1 // Copyright 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/host_resolver_resource_base.h"
6
7 #include "base/bind.h"
8 #include "ppapi/c/pp_errors.h"
9 #include "ppapi/proxy/error_conversion.h"
10 #include "ppapi/proxy/net_address_resource.h"
11 #include "ppapi/proxy/ppapi_messages.h"
12 #include "ppapi/shared_impl/tracked_callback.h"
13 #include "ppapi/shared_impl/var.h"
14
15 namespace ppapi {
16 namespace proxy {
17
HostResolverResourceBase(Connection connection,PP_Instance instance,bool private_api)18 HostResolverResourceBase::HostResolverResourceBase(Connection connection,
19 PP_Instance instance,
20 bool private_api)
21 : PluginResource(connection, instance),
22 private_api_(private_api),
23 allow_get_results_(false) {
24 if (private_api)
25 SendCreate(BROWSER, PpapiHostMsg_HostResolver_CreatePrivate());
26 else
27 SendCreate(BROWSER, PpapiHostMsg_HostResolver_Create());
28 }
29
~HostResolverResourceBase()30 HostResolverResourceBase::~HostResolverResourceBase() {
31 }
32
ResolveImpl(const char * host,uint16_t port,const PP_HostResolver_Private_Hint * hint,scoped_refptr<TrackedCallback> callback)33 int32_t HostResolverResourceBase::ResolveImpl(
34 const char* host,
35 uint16_t port,
36 const PP_HostResolver_Private_Hint* hint,
37 scoped_refptr<TrackedCallback> callback) {
38 allow_get_results_ = false;
39 if (!host || !hint)
40 return PP_ERROR_BADARGUMENT;
41 if (ResolveInProgress())
42 return PP_ERROR_INPROGRESS;
43
44 resolve_callback_ = callback;
45
46 HostPortPair host_port;
47 host_port.host = host;
48 host_port.port = port;
49
50 SendResolve(host_port, hint);
51 return PP_OK_COMPLETIONPENDING;
52 }
53
GetCanonicalNameImpl()54 PP_Var HostResolverResourceBase::GetCanonicalNameImpl() {
55 if (!allow_get_results_)
56 return PP_MakeUndefined();
57
58 return StringVar::StringToPPVar(canonical_name_);
59 }
60
GetSizeImpl()61 uint32_t HostResolverResourceBase::GetSizeImpl() {
62 if (!allow_get_results_)
63 return 0;
64 return static_cast<uint32_t>(net_address_list_.size());
65 }
66
GetNetAddressImpl(uint32_t index)67 scoped_refptr<NetAddressResource> HostResolverResourceBase::GetNetAddressImpl(
68 uint32_t index) {
69 if (!allow_get_results_ || index >= GetSizeImpl())
70 return scoped_refptr<NetAddressResource>();
71
72 return net_address_list_[index];
73 }
74
OnPluginMsgResolveReply(const ResourceMessageReplyParams & params,const std::string & canonical_name,const std::vector<PP_NetAddress_Private> & net_address_list)75 void HostResolverResourceBase::OnPluginMsgResolveReply(
76 const ResourceMessageReplyParams& params,
77 const std::string& canonical_name,
78 const std::vector<PP_NetAddress_Private>& net_address_list) {
79 if (params.result() == PP_OK) {
80 allow_get_results_ = true;
81 canonical_name_ = canonical_name;
82
83 net_address_list_.clear();
84 for (std::vector<PP_NetAddress_Private>::const_iterator iter =
85 net_address_list.begin();
86 iter != net_address_list.end();
87 ++iter) {
88 net_address_list_.push_back(
89 new NetAddressResource(connection(), pp_instance(), *iter));
90 }
91 } else {
92 canonical_name_.clear();
93 net_address_list_.clear();
94 }
95 resolve_callback_->Run(ConvertNetworkAPIErrorForCompatibility(params.result(),
96 private_api_));
97 }
98
SendResolve(const HostPortPair & host_port,const PP_HostResolver_Private_Hint * hint)99 void HostResolverResourceBase::SendResolve(
100 const HostPortPair& host_port,
101 const PP_HostResolver_Private_Hint* hint) {
102 PpapiHostMsg_HostResolver_Resolve msg(host_port, *hint);
103 Call<PpapiPluginMsg_HostResolver_ResolveReply>(
104 BROWSER,
105 msg,
106 base::Bind(&HostResolverResourceBase::OnPluginMsgResolveReply,
107 base::Unretained(this)));
108 }
109
ResolveInProgress() const110 bool HostResolverResourceBase::ResolveInProgress() const {
111 return TrackedCallback::IsPending(resolve_callback_);
112 }
113
114 } // namespace proxy
115 } // namespace ppapi
116