// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome_frame/cfproxy_private.h" #include "base/process_util.h" IPC::Message::Sender* CFProxyTraits::CreateChannel(const std::string& id, IPC::Channel::Listener* listener) { IPC::Channel* c = new IPC::Channel(id, IPC::Channel::MODE_SERVER, listener); if (c) c->Connect(); // must be called on the IPC thread. return c; } void CFProxyTraits::CloseChannel(IPC::Message::Sender* s) { IPC::Channel *c = static_cast(s); delete c; } bool CFProxyTraits::LaunchApp(const std::wstring& cmd_line) { bool ok = base::LaunchApp(cmd_line, false, false, NULL); return ok; } ////////////////////////////////////////////////////////// // ChromeProxyFactory ChromeProxyFactory::ChromeProxyFactory() { } ChromeProxyFactory::~ChromeProxyFactory() { AutoLock lock(lock_); ProxyMap::iterator it = proxies_.begin(); for (; it != proxies_.end(); ++it) { ChromeProxy* proxy = it->second; delete proxy; } proxies_.clear(); } void ChromeProxyFactory::GetProxy(ChromeProxyDelegate* delegate, const ProxyParams& params) { AutoLock lock(lock_); ChromeProxy* proxy = NULL; // TODO(stoyan): consider extra_params/timeout ProxyMap::iterator it = proxies_.find(params.profile); if (it == proxies_.end()) { proxy = CreateProxy(); proxy->Init(params); proxies_.insert(make_pair(params.profile, proxy)); } else { proxy = it->second; } proxy->AddDelegate(delegate); // TODO(stoyan): ::DeleteTimerQueueTimer (if any). } bool ChromeProxyFactory::ReleaseProxy(ChromeProxyDelegate* delegate, const std::string& profile) { AutoLock lock(lock_); ProxyMap::iterator it = proxies_.find(profile); if (it == proxies_.end()) return false; if (0 == it->second->RemoveDelegate(delegate)) { // This was the last delegate for this proxy. // TODO(stoyan): Use ::CreateTimerQueueTimer to schedule destroy of // the proxy in a reasonable timeout. } return true; } static CFProxyTraits g_default_traits; ChromeProxy* ChromeProxyFactory::CreateProxy() { ChromeProxy* p = new CFProxy(&g_default_traits); return p; }