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.
5 #include "remoting/client/plugin/pepper_util.h"
7 #include "base/callback.h"
8 #include "base/logging.h"
9 #include "ppapi/c/pp_completion_callback.h"
10 #include "ppapi/cpp/module.h"
11 #include "ppapi/cpp/private/net_address_private.h"
12 #include "third_party/libjingle/source/talk/base/socketaddress.h"
16 static void CallbackAdapter(void* user_data
, int32_t result
) {
17 scoped_ptr
<base::Callback
<void(int)> > callback(
18 reinterpret_cast<base::Callback
<void(int)>*>(user_data
));
19 callback
->Run(result
);
22 pp::CompletionCallback
PpCompletionCallback(
23 base::Callback
<void(int)> callback
) {
24 return pp::CompletionCallback(&CallbackAdapter
,
25 new base::Callback
<void(int)>(callback
));
28 bool SocketAddressToPpAddressWithPort(const talk_base::SocketAddress
& address
,
29 PP_NetAddress_Private
* pp_address
,
32 switch (address
.ipaddr().family()) {
34 in_addr addr
= address
.ipaddr().ipv4_address();
35 result
= pp::NetAddressPrivate::CreateFromIPv4Address(
36 reinterpret_cast<uint8_t*>(&addr
), port
, pp_address
);
40 in6_addr addr
= address
.ipaddr().ipv6_address();
41 result
= pp::NetAddressPrivate::CreateFromIPv6Address(
42 addr
.s6_addr
, 0, port
, pp_address
);
46 LOG(WARNING
) << "Unknown address family: " << address
.ipaddr().family();
50 LOG(WARNING
) << "Failed to convert address: " << address
.ToString();
55 bool SocketAddressToPpAddress(const talk_base::SocketAddress
& address
,
56 PP_NetAddress_Private
* pp_address
) {
57 return SocketAddressToPpAddressWithPort(address
, pp_address
, address
.port());
60 bool PpAddressToSocketAddress(const PP_NetAddress_Private
& pp_address
,
61 talk_base::SocketAddress
* address
) {
62 uint8_t addr_storage
[16];
63 bool result
= pp::NetAddressPrivate::GetAddress(
64 pp_address
, &addr_storage
, sizeof(addr_storage
));
67 switch (pp::NetAddressPrivate::GetFamily(pp_address
)) {
68 case PP_NETADDRESSFAMILY_IPV4
:
69 address
->SetIP(talk_base::IPAddress(
70 *reinterpret_cast<in_addr
*>(addr_storage
)));
72 case PP_NETADDRESSFAMILY_IPV6
:
73 address
->SetIP(talk_base::IPAddress(
74 *reinterpret_cast<in6_addr
*>(addr_storage
)));
82 LOG(WARNING
) << "Failed to convert address: "
83 << pp::NetAddressPrivate::Describe(pp_address
, true);
85 address
->SetPort(pp::NetAddressPrivate::GetPort(pp_address
));
90 } // namespace remoting