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

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: merge 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 base::SupportsWeakPtr<
19 PPB_NetworkMonitor_Private_Proxy::NetworkMonitor> {
20 public:
21 NetworkMonitor(PP_Instance instance,
22 PPB_NetworkMonitor_Private_Proxy* proxy,
23 PPB_NetworkMonitor_Callback callback,
24 void* user_data)
25 : Resource(OBJECT_IS_PROXY, instance),
26 proxy_(proxy),
27 callback_(callback),
28 user_data_(user_data) {
29 }
30
31 virtual ~NetworkMonitor() {
32 proxy_->OnNetworkMonitorDeleted(this, pp_instance());
33 }
34
35 // Resource overrides.
36 virtual ppapi::thunk::PPB_NetworkMonitor_Private_API*
37 AsPPB_NetworkMonitor_Private_API() OVERRIDE {
38 return this;
dmichael (off chromium) 2012/03/16 19:55:22 ditto here
Sergey Ulanov 2012/03/16 23:37:28 Done.
39 }
40
41 void OnNetworkListReceived(const scoped_refptr<NetworkListStorage>& list) {
42 PP_Resource list_resource =
43 PPB_NetworkList_Private_Shared::Create(
44 OBJECT_IS_PROXY, pp_instance(), list);
45 CallWhileUnlocked(callback_, user_data_, list_resource);
46 }
47
48 private:
49 PPB_NetworkMonitor_Private_Proxy* proxy_;
50 PPB_NetworkMonitor_Callback callback_;
51 void* user_data_;
52
53 DISALLOW_COPY_AND_ASSIGN(NetworkMonitor);
54 };
55
56 PPB_NetworkMonitor_Private_Proxy::PPB_NetworkMonitor_Private_Proxy(
57 Dispatcher* dispatcher)
58 : InterfaceProxy(dispatcher),
59 monitors_(new ObserverListThreadSafe<NetworkMonitor>()),
60 monitors_count_(0) {
61 }
62
63 PPB_NetworkMonitor_Private_Proxy::~PPB_NetworkMonitor_Private_Proxy() {
64 monitors_->AssertEmpty();
65 }
66
67 // static
68 PP_Resource PPB_NetworkMonitor_Private_Proxy::CreateProxyResource(
69 PP_Instance instance,
70 PPB_NetworkMonitor_Callback callback,
71 void* user_data) {
72 if (!callback)
73 return 0;
74
75 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
76 if (!dispatcher)
77 return 0;
78 PPB_NetworkMonitor_Private_Proxy* proxy =
79 static_cast<PPB_NetworkMonitor_Private_Proxy*>(
80 dispatcher->GetInterfaceProxy(kApiID));
81 if (!proxy)
82 return 0;
83
84 scoped_ptr<NetworkMonitor> result(
85 new NetworkMonitor(instance, proxy, callback, user_data));
86 proxy->monitors_->AddObserver(result.get());
87
88 proxy->monitors_count_++;
89 if (proxy->monitors_count_ == 1) {
90 // If that is the first network monitor then send Start message.
91 PluginGlobals::Get()->plugin_proxy_delegate()->SendToBrowser(
92 new PpapiHostMsg_PPBNetworkMonitor_Start(
93 dispatcher->plugin_dispatcher_id()));
94 } else if (proxy->current_list_.get()) {
95 MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
96 &NetworkMonitor::OnNetworkListReceived,
97 result->AsWeakPtr(), proxy->current_list_));
98 }
99
100 return result.release()->GetReference();
101 }
102
103 bool PPB_NetworkMonitor_Private_Proxy::OnMessageReceived(
104 const IPC::Message& msg) {
105 bool handled = true;
106 IPC_BEGIN_MESSAGE_MAP(PPB_NetworkMonitor_Private_Proxy, msg)
107 IPC_MESSAGE_HANDLER(PpapiMsg_PPBNetworkMonitor_NetworkList,
108 OnPluginMsgNetworkList)
109 IPC_MESSAGE_UNHANDLED(handled = false)
110 IPC_END_MESSAGE_MAP()
111 return handled;
112 }
113
114 void PPB_NetworkMonitor_Private_Proxy::OnPluginMsgNetworkList(
115 uint32 plugin_dispatcher_id,
116 const ppapi::NetworkList& list) {
117 scoped_refptr<NetworkListStorage> list_storage(new NetworkListStorage(list));
118 current_list_ = list_storage;
119 monitors_->Notify(&NetworkMonitor::OnNetworkListReceived, list_storage);
dmichael (off chromium) 2012/03/16 19:55:22 Have you thought about corner cases due to the asy
Sergey Ulanov 2012/03/16 23:37:28 Heh, that scenario is the reason I initially had t
120 }
121
122 void PPB_NetworkMonitor_Private_Proxy::OnNetworkMonitorDeleted(
123 NetworkMonitor* monitor,
124 PP_Instance instance) {
125 monitors_->RemoveObserver(monitor);
126 monitors_count_--;
127 if (monitors_count_ == 0) {
128 // Send Stop message if that was the last NetworkMonitor.
129 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
130 if (dispatcher) {
131 current_list_ = NULL;
132 PluginGlobals::Get()->plugin_proxy_delegate()->SendToBrowser(
133 new PpapiHostMsg_PPBNetworkMonitor_Stop(
134 dispatcher->plugin_dispatcher_id()));
135 }
136 }
137 }
138
139 } // namespace proxy
140 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698