1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/proxy/network_proxy_resource.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/proxy/dispatch_reply_message.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/proxy/ppapi_messages.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/shared_impl/tracked_callback.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/shared_impl/var.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace ppapi { 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace proxy { 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochNetworkProxyResource::NetworkProxyResource(Connection connection, 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PP_Instance instance) 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : PluginResource(connection, instance) { 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SendCreate(BROWSER, PpapiHostMsg_NetworkProxy_Create()); 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochNetworkProxyResource::~NetworkProxyResource() { 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochthunk::PPB_NetworkProxy_API* NetworkProxyResource::AsPPB_NetworkProxy_API() { 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return this; 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t NetworkProxyResource::GetProxyForURL( 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PP_Instance /* instance */, 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PP_Var url, 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PP_Var* proxy_string, 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<TrackedCallback> callback) { 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch StringVar* string_url = StringVar::FromPPVar(url); 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!string_url) 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PP_ERROR_BADARGUMENT; 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Call<PpapiPluginMsg_NetworkProxy_GetProxyForURLReply>( 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BROWSER, 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PpapiHostMsg_NetworkProxy_GetProxyForURL(string_url->value()), 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&NetworkProxyResource::OnPluginMsgGetProxyForURLReply, 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this), 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(proxy_string), 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callback)); 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PP_OK_COMPLETIONPENDING; 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid NetworkProxyResource::OnPluginMsgGetProxyForURLReply( 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PP_Var* proxy_string_out_param, 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<TrackedCallback> callback, 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const ResourceMessageReplyParams& params, 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& proxy_string) { 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!TrackedCallback::IsPending(callback)) { 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The callback should not have already been run. If this resource is 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // deleted, LastPluginRefWasReleased in PluginResource should abort the 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // callback and should not run this callback. 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (params.result() == PP_OK) { 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *proxy_string_out_param = (new StringVar(proxy_string))->GetPPVar(); 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callback->Run(params.result()); 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace proxy 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace ppapi 67