| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ppapi/proxy/ppb_broker_proxy.h" | 5 #include "ppapi/proxy/ppb_broker_proxy.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "ppapi/c/pp_errors.h" | 8 #include "ppapi/c/pp_errors.h" |
| 9 #include "ppapi/c/trusted/ppb_broker_trusted.h" | 9 #include "ppapi/c/trusted/ppb_broker_trusted.h" |
| 10 #include "ppapi/proxy/enter_proxy.h" | 10 #include "ppapi/proxy/enter_proxy.h" |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 // sends the IPC. This member holds the handle value for the plugin module | 50 // sends the IPC. This member holds the handle value for the plugin module |
| 51 // to read, but the plugin side of the proxy never takes ownership. | 51 // to read, but the plugin side of the proxy never takes ownership. |
| 52 base::SyncSocket::Handle socket_handle_; | 52 base::SyncSocket::Handle socket_handle_; |
| 53 | 53 |
| 54 DISALLOW_COPY_AND_ASSIGN(Broker); | 54 DISALLOW_COPY_AND_ASSIGN(Broker); |
| 55 }; | 55 }; |
| 56 | 56 |
| 57 Broker::Broker(const HostResource& resource) | 57 Broker::Broker(const HostResource& resource) |
| 58 : Resource(OBJECT_IS_PROXY, resource), | 58 : Resource(OBJECT_IS_PROXY, resource), |
| 59 called_connect_(false), | 59 called_connect_(false), |
| 60 socket_handle_(base::kInvalidPlatformFileValue) { | 60 socket_handle_(base::SyncSocket::kInvalidHandle) { |
| 61 } | 61 } |
| 62 | 62 |
| 63 Broker::~Broker() { | 63 Broker::~Broker() { |
| 64 socket_handle_ = base::kInvalidPlatformFileValue; | 64 socket_handle_ = base::SyncSocket::kInvalidHandle; |
| 65 } | 65 } |
| 66 | 66 |
| 67 PPB_Broker_API* Broker::AsPPB_Broker_API() { | 67 PPB_Broker_API* Broker::AsPPB_Broker_API() { |
| 68 return this; | 68 return this; |
| 69 } | 69 } |
| 70 | 70 |
| 71 int32_t Broker::Connect(scoped_refptr<TrackedCallback> connect_callback) { | 71 int32_t Broker::Connect(scoped_refptr<TrackedCallback> connect_callback) { |
| 72 if (TrackedCallback::IsPending(current_connect_callback_)) | 72 if (TrackedCallback::IsPending(current_connect_callback_)) |
| 73 return PP_ERROR_INPROGRESS; | 73 return PP_ERROR_INPROGRESS; |
| 74 else if (called_connect_) | 74 else if (called_connect_) |
| 75 return PP_ERROR_FAILED; | 75 return PP_ERROR_FAILED; |
| 76 | 76 |
| 77 current_connect_callback_ = connect_callback; | 77 current_connect_callback_ = connect_callback; |
| 78 called_connect_ = true; | 78 called_connect_ = true; |
| 79 | 79 |
| 80 bool success = PluginDispatcher::GetForResource(this)->Send( | 80 bool success = PluginDispatcher::GetForResource(this)->Send( |
| 81 new PpapiHostMsg_PPBBroker_Connect( | 81 new PpapiHostMsg_PPBBroker_Connect( |
| 82 API_ID_PPB_BROKER, host_resource())); | 82 API_ID_PPB_BROKER, host_resource())); |
| 83 return success ? PP_OK_COMPLETIONPENDING : PP_ERROR_FAILED; | 83 return success ? PP_OK_COMPLETIONPENDING : PP_ERROR_FAILED; |
| 84 } | 84 } |
| 85 | 85 |
| 86 int32_t Broker::GetHandle(int32_t* handle) { | 86 int32_t Broker::GetHandle(int32_t* handle) { |
| 87 if (socket_handle_ == base::kInvalidPlatformFileValue) | 87 if (socket_handle_ == base::SyncSocket::kInvalidHandle) |
| 88 return PP_ERROR_FAILED; | 88 return PP_ERROR_FAILED; |
| 89 *handle = PlatformFileToInt(socket_handle_); | 89 *handle = PlatformFileToInt(socket_handle_); |
| 90 return PP_OK; | 90 return PP_OK; |
| 91 } | 91 } |
| 92 | 92 |
| 93 void Broker::ConnectComplete(IPC::PlatformFileForTransit socket_handle, | 93 void Broker::ConnectComplete(IPC::PlatformFileForTransit socket_handle, |
| 94 int32_t result) { | 94 int32_t result) { |
| 95 if (result == PP_OK) { | 95 if (result == PP_OK) { |
| 96 DCHECK(socket_handle_ == base::kInvalidPlatformFileValue); | 96 DCHECK(socket_handle_ == base::SyncSocket::kInvalidHandle); |
| 97 socket_handle_ = IPC::PlatformFileForTransitToPlatformFile(socket_handle); | 97 socket_handle_ = IPC::PlatformFileForTransitToPlatformFile(socket_handle); |
| 98 } else { | 98 } else { |
| 99 // The caller may still have given us a handle in the failure case. | 99 // The caller may still have given us a handle in the failure case. |
| 100 // The easiest way to clean it up is to just put it in an object | 100 // The easiest way to clean it up is to just put it in an object |
| 101 // and then close them. This failure case is not performance critical. | 101 // and then close them. This failure case is not performance critical. |
| 102 base::SyncSocket temp_socket( | 102 base::SyncSocket temp_socket( |
| 103 IPC::PlatformFileForTransitToPlatformFile(socket_handle)); | 103 IPC::PlatformFileForTransitToPlatformFile(socket_handle)); |
| 104 } | 104 } |
| 105 | 105 |
| 106 if (!TrackedCallback::IsPending(current_connect_callback_)) { | 106 if (!TrackedCallback::IsPending(current_connect_callback_)) { |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 } | 190 } |
| 191 | 191 |
| 192 // Callback on the host side. | 192 // Callback on the host side. |
| 193 // Transfers ownership of the handle to the plugin side. This function must | 193 // Transfers ownership of the handle to the plugin side. This function must |
| 194 // either successfully call the callback or close the handle. | 194 // either successfully call the callback or close the handle. |
| 195 void PPB_Broker_Proxy::ConnectCompleteInHost(int32_t result, | 195 void PPB_Broker_Proxy::ConnectCompleteInHost(int32_t result, |
| 196 const HostResource& broker) { | 196 const HostResource& broker) { |
| 197 IPC::PlatformFileForTransit foreign_socket_handle = | 197 IPC::PlatformFileForTransit foreign_socket_handle = |
| 198 IPC::InvalidPlatformFileForTransit(); | 198 IPC::InvalidPlatformFileForTransit(); |
| 199 if (result == PP_OK) { | 199 if (result == PP_OK) { |
| 200 int32_t socket_handle = PlatformFileToInt(base::kInvalidPlatformFileValue); | 200 int32_t socket_handle = PlatformFileToInt(base::SyncSocket::kInvalidHandle); |
| 201 EnterHostFromHostResource<PPB_Broker_API> enter(broker); | 201 EnterHostFromHostResource<PPB_Broker_API> enter(broker); |
| 202 if (enter.succeeded()) | 202 if (enter.succeeded()) |
| 203 result = enter.object()->GetHandle(&socket_handle); | 203 result = enter.object()->GetHandle(&socket_handle); |
| 204 DCHECK(result == PP_OK || | 204 DCHECK(result == PP_OK || |
| 205 socket_handle == PlatformFileToInt(base::kInvalidPlatformFileValue)); | 205 socket_handle == |
| 206 PlatformFileToInt(base::SyncSocket::kInvalidHandle)); |
| 206 | 207 |
| 207 if (result == PP_OK) { | 208 if (result == PP_OK) { |
| 208 foreign_socket_handle = | 209 foreign_socket_handle = |
| 209 dispatcher()->ShareHandleWithRemote(IntToPlatformFile(socket_handle), | 210 dispatcher()->ShareHandleWithRemote(IntToPlatformFile(socket_handle), |
| 210 true); | 211 true); |
| 211 if (foreign_socket_handle == IPC::InvalidPlatformFileForTransit()) { | 212 if (foreign_socket_handle == IPC::InvalidPlatformFileForTransit()) { |
| 212 result = PP_ERROR_FAILED; | 213 result = PP_ERROR_FAILED; |
| 213 // Assume the local handle was closed even if the foreign handle could | 214 // Assume the local handle was closed even if the foreign handle could |
| 214 // not be created. | 215 // not be created. |
| 215 } | 216 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 226 // The easiest way to clean it up is to just put it in an object | 227 // The easiest way to clean it up is to just put it in an object |
| 227 // and then close it. This failure case is not performance critical. | 228 // and then close it. This failure case is not performance critical. |
| 228 // The handle could still leak if Send succeeded but the IPC later failed. | 229 // The handle could still leak if Send succeeded but the IPC later failed. |
| 229 base::SyncSocket temp_socket( | 230 base::SyncSocket temp_socket( |
| 230 IPC::PlatformFileForTransitToPlatformFile(foreign_socket_handle)); | 231 IPC::PlatformFileForTransitToPlatformFile(foreign_socket_handle)); |
| 231 } | 232 } |
| 232 } | 233 } |
| 233 | 234 |
| 234 } // namespace proxy | 235 } // namespace proxy |
| 235 } // namespace ppapi | 236 } // namespace ppapi |
| OLD | NEW |