Ignore:
Timestamp:
Sep 17, 2000, 12:31:07 PM (25 years ago)
Author:
davidr
Message:

Updates from wine

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:43 davidr Exp $ */
     1/* $Id: itemmoniker.cpp,v 1.2 2000-09-17 10:31:04 davidr Exp $ */
    22/*
    33 *  ItemMonikers implementation
     
    1515#include <assert.h>
    1616
    17 DEFAULT_DEBUG_CHANNEL(ole)
     17DEFAULT_DEBUG_CHANNEL(moniker)
    1818
    1919/* ItemMoniker data structure */
     
    7272HRESULT WINAPI ItemMonikerImpl_Construct(ItemMonikerImpl* iface, LPCOLESTR lpszDelim,LPCOLESTR lpszPathName);
    7373HRESULT WINAPI ItemMonikerImpl_Destroy(ItemMonikerImpl* iface);
     74HRESULT ItemMonikerImpl_GetSizeToSave(IMoniker* iface,ULARGE_INTEGER* pcbSize);
    7475
    7576/********************************************************************************/
     
    245246
    246247    /* 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))
    250250        return E_FAIL;
    251251
    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
    257265
    258266    /* read item name string length + 1*/
     
    262270
    263271    /* 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    }
    274284
    275285    return res;
     
    285295    ICOM_THIS(ItemMonikerImpl,iface);
    286296    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;
    290300
    291301    /* data writen by this function are : 1) DWORD : size of item delimiter string ('\0' included ) */
     
    294304    /*                                    4) String (type A): item name string ('\0' included)               */
    295305
    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    }
    300317
    301318    res=IStream_Write(pStm,&delimiterLength,sizeof(DWORD),NULL);
    302319    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);
    305327
    306328    return res;
     
    313335                                          ULARGE_INTEGER* pcbSize)/* Pointer to size of stream needed to save object */
    314336{
    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);
    334346    return S_OK;
    335347}
     348
     349HRESULT 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
    336367
    337368/******************************************************************************
     
    340371HRESULT WINAPI ItemMonikerImpl_Construct(ItemMonikerImpl* This, LPCOLESTR lpszDelim,LPCOLESTR lpszItem)
    341372{
    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. */
    349374    This->lpvtbl1      = &VT_ItemMonikerImpl;
    350375    This->lpvtbl2      = &VT_ROTDataImpl;
    351376    This->ref          = 0;
    352377
    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    }
    362393    return S_OK;
     394
    363395}
    364396
     
    801833        return E_OUTOFMEMORY;
    802834
    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
    805840   
    806841    return S_OK;
Note: See TracChangeset for help on using the changeset viewer.