summaryrefslogtreecommitdiffstats
path: root/ppapi/proxy/host_resolver_resource_base.cc
diff options
context:
space:
mode:
authoryzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-14 06:15:39 +0000
committeryzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-14 06:15:39 +0000
commit0edbfc86d6080cc7b3c65d3bd3e3867ab40d8e04 (patch)
tree174926eefd1cb8158325cee5cfc54667a81337cb /ppapi/proxy/host_resolver_resource_base.cc
parentcce836eea3969a9cc3730098d2ab91847c3616a7 (diff)
downloadchromium_src-0edbfc86d6080cc7b3c65d3bd3e3867ab40d8e04.zip
chromium_src-0edbfc86d6080cc7b3c65d3bd3e3867ab40d8e04.tar.gz
chromium_src-0edbfc86d6080cc7b3c65d3bd3e3867ab40d8e04.tar.bz2
Introduce PPB_HostResolver_Dev.
This change exposes the PPB_HostResolver_Dev interface and makes it to share the same backend as PPB_HostResolver_Private. It doesn't include apps permission check, which will be implemented in separate CLs. BUG=247225 TEST=newly added test_host_resolver.{h,cc}. Review URL: https://chromiumcodereview.appspot.com/16727002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@206321 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi/proxy/host_resolver_resource_base.cc')
-rw-r--r--ppapi/proxy/host_resolver_resource_base.cc107
1 files changed, 107 insertions, 0 deletions
diff --git a/ppapi/proxy/host_resolver_resource_base.cc b/ppapi/proxy/host_resolver_resource_base.cc
new file mode 100644
index 0000000..c4055a7
--- /dev/null
+++ b/ppapi/proxy/host_resolver_resource_base.cc
@@ -0,0 +1,107 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ppapi/proxy/host_resolver_resource_base.h"
+
+#include "ppapi/c/pp_errors.h"
+#include "ppapi/proxy/net_address_resource.h"
+#include "ppapi/proxy/ppapi_messages.h"
+#include "ppapi/shared_impl/tracked_callback.h"
+#include "ppapi/shared_impl/var.h"
+
+namespace ppapi {
+namespace proxy {
+
+HostResolverResourceBase::HostResolverResourceBase(Connection connection,
+ PP_Instance instance)
+ : PluginResource(connection, instance),
+ allow_get_results_(false) {
+ SendCreate(BROWSER, PpapiHostMsg_HostResolverPrivate_Create());
+}
+
+HostResolverResourceBase::~HostResolverResourceBase() {
+}
+
+int32_t HostResolverResourceBase::ResolveImpl(
+ const char* host,
+ uint16_t port,
+ const PP_HostResolver_Private_Hint* hint,
+ scoped_refptr<TrackedCallback> callback) {
+ allow_get_results_ = false;
+ if (!host || !hint)
+ return PP_ERROR_BADARGUMENT;
+ if (ResolveInProgress())
+ return PP_ERROR_INPROGRESS;
+
+ resolve_callback_ = callback;
+
+ HostPortPair host_port;
+ host_port.host = host;
+ host_port.port = port;
+
+ SendResolve(host_port, hint);
+ return PP_OK_COMPLETIONPENDING;
+}
+
+PP_Var HostResolverResourceBase::GetCanonicalNameImpl() {
+ if (!allow_get_results_)
+ return PP_MakeUndefined();
+
+ return StringVar::StringToPPVar(canonical_name_);
+}
+
+uint32_t HostResolverResourceBase::GetSizeImpl() {
+ if (!allow_get_results_)
+ return 0;
+ return static_cast<uint32_t>(net_address_list_.size());
+}
+
+scoped_refptr<NetAddressResource> HostResolverResourceBase::GetNetAddressImpl(
+ uint32_t index) {
+ if (!allow_get_results_ || index >= GetSizeImpl())
+ return scoped_refptr<NetAddressResource>();
+
+ return net_address_list_[index];
+}
+
+void HostResolverResourceBase::OnPluginMsgResolveReply(
+ const ResourceMessageReplyParams& params,
+ const std::string& canonical_name,
+ const std::vector<PP_NetAddress_Private>& net_address_list) {
+ if (params.result() == PP_OK) {
+ allow_get_results_ = true;
+ canonical_name_ = canonical_name;
+
+ net_address_list_.clear();
+ for (std::vector<PP_NetAddress_Private>::const_iterator iter =
+ net_address_list.begin();
+ iter != net_address_list.end();
+ ++iter) {
+ net_address_list_.push_back(
+ new NetAddressResource(connection(), pp_instance(), *iter));
+ }
+ } else {
+ canonical_name_.clear();
+ net_address_list_.clear();
+ }
+ resolve_callback_->Run(params.result());
+}
+
+void HostResolverResourceBase::SendResolve(
+ const HostPortPair& host_port,
+ const PP_HostResolver_Private_Hint* hint) {
+ PpapiHostMsg_HostResolverPrivate_Resolve msg(host_port, *hint);
+ Call<PpapiPluginMsg_HostResolverPrivate_ResolveReply>(
+ BROWSER,
+ msg,
+ base::Bind(&HostResolverResourceBase::OnPluginMsgResolveReply,
+ base::Unretained(this)));
+}
+
+bool HostResolverResourceBase::ResolveInProgress() const {
+ return TrackedCallback::IsPending(resolve_callback_);
+}
+
+} // namespace proxy
+} // namespace ppapi