Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

509 lines
11 KiB

  1. /*++
  2. Copyright (c) 1994 Microsoft Corporation
  3. Module Name:
  4. cacheapi.cxx
  5. Abstract:
  6. contains the URL cache mangemant APIs.
  7. Author:
  8. Madan Appiah (madana) 12-Dec-1994
  9. Environment:
  10. User Mode - Win32
  11. Revision History:
  12. Shishir Pardikar (shishirp) added: (as of 7/6/96)
  13. 1) Prefixed containers for supporting cookies and history
  14. 2) Default init, for distributing winint without setup
  15. 3) Crossprocess versionchecking scheme to allow all wininets
  16. to know about registry change
  17. --*/
  18. #include <cache.hxx>
  19. #include <time.h>
  20. #include <resource.h>
  21. URLCACHEAPI_(BOOL) UnlockUrlCacheEntryStream(
  22. HANDLE hStream,
  23. IN DWORD dwReserved
  24. )
  25. /*++
  26. Routine Description:
  27. This API checks in the file that was check out as part of
  28. RetrieveUrlFile API.
  29. Arguments:
  30. hStreamHandle : stream handle returned by a RetrieveUrlCacheEntryStream call.
  31. dwReserved : reserved for future use.
  32. Return Value:
  33. Windows Error code.
  34. --*/
  35. {
  36. ENTER_CACHE_API ((DBG_API, Bool, "UnlockUrlCacheEntryStream",
  37. "%#x, %#x", hStream, dwReserved))
  38. DWORD Error;
  39. // Map and validate handle.
  40. CACHE_STREAM_CONTEXT_HANDLE *pStream;
  41. LOCK_CACHE();
  42. pStream = (CACHE_STREAM_CONTEXT_HANDLE *) HandleMgr.Map(hStream);
  43. UNLOCK_CACHE();
  44. if (!pStream)
  45. {
  46. Error = ERROR_INVALID_HANDLE;
  47. goto Cleanup;
  48. }
  49. TcpsvcsDbgAssert(pStream->SourceUrlName != NULL );
  50. //
  51. // close file handle.
  52. //
  53. CloseHandle( pStream->FileHandle );
  54. //
  55. // unlock cache file.
  56. //
  57. if(!UnlockUrlCacheEntryFile(pStream->SourceUrlName, dwReserved) )
  58. Error = GetLastError();
  59. else
  60. Error = ERROR_SUCCESS;
  61. //
  62. // freeup url name data buffer.
  63. //
  64. FREE_MEMORY (pStream->SourceUrlName);
  65. //
  66. // free up context structure.
  67. //
  68. LOCK_CACHE();
  69. HandleMgr.Free (hStream);
  70. UNLOCK_CACHE();
  71. LEAVE_CACHE_API();
  72. }
  73. URLCACHEAPI_(BOOL) ReadUrlCacheEntryStream(
  74. IN HANDLE hStream,
  75. IN DWORD dwLocation,
  76. IN OUT LPVOID lpBuffer,
  77. IN OUT LPDWORD lpdwLen,
  78. IN DWORD Reserved
  79. )
  80. /*++
  81. Routine Description:
  82. This API provides a method of reading the cached data from a stream
  83. which has been opened using the RetrieveUrlCacheEntryStream API.
  84. Arguments:
  85. hStream : Handle that was returned by the RetrieveCacheEntryStream API.
  86. dwLocation : file offset to read from.
  87. lpBuffer : Pointer to a buffer where the data is read.
  88. lpdwLen : Pointer to a DWORD location where the length of the above buffer passed in, on return it contains the actual length of the data read.
  89. dwReserved : For future use.
  90. Return Value:
  91. Windows Error code.
  92. --*/
  93. {
  94. ENTER_CACHE_API ((DBG_API, Bool, "ReadUrlCacheEntryStream",
  95. "%#x, %d, %#x, %#x, %#x", hStream, dwLocation, lpBuffer, lpdwLen, Reserved));
  96. DWORD Error;
  97. // Map and validate handle.
  98. CACHE_STREAM_CONTEXT_HANDLE* pStream;
  99. LOCK_CACHE();
  100. pStream = (CACHE_STREAM_CONTEXT_HANDLE*) HandleMgr.Map(hStream);
  101. UNLOCK_CACHE();
  102. if (!pStream)
  103. {
  104. Error = ERROR_INVALID_HANDLE;
  105. goto Cleanup;
  106. }
  107. TcpsvcsDbgAssert( pStream->SourceUrlName);
  108. // PERFPERF: should we remember position to avoid this call?
  109. if ((DWORD) -1L == SetFilePointer
  110. (pStream->FileHandle, dwLocation, NULL, FILE_BEGIN))
  111. {
  112. Error = GetLastError();
  113. goto Cleanup;
  114. }
  115. if( !ReadFile
  116. (pStream->FileHandle, lpBuffer, *lpdwLen, lpdwLen, NULL ) )
  117. {
  118. Error = GetLastError();
  119. goto Cleanup;
  120. }
  121. Error = ERROR_SUCCESS;
  122. LEAVE_CACHE_API();
  123. }
  124. URLCACHEAPI_(BOOL) FindCloseUrlCache(
  125. IN HANDLE hFind
  126. )
  127. /*++
  128. Routine Description:
  129. This member function returns the next entry in the cache.
  130. Arguments:
  131. hEnumHandle : Find First handle.
  132. Return Value:
  133. Returns the find first handle. If the returned handle is NULL,
  134. GetLastError() returns the extended error code. It returns
  135. ERROR_NO_MORE_ITEMS after it returns the last entry in the cache.
  136. --*/
  137. {
  138. ENTER_CACHE_API ((DBG_API, Bool, "FindCloseUrlCache",
  139. "%#x", hFind));
  140. DWORD Error;
  141. Error = GlobalUrlContainers->FreeFindHandle(hFind);
  142. if (Error != ERROR_SUCCESS)
  143. {
  144. SetLastError( Error );
  145. DEBUG_ERROR(INET, Error);
  146. }
  147. DEBUG_LEAVE_API (Error==ERROR_SUCCESS);
  148. return (Error==ERROR_SUCCESS);
  149. }
  150. BOOL
  151. GetCurrentSettingsVersion(LPDWORD lpdwVer) {
  152. // Initialize globals
  153. if (!InitGlobals())
  154. {
  155. SetLastError (ERROR_INTERNET_INTERNAL_ERROR);
  156. return FALSE;
  157. }
  158. return GlobalUrlContainers->GetHeaderData(CACHE_HEADER_DATA_CURRENT_SETTINGS_VERSION,
  159. lpdwVer);
  160. }
  161. BOOL
  162. IncrementCurrentSettingsVersion(LPDWORD lpdwVer) {
  163. if (!InitGlobals())
  164. {
  165. SetLastError (ERROR_INTERNET_INTERNAL_ERROR);
  166. return FALSE;
  167. }
  168. return GlobalUrlContainers->IncrementHeaderData(CACHE_HEADER_DATA_CURRENT_SETTINGS_VERSION,
  169. lpdwVer);
  170. }
  171. BOOL
  172. GetUrlCacheHeaderData(IN DWORD nIdx, OUT LPDWORD lpdwData)
  173. {
  174. if (!InitGlobals())
  175. {
  176. SetLastError (ERROR_INTERNET_INTERNAL_ERROR);
  177. return FALSE;
  178. }
  179. return GlobalUrlContainers->GetHeaderData(nIdx, lpdwData);
  180. }
  181. BOOL
  182. SetUrlCacheHeaderData(IN DWORD nIdx, IN DWORD dwData)
  183. {
  184. if (!InitGlobals())
  185. {
  186. SetLastError (ERROR_INTERNET_INTERNAL_ERROR);
  187. return FALSE;
  188. }
  189. return GlobalUrlContainers->SetHeaderData(nIdx, dwData);
  190. }
  191. BOOL
  192. IncrementUrlCacheHeaderData(IN DWORD nIdx, OUT LPDWORD lpdwData)
  193. {
  194. if (!InitGlobals())
  195. {
  196. SetLastError (ERROR_INTERNET_INTERNAL_ERROR);
  197. return FALSE;
  198. }
  199. return GlobalUrlContainers->IncrementHeaderData(nIdx, lpdwData);
  200. }
  201. BOOL
  202. LoadUrlCacheContent(VOID)
  203. {
  204. DWORD dwError;
  205. if (!InitGlobals())
  206. {
  207. SetLastError(ERROR_INTERNET_INTERNAL_ERROR);
  208. return FALSE;
  209. }
  210. dwError = GlobalUrlContainers->LoadContent();
  211. if (dwError == ERROR_SUCCESS)
  212. return TRUE;
  213. SetLastError(dwError);
  214. return FALSE;
  215. }
  216. BOOL
  217. GetUrlCacheContainerInfo(
  218. IN LPSTR lpszUrlName,
  219. OUT LPINTERNET_CACHE_CONTAINER_INFOA lpContainerInfo,
  220. IN OUT LPDWORD lpdwContainerInfoBufferSize,
  221. IN DWORD dwOptions
  222. )
  223. {
  224. DWORD dwError;
  225. // Initialize globals.
  226. if (!InitGlobals())
  227. {
  228. SetLastError(ERROR_INTERNET_INTERNAL_ERROR);
  229. return FALSE;
  230. }
  231. dwError = GlobalUrlContainers->GetContainerInfo(lpszUrlName,
  232. lpContainerInfo, lpdwContainerInfoBufferSize);
  233. if (dwError == ERROR_SUCCESS)
  234. return TRUE;
  235. SetLastError(dwError);
  236. return FALSE;
  237. }
  238. BOOL
  239. UpdateUrlCacheContentPath(
  240. IN LPSTR lpszNewPath
  241. )
  242. {
  243. ENTER_CACHE_API ((DBG_API, Bool, "UpdateUrlCacheContentPath", "%q", lpszNewPath));
  244. INET_ASSERT(GlobalCacheInitialized);
  245. BOOL fResult = GlobalUrlContainers->SetContentPath(lpszNewPath);
  246. DEBUG_LEAVE_API(fResult);
  247. return fResult;
  248. }
  249. INTERNETAPI_(GROUPID) CreateUrlCacheGroup(
  250. IN DWORD dwFlags,
  251. IN LPVOID lpReserved // must pass NULL
  252. )
  253. {
  254. ENTER_CACHE_API ((DBG_API, Bool, "CreateUrlCacheGroup", "%#x, %#x", dwFlags, lpReserved));
  255. GROUPID gid = 0;
  256. DWORD Error;
  257. // Initialize globals
  258. if (!InitGlobals())
  259. {
  260. Error = ERROR_INTERNET_INTERNAL_ERROR;
  261. goto Cleanup;
  262. }
  263. Error = GlobalUrlContainers->CreateGroup(dwFlags, &gid);
  264. Cleanup:
  265. if( Error != ERROR_SUCCESS )
  266. {
  267. SetLastError(Error);
  268. DEBUG_ERROR(API, Error);
  269. }
  270. DEBUG_LEAVE_API(gid);
  271. return gid;
  272. }
  273. BOOLAPI DeleteUrlCacheGroup(
  274. IN GROUPID GroupId,
  275. IN DWORD dwFlags, // must pass 0
  276. IN LPVOID lpReserved // must pass NULL
  277. )
  278. {
  279. ENTER_CACHE_API ((DBG_API, Bool, "DeleteUrlCacheGroup", "%#x, %#x, %#x", GroupId, dwFlags, lpReserved));
  280. DWORD Error;
  281. // Initialize globals
  282. if (!InitGlobals())
  283. {
  284. Error = ERROR_INTERNET_INTERNAL_ERROR;
  285. goto Cleanup;
  286. }
  287. Error = GlobalUrlContainers->DeleteGroup(GroupId, dwFlags);
  288. LEAVE_CACHE_API();
  289. }
  290. URLCACHEAPI_(HANDLE) FindFirstUrlCacheGroup(
  291. IN DWORD dwFlags,
  292. IN DWORD dwFilter,
  293. IN LPVOID lpSearchCondition,
  294. IN DWORD dwSearchCondition,
  295. OUT GROUPID* lpGroupId,
  296. IN OUT LPVOID lpReserved
  297. )
  298. {
  299. ENTER_CACHE_API ((DBG_API, Handle, "FindFirstUrlCacheGroup",
  300. "%d, %d, %#x, %d, %#x, %#x",
  301. dwFlags, dwFilter, lpSearchCondition,
  302. dwSearchCondition, lpGroupId, lpReserved ));
  303. DWORD Error;
  304. HANDLE hFind = 0;
  305. // Validate parameters.
  306. if( !lpGroupId )
  307. {
  308. Error = ERROR_INVALID_PARAMETER;
  309. goto Cleanup;
  310. }
  311. // Initialize globals.
  312. if (!InitGlobals())
  313. {
  314. Error = ERROR_INTERNET_INTERNAL_ERROR;
  315. goto Cleanup;
  316. }
  317. // Get the first entry.
  318. Error = GlobalUrlContainers->FindNextGroup(&hFind, dwFlags, lpGroupId);
  319. Cleanup:
  320. if( Error != ERROR_SUCCESS )
  321. {
  322. GlobalUrlContainers->FreeFindHandle(hFind);
  323. SetLastError(Error);
  324. DEBUG_ERROR(API, Error);
  325. hFind = NULL;
  326. }
  327. INET_ASSERT (hFind);
  328. DEBUG_LEAVE_API (hFind);
  329. return hFind;
  330. }
  331. URLCACHEAPI_(BOOL) FindNextUrlCacheGroup(
  332. IN HANDLE hFind,
  333. OUT GROUPID* lpGroupId,
  334. IN OUT LPVOID lpReserved
  335. )
  336. {
  337. ENTER_CACHE_API ((DBG_API, Bool, "FindNextUrlCacheGroup",
  338. "%#x, %#x, %#x", hFind, lpGroupId, lpReserved ));
  339. DWORD Error;
  340. // Validate parameters.
  341. if( !lpGroupId )
  342. {
  343. Error = ERROR_INVALID_PARAMETER;
  344. goto Cleanup;
  345. }
  346. // Initialize globals.
  347. if (!InitGlobals())
  348. {
  349. Error = ERROR_INTERNET_INTERNAL_ERROR;
  350. goto Cleanup;
  351. }
  352. // Get the next entry.
  353. Error = GlobalUrlContainers->FindNextGroup(&hFind, 0, lpGroupId);
  354. LEAVE_CACHE_API();
  355. }
  356. BOOL
  357. AnyFindsInProgress(DWORD ContainerID)
  358. {
  359. LOCK_CACHE();
  360. BOOL fInProgress = HandleMgr.InUse();
  361. UNLOCK_CACHE();
  362. return fInProgress;
  363. }
  364. BOOLAPI
  365. RegisterUrlCacheNotification(
  366. HWND hWnd,
  367. UINT uMsg,
  368. GROUPID gid,
  369. DWORD dwFilter,
  370. DWORD dwReserve
  371. )
  372. {
  373. DWORD Error;
  374. ENTER_CACHE_API ((DBG_API, Bool, "RegisterUrlCacheNotification",
  375. "%#x,,%#x, %#x, %#x, %#x", hWnd, uMsg, gid, dwFilter, dwReserve));
  376. // Initialize globals.
  377. if (!InitGlobals())
  378. {
  379. Error = ERROR_INTERNET_INTERNAL_ERROR;
  380. goto Cleanup;
  381. }
  382. Error = GlobalUrlContainers->RegisterCacheNotify(hWnd, uMsg, gid, dwFilter);
  383. LEAVE_CACHE_API();
  384. }