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