Index: net/bind_status_callback.cc |
diff --git a/net/bind_status_callback.cc b/net/bind_status_callback.cc |
deleted file mode 100644 |
index 43a5ab8b00211e718b3db4b3e689fc75c3408189..0000000000000000000000000000000000000000 |
--- a/net/bind_status_callback.cc |
+++ /dev/null |
@@ -1,321 +0,0 @@ |
-// Copyright 2007-2009 Google Inc. |
-// |
-// Licensed under the Apache License, Version 2.0 (the "License"); |
-// you may not use this file except in compliance with the License. |
-// You may obtain a copy of the License at |
-// |
-// http://www.apache.org/licenses/LICENSE-2.0 |
-// |
-// Unless required by applicable law or agreed to in writing, software |
-// distributed under the License is distributed on an "AS IS" BASIS, |
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-// See the License for the specific language governing permissions and |
-// limitations under the License. |
-// ======================================================================== |
-// |
-// IBindStatusCallback interface. |
- |
-#include "omaha/net/bind_status_callback.h" |
-#include <wininet.h> |
-#include "omaha/base/debug.h" |
-#include "omaha/base/error.h" |
-#include "omaha/base/logging.h" |
-#include "omaha/base/utils.h" |
- |
-namespace omaha { |
- |
-HRESULT QueryHttpInfo(IWinInetHttpInfo* http_info, DWORD query, CString* info) { |
- CORE_LOG(L3, (_T("[QueryHttpInfo][%d]"), query)); |
- ASSERT1(http_info); |
- ASSERT1(query); |
- ASSERT1(info); |
- |
- info->Empty(); |
- DWORD size = 0; |
- DWORD flags = 0; |
- HRESULT hr = http_info->QueryInfo(query, 0, &size, &flags, 0); |
- CORE_LOG(L3, (_T("[http_info->QueryInfo][0x%x][%d]"), hr, size)); |
- if (FAILED(hr)) { |
- return hr; |
- } |
- |
- CStringA buf; |
- hr = http_info->QueryInfo(query, CStrBufA(buf, size), &size, &flags, 0); |
- CORE_LOG(L3, (_T("[http_info->QueryInfo][0x%x][%d]"), hr, size)); |
- if (FAILED(hr)) { |
- return hr; |
- } |
- |
- CORE_LOG(L3, (_T("[QueryHttpInfo success][%d][%s]"), query, CA2T(buf))); |
- *info = buf; |
- return S_OK; |
-} |
- |
-BindStatusCallback::BindStatusCallback() |
- : http_verb_(BINDVERB_GET), |
- post_data_byte_count_(0), |
- response_code_(0) { |
-} |
- |
-HRESULT BindStatusCallback::Send(BSTR url, |
- BSTR post_data, |
- BSTR request_headers, |
- VARIANT response_headers_needed, |
- VARIANT* response_headers, |
- DWORD* response_code, |
- BSTR* cache_filename) { |
- if (!url || !*url || !response_code || !cache_filename) { |
- return E_INVALIDARG; |
- } |
- |
- *response_code = 0; |
- *cache_filename = NULL; |
- |
- if (V_VT(&response_headers_needed) != VT_EMPTY) { |
- if ((V_VT(&response_headers_needed) != (VT_ARRAY | VT_UI4)) || |
- !response_headers) { |
- return E_INVALIDARG; |
- } |
- V_VT(response_headers) = VT_NULL; |
- response_headers_needed_ = response_headers_needed.parray; |
- if (!response_headers_needed_.GetCount()) { |
- return E_INVALIDARG; |
- } |
- } |
- |
- request_headers_ = request_headers; |
- if (!post_data) { |
- http_verb_ = BINDVERB_GET; |
- } else { |
- http_verb_ = BINDVERB_POST; |
- post_data_byte_count_ = ::SysStringByteLen(post_data); |
- reset(post_data_, ::GlobalAlloc(GPTR, post_data_byte_count_)); |
- if (!post_data_) { |
- HRESULT hr = HRESULTFromLastError(); |
- CORE_LOG(LE, (_T("[::GlobalAlloc failed][0x%x]"), hr)); |
- return hr; |
- } |
- |
- memcpy(get(post_data_), post_data, post_data_byte_count_); |
- } |
- |
- CComPtr<IBindStatusCallback> bsc(this); |
- CString filename; |
- HRESULT hr = ::URLDownloadToCacheFile(NULL, |
- url, |
- CStrBuf(filename, MAX_PATH), |
- MAX_PATH, |
- 0, |
- bsc); |
- |
- if (response_headers) { |
- response_headers_.Detach(response_headers); |
- } |
- *response_code = response_code_; |
- |
- CORE_LOG(L2, (_T("[URLDownloadToCacheFile][0x%x][%s]"), hr, url)); |
- if (FAILED(hr)) { |
- return hr; |
- } |
- |
- ASSERT1(!filename.IsEmpty()); |
- CORE_LOG(L2, (_T("[BindStatusCallback::Send][cache file][%s]"), filename)); |
- *cache_filename = filename.AllocSysString(); |
- return hr; |
-} |
- |
-// IBindStatusCallback methods. |
- |
-STDMETHODIMP BindStatusCallback::OnStartBinding(DWORD, IBinding* binding) { |
- __mutexScope(lock_); |
- binding_git_.Attach(binding); |
- return S_OK; |
-} |
- |
-STDMETHODIMP BindStatusCallback::GetPriority(LONG* priority) { |
- UNREFERENCED_PARAMETER(priority); |
- return E_NOTIMPL; |
-} |
- |
-STDMETHODIMP BindStatusCallback::OnLowResource(DWORD) { |
- return E_NOTIMPL; |
-} |
- |
-STDMETHODIMP BindStatusCallback::OnProgress(ULONG, ULONG, ULONG, LPCWSTR) { |
- return E_NOTIMPL; |
-} |
- |
-STDMETHODIMP BindStatusCallback::OnStopBinding(HRESULT, LPCWSTR) { |
- CComPtr<IBinding> binding; |
- |
- __mutexBlock(lock_) { |
- if (!binding_git_) { |
- return S_OK; |
- } |
- |
- HRESULT hr = binding_git_.CopyTo(&binding); |
- VERIFY1(SUCCEEDED(binding_git_.Revoke())); |
- if (FAILED(hr)) { |
- CORE_LOG(LW, (_T("[binding_git_.CopyTo failed][0x%x]"), hr)); |
- return S_OK; |
- } |
- } |
- |
- CComQIPtr<IWinInetHttpInfo> http_info(binding); |
- if (!http_info) { |
- return S_OK; |
- } |
- |
- CString response_code_buf; |
- if (SUCCEEDED(QueryHttpInfo(http_info, |
- HTTP_QUERY_STATUS_CODE, |
- &response_code_buf)) && |
- !response_code_buf.IsEmpty()) { |
- response_code_ = _ttoi(response_code_buf); |
- } |
- |
- if (!response_headers_needed_) { |
- return S_OK; |
- } |
- int count = response_headers_needed_.GetCount(); |
- ASSERT1(count > 0); |
- int lower_bound = response_headers_needed_.GetLowerBound(); |
- int upper_bound = response_headers_needed_.GetUpperBound(); |
- |
- CComSafeArray<BSTR> response_array(count, lower_bound); |
- for (int i = lower_bound; i <= upper_bound; ++i) { |
- CString response_header_buf; |
- QueryHttpInfo(http_info, response_headers_needed_[i], &response_header_buf); |
- response_array[i] = response_header_buf.AllocSysString(); |
- } |
- |
- V_VT(&response_headers_) = VT_ARRAY | VT_BSTR; |
- V_ARRAY(&response_headers_) = response_array.Detach(); |
- return S_OK; |
-} |
- |
-STDMETHODIMP BindStatusCallback::GetBindInfo(DWORD* flags, BINDINFO* info) { |
- ASSERT1(flags); |
- ASSERT1(info); |
- *flags = 0; |
- |
- // Set up the BINDINFO data structure. |
- info->cbSize = sizeof(*info); |
- info->dwBindVerb = http_verb_; |
- info->szExtraInfo = NULL; |
- |
- // Initialize the STGMEDIUM. |
- SetZero(info->stgmedData); |
- info->grfBindInfoF = 0; |
- info->szCustomVerb = NULL; |
- |
- switch (http_verb_) { |
- case BINDVERB_POST: |
- if (post_data_) { |
- // Fill the STGMEDIUM with the data to post. Certain versions of Urlmon |
- // require TYMED_GLOBAL with GMEM_FIXED. |
- info->stgmedData.tymed = TYMED_HGLOBAL; |
- info->stgmedData.hGlobal = get(post_data_); |
- |
- // The documentation for GetBindInfo() indicates that the method could |
- // be called multiple times for the same request. We do not want to |
- // allocate global memory for each of those times. So we maintain |
- // ownership of the global memory, and pass a reference to it each time. |
- // The HGLOBAL is released on BindStatusCallback destruction. Hence we |
- // set pUnkForRelease to our IUnknown ptr. |
- info->stgmedData.pUnkForRelease = |
- static_cast<IBindStatusCallback*>(this); |
- AddRef(); |
- |
- info->cbstgmedData = post_data_byte_count_; |
- } |
- return S_OK; |
- |
- case BINDVERB_GET: |
- return S_OK; |
- |
- case BINDVERB_PUT: |
- case BINDVERB_CUSTOM: |
- default: |
- ASSERT1(false); |
- return E_FAIL; |
- } |
-} |
- |
-STDMETHODIMP BindStatusCallback::OnDataAvailable(DWORD, |
- DWORD, |
- FORMATETC*, |
- STGMEDIUM*) { |
- // The documentation does not explicitly say that E_NOTIMPL can be returned |
- // for this method. So we return S_OK. |
- return S_OK; |
-} |
- |
-STDMETHODIMP BindStatusCallback::OnObjectAvailable(REFIID, IUnknown*) { |
- // The documentation does not explicitly say that E_NOTIMPL can be returned |
- // for this method. So we return S_OK. |
- return S_OK; |
-} |
- |
-STDMETHODIMP BindStatusCallback::BeginningTransaction(LPCWSTR, |
- LPCWSTR, |
- DWORD, |
- LPWSTR* request_headers) { |
- if (!request_headers) { |
- return E_INVALIDARG; |
- } |
- *request_headers = NULL; |
- |
- if (request_headers_.IsEmpty()) { |
- return S_OK; |
- } |
- |
- int request_headers_size = request_headers_.GetLength() + 1; |
- TCHAR* additional_headers = static_cast<TCHAR*>( |
- ::CoTaskMemAlloc(request_headers_size * sizeof(TCHAR))); |
- if (!additional_headers) { |
- return E_OUTOFMEMORY; |
- } |
- |
- _tcscpy_s(additional_headers, request_headers_size, request_headers_); |
- *request_headers = additional_headers; |
- |
- return S_OK; |
-} |
- |
-STDMETHODIMP BindStatusCallback::OnResponse(DWORD response_code, |
- LPCWSTR response_headers, |
- LPCWSTR request_headers, |
- LPWSTR* additional_headers) { |
- CORE_LOG(L1, (_T("[OnResponse [%d][%s]"), response_code, response_headers)); |
- UNREFERENCED_PARAMETER(response_code); |
- UNREFERENCED_PARAMETER(response_headers); |
- UNREFERENCED_PARAMETER(request_headers); |
- if (!additional_headers) { |
- return E_INVALIDARG; |
- } |
- |
- *additional_headers = NULL; |
- return S_OK; |
-} |
- |
-HRESULT BindStatusCallback::Cancel() { |
- CComPtr<IBinding> binding; |
- |
- __mutexBlock(lock_) { |
- if (!binding_git_) { |
- return S_OK; |
- } |
- |
- HRESULT hr = binding_git_.CopyTo(&binding); |
- if (FAILED(hr)) { |
- CORE_LOG(LE, (_T("[binding_git_.CopyTo failed][0x%x]"), hr)); |
- return hr; |
- } |
- } |
- |
- return binding->Abort(); |
-} |
- |
-} // namespace omaha |
- |