Index: native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_host_resolver_interface.cc |
diff --git a/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_host_resolver_interface.cc b/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_host_resolver_interface.cc |
index ef7f7baff3413ca33f8d27bcb5ea950b1b74c924..762f87ae43eac476d4303a118ac5ad40fb55c8b0 100644 |
--- a/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_host_resolver_interface.cc |
+++ b/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_host_resolver_interface.cc |
@@ -15,12 +15,11 @@ namespace { |
class FakeHostResolverResource : public FakeResource { |
public: |
- FakeHostResolverResource() : resolved(false), name(NULL) {} |
+ FakeHostResolverResource() : resolved(false) {} |
static const char* classname() { return "FakeHostResolverResource"; } |
bool resolved; |
- in_addr_t address; |
- const char* name; |
+ PP_HostResolver_Hint hints; |
}; |
int32_t RunCompletionCallback(PP_CompletionCallback* callback, int32_t result) { |
@@ -40,7 +39,7 @@ PP_Resource FakeHostResolverInterface::Create(PP_Instance instance) { |
if (instance != ppapi_->GetInstance()) |
return PP_ERROR_BADRESOURCE; |
- FakeHostResolverResource* resolver_resource = new FakeHostResolverResource; |
+ FakeHostResolverResource* resolver_resource = new FakeHostResolverResource(); |
return CREATE_RESOURCE(ppapi_->resource_manager(), |
FakeHostResolverResource, |
@@ -50,15 +49,14 @@ PP_Resource FakeHostResolverInterface::Create(PP_Instance instance) { |
int32_t FakeHostResolverInterface::Resolve(PP_Resource resource, |
const char* hostname, |
uint16_t, |
- const PP_HostResolver_Hint*, |
+ const PP_HostResolver_Hint* hints, |
PP_CompletionCallback callback) { |
FakeHostResolverResource* resolver = |
ppapi_->resource_manager()->Get<FakeHostResolverResource>(resource); |
resolver->resolved = false; |
- if (!strcmp(hostname, FAKE_HOSTNAME)) { |
+ resolver->hints = *hints; |
+ if (!fake_hostname.empty() && fake_hostname == hostname) { |
resolver->resolved = true; |
- resolver->name = FAKE_HOSTNAME; |
- resolver->address = htonl(FAKE_IP); |
return RunCompletionCallback(&callback, PP_OK); |
} |
return RunCompletionCallback(&callback, PP_ERROR_NAME_NOT_RESOLVED); |
@@ -69,7 +67,8 @@ PP_Var FakeHostResolverInterface::GetCanonicalName(PP_Resource resource) { |
ppapi_->resource_manager()->Get<FakeHostResolverResource>(resource); |
if (!res->resolved) |
return PP_Var(); |
- return ppapi_->GetVarInterface()->VarFromUtf8(res->name, strlen(res->name)); |
+ return ppapi_->GetVarInterface()->VarFromUtf8(fake_hostname.data(), |
+ fake_hostname.length()); |
} |
uint32_t FakeHostResolverInterface::GetNetAddressCount(PP_Resource resolver) { |
@@ -77,7 +76,17 @@ uint32_t FakeHostResolverInterface::GetNetAddressCount(PP_Resource resolver) { |
ppapi_->resource_manager()->Get<FakeHostResolverResource>(resolver); |
if (!res->resolved) |
return 0; |
- return 1; |
+ |
+ uint32_t rtn = 0; |
+ if (res->hints.family == PP_NETADDRESS_FAMILY_IPV6 || |
+ res->hints.family == PP_NETADDRESS_FAMILY_UNSPECIFIED) |
+ rtn += fake_addresses_v6.size(); |
+ |
+ if (res->hints.family == PP_NETADDRESS_FAMILY_IPV4 || |
+ res->hints.family == PP_NETADDRESS_FAMILY_UNSPECIFIED) |
+ rtn += fake_addresses_v4.size(); |
+ |
+ return rtn; |
} |
PP_Resource FakeHostResolverInterface::GetNetAddress(PP_Resource resource, |
@@ -87,12 +96,41 @@ PP_Resource FakeHostResolverInterface::GetNetAddress(PP_Resource resource, |
if (!res->resolved) |
return 0; |
- if (index != 0) |
+ bool include_v4 = false; |
+ int max_index = 0; |
+ switch (res->hints.family) { |
+ case PP_NETADDRESS_FAMILY_IPV4: |
+ max_index = fake_addresses_v4.size(); |
+ include_v4 = true; |
+ break; |
+ case PP_NETADDRESS_FAMILY_IPV6: |
+ max_index = fake_addresses_v6.size(); |
+ break; |
+ case PP_NETADDRESS_FAMILY_UNSPECIFIED: |
+ include_v4 = true; |
+ max_index = fake_addresses_v4.size() + fake_addresses_v6.size(); |
+ break; |
+ default: |
+ return 0; |
+ } |
+ |
+ if (index >= max_index) |
return 0; |
- // Create a new NetAddress resource and return it. |
- PP_NetAddress_IPv4 addr; |
- memcpy(addr.addr, &res->address, sizeof(res->address)); |
nacl_io::NetAddressInterface* iface = ppapi_->GetNetAddressInterface(); |
- return iface->CreateFromIPv4Address(ppapi_->GetInstance(), &addr); |
+ |
+ // Create a new NetAddress resource and return it. |
+ if (include_v4 && index < fake_addresses_v4.size()) { |
+ PP_NetAddress_IPv4 addr; |
+ sockaddr_in& addr4 = fake_addresses_v4[index]; |
+ memcpy(addr.addr, &addr4.sin_addr, sizeof(addr4.sin_addr)); |
+ return iface->CreateFromIPv4Address(ppapi_->GetInstance(), &addr); |
+ } else { |
+ if (include_v4) |
+ index -= fake_addresses_v4.size(); |
+ PP_NetAddress_IPv6 addr; |
+ sockaddr_in6& addr6 = fake_addresses_v6[index]; |
+ memcpy(addr.addr, &addr6.sin6_addr, sizeof(addr6.sin6_addr)); |
+ return iface->CreateFromIPv6Address(ppapi_->GetInstance(), &addr); |
+ } |
} |