OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2012 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/shared_impl/private/ppb_host_resolver_shared.h" |
| 6 |
| 7 #include <cstddef> |
| 8 #include <cstring> |
| 9 |
| 10 #include "net/base/sys_addrinfo.h" |
| 11 #include "ppapi/c/pp_errors.h" |
| 12 #include "ppapi/shared_impl/private/net_address_private_impl.h" |
| 13 #include "ppapi/shared_impl/var.h" |
| 14 #include "ppapi/thunk/thunk.h" |
| 15 |
| 16 namespace ppapi { |
| 17 |
| 18 NetworkList* CreateNetworkListFromAddrInfo(const addrinfo* ai) { |
| 19 scoped_ptr<NetworkList> network_list(new NetworkList()); |
| 20 |
| 21 while (ai != NULL) { |
| 22 network_list->push_back(NameAndAddressPair()); |
| 23 if (ai->ai_canonname) |
| 24 network_list->back().canonical_name = ai->ai_canonname; |
| 25 if (!NetAddressPrivateImpl::SockaddrToNetAddress( |
| 26 ai->ai_addr, |
| 27 ai->ai_addrlen, |
| 28 &network_list->back().address)) { |
| 29 return NULL; |
| 30 } |
| 31 ai = ai->ai_next; |
| 32 } |
| 33 |
| 34 return network_list.release(); |
| 35 } |
| 36 |
| 37 PPB_HostResolver_Shared::PPB_HostResolver_Shared(PP_Instance instance) |
| 38 : Resource(OBJECT_IS_IMPL, instance), |
| 39 host_resolver_id_(GenerateHostResolverID()) { |
| 40 } |
| 41 |
| 42 PPB_HostResolver_Shared::PPB_HostResolver_Shared( |
| 43 const HostResource& resource) |
| 44 : Resource(OBJECT_IS_PROXY, resource), |
| 45 host_resolver_id_(GenerateHostResolverID()) { |
| 46 } |
| 47 |
| 48 PPB_HostResolver_Shared::~PPB_HostResolver_Shared() { |
| 49 } |
| 50 |
| 51 thunk::PPB_HostResolver_Private_API* |
| 52 PPB_HostResolver_Shared::AsPPB_HostResolver_Private_API() { |
| 53 return this; |
| 54 } |
| 55 |
| 56 int32_t PPB_HostResolver_Shared::Resolve( |
| 57 const char* host, |
| 58 uint16_t port, |
| 59 const PP_HostResolver_Private_Hint* hint, |
| 60 PP_CompletionCallback callback) { |
| 61 if (!host) |
| 62 return PP_ERROR_BADARGUMENT; |
| 63 if (!callback.func) |
| 64 return PP_ERROR_BLOCKS_MAIN_THREAD; |
| 65 if (ResolveInProgress()) |
| 66 return PP_ERROR_INPROGRESS; |
| 67 |
| 68 resolve_callback_ = new TrackedCallback(this, callback); |
| 69 |
| 70 HostPortPair host_port; |
| 71 host_port.host = host; |
| 72 host_port.port = port; |
| 73 |
| 74 SendResolve(host_port, hint); |
| 75 return PP_OK_COMPLETIONPENDING; |
| 76 } |
| 77 |
| 78 uint32_t PPB_HostResolver_Shared::GetSize() { |
| 79 if (ResolveInProgress()) |
| 80 return 0; |
| 81 return static_cast<uint32_t>(network_list_.size()); |
| 82 } |
| 83 |
| 84 bool PPB_HostResolver_Shared::GetItem(uint32 index, |
| 85 PP_Var* canonical_name, |
| 86 PP_NetAddress_Private* address) { |
| 87 if (ResolveInProgress() || index >= network_list_.size()) |
| 88 return false; |
| 89 |
| 90 if (canonical_name) { |
| 91 *canonical_name = |
| 92 StringVar::StringToPPVar(network_list_[index].canonical_name); |
| 93 } |
| 94 if (address) |
| 95 *address = network_list_[index].address; |
| 96 |
| 97 return true; |
| 98 } |
| 99 |
| 100 void PPB_HostResolver_Shared::OnResolveCompleted( |
| 101 bool succeeded, |
| 102 const NetworkList& network_list) { |
| 103 if (succeeded) |
| 104 network_list_ = network_list; |
| 105 else |
| 106 network_list_.clear(); |
| 107 |
| 108 TrackedCallback::ClearAndRun(&resolve_callback_, |
| 109 succeeded ? PP_OK : PP_ERROR_FAILED); |
| 110 } |
| 111 |
| 112 uint32 PPB_HostResolver_Shared::GenerateHostResolverID() { |
| 113 static uint32 host_resolver_id = 0; |
| 114 return host_resolver_id++; |
| 115 } |
| 116 |
| 117 bool PPB_HostResolver_Shared::ResolveInProgress() const { |
| 118 return TrackedCallback::IsPending(resolve_callback_); |
| 119 } |
| 120 |
| 121 } // namespace ppapi |
OLD | NEW |