| 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);
|
| + }
|
| }
|
|
|