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.

179 lines
4.5 KiB

  1. /*++
  2. Copyright (c) 2001 Microsoft Corporation
  3. Module Name:
  4. cachehndl.cxx
  5. Abstract:
  6. Cache handle manager for creating, deleting, reference counting,
  7. and mapping HINTERNET objects to HTTPCACHE_REQUEST objects
  8. Author:
  9. Revision History:
  10. --*/
  11. /*
  12. Class CACHE_HANDLE_MANAGER public interface:
  13. BOOL AddCacheRequestObject(HINTERNET hRequest);
  14. BOOL GetCacheRequestObject(HINTERNET hRequest, HTTPCACHE_REQUEST* CacheRequest);
  15. BOOL RemoveCacheRequestObject(HINTERNET hRequest);
  16. CACHE_HANDLE_MANAGER();
  17. ~CACHE_HANDLE_MANAGER();
  18. */
  19. #include <wininetp.h>
  20. #define __CACHE_INCLUDE__
  21. #include "..\urlcache\cache.hxx"
  22. #include "cachelogic.hxx"
  23. #include "cachehndl.hxx"
  24. /*
  25. We'll also let the handle manager takes care of the work of loading and unloading
  26. the URLCACHE library
  27. */
  28. CACHE_HANDLE_MANAGER::CACHE_HANDLE_MANAGER()
  29. {
  30. HeadCacheRequestList = NULL;
  31. dwRefCount = 0;
  32. HndlMgrCritSec.Init();
  33. DLLUrlCacheEntry(DLL_PROCESS_ATTACH);
  34. }
  35. CACHE_HANDLE_MANAGER::~CACHE_HANDLE_MANAGER()
  36. {
  37. HndlMgrCritSec.FreeLock();
  38. DLLUrlCacheEntry(DLL_PROCESS_DETACH);
  39. }
  40. // Precondition: hRequest really is a HTTP_REQUEST_HANDLE_OBJECT.
  41. BOOL CACHE_HANDLE_MANAGER::AddCacheRequestObject(HINTERNET hRequest)
  42. {
  43. DWORD dwHandleType;
  44. DWORD dwSize = sizeof(DWORD);
  45. DWORD fResult = FALSE;
  46. HndlMgrCritSec.Lock();
  47. if (hRequest == NULL)
  48. goto quit;
  49. // If you try to give me a Connect or Session handle and try to trick me into
  50. // thinking that it's a Request handle, then I'll fail you!
  51. WinHttpQueryOption(hRequest, WINHTTP_OPTION_HANDLE_TYPE, &dwHandleType, &dwSize);
  52. if (dwHandleType != WINHTTP_HANDLE_TYPE_REQUEST)
  53. goto quit;
  54. // We don't add another hInternet->HTTPCACHE_REQUEST mapping if one already exists
  55. if (GetCacheRequestObject(hRequest) != NULL)
  56. goto quit;
  57. // Traverse to the end of the list
  58. CACHE_REQUEST_LIST * CurCacheRequestList = HeadCacheRequestList;
  59. if (HeadCacheRequestList != NULL)
  60. {
  61. for (;;)
  62. {
  63. if (CurCacheRequestList->next == NULL)
  64. break;
  65. CurCacheRequestList = CurCacheRequestList->next;
  66. }
  67. if ((CurCacheRequestList->next = new CACHE_REQUEST_LIST(hRequest)) != NULL)
  68. {
  69. dwRefCount++;
  70. fResult = TRUE;
  71. goto quit;
  72. }
  73. }
  74. else
  75. {
  76. if ((HeadCacheRequestList = new CACHE_REQUEST_LIST(hRequest)) != NULL)
  77. {
  78. dwRefCount++;
  79. fResult = TRUE;
  80. goto quit;
  81. }
  82. }
  83. quit:
  84. HndlMgrCritSec.Unlock();
  85. return fResult;
  86. }
  87. HTTPCACHE_REQUEST * CACHE_HANDLE_MANAGER::GetCacheRequestObject(HINTERNET hRequest)
  88. {
  89. CACHE_REQUEST_LIST * CurCacheRequestList = HeadCacheRequestList;
  90. while (CurCacheRequestList != NULL)
  91. {
  92. if (CurCacheRequestList->CacheRequestObj->GetRequestHandle() == hRequest)
  93. {
  94. return CurCacheRequestList->CacheRequestObj;
  95. }
  96. CurCacheRequestList = CurCacheRequestList->next;
  97. }
  98. return NULL;
  99. }
  100. BOOL CACHE_HANDLE_MANAGER::RemoveCacheRequestObject(HINTERNET hRequest)
  101. {
  102. if (HeadCacheRequestList == NULL)
  103. return FALSE;
  104. CACHE_REQUEST_LIST * CurCacheRequestList = HeadCacheRequestList;
  105. if (HeadCacheRequestList->CacheRequestObj->GetRequestHandle() == hRequest)
  106. {
  107. HndlMgrCritSec.Lock();
  108. HeadCacheRequestList = HeadCacheRequestList->next;
  109. delete CurCacheRequestList;
  110. CurCacheRequestList = NULL;
  111. dwRefCount--;
  112. HndlMgrCritSec.Unlock();
  113. return TRUE;
  114. }
  115. while (CurCacheRequestList->next != NULL)
  116. {
  117. if (CurCacheRequestList->next->CacheRequestObj->GetRequestHandle() == hRequest)
  118. {
  119. HndlMgrCritSec.Lock();
  120. CACHE_REQUEST_LIST * DeleteCacheRequestList = CurCacheRequestList->next;
  121. if (CurCacheRequestList->next->next == NULL)
  122. CurCacheRequestList->next = NULL;
  123. else
  124. CurCacheRequestList->next = CurCacheRequestList->next->next;
  125. delete DeleteCacheRequestList;
  126. DeleteCacheRequestList = NULL;
  127. dwRefCount--;
  128. HndlMgrCritSec.Unlock();
  129. return TRUE;
  130. }
  131. CurCacheRequestList = CurCacheRequestList->next;
  132. }
  133. return FALSE;
  134. }