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