Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenenumlist.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
1.7.6.1
|