Index: ppapi/proxy/ppb_network_monitor_private_proxy.cc |
diff --git a/ppapi/proxy/ppb_network_monitor_private_proxy.cc b/ppapi/proxy/ppb_network_monitor_private_proxy.cc |
index 055ed2e3a7b3192f87172dbb6a57daf47fc7a648..c91a263c4f4753219b0e08992a95ca647cb19a9e 100644 |
--- a/ppapi/proxy/ppb_network_monitor_private_proxy.cc |
+++ b/ppapi/proxy/ppb_network_monitor_private_proxy.cc |
@@ -19,19 +19,40 @@ class PPB_NetworkMonitor_Private_Proxy::NetworkMonitor |
PPB_NetworkMonitor_Private_Proxy::NetworkMonitor> { |
public: |
NetworkMonitor(PP_Instance instance, |
- PPB_NetworkMonitor_Private_Proxy* proxy, |
- PPB_NetworkMonitor_Callback callback, |
- void* user_data) |
+ PPB_NetworkMonitor_Private_Proxy* proxy) |
: Resource(OBJECT_IS_PROXY, instance), |
proxy_(proxy), |
- callback_(callback), |
- user_data_(user_data) { |
+ initial_list_sent_(false), |
+ network_list_(NULL) { |
} |
virtual ~NetworkMonitor() { |
+ if (TrackedCallback::IsPending(update_callback_)) |
+ update_callback_->PostAbort(); |
proxy_->OnNetworkMonitorDeleted(this, pp_instance()); |
} |
+ // thunk::PPB_NetworkMonitor_Private_API interface. |
+ virtual int32_t UpdateNetworkList( |
+ PP_Resource* network_list, |
+ scoped_refptr<TrackedCallback> callback) OVERRIDE { |
+ if (!network_list) |
+ return PP_ERROR_BADARGUMENT; |
+ if (TrackedCallback::IsPending(update_callback_)) |
+ return PP_ERROR_INPROGRESS; |
+ |
+ if (current_list_ && !initial_list_sent_) { |
+ initial_list_sent_ = true; |
+ thunk::EnterResourceCreation enter(pp_instance()); |
yzshen1
2013/09/04 19:52:01
Please use EnterResourceCreationNoLock. At this po
Sergey Ulanov
2013/09/04 22:22:32
Done. Thanks for catching this.
|
+ *network_list = PPB_NetworkList_Private_Shared::Create( |
+ OBJECT_IS_PROXY, pp_instance(), current_list_); |
+ return PP_OK; |
+ } |
+ |
+ network_list_ = network_list; |
+ update_callback_ = callback; |
+ return PP_OK_COMPLETIONPENDING; |
+ } |
// Resource overrides. |
virtual ppapi::thunk::PPB_NetworkMonitor_Private_API* |
@@ -46,16 +67,28 @@ class PPB_NetworkMonitor_Private_Proxy::NetworkMonitor |
void OnNetworkListReceivedLocks( |
const scoped_refptr<NetworkListStorage>& list) { |
ProxyAutoLock lock; |
- PP_Resource list_resource = |
- PPB_NetworkList_Private_Shared::Create( |
+ |
+ current_list_ = list; |
+ |
+ if (TrackedCallback::IsPending(update_callback_)) { |
+ initial_list_sent_ = true; |
+ { |
+ thunk::EnterResourceCreationNoLock enter(pp_instance()); |
+ *network_list_ = PPB_NetworkList_Private_Shared::Create( |
OBJECT_IS_PROXY, pp_instance(), list); |
yzshen1
2013/09/04 19:52:01
nit: please consider setting network_list_ to NULL
Sergey Ulanov
2013/09/04 22:22:32
Done.
|
- CallWhileUnlocked(callback_, user_data_, list_resource); |
+ } |
+ update_callback_->Run(PP_OK); |
+ } |
} |
private: |
PPB_NetworkMonitor_Private_Proxy* proxy_; |
- PPB_NetworkMonitor_Callback callback_; |
- void* user_data_; |
+ scoped_refptr<NetworkListStorage> current_list_; |
+ bool initial_list_sent_; |
+ |
+ // Parameters passed to UpdateNetworkList(); |
+ PP_Resource* network_list_; |
+ scoped_refptr<TrackedCallback> update_callback_; |
DISALLOW_COPY_AND_ASSIGN(NetworkMonitor); |
}; |
@@ -73,14 +106,9 @@ PPB_NetworkMonitor_Private_Proxy::~PPB_NetworkMonitor_Private_Proxy() { |
// static |
PP_Resource PPB_NetworkMonitor_Private_Proxy::CreateProxyResource( |
- PP_Instance instance, |
- PPB_NetworkMonitor_Callback callback, |
- void* user_data) { |
+ PP_Instance instance) { |
// TODO(dmichael): Check that this thread has a valid message loop associated |
// with it. |
- if (!callback) |
- return 0; |
- |
PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
if (!dispatcher) |
return 0; |
@@ -90,8 +118,7 @@ PP_Resource PPB_NetworkMonitor_Private_Proxy::CreateProxyResource( |
if (!proxy) |
return 0; |
- scoped_refptr<NetworkMonitor> result( |
- new NetworkMonitor(instance, proxy, callback, user_data)); |
+ scoped_refptr<NetworkMonitor> result(new NetworkMonitor(instance, proxy)); |
proxy->monitors_->AddObserver(result.get()); |
proxy->monitors_count_++; |