| Index: goopdate/google_update_proxy.h
|
| diff --git a/goopdate/google_update_proxy.h b/goopdate/google_update_proxy.h
|
| deleted file mode 100644
|
| index 6b39a47598993279c4724c8f91cef2e7c48484c6..0000000000000000000000000000000000000000
|
| --- a/goopdate/google_update_proxy.h
|
| +++ /dev/null
|
| @@ -1,224 +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.
|
| -// ========================================================================
|
| -//
|
| -// Defines SharedMemoryProxy to encapsulate marshaling and unmarshaling of
|
| -// IGoogleUpdate3 and other interface pointers across process boundaries.
|
| -//
|
| -// TODO(omaha): seems possible to make it general purpose and move it to common.
|
| -#ifndef OMAHA_GOOPDATE_GOOGLE_UPDATE_PROXY_H__
|
| -#define OMAHA_GOOPDATE_GOOGLE_UPDATE_PROXY_H__
|
| -
|
| -#include <atlbase.h>
|
| -#include <atlsecurity.h>
|
| -#include "base/basictypes.h"
|
| -#include "omaha/base/debug.h"
|
| -#include "omaha/base/error.h"
|
| -#include "omaha/base/logging.h"
|
| -#include "omaha/base/scoped_any.h"
|
| -#include "omaha/base/shared_memory_ptr.h"
|
| -#include "omaha/base/utils.h"
|
| -#include "omaha/base/vistautil.h"
|
| -
|
| -namespace omaha {
|
| -
|
| -// Constants
|
| -const size_t kMaxSizeInterfaceMarshalData = 256;
|
| -const TCHAR* const kBrowserHttpRequestShareName = _T("IBrowserRequest2_");
|
| -
|
| -struct InterfaceMarshalData {
|
| - void InitializeSharedData(const CString&) {
|
| - SetZero(data_);
|
| - size_ = 0;
|
| - }
|
| - size_t size_;
|
| - uint8 data_[kMaxSizeInterfaceMarshalData];
|
| -};
|
| -
|
| -class SharedMemoryAttributes {
|
| - public:
|
| - SharedMemoryAttributes(const TCHAR* shared_memory_name,
|
| - const CSecurityDesc& security_attributes)
|
| - : shared_memory_name_(shared_memory_name),
|
| - security_attributes_(security_attributes) {
|
| - }
|
| - const CString& GetSharedMemoryName() { return shared_memory_name_; }
|
| - LPSECURITY_ATTRIBUTES GetSecurityAttributes() {
|
| - return &security_attributes_;
|
| - }
|
| -
|
| - private:
|
| - CString shared_memory_name_;
|
| - CSecurityAttributes security_attributes_;
|
| - DISALLOW_EVIL_CONSTRUCTORS(SharedMemoryAttributes);
|
| -};
|
| -
|
| -extern SharedMemoryAttributes low_integrity_attributes;
|
| -extern SharedMemoryAttributes high_integrity_attributes;
|
| -
|
| -template <typename InterfaceType, typename LockType>
|
| -class SharedMemoryProxy {
|
| - public:
|
| - SharedMemoryProxy(bool read_only, SharedMemoryAttributes* attributes)
|
| - : shared_memory_ptr_(attributes->GetSharedMemoryName(),
|
| - attributes->GetSecurityAttributes(),
|
| - NULL,
|
| - read_only) {
|
| - CORE_LOG(L3, (_T("[SharedMemoryProxy::SharedMemoryProxy]")));
|
| - }
|
| -
|
| - ~SharedMemoryProxy() {
|
| - CORE_LOG(L3, (_T("[SharedMemoryProxy::~SharedMemoryProxy]")));
|
| - }
|
| -
|
| - HRESULT GetObject(InterfaceType** interface_ptr) {
|
| - ASSERT1(interface_ptr);
|
| - ASSERT1(*interface_ptr == NULL);
|
| -
|
| - CORE_LOG(L3, (_T("[SharedMemoryProxy::GetObject]")));
|
| -
|
| - return UnmarshalInterface(interface_ptr);
|
| - }
|
| -
|
| - HRESULT RegisterObject(InterfaceType* interface_ptr) {
|
| - ASSERT1(interface_ptr);
|
| - CORE_LOG(L3, (_T("[SharedMemoryProxy::RegisterObject]")));
|
| -
|
| - return MarshalInterface(interface_ptr);
|
| - }
|
| -
|
| - HRESULT RevokeObject() {
|
| - CORE_LOG(L3, (_T("[SharedMemoryProxy::RevokeObject]")));
|
| -
|
| - if (!shared_memory_ptr_) {
|
| - OPT_LOG(LEVEL_ERROR, (_T("[Shared memory ptr error]")));
|
| - return GOOPDATE_E_INVALID_SHARED_MEMORY_PTR;
|
| - }
|
| -
|
| - shared_memory_ptr_->size_ = 0;
|
| - SetZero(shared_memory_ptr_->data_);
|
| -
|
| - return S_OK;
|
| - }
|
| -
|
| - private:
|
| - // Helpers.
|
| - HRESULT MarshalInterface(InterfaceType* interface_ptr) {
|
| - CORE_LOG(L3, (_T("[SharedMemoryProxy::MarshalInterface]")));
|
| -
|
| - if (!shared_memory_ptr_) {
|
| - OPT_LOG(LEVEL_ERROR, (_T("[Shared memory ptr error]")));
|
| - return GOOPDATE_E_INVALID_SHARED_MEMORY_PTR;
|
| - }
|
| -
|
| - // Marshal the interface.
|
| - scoped_hglobal hglobal(::GlobalAlloc(GHND, 0));
|
| - if (!valid(hglobal)) {
|
| - OPT_LOG(LEVEL_ERROR, (_T("[GlobalAlloc failed]")));
|
| - return E_OUTOFMEMORY;
|
| - }
|
| -
|
| - CComPtr<IStream> stream;
|
| - HRESULT hr = ::CreateStreamOnHGlobal(get(hglobal), false, &stream);
|
| - if (FAILED(hr)) {
|
| - OPT_LOG(LEVEL_ERROR, (_T("[CreateStreamOnHGlobal failed][0x%08x]"), hr));
|
| - return hr;
|
| - }
|
| -
|
| - // MSHLFLAGS_TABLEWEAK results in CO_E_OBJNOTREG if unmarshaling multiple
|
| - // times, so using MSHLFLAGS_TABLESTRONG.
|
| - hr = ::CoMarshalInterface(stream,
|
| - __uuidof(InterfaceType),
|
| - interface_ptr,
|
| - MSHCTX_LOCAL,
|
| - NULL,
|
| - MSHLFLAGS_TABLESTRONG);
|
| - if (FAILED(hr)) {
|
| - OPT_LOG(LEVEL_ERROR, (_T("[CoMarshalInterface failed][0x%08x]"), hr));
|
| - return hr;
|
| - }
|
| -
|
| - // Copy out the marshaled data.
|
| - STATSTG stat = {0};
|
| - hr = stream->Stat(&stat, STATFLAG_NONAME);
|
| - if (FAILED(hr)) {
|
| - OPT_LOG(LEVEL_ERROR, (_T("[IStream::Stat failed][0x%08x]"), hr));
|
| - return hr;
|
| - }
|
| - int64 size = static_cast<int64>(stat.cbSize.QuadPart);
|
| - if (!size || size > kMaxSizeInterfaceMarshalData) {
|
| - OPT_LOG(LEVEL_ERROR, (_T("[Bad size][%I64d]"), size));
|
| - return GOOPDATE_E_INVALID_INTERFACE_MARSHAL_SIZE;
|
| - }
|
| -
|
| - byte* data = reinterpret_cast<byte*>(::GlobalLock(get(hglobal)));
|
| - if (!data) {
|
| - return HRESULTFromLastError();
|
| - }
|
| - memcpy(shared_memory_ptr_->data_, data, stat.cbSize.LowPart);
|
| - shared_memory_ptr_->size_ = stat.cbSize.LowPart;
|
| -
|
| - ::GlobalUnlock(get(hglobal));
|
| -
|
| - return S_OK;
|
| - }
|
| -
|
| - HRESULT UnmarshalInterface(InterfaceType** interface_ptr) {
|
| - CORE_LOG(L3, (_T("[SharedMemoryProxy::UnmarshalInterface]")));
|
| -
|
| - if (!shared_memory_ptr_) {
|
| - OPT_LOG(LEVEL_ERROR, (_T("[Shared memory ptr error]")));
|
| - return GOOPDATE_E_INVALID_SHARED_MEMORY_PTR;
|
| - }
|
| -
|
| - size_t size = shared_memory_ptr_->size_;
|
| - if (!size || size > kMaxSizeInterfaceMarshalData) {
|
| - CORE_LOG(LEVEL_ERROR, (_T("[bad size][%d]"), size));
|
| - return GOOPDATE_E_INVALID_INTERFACE_MARSHAL_SIZE;
|
| - }
|
| -
|
| - // Unmarshal the interface.
|
| - scoped_hglobal hglobal(::GlobalAlloc(GPTR, size));
|
| - if (!valid(hglobal)) {
|
| - OPT_LOG(LEVEL_ERROR, (_T("[GlobalAlloc failed]")));
|
| - return E_OUTOFMEMORY;
|
| - }
|
| - memcpy(get(hglobal), shared_memory_ptr_->data_, size);
|
| -
|
| - CComPtr<IStream> stream;
|
| - HRESULT hr = ::CreateStreamOnHGlobal(get(hglobal), false, &stream);
|
| - if (FAILED(hr)) {
|
| - OPT_LOG(LEVEL_ERROR, (_T("[CreateStreamOnHGlobal failed][0x%08x]"), hr));
|
| - return hr;
|
| - }
|
| -
|
| - hr = ::CoUnmarshalInterface(stream,
|
| - __uuidof(InterfaceType),
|
| - reinterpret_cast<void **>(interface_ptr));
|
| - if (FAILED(hr)) {
|
| - OPT_LOG(LEVEL_ERROR, (_T("[CoUnmarshalInterface failed][0x%08x]"), hr));
|
| - return hr;
|
| - }
|
| -
|
| - return S_OK;
|
| - }
|
| -
|
| - SharedMemoryPtr<LockType, InterfaceMarshalData> shared_memory_ptr_;
|
| - DISALLOW_EVIL_CONSTRUCTORS(SharedMemoryProxy);
|
| -};
|
| -
|
| -} // namespace omaha
|
| -
|
| -#endif // OMAHA_GOOPDATE_GOOGLE_UPDATE_PROXY_H__
|
| -
|
|
|