[email protected] | 70277f6 | 2010-04-15 01:39:26 | [diff] [blame] | 1 | // Copyright (c) 2010 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 | |||||
[email protected] | 25299f2 | 2010-05-13 17:46:43 | [diff] [blame] | 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 | |||||
[email protected] | 77d7aee | 2010-05-14 20:31:55 | [diff] [blame] | 34 | HRESULT BindContextInfo::FromBindContext(IBindCtx* bind_context, |
35 | BindContextInfo** info) { | ||||
36 | DCHECK(info); | ||||
[email protected] | 70277f6 | 2010-04-15 01:39:26 | [diff] [blame] | 37 | if (!bind_context) { |
38 | NOTREACHED(); | ||||
[email protected] | 77d7aee | 2010-05-14 20:31:55 | [diff] [blame] | 39 | return E_POINTER; |
[email protected] | 70277f6 | 2010-04-15 01:39:26 | [diff] [blame] | 40 | } |
41 | |||||
42 | ScopedComPtr<IUnknown> context; | ||||
[email protected] | 77d7aee | 2010-05-14 20:31:55 | [diff] [blame] | 43 | HRESULT hr = bind_context->GetObjectParam(kBindContextInfo, |
44 | context.Receive()); | ||||
[email protected] | 70277f6 | 2010-04-15 01:39:26 | [diff] [blame] | 45 | if (context) { |
[email protected] | 25299f2 | 2010-05-13 17:46:43 | [diff] [blame] | 46 | ScopedComPtr<IBindContextInfoInternal> internal; |
[email protected] | 77d7aee | 2010-05-14 20:31:55 | [diff] [blame] | 47 | hr = internal.QueryFrom(context); |
[email protected] | 25299f2 | 2010-05-13 17:46:43 | [diff] [blame] | 48 | DCHECK(SUCCEEDED(hr)); |
49 | if (SUCCEEDED(hr)) { | ||||
[email protected] | 77d7aee | 2010-05-14 20:31:55 | [diff] [blame] | 50 | hr = internal->GetCppObject(reinterpret_cast<void**>(info)); |
51 | DCHECK_EQ(hr, S_OK); | ||||
[email protected] | 5ae94d2 | 2010-07-21 19:55:36 | [diff] [blame^] | 52 | DLOG_IF(ERROR, *info != static_cast<BindContextInfo*>(internal.get())) |
53 | << "marshalling took place!"; | ||||
[email protected] | 77d7aee | 2010-05-14 20:31:55 | [diff] [blame] | 54 | } |
55 | } else { | ||||
56 | DCHECK(FAILED(hr)); | ||||
57 | CComObject<BindContextInfo>* bind_context_info = NULL; | ||||
58 | hr = CComObject<BindContextInfo>::CreateInstance(&bind_context_info); | ||||
59 | DCHECK(bind_context_info != NULL); | ||||
60 | if (bind_context_info) { | ||||
61 | bind_context_info->AddRef(); | ||||
62 | hr = bind_context_info->Initialize(bind_context); | ||||
63 | if (FAILED(hr)) { | ||||
64 | bind_context_info->Release(); | ||||
65 | } else { | ||||
66 | *info = bind_context_info; | ||||
67 | } | ||||
[email protected] | 25299f2 | 2010-05-13 17:46:43 | [diff] [blame] | 68 | } |
[email protected] | 70277f6 | 2010-04-15 01:39:26 | [diff] [blame] | 69 | } |
70 | |||||
[email protected] | 77d7aee | 2010-05-14 20:31:55 | [diff] [blame] | 71 | return hr; |
[email protected] | 70277f6 | 2010-04-15 01:39:26 | [diff] [blame] | 72 | } |
73 | |||||
74 | void BindContextInfo::SetToSwitch(IStream* cache) { | ||||
75 | is_switching_ = true; | ||||
76 | if (!no_cache_) { | ||||
77 | cache_ = cache; | ||||
78 | RewindStream(cache_); | ||||
79 | } | ||||
80 | } | ||||
81 |