| OLD | NEW |
| (Empty) |
| 1 // Copyright 2007-2009 Google Inc. | |
| 2 // | |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
| 4 // you may not use this file except in compliance with the License. | |
| 5 // You may obtain a copy of the License at | |
| 6 // | |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | |
| 8 // | |
| 9 // Unless required by applicable law or agreed to in writing, software | |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 12 // See the License for the specific language governing permissions and | |
| 13 // limitations under the License. | |
| 14 // ======================================================================== | |
| 15 | |
| 16 // | |
| 17 // WinHttpVTable provides dynamic loading of winhttp.dll. | |
| 18 | |
| 19 // Runtime requirements: WinHTTP 5.1 is now an operating-system component of | |
| 20 // the following systems: | |
| 21 // - Windows Vista | |
| 22 // - Windows Server 2003 family | |
| 23 // - Windows XP SP1 | |
| 24 // - Windows 2000 SP3 (except Datacenter Server) | |
| 25 | |
| 26 #ifndef OMAHA_NET_WINHTTP_VTABLE_H__ | |
| 27 #define OMAHA_NET_WINHTTP_VTABLE_H__ | |
| 28 | |
| 29 #include <windows.h> | |
| 30 #include <winhttp.h> | |
| 31 #include "omaha/base/debug.h" | |
| 32 | |
| 33 namespace omaha { | |
| 34 | |
| 35 class WinHttpVTable { | |
| 36 public: | |
| 37 BOOL WinHttpAddRequestHeaders(HINTERNET, const TCHAR*, DWORD, DWORD); | |
| 38 BOOL WinHttpCheckPlatform(); | |
| 39 BOOL WinHttpCloseHandle(HINTERNET); | |
| 40 HINTERNET WinHttpConnect(HINTERNET, const TCHAR*, INTERNET_PORT, DWORD); | |
| 41 BOOL WinHttpCrackUrl(const TCHAR*, DWORD, DWORD, URL_COMPONENTS*); | |
| 42 BOOL WinHttpCreateUrl(URL_COMPONENTS*, DWORD, TCHAR*, DWORD*); | |
| 43 BOOL WinHttpGetDefaultProxyConfiguration(WINHTTP_PROXY_INFO*); | |
| 44 BOOL WinHttpGetIEProxyConfigForCurrentUser( | |
| 45 WINHTTP_CURRENT_USER_IE_PROXY_CONFIG*); | |
| 46 HINTERNET WinHttpOpen(const TCHAR*, DWORD, const TCHAR*, const TCHAR*, DWORD); | |
| 47 HINTERNET WinHttpOpenRequest(HINTERNET, | |
| 48 const TCHAR*, | |
| 49 const TCHAR*, | |
| 50 const TCHAR*, | |
| 51 const TCHAR*, | |
| 52 const TCHAR**, | |
| 53 DWORD); | |
| 54 BOOL WinHttpQueryAuthSchemes(HINTERNET, DWORD*, DWORD*, DWORD*); | |
| 55 BOOL WinHttpQueryDataAvailable(HINTERNET, DWORD*); | |
| 56 BOOL WinHttpQueryHeaders(HINTERNET, | |
| 57 DWORD, | |
| 58 const TCHAR*, | |
| 59 void*, | |
| 60 DWORD*, | |
| 61 DWORD*); | |
| 62 BOOL WinHttpQueryOption(HINTERNET, DWORD, void*, DWORD*); | |
| 63 BOOL WinHttpReadData(HINTERNET, void*, DWORD, DWORD*); | |
| 64 BOOL WinHttpWriteData(HINTERNET, const void*, DWORD, DWORD*); | |
| 65 BOOL WinHttpReceiveResponse(HINTERNET, void*); | |
| 66 BOOL WinHttpSendRequest(HINTERNET, | |
| 67 const TCHAR*, | |
| 68 DWORD, | |
| 69 void*, | |
| 70 DWORD, | |
| 71 DWORD, | |
| 72 DWORD_PTR); | |
| 73 BOOL WinHttpSetCredentials(HINTERNET, | |
| 74 DWORD, | |
| 75 DWORD, | |
| 76 const TCHAR*, | |
| 77 const TCHAR*, | |
| 78 void*); | |
| 79 BOOL WinHttpSetOption(HINTERNET, DWORD, void*, DWORD); | |
| 80 WINHTTP_STATUS_CALLBACK WinHttpSetStatusCallback(HINTERNET, | |
| 81 WINHTTP_STATUS_CALLBACK, | |
| 82 DWORD, | |
| 83 DWORD_PTR); | |
| 84 BOOL WinHttpSetTimeouts(HINTERNET, int, int, int, int); | |
| 85 BOOL WinHttpGetProxyForUrl(HINTERNET, | |
| 86 const TCHAR*, | |
| 87 WINHTTP_AUTOPROXY_OPTIONS*, | |
| 88 WINHTTP_PROXY_INFO*); | |
| 89 BOOL WinHttpDetectAutoProxyConfigUrl(DWORD, TCHAR**); | |
| 90 BOOL WinHttpSetDefaultProxyConfiguration(WINHTTP_PROXY_INFO*); | |
| 91 | |
| 92 WinHttpVTable() { Clear(); } | |
| 93 ~WinHttpVTable() { Unload(); } | |
| 94 | |
| 95 // Loads library, snap links. | |
| 96 bool Load(); | |
| 97 | |
| 98 // Unloads library, clear links. | |
| 99 void Unload(); | |
| 100 | |
| 101 bool IsLoaded() { return NULL != library_; } | |
| 102 | |
| 103 private: | |
| 104 void Clear() { memset(this, 0, sizeof(*this)); } | |
| 105 | |
| 106 template <typename T> | |
| 107 bool GPA(const char* function_name, T* function_pointer) { | |
| 108 ASSERT1(function_name); | |
| 109 *function_pointer = reinterpret_cast<T>(::GetProcAddress(library_, | |
| 110 function_name)); | |
| 111 return NULL != *function_pointer; | |
| 112 } | |
| 113 | |
| 114 // No good way to keep lines below 80 chars. | |
| 115 BOOL (CALLBACK *WinHttpAddRequestHeaders_pointer)(HINTERNET, const TCHAR*
, DWORD, DWORD); // NOLINT | |
| 116 BOOL (CALLBACK *WinHttpCheckPlatform_pointer)(); | |
| 117 BOOL (CALLBACK *WinHttpCloseHandle_pointer)(HINTERNET); // NOLINT | |
| 118 HINTERNET (CALLBACK *WinHttpConnect_pointer)(HINTERNET, const TCHAR*, INTERNET
_PORT, DWORD); // NOLINT | |
| 119 BOOL (CALLBACK *WinHttpCrackUrl_pointer)(const TCHAR*, DWORD, DWORD, URL_
COMPONENTS*); // NOLINT | |
| 120 BOOL (CALLBACK *WinHttpCreateUrl_pointer)(URL_COMPONENTS*, DWORD, TCHAR*,
DWORD*); // NOLINT | |
| 121 BOOL (CALLBACK *WinHttpDetectAutoProxyConfigUrl_pointer)(DWORD, TCHAR**);
// NOLINT | |
| 122 BOOL (CALLBACK *WinHttpGetDefaultProxyConfiguration_pointer)(WINHTTP_PROX
Y_INFO*); // NOLINT | |
| 123 BOOL (CALLBACK *WinHttpGetIEProxyConfigForCurrentUser_pointer)(WINHTTP_CU
RRENT_USER_IE_PROXY_CONFIG* pProxyConfig); // NOLINT | |
| 124 BOOL (CALLBACK *WinHttpGetProxyForUrl_pointer)(HINTERNET, const TCHAR*, W
INHTTP_AUTOPROXY_OPTIONS*, WINHTTP_PROXY_INFO*); // NOLINT | |
| 125 HINTERNET (CALLBACK *WinHttpOpen_pointer)(const TCHAR*, DWORD, const TCHAR*, c
onst TCHAR*, DWORD); // NOLINT | |
| 126 HINTERNET (CALLBACK *WinHttpOpenRequest_pointer)(HINTERNET, const TCHAR*, cons
t TCHAR*, const TCHAR*, const TCHAR*, const TCHAR**, DWORD); // NOLINT | |
| 127 BOOL (CALLBACK *WinHttpQueryAuthSchemes_pointer)(HINTERNET, DWORD*, DWORD
*, DWORD*); // NOLINT | |
| 128 BOOL (CALLBACK *WinHttpQueryDataAvailable_pointer)(HINTERNET, DWORD*);
// NOLINT | |
| 129 BOOL (CALLBACK *WinHttpQueryHeaders_pointer)(HINTERNET, DWORD, const TCHA
R*, void*, DWORD*, DWORD*); // NOLINT | |
| 130 BOOL (CALLBACK *WinHttpQueryOption_pointer)(HINTERNET, DWORD, void*, DWOR
D*); // NOLINT | |
| 131 BOOL (CALLBACK *WinHttpReadData_pointer)(HINTERNET, void*, DWORD, DWORD*)
; // NOLINT | |
| 132 BOOL (CALLBACK *WinHttpReceiveResponse_pointer)(HINTERNET, void*); //
NOLINT | |
| 133 BOOL (CALLBACK *WinHttpSendRequest_pointer)(HINTERNET, const TCHAR*, DWOR
D, void*, DWORD, DWORD, DWORD_PTR); // NOLINT | |
| 134 BOOL (CALLBACK *WinHttpSetCredentials_pointer)(HINTERNET, DWORD, DWORD, c
onst TCHAR*, const TCHAR*, void*); // NOLINT | |
| 135 BOOL (CALLBACK *WinHttpSetDefaultProxyConfiguration_pointer)(WINHTTP_PROX
Y_INFO*); // NOLINT | |
| 136 BOOL (CALLBACK *WinHttpSetOption_pointer)(HINTERNET, DWORD, void*, DWORD)
; // NOLINT | |
| 137 BOOL (CALLBACK *WinHttpSetTimeouts_pointer)(HINTERNET, int, int, int, int
); // NOLINT | |
| 138 BOOL (CALLBACK *WinHttpWriteData_pointer)(HINTERNET, LPCVOID, DWORD, DWOR
D*); // NOLINT | |
| 139 WINHTTP_STATUS_CALLBACK (CALLBACK *WinHttpSetStatusCallback_pointer)(HINTERNET
, WINHTTP_STATUS_CALLBACK, DWORD, DWORD_PTR); // NOLINT | |
| 140 | |
| 141 HINSTANCE library_; | |
| 142 | |
| 143 DISALLOW_EVIL_CONSTRUCTORS(WinHttpVTable); | |
| 144 }; | |
| 145 | |
| 146 #define PROTECT_WRAP(function, proto, call, result_type, result_error_value) \ | |
| 147 inline result_type WinHttpVTable::function proto { \ | |
| 148 return function##_pointer call; \ | |
| 149 } | |
| 150 | |
| 151 // No good way to keep lines below 80 chars. | |
| 152 PROTECT_WRAP(WinHttpAddRequestHeaders, (HINTERNET a, const TCHAR* b, DWORD c, DW
ORD d), (a, b, c, d), BOOL, FALSE); // NOLINT | |
| 153 PROTECT_WRAP(WinHttpCheckPlatform, (), (), BOOL, FALSE); | |
| 154 PROTECT_WRAP(WinHttpCloseHandle, (HINTERNET a), (a), BOOL, FALSE); // NOLINT | |
| 155 PROTECT_WRAP(WinHttpConnect, (HINTERNET a, const TCHAR* b, INTERNET_PORT c, DWOR
D d), (a, b, c, d), HINTERNET, NULL); // NOLINT | |
| 156 PROTECT_WRAP(WinHttpCrackUrl, (const TCHAR* a, DWORD b, DWORD c, LPURL_COMPONENT
S d), (a, b, c, d), BOOL, FALSE); // NOLINT | |
| 157 PROTECT_WRAP(WinHttpCreateUrl, (URL_COMPONENTS* a, DWORD b, TCHAR* c, DWORD* d),
(a, b, c, d), BOOL, FALSE); // NOLINT | |
| 158 PROTECT_WRAP(WinHttpDetectAutoProxyConfigUrl, (DWORD a, TCHAR** b), (a, b), BOOL
, FALSE); // NOLINT | |
| 159 PROTECT_WRAP(WinHttpGetDefaultProxyConfiguration, (WINHTTP_PROXY_INFO* a), (a),
BOOL, FALSE); // NOLINT | |
| 160 PROTECT_WRAP(WinHttpGetIEProxyConfigForCurrentUser, (WINHTTP_CURRENT_USER_IE_PRO
XY_CONFIG* a), (a), BOOL, FALSE); // NOLINT | |
| 161 PROTECT_WRAP(WinHttpGetProxyForUrl, (HINTERNET a, const TCHAR* b, WINHTTP_AUTOPR
OXY_OPTIONS* c, WINHTTP_PROXY_INFO* d), (a, b, c, d), BOOL, FALSE); // NOLINT | |
| 162 PROTECT_WRAP(WinHttpOpen, (const TCHAR* a, DWORD b, const TCHAR* c, const TCHAR*
d, DWORD e), (a, b, c, d, e), HINTERNET, NULL); // NOLINT | |
| 163 PROTECT_WRAP(WinHttpOpenRequest, (HINTERNET a, const TCHAR* b, const TCHAR* c, c
onst TCHAR* d, const TCHAR* e, const TCHAR** f, DWORD g), (a, b, c, d, e, f, g),
HINTERNET, NULL); // NOLINT | |
| 164 PROTECT_WRAP(WinHttpQueryAuthSchemes, (HINTERNET a, DWORD* b, DWORD* c, DWORD* d
), (a, b, c, d), BOOL, FALSE); // NOLINT | |
| 165 PROTECT_WRAP(WinHttpQueryDataAvailable, (HINTERNET a, DWORD* b), (a, b), BOOL, F
ALSE); // NOLINT | |
| 166 PROTECT_WRAP(WinHttpQueryHeaders, (HINTERNET a, DWORD b, const TCHAR* c, void* d
, DWORD* e, DWORD* f), (a, b, c, d, e, f), BOOL, FALSE); // NOLINT | |
| 167 PROTECT_WRAP(WinHttpQueryOption, (HINTERNET a, DWORD b, void* c, DWORD* d), (a,
b, c, d), BOOL, FALSE); // NOLINT | |
| 168 PROTECT_WRAP(WinHttpReadData, (HINTERNET a, void* b, DWORD c, DWORD* d), (a, b,
c, d), BOOL, FALSE); // NOLINT | |
| 169 PROTECT_WRAP(WinHttpReceiveResponse, (HINTERNET a, void* b), (a, b), BOOL, FALSE
); // NOLINT | |
| 170 PROTECT_WRAP(WinHttpSendRequest, (HINTERNET a, const TCHAR* b, DWORD c, void* d,
DWORD e, DWORD f, DWORD_PTR g), (a, b, c, d, e, f, g), BOOL, FALSE); // NOLI
NT | |
| 171 PROTECT_WRAP(WinHttpSetCredentials, (HINTERNET a, DWORD b, DWORD c, const TCHAR*
d, const TCHAR* e, void* f), (a, b, c, d, e, f), BOOL, FALSE); // NOLINT | |
| 172 PROTECT_WRAP(WinHttpSetDefaultProxyConfiguration, (WINHTTP_PROXY_INFO* a), (a),
BOOL, FALSE); // NOLINT | |
| 173 PROTECT_WRAP(WinHttpSetOption, (HINTERNET a, DWORD b, void* c, DWORD d), (a, b,
c, d), BOOL, FALSE); // NOLINT | |
| 174 PROTECT_WRAP(WinHttpSetStatusCallback, (HINTERNET a, WINHTTP_STATUS_CALLBACK b,
DWORD c, DWORD_PTR d), (a, b, c, d), WINHTTP_STATUS_CALLBACK, WINHTTP_INVALID_ST
ATUS_CALLBACK); // NOLINT | |
| 175 PROTECT_WRAP(WinHttpSetTimeouts, (HINTERNET a, int b, int c, int d, int e), (a,
b, c, d, e), BOOL, FALSE); // NOLINT | |
| 176 PROTECT_WRAP(WinHttpWriteData, (HINTERNET a, LPCVOID b, DWORD c, DWORD* d), (a,
b, c, d), BOOL, FALSE); // NOLINT | |
| 177 | |
| 178 } // namespace omaha | |
| 179 | |
| 180 #endif // OMAHA_NET_WINHTTP_VTABLE_H__ | |
| 181 | |
| OLD | NEW |