Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(181)

Side by Side Diff: ppapi/proxy/ppb_network_monitor_private_proxy.cc

Issue 9677060: Out-of-process implementation of the PPB_NetworkMonitor_Private interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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.
4
5 #include "ppapi/proxy/ppb_network_monitor_private_proxy.h"
6
7 #include "ppapi/proxy/enter_proxy.h"
8 #include "ppapi/proxy/plugin_proxy_delegate.h"
9 #include "ppapi/proxy/ppapi_messages.h"
10 #include "ppapi/thunk/ppb_network_monitor_private_api.h"
11
12 namespace ppapi {
13 namespace proxy {
14
15 class PPB_NetworkMonitor_Private_Proxy::NetworkMonitor
16 : public Resource,
17 public thunk::PPB_NetworkMonitor_Private_API {
18 public:
19 NetworkMonitor(PP_Instance instance,
20 PPB_NetworkMonitor_Private_Proxy* proxy,
21 PPB_NetworkMonitor_Callback callback,
22 void* user_data)
23 : Resource(OBJECT_IS_PROXY, instance),
24 proxy_(proxy),
25 callback_(callback),
26 user_data_(user_data) {
27 }
28
29 virtual ~NetworkMonitor() {
30 proxy_->OnNetworkMonitorDeleted(this, pp_instance());
dmichael (off chromium) 2012/03/15 20:01:28 By putting the bodies of these functions in the cl
Sergey Ulanov 2012/03/15 22:18:00 The compiler will inline these methods only when i
dmichael (off chromium) 2012/03/16 19:55:22 Yes, please move the destructor implementation out
Sergey Ulanov 2012/03/16 23:37:28 Clang style checker only checks that constructor/d
dmichael (off chromium) 2012/03/19 16:25:08 Yeah, I thought you'd be stuck doing it anyway. Di
Sergey Ulanov 2012/03/19 20:43:29 Done.
31 }
32
33 // Resource overrides.
34 ppapi::thunk::PPB_NetworkMonitor_Private_API*
35 AsPPB_NetworkMonitor_Private_API() {
36 return this;
37 }
38
39 void OnNetworkList(const scoped_refptr<NetworkListStorage>& list) {
dmichael (off chromium) 2012/03/15 20:01:28 Can you think of a better name , like... OnReceiv
Sergey Ulanov 2012/03/15 22:18:00 Renamed to OnNetworkListReceived()
40 PP_Resource list_resource =
41 PPB_NetworkList_Private_Shared::Create(
42 OBJECT_IS_PROXY, pp_instance(), list);
43 callback_(user_data_, list_resource);
dmichael (off chromium) 2012/03/15 20:01:28 Here, you need to use "CallWhileUnlocked" from ppa
Sergey Ulanov 2012/03/15 22:18:00 Ah, that makes sense now!
44 }
45
46 private:
47 PPB_NetworkMonitor_Private_Proxy* proxy_;
48 PPB_NetworkMonitor_Callback callback_;
49 void* user_data_;
50
51 DISALLOW_COPY_AND_ASSIGN(NetworkMonitor);
52 };
53
54 PPB_NetworkMonitor_Private_Proxy::PPB_NetworkMonitor_Private_Proxy(
55 Dispatcher* dispatcher)
56 : InterfaceProxy(dispatcher),
57 monitors_(new ObserverListThreadSafe<NetworkMonitor>()),
58 monitors_count_(0) {
59 }
60
61 PPB_NetworkMonitor_Private_Proxy::~PPB_NetworkMonitor_Private_Proxy() {
62 monitors_->AssertEmpty();
63 }
64
65 // static
66 PP_Resource PPB_NetworkMonitor_Private_Proxy::CreateProxyResource(
67 PP_Instance instance,
68 PPB_NetworkMonitor_Callback callback,
69 void* user_data) {
70 if (!callback)
71 return 0;
72
73 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
74 if (!dispatcher)
75 return 0;
76 PPB_NetworkMonitor_Private_Proxy* proxy =
77 static_cast<PPB_NetworkMonitor_Private_Proxy*>(
78 dispatcher->GetInterfaceProxy(kApiID));
79 if (!proxy)
80 return 0;
81
82 scoped_ptr<NetworkMonitor> result(
83 new NetworkMonitor(instance, proxy, callback, user_data));
84 proxy->monitors_->AddObserver(result.get());
85
86 scoped_refptr<NetworkListStorage> current_list;
87
88 {
89 base::AutoLock lock(proxy->lock_);
90
91 proxy->monitors_count_++;
92 if (proxy->monitors_count_ == 1) {
dmichael (off chromium) 2012/03/15 20:01:28 ObserverList has size(), so I don't think you need
Sergey Ulanov 2012/03/15 22:18:00 I believe that we need ThreadSafe observer list be
93 // If that is the first network monitor then release the
94 // previous list, if any, and then send Start message.
95 proxy->current_list_ = NULL;
dmichael (off chromium) 2012/03/15 20:01:28 It seems cleaner to me to clear the list in OnNetw
Sergey Ulanov 2012/03/15 22:18:00 Done.
96 PluginGlobals::Get()->plugin_proxy_delegate()->SendToBrowser(
97 new PpapiHostMsg_PPBNetworkMonitor_Start(
98 dispatcher->plugin_dispatcher_id()));
99 } else if (proxy->current_list_.get()) {
100 current_list = proxy->current_list_;
101 }
102 }
103
104 if (current_list.get())
105 result->OnNetworkList(current_list);
dmichael (off chromium) 2012/03/15 20:01:28 Shouldn't this be posted to happen asynchronously
Sergey Ulanov 2012/03/15 22:18:00 Done.
106
107 return result.release()->GetReference();
108 }
109
110 bool PPB_NetworkMonitor_Private_Proxy::OnMessageReceived(
111 const IPC::Message& msg) {
112 bool handled = true;
113 IPC_BEGIN_MESSAGE_MAP(PPB_NetworkMonitor_Private_Proxy, msg)
114 IPC_MESSAGE_HANDLER(PpapiMsg_PPBNetworkMonitor_NetworkList,
115 OnPluginMsgNetworkList)
116 IPC_MESSAGE_UNHANDLED(handled = false)
117 IPC_END_MESSAGE_MAP()
118 return handled;
119 }
120
121 void PPB_NetworkMonitor_Private_Proxy::OnPluginMsgNetworkList(
122 uint32 plugin_dispatcher_id,
123 const ppapi::NetworkList& list) {
124 scoped_refptr<NetworkListStorage> list_storage(new NetworkListStorage(list));
125
126 {
127 base::AutoLock lock(lock_);
128 current_list_ = list_storage;
129 }
130
131 monitors_->Notify(&NetworkMonitor::OnNetworkList, list_storage);
132 }
133
134 void PPB_NetworkMonitor_Private_Proxy::OnNetworkMonitorDeleted(
135 NetworkMonitor* monitor,
136 PP_Instance instance) {
137 monitors_->RemoveObserver(monitor);
138 {
139 base::AutoLock lock(lock_);
140 monitors_count_--;
141 if (monitors_count_ == 0) {
142 // Send Stop message if that was the last NetworkMonitor.
143 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
144 if (dispatcher) {
145 PluginGlobals::Get()->plugin_proxy_delegate()->SendToBrowser(
146 new PpapiHostMsg_PPBNetworkMonitor_Stop(
147 dispatcher->plugin_dispatcher_id()));
148 }
149 }
150 }
151 }
152
153 } // namespace proxy
154 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698