15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/dbus/proxy_resolution_service_provider.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/platform_thread.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/bus.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/message.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/exported_object.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/base/load_flags.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_service.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ProxyResolverInterface implementation used in production. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyResolverImpl : public ProxyResolverInterface { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Data being used in one proxy resolution. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Request { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit Request(const std::string& source_url) 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : callback_(base::Bind(&Request::OnCompletion, base::Unretained(this))), 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_url_(source_url) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Request() {} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback on IO thread for when net::ProxyService::ResolveProxy 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // completes, synchronously or asynchronously. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCompletion(int result) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generate the error message if the error message is not yet set, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and there was an error. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error_.empty() && result != net::OK) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ = net::ErrorToString(result); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, notify_task_); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CompletionCallback callback_; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string source_url_; // URL being resolved. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::ProxyInfo proxy_info_; // ProxyInfo resolved for source_url_. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error_; // Error from proxy resolution. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure notify_task_; // Task to notify of resolution result. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Request); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyResolverImpl() 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : origin_thread_id_(base::PlatformThread::CurrentId()), 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_(this) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ProxyResolverImpl() { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(OnOriginThread()); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<Request*>::iterator iter = all_requests_.begin(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != all_requests_.end(); ++iter) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Request* request = *iter; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Pending request for " << request->source_url_; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete request; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ProxyResolverInterface override. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ResolveProxy( 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& source_url, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& signal_interface, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& signal_name, 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<dbus::ExportedObject> exported_object) OVERRIDE { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(OnOriginThread()); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a request slot for this proxy resolution request. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Request* request = new Request(source_url); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->notify_task_ = base::Bind( 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ProxyResolverImpl::NotifyProxyResolved, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signal_interface, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signal_name, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exported_object, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_requests_.insert(request); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // GetPrimaryUserProfile() and GetRequestContext() must be called on UI 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread. 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile* profile = ProfileManager::GetPrimaryUserProfile(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> getter = 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetRequestContext(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ProxyResolverImpl::ResolveProxyInternal, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getter, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exported_object)); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper function for ResolveProxy(). 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ResolveProxyInternal( 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Request* request, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> getter, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<dbus::ExportedObject> exported_object) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we're running on IO thread. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if we have the URLRequestContextGetter. 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!getter.get()) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->error_ = "No URLRequestContextGetter"; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->OnCompletion(net::ERR_UNEXPECTED); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve ProxyService from profile's request context. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::ProxyService* proxy_service = 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getter->GetURLRequestContext()->proxy_service(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!proxy_service) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->error_ = "No proxy service in chrome"; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->OnCompletion(net::ERR_UNEXPECTED); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Starting network proxy resolution for " 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << request->source_url_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int result = proxy_service->ResolveProxy( 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(request->source_url_), net::LOAD_NORMAL, &request->proxy_info_, 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch request->callback_, NULL, NULL, net::BoundNetLog()); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result != net::ERR_IO_PENDING) { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Network proxy resolution completed synchronously."; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->OnCompletion(result); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called on UI thread as task posted from Request::OnCompletion on IO 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyProxyResolved( 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& signal_interface, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& signal_name, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<dbus::ExportedObject> exported_object, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Request* request) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(OnOriginThread()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send a signal to the client. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::Signal signal(signal_interface, signal_name); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter writer(&signal); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendString(request->source_url_); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendString(request->proxy_info_.ToPacString()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendString(request->error_); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exported_object->SendSignal(&signal); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Sending signal: " << signal.ToString(); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<Request*>::iterator iter = all_requests_.find(request); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == all_requests_.end()) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "can't find request slot(" << request->source_url_ 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ") in proxy-resolution queue"; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_requests_.erase(iter); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete request; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the current thread is on the origin thread. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool OnOriginThread() { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::PlatformThread::CurrentId() == origin_thread_id_; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformThreadId origin_thread_id_; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<Request*> all_requests_; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<ProxyResolverImpl> weak_ptr_factory_; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ProxyResolverImpl); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProxyResolutionServiceProvider::ProxyResolutionServiceProvider( 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyResolverInterface* resolver) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : resolver_(resolver), 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin_thread_id_(base::PlatformThread::CurrentId()), 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_(this) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProxyResolutionServiceProvider::~ProxyResolutionServiceProvider() { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProxyResolutionServiceProvider::Start( 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<dbus::ExportedObject> exported_object) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(OnOriginThread()); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exported_object_ = exported_object; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "ProxyResolutionServiceProvider started"; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exported_object_->ExportMethod( 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kLibCrosServiceInterface, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kResolveNetworkProxy, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Weak pointers can only bind to methods without return values, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hence we cannot bind ResolveProxyInternal here. Instead we use a 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // static function to solve this problem. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ProxyResolutionServiceProvider::CallResolveProxyHandler, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr()), 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ProxyResolutionServiceProvider::OnExported, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProxyResolutionServiceProvider::OnExported( 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& interface_name, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& method_name, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!success) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Failed to export " << interface_name << "." 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << method_name; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Method exported: " << interface_name << "." << method_name; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProxyResolutionServiceProvider::OnOriginThread() { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::PlatformThread::CurrentId() == origin_thread_id_; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProxyResolutionServiceProvider::ResolveProxyHandler( 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall* method_call, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ExportedObject::ResponseSender response_sender) { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(OnOriginThread()); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Handing method call: " << method_call->ToString(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The method call should contain the three string parameters. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageReader reader(method_call); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string source_url; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string signal_interface; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string signal_name; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!reader.PopString(&source_url) || 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !reader.PopString(&signal_interface) || 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !reader.PopString(&signal_name)) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Unexpected method call: " << method_call->ToString(); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) response_sender.Run(scoped_ptr<dbus::Response>()); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resolver_->ResolveProxy(source_url, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signal_interface, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signal_name, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exported_object_); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send an empty response for now. We'll send a signal once the network proxy 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resolution is completed. 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) response_sender.Run(dbus::Response::FromMethodCall(method_call)); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProxyResolutionServiceProvider::CallResolveProxyHandler( 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtr<ProxyResolutionServiceProvider> provider_weak_ptr, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall* method_call, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ExportedObject::ResponseSender response_sender) { 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!provider_weak_ptr) { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Called after the object is deleted"; 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) response_sender.Run(scoped_ptr<dbus::Response>()); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_weak_ptr->ResolveProxyHandler(method_call, response_sender); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProxyResolutionServiceProvider* ProxyResolutionServiceProvider::Create() { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new ProxyResolutionServiceProvider(new ProxyResolverImpl); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProxyResolutionServiceProvider* 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProxyResolutionServiceProvider::CreateForTesting( 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyResolverInterface* resolver) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new ProxyResolutionServiceProvider(resolver); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProxyResolverInterface::~ProxyResolverInterface() { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 283