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