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 |