blob: f6e52c96e2c26ea728ad6efb86b1bfc2a536f6e9 [file] [log] [blame]
Avi Drissmandb497b32022-09-15 19:47:281// Copyright 2013 The Chromium Authors
[email protected]0edbfc82013-06-14 06:15:392// 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
Avi Drissman821ca3092023-01-11 22:42:157#include "base/functional/bind.h"
[email protected]0edbfc82013-06-14 06:15:398#include "ppapi/c/pp_errors.h"
[email protected]8522332e2013-08-28 19:42:599#include "ppapi/proxy/error_conversion.h"
[email protected]0edbfc82013-06-14 06:15:3910#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
15namespace ppapi {
16namespace proxy {
17
18HostResolverResourceBase::HostResolverResourceBase(Connection connection,
[email protected]f31e55c2013-06-20 08:44:3719 PP_Instance instance,
20 bool private_api)
[email protected]0edbfc82013-06-14 06:15:3921 : PluginResource(connection, instance),
[email protected]f31e55c2013-06-20 08:44:3722 private_api_(private_api),
[email protected]0edbfc82013-06-14 06:15:3923 allow_get_results_(false) {
[email protected]f31e55c2013-06-20 08:44:3724 if (private_api)
25 SendCreate(BROWSER, PpapiHostMsg_HostResolver_CreatePrivate());
26 else
27 SendCreate(BROWSER, PpapiHostMsg_HostResolver_Create());
[email protected]0edbfc82013-06-14 06:15:3928}
29
30HostResolverResourceBase::~HostResolverResourceBase() {
31}
32
33int32_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
54PP_Var HostResolverResourceBase::GetCanonicalNameImpl() {
55 if (!allow_get_results_)
56 return PP_MakeUndefined();
57
58 return StringVar::StringToPPVar(canonical_name_);
59}
60
61uint32_t HostResolverResourceBase::GetSizeImpl() {
62 if (!allow_get_results_)
63 return 0;
64 return static_cast<uint32_t>(net_address_list_.size());
65}
66
67scoped_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
75void 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 }
[email protected]8522332e2013-08-28 19:42:5995 resolve_callback_->Run(ConvertNetworkAPIErrorForCompatibility(params.result(),
96 private_api_));
[email protected]0edbfc82013-06-14 06:15:3997}
98
99void HostResolverResourceBase::SendResolve(
100 const HostPortPair& host_port,
101 const PP_HostResolver_Private_Hint* hint) {
[email protected]f31e55c2013-06-20 08:44:37102 PpapiHostMsg_HostResolver_Resolve msg(host_port, *hint);
103 Call<PpapiPluginMsg_HostResolver_ResolveReply>(
Anand K Mistry9182c2a72021-03-17 04:40:08104 BROWSER, msg,
105 base::BindOnce(&HostResolverResourceBase::OnPluginMsgResolveReply,
106 base::Unretained(this)));
[email protected]0edbfc82013-06-14 06:15:39107}
108
109bool HostResolverResourceBase::ResolveInProgress() const {
110 return TrackedCallback::IsPending(resolve_callback_);
111}
112
113} // namespace proxy
114} // namespace ppapi