168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file.
468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/cpp/network_list.h"
668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/c/pp_errors.h"
868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/cpp/array_output.h"
968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/cpp/logging.h"
1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/cpp/module_impl.h"
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/cpp/net_address.h"
1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/cpp/var.h"
1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace pp {
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace {
1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)template <> const char* interface_name<PPB_NetworkList_1_0>() {
1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return PPB_NETWORKLIST_INTERFACE_1_0;
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace
2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)NetworkList::NetworkList() {
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)NetworkList::NetworkList(PassRef, PP_Resource resource)
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    : Resource(PASS_REF, resource) {
2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// static
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool NetworkList::IsAvailable() {
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return has_interface<PPB_NetworkList_1_0>();
3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)uint32_t NetworkList::GetCount() const {
3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!has_interface<PPB_NetworkList_1_0>())
3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return 0;
3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return get_interface<PPB_NetworkList_1_0>()->GetCount(pp_resource());
4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)std::string NetworkList::GetName(uint32_t index) const {
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!has_interface<PPB_NetworkList_1_0>())
4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return std::string();
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  Var result(PASS_REF,
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)             get_interface<PPB_NetworkList_1_0>()->GetName(
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                 pp_resource(), index));
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return result.is_string() ? result.AsString() : std::string();
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)PP_NetworkList_Type NetworkList::GetType(uint32_t index) const {
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!has_interface<PPB_NetworkList_1_0>())
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return PP_NETWORKLIST_TYPE_ETHERNET;
5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return get_interface<PPB_NetworkList_1_0>()->GetType(
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      pp_resource(), index);
5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)PP_NetworkList_State NetworkList::GetState(uint32_t index) const {
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!has_interface<PPB_NetworkList_1_0>())
6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return PP_NETWORKLIST_STATE_DOWN;
6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return get_interface<PPB_NetworkList_1_0>()->GetState(
6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      pp_resource(), index);
6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)int32_t NetworkList::GetIpAddresses(
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    uint32_t index,
6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    std::vector<NetAddress>* addresses) const {
6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!has_interface<PPB_NetworkList_1_0>())
6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return PP_ERROR_NOINTERFACE;
7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!addresses)
7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return PP_ERROR_BADARGUMENT;
7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ResourceArrayOutputAdapter<NetAddress> adapter(addresses);
7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return get_interface<PPB_NetworkList_1_0>()->GetIpAddresses(
7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      pp_resource(), index, adapter.pp_array_output());
7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)std::string NetworkList::GetDisplayName(uint32_t index) const {
7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!has_interface<PPB_NetworkList_1_0>())
8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return std::string();
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  Var result(PASS_REF,
8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)             get_interface<PPB_NetworkList_1_0>()->GetDisplayName(
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                 pp_resource(), index));
8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return result.is_string() ? result.AsString() : std::string();
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)uint32_t NetworkList::GetMTU(uint32_t index) const {
8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!has_interface<PPB_NetworkList_1_0>())
8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return 0;
9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return get_interface<PPB_NetworkList_1_0>()->GetMTU(
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      pp_resource(), index);
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace pp
95