| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome_frame/bind_context_info.h" | |
| 6 #include "chrome_frame/utils.h" | |
| 7 | |
| 8 // This is non const due to API expectations | |
| 9 static wchar_t* kBindContextInfo = L"_CHROMEFRAME_BIND_CONTEXT_INFO_"; | |
| 10 | |
| 11 // BindContextInfo member definitions. | |
| 12 BindContextInfo::BindContextInfo() | |
| 13 : no_cache_(false), | |
| 14 chrome_request_(false), | |
| 15 is_switching_(false) { | |
| 16 } | |
| 17 | |
| 18 BindContextInfo::~BindContextInfo() { | |
| 19 } | |
| 20 | |
| 21 HRESULT BindContextInfo::Initialize(IBindCtx* bind_ctx) { | |
| 22 DCHECK(bind_ctx); | |
| 23 DCHECK(!ftm_); | |
| 24 HRESULT hr = CoCreateFreeThreadedMarshaler(GetUnknown(), ftm_.Receive()); | |
| 25 DCHECK(ftm_); | |
| 26 if (SUCCEEDED(hr)) { | |
| 27 hr = bind_ctx->RegisterObjectParam(kBindContextInfo, GetUnknown()); | |
| 28 } | |
| 29 | |
| 30 DCHECK(SUCCEEDED(hr)) << "Failed to initialize BindContextInfo"; | |
| 31 return hr; | |
| 32 } | |
| 33 | |
| 34 HRESULT BindContextInfo::FromBindContext(IBindCtx* bind_context, | |
| 35 BindContextInfo** info) { | |
| 36 DCHECK(info); | |
| 37 if (!bind_context) { | |
| 38 NOTREACHED(); | |
| 39 return E_POINTER; | |
| 40 } | |
| 41 | |
| 42 base::win::ScopedComPtr<IUnknown> context; | |
| 43 HRESULT hr = bind_context->GetObjectParam(kBindContextInfo, | |
| 44 context.Receive()); | |
| 45 if (context) { | |
| 46 base::win::ScopedComPtr<IBindContextInfoInternal> internal; | |
| 47 hr = internal.QueryFrom(context); | |
| 48 if (SUCCEEDED(hr)) { | |
| 49 hr = internal->GetCppObject(reinterpret_cast<void**>(info)); | |
| 50 DCHECK_EQ(hr, S_OK); | |
| 51 DLOG_IF(ERROR, *info != static_cast<BindContextInfo*>(internal.get())) | |
| 52 << "marshalling took place!"; | |
| 53 } | |
| 54 } else { | |
| 55 DCHECK(FAILED(hr)); | |
| 56 CComObject<BindContextInfo>* bind_context_info = NULL; | |
| 57 hr = CComObject<BindContextInfo>::CreateInstance(&bind_context_info); | |
| 58 DCHECK(bind_context_info != NULL); | |
| 59 if (bind_context_info) { | |
| 60 bind_context_info->AddRef(); | |
| 61 hr = bind_context_info->Initialize(bind_context); | |
| 62 if (FAILED(hr)) { | |
| 63 bind_context_info->Release(); | |
| 64 } else { | |
| 65 *info = bind_context_info; | |
| 66 } | |
| 67 } | |
| 68 } | |
| 69 | |
| 70 return hr; | |
| 71 } | |
| 72 | |
| 73 void BindContextInfo::SetToSwitch(IStream* cache) { | |
| 74 is_switching_ = true; | |
| 75 if (!no_cache_) { | |
| 76 cache_ = cache; | |
| 77 RewindStream(cache_); | |
| 78 } | |
| 79 } | |
| 80 | |
| 81 std::wstring BindContextInfo::GetUrl() { | |
| 82 if (has_prot_data()) { | |
| 83 return prot_data_->url(); | |
| 84 } | |
| 85 return std::wstring(); | |
| 86 } | |
| 87 | |
| OLD | NEW |