ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

enumlist.cpp
Go to the documentation of this file.
00001 #include <precomp.h>
00002 
00003 WINE_DEFAULT_DEBUG_CHANNEL(shell);
00004 
00005 /**************************************************************************
00006  *  AddToEnumList()
00007  */
00008 BOOL 
00009 CEnumIDList::AddToEnumList(LPITEMIDLIST pidl)
00010 {
00011     LPENUMLIST pNew;
00012 
00013     if (!pidl)
00014         return FALSE;
00015 
00016     pNew = (LPENUMLIST)SHAlloc(sizeof(ENUMLIST));
00017     if(pNew)
00018     {
00019         pNew->pNext = NULL;
00020         pNew->pidl = pidl;
00021 
00022         if(!mpFirst)
00023         {
00024             mpFirst = pNew;
00025             mpCurrent = pNew;
00026         }
00027 
00028         if(mpLast)
00029         {
00030             /*add the new item to the end of the list */
00031             mpLast->pNext = pNew;
00032         }
00033 
00034         /*update the last item pointer */
00035         mpLast = pNew;
00036         return TRUE;
00037     }
00038     return FALSE;
00039 }
00040 
00041 CEnumIDList::CEnumIDList()
00042 {
00043     ref = 0;
00044     mpCurrent = NULL;
00045     mpLast = NULL;
00046     mpFirst = NULL;
00047 }
00048 
00049 HRESULT
00050 WINAPI
00051 CEnumIDList::QueryInterface(
00052     REFIID riid,
00053     LPVOID *ppvObj)
00054 {
00055     *ppvObj = NULL;
00056 
00057     if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IEnumIDList))
00058     {
00059         *ppvObj = (IEnumIDList*)this;
00060         AddRef();
00061         return S_OK;
00062     }
00063 
00064     return E_NOINTERFACE;
00065 }
00066 
00067 ULONG
00068 WINAPI
00069 CEnumIDList::AddRef()
00070 {
00071     ULONG refCount = InterlockedIncrement(&ref);
00072 
00073     return refCount;
00074 }
00075 
00076 ULONG
00077 WINAPI CEnumIDList::Release()
00078 {
00079     LPENUMLIST pDelete;
00080     ULONG refCount = InterlockedDecrement(&ref);
00081 
00082     if (!refCount) 
00083     {
00084         while (mpFirst)
00085         {
00086             pDelete = mpFirst;
00087             mpFirst = pDelete->pNext;
00088             SHFree(pDelete->pidl);
00089             SHFree(pDelete);
00090         }
00091         delete this;
00092     }
00093     return refCount;
00094 }
00095 
00096 HRESULT
00097 WINAPI
00098 CEnumIDList::Next(
00099     ULONG celt,
00100     LPITEMIDLIST * rgelt,
00101     ULONG *pceltFetched)
00102 {
00103     ULONG i;
00104     HRESULT hr = S_OK;
00105     LPITEMIDLIST temp;
00106 
00107     if(pceltFetched)
00108         *pceltFetched = 0;
00109 
00110     *rgelt=0;
00111 
00112     if (celt > 1 && !pceltFetched)
00113     {
00114         return E_INVALIDARG;
00115     }
00116 
00117     if (celt > 0 && !mpCurrent)
00118     {
00119         return S_FALSE;
00120     }
00121 
00122     for (i = 0; i < celt; i++)
00123     {
00124         if (!mpCurrent)
00125             break;
00126 
00127         temp = ILClone(mpCurrent->pidl);
00128         rgelt[i] = temp;
00129         mpCurrent = mpCurrent->pNext;
00130     }
00131 
00132     if (pceltFetched)
00133         *pceltFetched = i;
00134 
00135     return hr;
00136 }
00137 
00138 HRESULT
00139 WINAPI
00140 CEnumIDList::Skip(ULONG celt)
00141 {
00142     DWORD dwIndex;
00143     HRESULT hr = S_OK;
00144 
00145     for (dwIndex = 0; dwIndex < celt; dwIndex++)
00146     {
00147         if (!mpCurrent)
00148         {
00149             hr = S_FALSE;
00150             break;
00151         }
00152         mpCurrent = mpCurrent->pNext;
00153     }
00154 
00155     return hr;
00156 }
00157 
00158 HRESULT
00159 WINAPI
00160 CEnumIDList::Reset()
00161 {
00162     mpCurrent = mpFirst;
00163     return S_OK;
00164 }
00165 
00166 HRESULT
00167 WINAPI
00168 CEnumIDList::Clone(
00169     LPENUMIDLIST * ppenum)
00170 {
00171     //IEnumIDListImpl *This = (IEnumIDListImpl *)iface;
00172 
00173     return E_NOTIMPL;
00174 }
00175 
00176 LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
00177 {
00178     if(pidl && pidl->mkid.cb != 0x00)
00179         return (LPPIDLDATA) &(pidl->mkid.abID);
00180     return NULL;
00181 }
00182 
00183 LPITEMIDLIST _ILAlloc(BYTE type, unsigned int size)
00184 {
00185     LPITEMIDLIST pidlOut = NULL;
00186 
00187     pidlOut = (LPITEMIDLIST)SHAlloc(size + 5);
00188     if(pidlOut)
00189     {
00190         LPPIDLDATA pData;
00191 
00192         ZeroMemory(pidlOut, size + 5);
00193         pidlOut->mkid.cb = size + 3;
00194         pData = _ILGetDataPointer(pidlOut);
00195         if (pData)
00196             pData->type = type;
00197 
00198     }
00199 
00200     return pidlOut;
00201 }
00202 
00203 LPITEMIDLIST _ILCreateNetConnect()
00204 {
00205     LPITEMIDLIST pidlOut;
00206 
00207     pidlOut = _ILAlloc(PT_GUID, sizeof(PIDLDATA));
00208     if (pidlOut)
00209     {
00210         LPPIDLDATA pData = _ILGetDataPointer(pidlOut);
00211 
00212         memcpy(&(pData->u.guid.guid), &CLSID_NetworkConnections, sizeof(GUID));
00213     }
00214     return pidlOut;
00215 }
00216 
00217 IID* _ILGetGUIDPointer(LPCITEMIDLIST pidl)
00218 {
00219     LPPIDLDATA pdata =_ILGetDataPointer(pidl);
00220 
00221     if (!pdata)
00222         return NULL;
00223 
00224     if (pdata->type != PT_GUID)
00225         return NULL;
00226     else
00227         return &(pdata->u.guid.guid);
00228 
00229 }
00230 
00231 BOOL _ILIsNetConnect(LPCITEMIDLIST pidl)
00232 {
00233     IID *piid = _ILGetGUIDPointer(pidl);
00234 
00235     if (piid)
00236         return IsEqualIID(*piid, CLSID_NetworkConnections);
00237 
00238     return FALSE;
00239 }
00240 
00241 LPITEMIDLIST ILCreateNetConnectItem(INetConnection * pItem)
00242 {
00243     LPITEMIDLIST pidl;
00244     LPPIDLDATA pdata;
00245 
00246     pidl = _ILAlloc(0x99, sizeof(PIDLDATA));
00247     pdata = _ILGetDataPointer(pidl);
00248     pdata->u.value.pItem = (INetConnection*)pItem;
00249 
00250     return pidl;
00251 }
00252 
00253 VALUEStruct * _ILGetValueStruct(LPCITEMIDLIST pidl)
00254 {
00255     LPPIDLDATA pdata = _ILGetDataPointer(pidl);
00256 
00257     if (pdata && pdata->type==0x99)
00258         return (VALUEStruct*)&(pdata->u.value);
00259 
00260     return NULL;
00261 }

Generated on Sat May 26 2012 04:24:01 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.