Changeset 4274 for trunk/src/ole32/itemmoniker.cpp
- Timestamp:
- Sep 17, 2000, 12:31:07 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/ole32/itemmoniker.cpp
r1033 r4274 1 /* $Id: itemmoniker.cpp,v 1. 1 1999-09-24 21:49:43davidr Exp $ */1 /* $Id: itemmoniker.cpp,v 1.2 2000-09-17 10:31:04 davidr Exp $ */ 2 2 /* 3 3 * ItemMonikers implementation … … 15 15 #include <assert.h> 16 16 17 DEFAULT_DEBUG_CHANNEL( ole)17 DEFAULT_DEBUG_CHANNEL(moniker) 18 18 19 19 /* ItemMoniker data structure */ … … 72 72 HRESULT WINAPI ItemMonikerImpl_Construct(ItemMonikerImpl* iface, LPCOLESTR lpszDelim,LPCOLESTR lpszPathName); 73 73 HRESULT WINAPI ItemMonikerImpl_Destroy(ItemMonikerImpl* iface); 74 HRESULT ItemMonikerImpl_GetSizeToSave(IMoniker* iface,ULARGE_INTEGER* pcbSize); 74 75 75 76 /********************************************************************************/ … … 245 246 246 247 /* read item delimiter string */ 247 itemDelimiterA= (CHAR *)HeapAlloc(GetProcessHeap(),0,delimiterLength); 248 res=IStream_Read(pStm,itemDelimiterA,delimiterLength,&bread); 249 if (bread != delimiterLength) 248 res=IStream_Read(pStm,&delimiterLength,sizeof(DWORD),&bread); 249 if (bread != sizeof(DWORD)) 250 250 return E_FAIL; 251 251 252 This->itemDelimiter= (WCHAR *)HeapReAlloc(GetProcessHeap(),0,This->itemDelimiter,delimiterLength*sizeof(WCHAR)); 253 if (!This->itemDelimiter) 254 return E_OUTOFMEMORY; 255 256 lstrcpyAtoW(This->itemDelimiter,itemDelimiterA); 252 /* read item delimiter string */ 253 if (delimiterLength){ 254 itemDelimiterA=(CHAR *)HeapAlloc(GetProcessHeap(),0,delimiterLength); 255 res=IStream_Read(pStm,itemDelimiterA,delimiterLength,&bread); 256 if (bread != delimiterLength) 257 return E_FAIL; 258 This->itemDelimiter=(WCHAR *)HeapReAlloc(GetProcessHeap(),0,This->itemDelimiter,delimiterLength*sizeof(WCHAR)); 259 if (!This->itemDelimiter) 260 return E_OUTOFMEMORY; 261 262 lstrcpyAtoW(This->itemDelimiter,itemDelimiterA); 263 } 264 257 265 258 266 /* read item name string length + 1*/ … … 262 270 263 271 /* read item name string */ 264 itemNameA= (CHAR *)HeapAlloc(GetProcessHeap(),0,nameLength); 265 res=IStream_Read(pStm,itemNameA,nameLength,&bread); 266 if (bread != nameLength) 267 return E_FAIL; 268 269 This->itemName= (WCHAR *)HeapReAlloc(GetProcessHeap(),0,This->itemName,nameLength*sizeof(WCHAR)); 270 if (!This->itemName) 271 return E_OUTOFMEMORY; 272 273 lstrcpyAtoW(This->itemName,itemNameA); 272 if (nameLength) { 273 itemNameA= (CHAR *)HeapAlloc(GetProcessHeap(),0,nameLength); 274 res=IStream_Read(pStm,itemNameA,nameLength,&bread); 275 if (bread != nameLength) 276 return E_FAIL; 277 278 This->itemName= (WCHAR *)HeapReAlloc(GetProcessHeap(),0,This->itemName,nameLength*sizeof(WCHAR)); 279 if (!This->itemName) 280 return E_OUTOFMEMORY; 281 282 lstrcpyAtoW(This->itemName,itemNameA); 283 } 274 284 275 285 return res; … … 285 295 ICOM_THIS(ItemMonikerImpl,iface); 286 296 HRESULT res; 287 DWORD delimiterLength =lstrlenW(This->itemDelimiter)+1;288 DWORD nameLength=lstrlenW(This->itemName)+1;289 CHAR *itemNameA ,*itemDelimiterA;297 DWORD delimiterLength = 0; 298 DWORD itemLength = 0; 299 CHAR *itemNameA = 0, *itemDelimiterA = 0; 290 300 291 301 /* data writen by this function are : 1) DWORD : size of item delimiter string ('\0' included ) */ … … 294 304 /* 4) String (type A): item name string ('\0' included) */ 295 305 296 itemNameA= (CHAR *)HeapAlloc(GetProcessHeap(),0,nameLength); 297 itemDelimiterA= (CHAR *)HeapAlloc(GetProcessHeap(),0,delimiterLength); 298 lstrcpyWtoA(itemNameA,This->itemName); 299 lstrcpyWtoA(itemDelimiterA,This->itemDelimiter); 306 if (This->itemDelimiter){ 307 delimiterLength = lstrlenW(This->itemDelimiter) + 1; 308 itemDelimiterA=(CHAR *)HeapAlloc(GetProcessHeap(),0,delimiterLength); 309 lstrcpyWtoA(itemDelimiterA,This->itemDelimiter); 310 } 311 312 if (This->itemName){ 313 itemLength = lstrlenW(This->itemName) + 1; 314 itemNameA=(CHAR *)HeapAlloc(GetProcessHeap(),0,itemLength); 315 lstrcpyWtoA(itemNameA,This->itemName); 316 } 300 317 301 318 res=IStream_Write(pStm,&delimiterLength,sizeof(DWORD),NULL); 302 319 res=IStream_Write(pStm,itemDelimiterA,delimiterLength * sizeof(CHAR),NULL); 303 res=IStream_Write(pStm,&nameLength,sizeof(DWORD),NULL); 304 res=IStream_Write(pStm,itemNameA,nameLength * sizeof(CHAR),NULL); 320 res=IStream_Write(pStm,&itemLength,sizeof(DWORD),NULL); 321 res=IStream_Write(pStm,itemNameA,itemLength * sizeof(CHAR),NULL); 322 323 if (itemNameA) 324 HeapFree(GetProcessHeap(),0,itemNameA); 325 if (itemDelimiterA) 326 HeapFree(GetProcessHeap(),0,itemDelimiterA); 305 327 306 328 return res; … … 313 335 ULARGE_INTEGER* pcbSize)/* Pointer to size of stream needed to save object */ 314 336 { 315 ICOM_THIS(ItemMonikerImpl,iface); 316 DWORD delimiterLength=lstrlenW(This->itemDelimiter)+1; 317 DWORD nameLength=lstrlenW(This->itemName)+1; 318 319 TRACE("(%p,%p)\n",iface,pcbSize); 320 321 if (pcbSize!=NULL) 322 return E_POINTER; 323 324 /* for more details see ItemMonikerImpl_Save coments */ 325 326 pcbSize->LowPart = sizeof(DWORD) + /* DWORD witch contains delimiter length */ 327 delimiterLength + /* item delimiter string */ 328 sizeof(DWORD) + /* DWORD witch contains item name length */ 329 nameLength + /* item name string */ 330 34; /* this constant was added ! because when I tested this function it usually */ 331 /* returns 34 bytes more than the number of bytes used by IMoniker::Save function */ 332 pcbSize->HighPart=0; 333 337 if (pcbSize==NULL) 338 return E_POINTER; 339 340 /* SizeMax = 4 * SizeToSave - 6 */ 341 ItemMonikerImpl_GetSizeToSave(iface,pcbSize); 342 pcbSize->LowPart = 4 * pcbSize->LowPart - 6; 343 pcbSize->HighPart = 0; 344 345 TRACE("(iface:%p pcbSize:(LowPart:%ld - HighPart:0))\n",iface,pcbSize->LowPart); 334 346 return S_OK; 335 347 } 348 349 HRESULT ItemMonikerImpl_GetSizeToSave(IMoniker* iface,ULARGE_INTEGER* pcbSize) 350 { 351 ICOM_THIS(ItemMonikerImpl,iface); 352 DWORD delimiterLength = This->itemDelimiter ? lstrlenW(This->itemDelimiter) + 1 : 0; 353 DWORD itemLength = This->itemName ? lstrlenW(This->itemName) + 1 : 0; 354 355 if (pcbSize==NULL) 356 return E_POINTER; 357 358 pcbSize->LowPart = sizeof(DWORD) + /* DWORD witch contains delimiter length */ 359 delimiterLength + /* item delimiter string */ 360 sizeof(DWORD) + /* DWORD witch contains item name length */ 361 itemLength; /* item string */ 362 pcbSize->HighPart = 0; 363 364 return S_OK; 365 } 366 336 367 337 368 /****************************************************************************** … … 340 371 HRESULT WINAPI ItemMonikerImpl_Construct(ItemMonikerImpl* This, LPCOLESTR lpszDelim,LPCOLESTR lpszItem) 341 372 { 342 343 int sizeStr1=lstrlenW(lpszItem); 344 int sizeStr2=lstrlenW(lpszDelim); 345 346 TRACE("(%p,%p)\n",This,lpszItem); 347 348 /* Initialize the virtual fgunction table. */ 373 /* Initialize the virtual function table. */ 349 374 This->lpvtbl1 = &VT_ItemMonikerImpl; 350 375 This->lpvtbl2 = &VT_ROTDataImpl; 351 376 This->ref = 0; 352 377 353 This->itemName= (WCHAR *)HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(sizeStr1+1)); 354 This->itemDelimiter= (WCHAR *)HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(sizeStr2+1)); 355 356 if ((This->itemName==NULL)||(This->itemDelimiter==NULL)) 357 return E_OUTOFMEMORY; 358 359 lstrcpyW(This->itemName,lpszItem); 360 lstrcpyW(This->itemDelimiter,lpszDelim); 361 378 This->itemName = 0; 379 This->itemDelimiter = 0; 380 381 if (lpszItem){ 382 This->itemName = (WCHAR *)HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(lstrlenW(lpszItem)+1)); 383 if (!This->itemName) 384 return E_OUTOFMEMORY; 385 lstrcpyW(This->itemName,lpszItem); 386 } 387 if (lpszDelim){ 388 This->itemDelimiter = (WCHAR *)HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(lstrlenW(lpszDelim)+1)); 389 if (!This->itemDelimiter) 390 return E_OUTOFMEMORY; 391 lstrcpyW(This->itemDelimiter,lpszDelim); 392 } 362 393 return S_OK; 394 363 395 } 364 396 … … 801 833 return E_OUTOFMEMORY; 802 834 803 lstrcpyW(*ppszDisplayName,This->itemDelimiter); 804 lstrcatW(*ppszDisplayName,This->itemName); 835 if (This->itemDelimiter) lstrcatW(*ppszDisplayName,This->itemDelimiter); 836 if (This->itemName) lstrcatW(*ppszDisplayName,This->itemName); 837 838 TRACE("(iface:%p, pbc:%p, pmkToLeft:%p, ppszDisplayName:%s)\n",iface,pbc,pmkToLeft,debugstr_w(*ppszDisplayName)); 839 805 840 806 841 return S_OK;
Note:
See TracChangeset
for help on using the changeset viewer.