initial commit
[rofl0r-KOL.git] / units / wab / KOLWAB.pas
blob81534355337580e7e5c74709309c14b031e3a372
1 unit KOLWAB;
3 interface
4 uses KOL, KOLComObj, WabDefs, WabApi, WabIab, windows;
6 type
8 PKOLWAB =^TKOLWAB;
9 TKOLWAB = object(TObj)
10 private
11 AddrBook: IAddrBook;
12 WabObject: IWabObject;
13 fFileName : String;
14 fContacts : PStrList;
15 fProperties : PStrList;
16 fContactIds : PList;
17 procedure loadItems;
18 function SPropValueToStr(PropValue: TSPropValue): string;
19 procedure FreeSRowSet(var P: PSRowSet);
20 procedure FreeSBinary(var P: PSBinary);
21 function SPropValueToTypeStr(PropValue: TSPropValue): string;
22 public
23 destructor destroy; virtual;
24 procedure loadFile;
25 function connect : boolean;
26 procedure setToDefaultAddressBook;
27 procedure getPropertiesOf(name : String);
28 property fileName : String read fFileName write fFileName;
29 property contacts : PStrList read fContacts write fContacts;
30 property properties : PStrList read fProperties write fProperties;
31 end;
33 function NewKOLWAB: PKOLWAB;
35 implementation
37 uses wabTags;
39 function NewKOLWAB;
40 begin
41 New(Result, create);
42 Result.fContacts := NewStrList;
43 Result.fProperties := NewStrList;
44 Result.fContactIds := NewList;
45 end;
47 destructor TKOLWAB.destroy;
48 begin
49 AddrBook := nil;
50 WabObject := nil;
51 fProperties.free;
52 fContacts.free;
53 fContactIDs.free;
54 inherited destroy;
55 end;
57 procedure TKOLWAB.setToDefaultAddressBook;
58 var r : HKey;
59 begin
60 fFileName := '';
61 try
62 r := RegKeyOpenRead(HKEY_CURRENT_USER, '\Software\Microsoft\Windows\WAB\WAB4');
63 if r <> 0 then
64 fFileName := RegKeyGetStr(r, 'Wab File Name');
65 except
66 end;
68 end;
70 function TKOLWAB.connect : boolean;
71 begin
72 result := WabApiLoaded;
73 end;
75 procedure TKOLWAB.FreeSRowSet(var P: PSRowSet);
76 var
77 I: Integer;
78 begin
79 for I := 0 to P^.cRows - 1 do
80 OleCheck(WabObject.FreeBuffer(P^.aRow[I].lpProps));
81 OleCheck(WabObject.FreeBuffer(P));
82 P := nil;
83 end;
85 procedure TKOLWAB.FreeSBinary(var P: PSBinary);
86 begin
87 if P = nil then Exit;
88 FreeMem(P.lpb);
89 Dispose(P);
90 P := nil;
91 end;
93 procedure TKOLWAB.getPropertiesOf(name : String);
94 var fLastDetailsCount,i : Integer;
95 EntryIDData : PSBinary;
96 FLastDetailID: PSBinary;
97 objType : ULong;
98 MailUser: IMailUser;
99 FLastDetails: PSPropsArray;
101 procedure ClearLastDetails;
102 begin
103 if FLastDetails <> nil then
104 begin
105 OleCheck(WabObject.FreeBuffer(FLastDetails));
106 FreeSBinary(FLastDetailID);
107 FLastDetails := nil;
108 FLastDetailsCount := 0;
109 end;
110 end;
112 begin
113 fLastDetails := nil;
114 fProperties.clear;
115 ClearLastDetails;
116 i := fContacts.indexOf(name);
117 if i = -1 then exit;
118 EntryIDData := fContactIds.Items[i];
119 if ENtryIDData = nil then exit;
120 objType := 0;
121 with EntryIDData^ do
122 begin
123 New(FLastDetailID);
124 FLastDetailID.cb := cb;
125 GetMem(FLastDetailID.lpb, cb);
126 CopyMemory(FLastDetailID.lpb, lpb, cb);
127 OleCheck(AddrBook.OpenEntry(cb, lpb, nil, 0, ObjType, IUnknown(MailUser)));
128 end;
129 OleCheck(MailUser.GetProps(nil, 0, @FLastDetailsCount, PSPropValue(FLastDetails)));
130 for i := 0 to fLastDetailsCount-1 do begin
131 fProperties.Add(SPropValueToTypeStr(FLastDetails[i])+'='+SPropValueToStr(FLastDetails[i]));
132 end;
134 end;
136 function TKOLWAB.SPropValueToStr(PropValue: TSPropValue): string;
138 LT: TFileTime;
139 ST: TSystemTime;
140 DT: TDateTime;
141 begin
142 with PropValue do
143 case PROP_TYPE(ulPropTag) of
144 PT_TSTRING:
145 Result := Value.lpszA;
146 PT_BINARY:
147 if Value.bin.cb = 4 then
148 Result := Format('[Binary - Size: %d bytes] (%.8x)', [Value.bin.cb, PDWORD(Value.bin.lpb)^])
149 else
150 Result := Format('[Binary - Size: %d bytes]', [Value.bin.cb]);
151 PT_I2:
152 Result := Int2Str(Value.i);
153 PT_LONG:
154 Result := Int2Str(Value.l);
155 PT_R4:
156 Result := Double2Str(Value.flt);
157 PT_DOUBLE:
158 Result := Double2Str(Value.dbl);
159 PT_BOOLEAN:
160 Result := Int2Str(Value.b);
161 PT_SYSTIME:
162 begin
163 FileTimeToLocalFileTime(Value.ft, LT);
164 FileTimeToSystemTime(LT, ST);
165 SystemTime2DateTime(ST, DT);
166 Result := DateTime2StrShort(DT);
167 end;
168 PT_ERROR:
169 Result := 'Error';
170 else
171 Result := Format('[Unknown type %x]', [PROP_TYPE(ulPropTag)]);
172 end;
173 end;
175 procedure TKOLWAB.loadFile;
177 WP: TWabParam;
178 begin
179 ZeroMemory(@WP, Sizeof(WP));
180 WP.cbSize := Sizeof(WP);
181 WP.szFileName := PChar(fFileName);
182 WP.hwnd := 0;
183 OleCheck(WabOpen(AddrBook, WabObject, @WP, 0));
184 {-- Ok its loaded now get all the contacts}
185 loadItems;
186 end;
188 procedure TKOLWAB.loadItems;
189 const
190 TableColumns: record // SizedSPropTagArray macro
191 Count: ULONG;
192 Definition: array[0..4] of ULONG;
193 end = (
194 Count: 5;
195 Definition:
196 (PR_DISPLAY_NAME,
197 PR_EMAIL_ADDRESS,
198 PR_PERSONAL_HOME_PAGE,
199 PR_ENTRYID,
200 PR_OBJECT_TYPE);
203 Container: IABContainer;
204 EntryID: PEntryID;
205 EntryIDSize, ObjType: ULONG;
206 Table: IMAPITable;
207 TableRow: PSRowSet;
208 EntryIDData: PSBinary;
209 begin
210 OleCheck(AddrBook.GetPAB(EntryIDSize, EntryID));
211 OleCheck(AddrBook.OpenEntry(EntryIDSize, EntryID, nil, 0,
212 ObjType, IUnknown(Container)));
213 OleCheck(WabObject.FreeBuffer(EntryID));
215 OleCheck(Container.GetContentsTable(0, Table));
216 OleCheck(Table.SetColumns(@TableColumns, 0));
217 OleCheck(Table.SeekRow(BOOKMARK_BEGINNING, 0, nil));
219 fContacts.clear;
220 fContactIDs.clear;
221 repeat
222 OleCheck(Table.QueryRows(1, 0, TableRow));
223 if TableRow.cRows > 0 then with TableRow^.aRow[0] do
224 begin
225 if ULONG(lpProps[4].Value.l) in [MAPI_MAILUSER, MAPI_DISTLIST] then
226 begin
227 EntryID := lpProps[3].Value.bin.lpb;
228 EntryIDSize := lpProps[3].Value.bin.cb;
230 OleCheck(WabObject.AllocateBuffer(Sizeof(TSBinary), Pointer(EntryIDData)));
231 OleCheck(WabObject.AllocateMore(EntryIDSize, EntryIDData, Pointer(EntryIDData.lpb)));
232 CopyMemory(EntryIDData.lpb, EntryID, EntryIDSize);
233 EntryIDData^.cb := EntryIDSize;
235 fContactIds.Add(EntryIDData);
236 {indexes 1 and 2 have the email and web addresses}
237 case ULONG(lpProps[4].Value.l) of
238 MAPI_MAILUSER:
239 fContacts.Add(SPropValueToStr(lpProps[0]));
240 MAPI_DISTLIST:
241 {Ignoring lists for the moment}
242 end;
243 end;
244 FreeSRowSet(TableRow);
245 end else Break;
246 until False;
248 end;
250 function TKOLWAB.SPropValueToTypeStr(PropValue: TSPropValue): string;
251 const
252 TagNames: array[1..321] of record
253 Tag: ULONG;
254 Name: PChar
255 end = (
256 (Tag: PR_ENTRYID; Name: 'ENTRYID'),
257 (Tag: PR_OBJECT_TYPE; Name: 'OBJECT_TYPE'),
258 (Tag: PR_ICON; Name: 'ICON'),
259 (Tag: PR_MINI_ICON; Name: 'MINI_ICON'),
260 (Tag: PR_STORE_ENTRYID; Name: 'STORE_ENTRYID'),
261 (Tag: PR_STORE_RECORD_KEY; Name: 'STORE_RECORD_KEY'),
262 (Tag: PR_RECORD_KEY; Name: 'RECORD_KEY'),
263 (Tag: PR_MAPPING_SIGNATURE; Name: 'MAPPING_SIGNATURE'),
264 (Tag: PR_ACCESS_LEVEL; Name: 'ACCESS_LEVEL'),
265 (Tag: PR_INSTANCE_KEY; Name: 'INSTANCE_KEY'),
266 (Tag: PR_ROW_TYPE; Name: 'ROW_TYPE'),
267 (Tag: PR_ACCESS; Name: 'ACCESS'),
268 (Tag: PR_ROWID; Name: 'ROWID'),
269 (Tag: PR_DISPLAY_NAME; Name: 'DISPLAY_NAME'),
270 (Tag: PR_DISPLAY_NAME_W; Name: 'DISPLAY_NAME_W'),
271 (Tag: PR_DISPLAY_NAME_A; Name: 'DISPLAY_NAME_A'),
272 (Tag: PR_ADDRTYPE; Name: 'ADDRTYPE'),
273 (Tag: PR_ADDRTYPE_W; Name: 'ADDRTYPE_W'),
274 (Tag: PR_ADDRTYPE_A; Name: 'ADDRTYPE_A'),
275 (Tag: PR_EMAIL_ADDRESS; Name: 'EMAIL_ADDRESS'),
276 (Tag: PR_EMAIL_ADDRESS_W; Name: 'EMAIL_ADDRESS_W'),
277 (Tag: PR_EMAIL_ADDRESS_A; Name: 'EMAIL_ADDRESS_A'),
278 (Tag: PR_COMMENT; Name: 'COMMENT'),
279 (Tag: PR_COMMENT_W; Name: 'COMMENT_W'),
280 (Tag: PR_COMMENT_A; Name: 'COMMENT_A'),
281 (Tag: PR_DEPTH; Name: 'DEPTH'),
282 (Tag: PR_PROVIDER_DISPLAY; Name: 'PROVIDER_DISPLAY'),
283 (Tag: PR_PROVIDER_DISPLAY_W; Name: 'PROVIDER_DISPLAY_W'),
284 (Tag: PR_PROVIDER_DISPLAY_A; Name: 'PROVIDER_DISPLAY_A'),
285 (Tag: PR_CREATION_TIME; Name: 'CREATION_TIME'),
286 (Tag: PR_LAST_MODIFICATION_TIME; Name: 'LAST_MODIFICATION_TIME'),
287 (Tag: PR_RESOURCE_FLAGS; Name: 'RESOURCE_FLAGS'),
288 (Tag: PR_PROVIDER_DLL_NAME; Name: 'PROVIDER_DLL_NAME'),
289 (Tag: PR_PROVIDER_DLL_NAME_W; Name: 'PROVIDER_DLL_NAME_W'),
290 (Tag: PR_PROVIDER_DLL_NAME_A; Name: 'PROVIDER_DLL_NAME_A'),
291 (Tag: PR_SEARCH_KEY; Name: 'SEARCH_KEY'),
292 (Tag: PR_PROVIDER_UID; Name: 'PROVIDER_UID'),
293 (Tag: PR_PROVIDER_ORDINAL; Name: 'PROVIDER_ORDINAL'),
294 (Tag: PR_CONTAINER_FLAGS; Name: 'CONTAINER_FLAGS'),
295 (Tag: PR_FOLDER_TYPE; Name: 'FOLDER_TYPE'),
296 (Tag: PR_CONTENT_COUNT; Name: 'CONTENT_COUNT'),
297 (Tag: PR_CONTENT_UNREAD; Name: 'CONTENT_UNREAD'),
298 (Tag: PR_CREATE_TEMPLATES; Name: 'CREATE_TEMPLATES'),
299 (Tag: PR_DETAILS_TABLE; Name: 'DETAILS_TABLE'),
300 (Tag: PR_SEARCH; Name: 'SEARCH'),
301 (Tag: PR_SELECTABLE; Name: 'SELECTABLE'),
302 (Tag: PR_SUBFOLDERS; Name: 'SUBFOLDERS'),
303 (Tag: PR_STATUS; Name: 'STATUS'),
304 (Tag: PR_ANR; Name: 'ANR'),
305 (Tag: PR_ANR_W; Name: 'ANR_W'),
306 (Tag: PR_ANR_A; Name: 'ANR_A'),
307 (Tag: PR_CONTENTS_SORT_ORDER; Name: 'CONTENTS_SORT_ORDER'),
308 (Tag: PR_CONTAINER_HIERARCHY; Name: 'CONTAINER_HIERARCHY'),
309 (Tag: PR_CONTAINER_CONTENTS; Name: 'CONTAINER_CONTENTS'),
310 (Tag: PR_FOLDER_ASSOCIATED_CONTENTS; Name: 'FOLDER_ASSOCIATED_CONTENTS'),
311 (Tag: PR_DEF_CREATE_DL; Name: 'DEF_CREATE_DL'),
312 (Tag: PR_DEF_CREATE_MAILUSER; Name: 'DEF_CREATE_MAILUSER'),
313 (Tag: PR_CONTAINER_CLASS; Name: 'CONTAINER_CLASS'),
314 (Tag: PR_CONTAINER_CLASS_W; Name: 'CONTAINER_CLASS_W'),
315 (Tag: PR_CONTAINER_CLASS_A; Name: 'CONTAINER_CLASS_A'),
316 (Tag: PR_CONTAINER_MODIFY_VERSION; Name: 'CONTAINER_MODIFY_VERSION'),
317 (Tag: PR_AB_PROVIDER_ID; Name: 'AB_PROVIDER_ID'),
318 (Tag: PR_DEFAULT_VIEW_ENTRYID; Name: 'DEFAULT_VIEW_ENTRYID'),
319 (Tag: PR_ASSOC_CONTENT_COUNT; Name: 'ASSOC_CONTENT_COUNT'),
320 (Tag: PR_DISPLAY_TYPE; Name: 'DISPLAY_TYPE'),
321 (Tag: PR_TEMPLATEID; Name: 'TEMPLATEID'),
322 (Tag: PR_PRIMARY_CAPABILITY; Name: 'PRIMARY_CAPABILITY'),
323 (Tag: PR_7BIT_DISPLAY_NAME; Name: '7BIT_DISPLAY_NAME'),
324 (Tag: PR_ACCOUNT; Name: 'ACCOUNT'),
325 (Tag: PR_ACCOUNT_W; Name: 'ACCOUNT_W'),
326 (Tag: PR_ACCOUNT_A; Name: 'ACCOUNT_A'),
327 (Tag: PR_ALTERNATE_RECIPIENT; Name: 'ALTERNATE_RECIPIENT'),
328 (Tag: PR_CALLBACK_TELEPHONE_NUMBER; Name: 'CALLBACK_TELEPHONE_NUMBER'),
329 (Tag: PR_CALLBACK_TELEPHONE_NUMBER_W; Name: 'CALLBACK_TELEPHONE_NUMBER_W'),
330 (Tag: PR_CALLBACK_TELEPHONE_NUMBER_A; Name: 'CALLBACK_TELEPHONE_NUMBER_A'),
331 (Tag: PR_CONVERSION_PROHIBITED; Name: 'CONVERSION_PROHIBITED'),
332 (Tag: PR_DISCLOSE_RECIPIENTS; Name: 'DISCLOSE_RECIPIENTS'),
333 (Tag: PR_GENERATION; Name: 'GENERATION'),
334 (Tag: PR_GENERATION_W; Name: 'GENERATION_W'),
335 (Tag: PR_GENERATION_A; Name: 'GENERATION_A'),
336 (Tag: PR_GIVEN_NAME; Name: 'GIVEN_NAME'),
337 (Tag: PR_GIVEN_NAME_W; Name: 'GIVEN_NAME_W'),
338 (Tag: PR_GIVEN_NAME_A; Name: 'GIVEN_NAME_A'),
339 (Tag: PR_GOVERNMENT_ID_NUMBER; Name: 'GOVERNMENT_ID_NUMBER'),
340 (Tag: PR_GOVERNMENT_ID_NUMBER_W; Name: 'GOVERNMENT_ID_NUMBER_W'),
341 (Tag: PR_GOVERNMENT_ID_NUMBER_A; Name: 'GOVERNMENT_ID_NUMBER_A'),
342 (Tag: PR_BUSINESS_TELEPHONE_NUMBER; Name: 'BUSINESS_TELEPHONE_NUMBER'),
343 (Tag: PR_BUSINESS_TELEPHONE_NUMBER_W; Name: 'BUSINESS_TELEPHONE_NUMBER_W'),
344 (Tag: PR_BUSINESS_TELEPHONE_NUMBER_A; Name: 'BUSINESS_TELEPHONE_NUMBER_A'),
345 (Tag: PR_OFFICE_TELEPHONE_NUMBER; Name: 'OFFICE_TELEPHONE_NUMBER'),
346 (Tag: PR_OFFICE_TELEPHONE_NUMBER_W; Name: 'OFFICE_TELEPHONE_NUMBER_W'),
347 (Tag: PR_OFFICE_TELEPHONE_NUMBER_A; Name: 'OFFICE_TELEPHONE_NUMBER_A'),
348 (Tag: PR_HOME_TELEPHONE_NUMBER; Name: 'HOME_TELEPHONE_NUMBER'),
349 (Tag: PR_HOME_TELEPHONE_NUMBER_W; Name: 'HOME_TELEPHONE_NUMBER_W'),
350 (Tag: PR_HOME_TELEPHONE_NUMBER_A; Name: 'HOME_TELEPHONE_NUMBER_A'),
351 (Tag: PR_INITIALS; Name: 'INITIALS'),
352 (Tag: PR_INITIALS_W; Name: 'INITIALS_W'),
353 (Tag: PR_INITIALS_A; Name: 'INITIALS_A'),
354 (Tag: PR_KEYWORD; Name: 'KEYWORD'),
355 (Tag: PR_KEYWORD_W; Name: 'KEYWORD_W'),
356 (Tag: PR_KEYWORD_A; Name: 'KEYWORD_A'),
357 (Tag: PR_LANGUAGE; Name: 'LANGUAGE'),
358 (Tag: PR_LANGUAGE_W; Name: 'LANGUAGE_W'),
359 (Tag: PR_LANGUAGE_A; Name: 'LANGUAGE_A'),
360 (Tag: PR_LOCATION; Name: 'LOCATION'),
361 (Tag: PR_LOCATION_W; Name: 'LOCATION_W'),
362 (Tag: PR_LOCATION_A; Name: 'LOCATION_A'),
363 (Tag: PR_MAIL_PERMISSION; Name: 'MAIL_PERMISSION'),
364 (Tag: PR_MHS_COMMON_NAME; Name: 'MHS_COMMON_NAME'),
365 (Tag: PR_MHS_COMMON_NAME_W; Name: 'MHS_COMMON_NAME_W'),
366 (Tag: PR_MHS_COMMON_NAME_A; Name: 'MHS_COMMON_NAME_A'),
367 (Tag: PR_ORGANIZATIONAL_ID_NUMBER; Name: 'ORGANIZATIONAL_ID_NUMBER'),
368 (Tag: PR_ORGANIZATIONAL_ID_NUMBER_W; Name: 'ORGANIZATIONAL_ID_NUMBER_W'),
369 (Tag: PR_ORGANIZATIONAL_ID_NUMBER_A; Name: 'ORGANIZATIONAL_ID_NUMBER_A'),
370 (Tag: PR_SURNAME; Name: 'SURNAME'),
371 (Tag: PR_SURNAME_W; Name: 'SURNAME_W'),
372 (Tag: PR_SURNAME_A; Name: 'SURNAME_A'),
373 (Tag: PR_ORIGINAL_ENTRYID; Name: 'ORIGINAL_ENTRYID'),
374 (Tag: PR_ORIGINAL_DISPLAY_NAME; Name: 'ORIGINAL_DISPLAY_NAME'),
375 (Tag: PR_ORIGINAL_DISPLAY_NAME_W; Name: 'ORIGINAL_DISPLAY_NAME_W'),
376 (Tag: PR_ORIGINAL_DISPLAY_NAME_A; Name: 'ORIGINAL_DISPLAY_NAME_A'),
377 (Tag: PR_ORIGINAL_SEARCH_KEY; Name: 'ORIGINAL_SEARCH_KEY'),
378 (Tag: PR_POSTAL_ADDRESS; Name: 'POSTAL_ADDRESS'),
379 (Tag: PR_POSTAL_ADDRESS_W; Name: 'POSTAL_ADDRESS_W'),
380 (Tag: PR_POSTAL_ADDRESS_A; Name: 'POSTAL_ADDRESS_A'),
381 (Tag: PR_COMPANY_NAME; Name: 'COMPANY_NAME'),
382 (Tag: PR_COMPANY_NAME_W; Name: 'COMPANY_NAME_W'),
383 (Tag: PR_COMPANY_NAME_A; Name: 'COMPANY_NAME_A'),
384 (Tag: PR_TITLE; Name: 'TITLE'),
385 (Tag: PR_TITLE_W; Name: 'TITLE_W'),
386 (Tag: PR_TITLE_A; Name: 'TITLE_A'),
387 (Tag: PR_DEPARTMENT_NAME; Name: 'DEPARTMENT_NAME'),
388 (Tag: PR_DEPARTMENT_NAME_W; Name: 'DEPARTMENT_NAME_W'),
389 (Tag: PR_DEPARTMENT_NAME_A; Name: 'DEPARTMENT_NAME_A'),
390 (Tag: PR_OFFICE_LOCATION; Name: 'OFFICE_LOCATION'),
391 (Tag: PR_OFFICE_LOCATION_W; Name: 'OFFICE_LOCATION_W'),
392 (Tag: PR_OFFICE_LOCATION_A; Name: 'OFFICE_LOCATION_A'),
393 (Tag: PR_PRIMARY_TELEPHONE_NUMBER; Name: 'PRIMARY_TELEPHONE_NUMBER'),
394 (Tag: PR_PRIMARY_TELEPHONE_NUMBER_W; Name: 'PRIMARY_TELEPHONE_NUMBER_W'),
395 (Tag: PR_PRIMARY_TELEPHONE_NUMBER_A; Name: 'PRIMARY_TELEPHONE_NUMBER_A'),
396 (Tag: PR_BUSINESS2_TELEPHONE_NUMBER; Name: 'BUSINESS2_TELEPHONE_NUMBER'),
397 (Tag: PR_BUSINESS2_TELEPHONE_NUMBER_W; Name: 'BUSINESS2_TELEPHONE_NUMBER_W'),
398 (Tag: PR_BUSINESS2_TELEPHONE_NUMBER_A; Name: 'BUSINESS2_TELEPHONE_NUMBER_A'),
399 (Tag: PR_OFFICE2_TELEPHONE_NUMBER; Name: 'OFFICE2_TELEPHONE_NUMBER'),
400 (Tag: PR_OFFICE2_TELEPHONE_NUMBER_W; Name: 'OFFICE2_TELEPHONE_NUMBER_W'),
401 (Tag: PR_OFFICE2_TELEPHONE_NUMBER_A; Name: 'OFFICE2_TELEPHONE_NUMBER_A'),
402 (Tag: PR_MOBILE_TELEPHONE_NUMBER; Name: 'MOBILE_TELEPHONE_NUMBER'),
403 (Tag: PR_MOBILE_TELEPHONE_NUMBER_W; Name: 'MOBILE_TELEPHONE_NUMBER_W'),
404 (Tag: PR_MOBILE_TELEPHONE_NUMBER_A; Name: 'MOBILE_TELEPHONE_NUMBER_A'),
405 (Tag: PR_CELLULAR_TELEPHONE_NUMBER; Name: 'CELLULAR_TELEPHONE_NUMBER'),
406 (Tag: PR_CELLULAR_TELEPHONE_NUMBER_W; Name: 'CELLULAR_TELEPHONE_NUMBER_W'),
407 (Tag: PR_CELLULAR_TELEPHONE_NUMBER_A; Name: 'CELLULAR_TELEPHONE_NUMBER_A'),
408 (Tag: PR_RADIO_TELEPHONE_NUMBER; Name: 'RADIO_TELEPHONE_NUMBER'),
409 (Tag: PR_RADIO_TELEPHONE_NUMBER_W; Name: 'RADIO_TELEPHONE_NUMBER_W'),
410 (Tag: PR_RADIO_TELEPHONE_NUMBER_A; Name: 'RADIO_TELEPHONE_NUMBER_A'),
411 (Tag: PR_CAR_TELEPHONE_NUMBER; Name: 'CAR_TELEPHONE_NUMBER'),
412 (Tag: PR_CAR_TELEPHONE_NUMBER_W; Name: 'CAR_TELEPHONE_NUMBER_W'),
413 (Tag: PR_CAR_TELEPHONE_NUMBER_A; Name: 'CAR_TELEPHONE_NUMBER_A'),
414 (Tag: PR_OTHER_TELEPHONE_NUMBER; Name: 'OTHER_TELEPHONE_NUMBER'),
415 (Tag: PR_OTHER_TELEPHONE_NUMBER_W; Name: 'OTHER_TELEPHONE_NUMBER_W'),
416 (Tag: PR_OTHER_TELEPHONE_NUMBER_A; Name: 'OTHER_TELEPHONE_NUMBER_A'),
417 (Tag: PR_TRANSMITABLE_DISPLAY_NAME; Name: 'TRANSMITABLE_DISPLAY_NAME'),
418 (Tag: PR_TRANSMITABLE_DISPLAY_NAME_W; Name: 'TRANSMITABLE_DISPLAY_NAME_W'),
419 (Tag: PR_TRANSMITABLE_DISPLAY_NAME_A; Name: 'TRANSMITABLE_DISPLAY_NAME_A'),
420 (Tag: PR_PAGER_TELEPHONE_NUMBER; Name: 'PAGER_TELEPHONE_NUMBER'),
421 (Tag: PR_PAGER_TELEPHONE_NUMBER_W; Name: 'PAGER_TELEPHONE_NUMBER_W'),
422 (Tag: PR_PAGER_TELEPHONE_NUMBER_A; Name: 'PAGER_TELEPHONE_NUMBER_A'),
423 (Tag: PR_BEEPER_TELEPHONE_NUMBER; Name: 'BEEPER_TELEPHONE_NUMBER'),
424 (Tag: PR_BEEPER_TELEPHONE_NUMBER_W; Name: 'BEEPER_TELEPHONE_NUMBER_W'),
425 (Tag: PR_BEEPER_TELEPHONE_NUMBER_A; Name: 'BEEPER_TELEPHONE_NUMBER_A'),
426 (Tag: PR_USER_CERTIFICATE; Name: 'USER_CERTIFICATE'),
427 (Tag: PR_PRIMARY_FAX_NUMBER; Name: 'PRIMARY_FAX_NUMBER'),
428 (Tag: PR_PRIMARY_FAX_NUMBER_W; Name: 'PRIMARY_FAX_NUMBER_W'),
429 (Tag: PR_PRIMARY_FAX_NUMBER_A; Name: 'PRIMARY_FAX_NUMBER_A'),
430 (Tag: PR_BUSINESS_FAX_NUMBER; Name: 'BUSINESS_FAX_NUMBER'),
431 (Tag: PR_BUSINESS_FAX_NUMBER_W; Name: 'BUSINESS_FAX_NUMBER_W'),
432 (Tag: PR_BUSINESS_FAX_NUMBER_A; Name: 'BUSINESS_FAX_NUMBER_A'),
433 (Tag: PR_HOME_FAX_NUMBER; Name: 'HOME_FAX_NUMBER'),
434 (Tag: PR_HOME_FAX_NUMBER_W; Name: 'HOME_FAX_NUMBER_W'),
435 (Tag: PR_HOME_FAX_NUMBER_A; Name: 'HOME_FAX_NUMBER_A'),
436 (Tag: PR_COUNTRY; Name: 'COUNTRY'),
437 (Tag: PR_COUNTRY_W; Name: 'COUNTRY_W'),
438 (Tag: PR_COUNTRY_A; Name: 'COUNTRY_A'),
439 (Tag: PR_LOCALITY; Name: 'LOCALITY'),
440 (Tag: PR_LOCALITY_W; Name: 'LOCALITY_W'),
441 (Tag: PR_LOCALITY_A; Name: 'LOCALITY_A'),
442 (Tag: PR_STATE_OR_PROVINCE; Name: 'STATE_OR_PROVINCE'),
443 (Tag: PR_STATE_OR_PROVINCE_W; Name: 'STATE_OR_PROVINCE_W'),
444 (Tag: PR_STATE_OR_PROVINCE_A; Name: 'STATE_OR_PROVINCE_A'),
445 (Tag: PR_STREET_ADDRESS; Name: 'STREET_ADDRESS'),
446 (Tag: PR_STREET_ADDRESS_W; Name: 'STREET_ADDRESS_W'),
447 (Tag: PR_STREET_ADDRESS_A; Name: 'STREET_ADDRESS_A'),
448 (Tag: PR_POSTAL_CODE; Name: 'POSTAL_CODE'),
449 (Tag: PR_POSTAL_CODE_W; Name: 'POSTAL_CODE_W'),
450 (Tag: PR_POSTAL_CODE_A; Name: 'POSTAL_CODE_A'),
451 (Tag: PR_POST_OFFICE_BOX; Name: 'POST_OFFICE_BOX'),
452 (Tag: PR_POST_OFFICE_BOX_W; Name: 'POST_OFFICE_BOX_W'),
453 (Tag: PR_POST_OFFICE_BOX_A; Name: 'POST_OFFICE_BOX_A'),
454 (Tag: PR_BUSINESS_ADDRESS_POST_OFFICE_BOX; Name: 'BUSINESS_ADDRESS_POST_OFFICE_BOX'),
455 (Tag: PR_BUSINESS_ADDRESS_POST_OFFICE_BOX_W; Name: 'BUSINESS_ADDRESS_POST_OFFICE_BOX_W'),
456 (Tag: PR_BUSINESS_ADDRESS_POST_OFFICE_BOX_A; Name: 'BUSINESS_ADDRESS_POST_OFFICE_BOX_A'),
457 (Tag: PR_TELEX_NUMBER; Name: 'TELEX_NUMBER'),
458 (Tag: PR_TELEX_NUMBER_W; Name: 'TELEX_NUMBER_W'),
459 (Tag: PR_TELEX_NUMBER_A; Name: 'TELEX_NUMBER_A'),
460 (Tag: PR_ISDN_NUMBER; Name: 'ISDN_NUMBER'),
461 (Tag: PR_ISDN_NUMBER_W; Name: 'ISDN_NUMBER_W'),
462 (Tag: PR_ISDN_NUMBER_A; Name: 'ISDN_NUMBER_A'),
463 (Tag: PR_ASSISTANT_TELEPHONE_NUMBER; Name: 'ASSISTANT_TELEPHONE_NUMBER'),
464 (Tag: PR_ASSISTANT_TELEPHONE_NUMBER_W; Name: 'ASSISTANT_TELEPHONE_NUMBER_W'),
465 (Tag: PR_ASSISTANT_TELEPHONE_NUMBER_A; Name: 'ASSISTANT_TELEPHONE_NUMBER_A'),
466 (Tag: PR_HOME2_TELEPHONE_NUMBER; Name: 'HOME2_TELEPHONE_NUMBER'),
467 (Tag: PR_HOME2_TELEPHONE_NUMBER_W; Name: 'HOME2_TELEPHONE_NUMBER_W'),
468 (Tag: PR_HOME2_TELEPHONE_NUMBER_A; Name: 'HOME2_TELEPHONE_NUMBER_A'),
469 (Tag: PR_ASSISTANT; Name: 'ASSISTANT'),
470 (Tag: PR_ASSISTANT_W; Name: 'ASSISTANT_W'),
471 (Tag: PR_ASSISTANT_A; Name: 'ASSISTANT_A'),
472 (Tag: PR_SEND_RICH_INFO; Name: 'SEND_RICH_INFO'),
473 (Tag: PR_WEDDING_ANNIVERSARY; Name: 'WEDDING_ANNIVERSARY'),
474 (Tag: PR_BIRTHDAY; Name: 'BIRTHDAY'),
475 (Tag: PR_HOBBIES; Name: 'HOBBIES'),
476 (Tag: PR_HOBBIES_W; Name: 'HOBBIES_W'),
477 (Tag: PR_HOBBIES_A; Name: 'HOBBIES_A'),
478 (Tag: PR_MIDDLE_NAME; Name: 'MIDDLE_NAME'),
479 (Tag: PR_MIDDLE_NAME_W; Name: 'MIDDLE_NAME_W'),
480 (Tag: PR_MIDDLE_NAME_A; Name: 'MIDDLE_NAME_A'),
481 (Tag: PR_DISPLAY_NAME_PREFIX; Name: 'DISPLAY_NAME_PREFIX'),
482 (Tag: PR_DISPLAY_NAME_PREFIX_W; Name: 'DISPLAY_NAME_PREFIX_W'),
483 (Tag: PR_DISPLAY_NAME_PREFIX_A; Name: 'DISPLAY_NAME_PREFIX_A'),
484 (Tag: PR_PROFESSION; Name: 'PROFESSION'),
485 (Tag: PR_PROFESSION_W; Name: 'PROFESSION_W'),
486 (Tag: PR_PROFESSION_A; Name: 'PROFESSION_A'),
487 (Tag: PR_PREFERRED_BY_NAME; Name: 'PREFERRED_BY_NAME'),
488 (Tag: PR_PREFERRED_BY_NAME_W; Name: 'PREFERRED_BY_NAME_W'),
489 (Tag: PR_PREFERRED_BY_NAME_A; Name: 'PREFERRED_BY_NAME_A'),
490 (Tag: PR_SPOUSE_NAME; Name: 'SPOUSE_NAME'),
491 (Tag: PR_SPOUSE_NAME_W; Name: 'SPOUSE_NAME_W'),
492 (Tag: PR_SPOUSE_NAME_A; Name: 'SPOUSE_NAME_A'),
493 (Tag: PR_COMPUTER_NETWORK_NAME; Name: 'COMPUTER_NETWORK_NAME'),
494 (Tag: PR_COMPUTER_NETWORK_NAME_W; Name: 'COMPUTER_NETWORK_NAME_W'),
495 (Tag: PR_COMPUTER_NETWORK_NAME_A; Name: 'COMPUTER_NETWORK_NAME_A'),
496 (Tag: PR_CUSTOMER_ID; Name: 'CUSTOMER_ID'),
497 (Tag: PR_CUSTOMER_ID_W; Name: 'CUSTOMER_ID_W'),
498 (Tag: PR_CUSTOMER_ID_A; Name: 'CUSTOMER_ID_A'),
499 (Tag: PR_TTYTDD_PHONE_NUMBER; Name: 'TTYTDD_PHONE_NUMBER'),
500 (Tag: PR_TTYTDD_PHONE_NUMBER_W; Name: 'TTYTDD_PHONE_NUMBER_W'),
501 (Tag: PR_TTYTDD_PHONE_NUMBER_A; Name: 'TTYTDD_PHONE_NUMBER_A'),
502 (Tag: PR_FTP_SITE; Name: 'FTP_SITE'),
503 (Tag: PR_FTP_SITE_W; Name: 'FTP_SITE_W'),
504 (Tag: PR_FTP_SITE_A; Name: 'FTP_SITE_A'),
505 (Tag: PR_GENDER; Name: 'GENDER'),
506 (Tag: PR_MANAGER_NAME; Name: 'MANAGER_NAME'),
507 (Tag: PR_MANAGER_NAME_W; Name: 'MANAGER_NAME_W'),
508 (Tag: PR_MANAGER_NAME_A; Name: 'MANAGER_NAME_A'),
509 (Tag: PR_NICKNAME; Name: 'NICKNAME'),
510 (Tag: PR_NICKNAME_W; Name: 'NICKNAME_W'),
511 (Tag: PR_NICKNAME_A; Name: 'NICKNAME_A'),
512 (Tag: PR_PERSONAL_HOME_PAGE; Name: 'PERSONAL_HOME_PAGE'),
513 (Tag: PR_PERSONAL_HOME_PAGE_W; Name: 'PERSONAL_HOME_PAGE_W'),
514 (Tag: PR_PERSONAL_HOME_PAGE_A; Name: 'PERSONAL_HOME_PAGE_A'),
515 (Tag: PR_BUSINESS_HOME_PAGE; Name: 'BUSINESS_HOME_PAGE'),
516 (Tag: PR_BUSINESS_HOME_PAGE_W; Name: 'BUSINESS_HOME_PAGE_W'),
517 (Tag: PR_BUSINESS_HOME_PAGE_A; Name: 'BUSINESS_HOME_PAGE_A'),
518 (Tag: PR_CONTACT_VERSION; Name: 'CONTACT_VERSION'),
519 (Tag: PR_CONTACT_ENTRYIDS; Name: 'CONTACT_ENTRYIDS'),
520 (Tag: PR_CONTACT_ADDRTYPES; Name: 'CONTACT_ADDRTYPES'),
521 (Tag: PR_CONTACT_ADDRTYPES_W; Name: 'CONTACT_ADDRTYPES_W'),
522 (Tag: PR_CONTACT_ADDRTYPES_A; Name: 'CONTACT_ADDRTYPES_A'),
523 (Tag: PR_CONTACT_DEFAULT_ADDRESS_INDEX; Name: 'CONTACT_DEFAULT_ADDRESS_INDEX'),
524 (Tag: PR_CONTACT_EMAIL_ADDRESSES; Name: 'CONTACT_EMAIL_ADDRESSES'),
525 (Tag: PR_CONTACT_EMAIL_ADDRESSES_W; Name: 'CONTACT_EMAIL_ADDRESSES_W'),
526 (Tag: PR_CONTACT_EMAIL_ADDRESSES_A; Name: 'CONTACT_EMAIL_ADDRESSES_A'),
527 (Tag: PR_COMPANY_MAIN_PHONE_NUMBER; Name: 'COMPANY_MAIN_PHONE_NUMBER'),
528 (Tag: PR_COMPANY_MAIN_PHONE_NUMBER_W; Name: 'COMPANY_MAIN_PHONE_NUMBER_W'),
529 (Tag: PR_COMPANY_MAIN_PHONE_NUMBER_A; Name: 'COMPANY_MAIN_PHONE_NUMBER_A'),
530 (Tag: PR_CHILDRENS_NAMES; Name: 'CHILDRENS_NAMES'),
531 (Tag: PR_CHILDRENS_NAMES_W; Name: 'CHILDRENS_NAMES_W'),
532 (Tag: PR_CHILDRENS_NAMES_A; Name: 'CHILDRENS_NAMES_A'),
533 (Tag: PR_HOME_ADDRESS_CITY; Name: 'HOME_ADDRESS_CITY'),
534 (Tag: PR_HOME_ADDRESS_CITY_W; Name: 'HOME_ADDRESS_CITY_W'),
535 (Tag: PR_HOME_ADDRESS_CITY_A; Name: 'HOME_ADDRESS_CITY_A'),
536 (Tag: PR_HOME_ADDRESS_COUNTRY; Name: 'HOME_ADDRESS_COUNTRY'),
537 (Tag: PR_HOME_ADDRESS_COUNTRY_W; Name: 'HOME_ADDRESS_COUNTRY_W'),
538 (Tag: PR_HOME_ADDRESS_COUNTRY_A; Name: 'HOME_ADDRESS_COUNTRY_A'),
539 (Tag: PR_HOME_ADDRESS_POSTAL_CODE; Name: 'HOME_ADDRESS_POSTAL_CODE'),
540 (Tag: PR_HOME_ADDRESS_POSTAL_CODE_W; Name: 'HOME_ADDRESS_POSTAL_CODE_W'),
541 (Tag: PR_HOME_ADDRESS_POSTAL_CODE_A; Name: 'HOME_ADDRESS_POSTAL_CODE_A'),
542 (Tag: PR_HOME_ADDRESS_STATE_OR_PROVINCE; Name: 'HOME_ADDRESS_STATE_OR_PROVINCE'),
543 (Tag: PR_HOME_ADDRESS_STATE_OR_PROVINCE_W; Name: 'HOME_ADDRESS_STATE_OR_PROVINCE_W'),
544 (Tag: PR_HOME_ADDRESS_STATE_OR_PROVINCE_A; Name: 'HOME_ADDRESS_STATE_OR_PROVINCE_A'),
545 (Tag: PR_HOME_ADDRESS_STREET; Name: 'HOME_ADDRESS_STREET'),
546 (Tag: PR_HOME_ADDRESS_STREET_W; Name: 'HOME_ADDRESS_STREET_W'),
547 (Tag: PR_HOME_ADDRESS_STREET_A; Name: 'HOME_ADDRESS_STREET_A'),
548 (Tag: PR_HOME_ADDRESS_POST_OFFICE_BOX; Name: 'HOME_ADDRESS_POST_OFFICE_BOX'),
549 (Tag: PR_HOME_ADDRESS_POST_OFFICE_BOX_W; Name: 'HOME_ADDRESS_POST_OFFICE_BOX_W'),
550 (Tag: PR_HOME_ADDRESS_POST_OFFICE_BOX_A; Name: 'HOME_ADDRESS_POST_OFFICE_BOX_A'),
551 (Tag: PR_OTHER_ADDRESS_CITY; Name: 'OTHER_ADDRESS_CITY'),
552 (Tag: PR_OTHER_ADDRESS_CITY_W; Name: 'OTHER_ADDRESS_CITY_W'),
553 (Tag: PR_OTHER_ADDRESS_CITY_A; Name: 'OTHER_ADDRESS_CITY_A'),
554 (Tag: PR_OTHER_ADDRESS_COUNTRY; Name: 'OTHER_ADDRESS_COUNTRY'),
555 (Tag: PR_OTHER_ADDRESS_COUNTRY_W; Name: 'OTHER_ADDRESS_COUNTRY_W'),
556 (Tag: PR_OTHER_ADDRESS_COUNTRY_A; Name: 'OTHER_ADDRESS_COUNTRY_A'),
557 (Tag: PR_OTHER_ADDRESS_POSTAL_CODE; Name: 'OTHER_ADDRESS_POSTAL_CODE'),
558 (Tag: PR_OTHER_ADDRESS_POSTAL_CODE_W; Name: 'OTHER_ADDRESS_POSTAL_CODE_W'),
559 (Tag: PR_OTHER_ADDRESS_POSTAL_CODE_A; Name: 'OTHER_ADDRESS_POSTAL_CODE_A'),
560 (Tag: PR_OTHER_ADDRESS_STATE_OR_PROVINCE; Name: 'OTHER_ADDRESS_STATE_OR_PROVINCE'),
561 (Tag: PR_OTHER_ADDRESS_STATE_OR_PROVINCE_W; Name: 'OTHER_ADDRESS_STATE_OR_PROVINCE_W'),
562 (Tag: PR_OTHER_ADDRESS_STATE_OR_PROVINCE_A; Name: 'OTHER_ADDRESS_STATE_OR_PROVINCE_A'),
563 (Tag: PR_OTHER_ADDRESS_STREET; Name: 'OTHER_ADDRESS_STREET'),
564 (Tag: PR_OTHER_ADDRESS_STREET_W; Name: 'OTHER_ADDRESS_STREET_W'),
565 (Tag: PR_OTHER_ADDRESS_STREET_A; Name: 'OTHER_ADDRESS_STREET_A'),
566 (Tag: PR_OTHER_ADDRESS_POST_OFFICE_BOX; Name: 'OTHER_ADDRESS_POST_OFFICE_BOX'),
567 (Tag: PR_OTHER_ADDRESS_POST_OFFICE_BOX_W; Name: 'OTHER_ADDRESS_POST_OFFICE_BOX_W'),
568 (Tag: PR_OTHER_ADDRESS_POST_OFFICE_BOX_A; Name: 'OTHER_ADDRESS_POST_OFFICE_BOX_A'),
569 (Tag: PR_USER_X509_CERTIFICATE; Name: 'USER_X509_CERTIFICATE'),
570 (Tag: PR_SEND_INTERNET_ENCODING; Name: 'SEND_INTERNET_ENCODING'),
571 (Tag: PR_BUSINESS_ADDRESS_CITY; Name: 'BUSINESS_ADDRESS_CITY'),
572 (Tag: PR_BUSINESS_ADDRESS_COUNTRY; Name: 'BUSINESS_ADDRESS_COUNTRY'),
573 (Tag: PR_BUSINESS_ADDRESS_POSTAL_CODE; Name: 'BUSINESS_ADDRESS_POSTAL_CODE'),
574 (Tag: PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE; Name: 'BUSINESS_ADDRESS_STATE_OR_PROVINCE'),
575 (Tag: PR_BUSINESS_ADDRESS_STREET; Name: 'BUSINESS_ADDRESS_STREET'),
576 (Tag: PR_RECIPIENT_TYPE; Name: 'RECIPIENT_TYPE')
579 I: Integer;
580 PropID: ULONG;
581 begin
582 Result := '';
583 PropID := PROP_ID(PropValue.ulPropTag);
584 for I := Low(TagNames) to High(TagNames) do
585 if PROP_ID(TagNames[I].Tag) = PropID then
586 begin
587 Result := TagNames[I].Name;
588 Break;
589 end;
590 if Result = '' then Result := Format('[%x]', [PropID]);
591 end;
593 end.