Home | History | Annotate | Download | only in chrome_frame
      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 
     88