1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file.
4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ppapi/proxy/network_list_resource.h"
6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <algorithm>
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/logging.h"
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ppapi/c/pp_errors.h"
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ppapi/shared_impl/array_writer.h"
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ppapi/shared_impl/var.h"
13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ppapi/thunk/enter.h"
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace ppapi {
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace proxy {
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)NetworkListResource::NetworkListResource(PP_Instance instance,
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                         const SerializedNetworkList& list)
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    : Resource(OBJECT_IS_PROXY, instance),
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      list_(list) {
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)NetworkListResource::~NetworkListResource() {}
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)thunk::PPB_NetworkList_API* NetworkListResource::AsPPB_NetworkList_API() {
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return this;
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)uint32_t NetworkListResource::GetCount() {
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return static_cast<uint32_t>(list_.size());
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)PP_Var NetworkListResource::GetName(uint32_t index) {
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (index >= list_.size())
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return PP_MakeUndefined();
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return StringVar::StringToPPVar(list_.at(index).name);
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)PP_NetworkList_Type NetworkListResource::GetType(uint32_t index) {
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (index >= list_.size())
4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return PP_NETWORKLIST_TYPE_UNKNOWN;
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return list_.at(index).type;
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)PP_NetworkList_State NetworkListResource::GetState(uint32_t index) {
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (index >= list_.size())
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return PP_NETWORKLIST_STATE_DOWN;
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return list_.at(index).state;
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)int32_t NetworkListResource::GetIpAddresses(uint32_t index,
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                            const PP_ArrayOutput& output) {
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ArrayWriter writer(output);
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (index >= list_.size() || !writer.is_valid())
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return PP_ERROR_BADARGUMENT;
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  thunk::EnterResourceCreationNoLock enter(pp_instance());
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (enter.failed())
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return PP_ERROR_FAILED;
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const std::vector<PP_NetAddress_Private>& addresses =
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      list_.at(index).addresses;
64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  std::vector<PP_Resource> addr_resources;
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  for (size_t i = 0; i < addresses.size(); ++i) {
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    addr_resources.push_back(
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        enter.functions()->CreateNetAddressFromNetAddressPrivate(
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            pp_instance(), addresses[i]));
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!writer.StoreResourceVector(addr_resources))
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return PP_ERROR_FAILED;
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return PP_OK;
74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)PP_Var NetworkListResource::GetDisplayName(uint32_t index) {
77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (index >= list_.size())
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return PP_MakeUndefined();
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return StringVar::StringToPPVar(list_.at(index).display_name);
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)uint32_t NetworkListResource::GetMTU(uint32_t index) {
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (index >= list_.size())
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return 0;
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return list_.at(index).mtu;
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace proxy
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace thunk
90