| Index: ppapi/proxy/ppb_file_ref_proxy.cc
|
| diff --git a/ppapi/proxy/ppb_file_ref_proxy.cc b/ppapi/proxy/ppb_file_ref_proxy.cc
|
| index 26c3e15fc1b8e2194c9c934f27ff736d8fde6fa5..d8ffde6745be642a189839cc32a683239733d02d 100644
|
| --- a/ppapi/proxy/ppb_file_ref_proxy.cc
|
| +++ b/ppapi/proxy/ppb_file_ref_proxy.cc
|
| @@ -38,14 +38,15 @@ class FileRef : public PPB_FileRef_Shared {
|
|
|
| // PPB_FileRef_API implementation (not provided by PPB_FileRef_Shared).
|
| virtual PP_Resource GetParent() OVERRIDE;
|
| - virtual int32_t MakeDirectory(PP_Bool make_ancestors,
|
| - PP_CompletionCallback callback) OVERRIDE;
|
| + virtual int32_t MakeDirectory(
|
| + PP_Bool make_ancestors,
|
| + scoped_refptr<TrackedCallback> callback) OVERRIDE;
|
| virtual int32_t Touch(PP_Time last_access_time,
|
| PP_Time last_modified_time,
|
| - PP_CompletionCallback callback) OVERRIDE;
|
| - virtual int32_t Delete(PP_CompletionCallback callback) OVERRIDE;
|
| + scoped_refptr<TrackedCallback> callback) OVERRIDE;
|
| + virtual int32_t Delete(scoped_refptr<TrackedCallback> callback) OVERRIDE;
|
| virtual int32_t Rename(PP_Resource new_file_ref,
|
| - PP_CompletionCallback callback) OVERRIDE;
|
| + scoped_refptr<TrackedCallback> callback) OVERRIDE;
|
| virtual PP_Var GetAbsolutePath() OVERRIDE;
|
|
|
| // Executes the pending callback with the given ID. See pending_callbacks_.
|
| @@ -56,9 +57,8 @@ class FileRef : public PPB_FileRef_Shared {
|
| return PluginDispatcher::GetForResource(this);
|
| }
|
|
|
| - // Adds a callback to the list and returns its ID. Returns 0 if the callback
|
| - // is invalid.
|
| - int SendCallback(PP_CompletionCallback callback);
|
| + // Adds a callback to the list and returns its ID.
|
| + int SendCallback(scoped_refptr<TrackedCallback> callback);
|
|
|
| // This class can have any number of out-standing requests with completion
|
| // callbacks, in contrast to most resources which have one possible pending
|
| @@ -66,9 +66,10 @@ class FileRef : public PPB_FileRef_Shared {
|
| //
|
| // To keep track of them, assign integer IDs to the callbacks, which is how
|
| // the callback will be identified when it's passed to the host and then
|
| - // back here.
|
| - int next_callback_id_;
|
| - typedef std::map<int, scoped_refptr<TrackedCallback> > PendingCallbackMap;
|
| + // back here. Use unsigned so that overflow is well-defined.
|
| + unsigned int next_callback_id_;
|
| + typedef std::map<unsigned int,
|
| + scoped_refptr<TrackedCallback> > PendingCallbackMap;
|
| PendingCallbackMap pending_callbacks_;
|
|
|
| DISALLOW_IMPLICIT_CONSTRUCTORS(FileRef);
|
| @@ -76,7 +77,7 @@ class FileRef : public PPB_FileRef_Shared {
|
|
|
| FileRef::FileRef(const PPB_FileRef_CreateInfo& info)
|
| : PPB_FileRef_Shared(OBJECT_IS_PROXY, info),
|
| - next_callback_id_(1) {
|
| + next_callback_id_(0u) {
|
| }
|
|
|
| FileRef::~FileRef() {
|
| @@ -97,45 +98,30 @@ PP_Resource FileRef::GetParent() {
|
| }
|
|
|
| int32_t FileRef::MakeDirectory(PP_Bool make_ancestors,
|
| - PP_CompletionCallback callback) {
|
| - int callback_id = SendCallback(callback);
|
| - if (!callback_id)
|
| - return PP_ERROR_BADARGUMENT;
|
| -
|
| + scoped_refptr<TrackedCallback> callback) {
|
| GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_MakeDirectory(
|
| - API_ID_PPB_FILE_REF, host_resource(), make_ancestors, callback_id));
|
| + API_ID_PPB_FILE_REF, host_resource(), make_ancestors,
|
| + SendCallback(callback)));
|
| return PP_OK_COMPLETIONPENDING;
|
| }
|
|
|
| int32_t FileRef::Touch(PP_Time last_access_time,
|
| PP_Time last_modified_time,
|
| - PP_CompletionCallback callback) {
|
| - int callback_id = SendCallback(callback);
|
| - if (!callback_id)
|
| - return PP_ERROR_BADARGUMENT;
|
| -
|
| + scoped_refptr<TrackedCallback> callback) {
|
| GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_Touch(
|
| - API_ID_PPB_FILE_REF, host_resource(),
|
| - last_access_time, last_modified_time, callback_id));
|
| + API_ID_PPB_FILE_REF, host_resource(), last_access_time,
|
| + last_modified_time, SendCallback(callback)));
|
| return PP_OK_COMPLETIONPENDING;
|
| }
|
|
|
| -int32_t FileRef::Delete(PP_CompletionCallback callback) {
|
| - int callback_id = SendCallback(callback);
|
| - if (!callback_id)
|
| - return PP_ERROR_BADARGUMENT;
|
| -
|
| +int32_t FileRef::Delete(scoped_refptr<TrackedCallback> callback) {
|
| GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_Delete(
|
| - API_ID_PPB_FILE_REF, host_resource(), callback_id));
|
| + API_ID_PPB_FILE_REF, host_resource(), SendCallback(callback)));
|
| return PP_OK_COMPLETIONPENDING;
|
| }
|
|
|
| int32_t FileRef::Rename(PP_Resource new_file_ref,
|
| - PP_CompletionCallback callback) {
|
| - int callback_id = SendCallback(callback);
|
| - if (!callback_id)
|
| - return PP_ERROR_BADARGUMENT;
|
| -
|
| + scoped_refptr<TrackedCallback> callback) {
|
| Resource* new_file_ref_object =
|
| PpapiGlobals::Get()->GetResourceTracker()->GetResource(new_file_ref);
|
| if (!new_file_ref_object ||
|
| @@ -144,7 +130,7 @@ int32_t FileRef::Rename(PP_Resource new_file_ref,
|
|
|
| GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_Rename(
|
| API_ID_PPB_FILE_REF, host_resource(),
|
| - new_file_ref_object->host_resource(), callback_id));
|
| + new_file_ref_object->host_resource(), SendCallback(callback)));
|
| return PP_OK_COMPLETIONPENDING;
|
| }
|
|
|
| @@ -170,15 +156,12 @@ void FileRef::ExecuteCallback(int callback_id, int32_t result) {
|
| callback->Run(result);
|
| }
|
|
|
| -int FileRef::SendCallback(PP_CompletionCallback callback) {
|
| - if (!callback.func)
|
| - return 0;
|
| -
|
| +int FileRef::SendCallback(scoped_refptr<TrackedCallback> callback) {
|
| // In extreme cases the IDs may wrap around, so avoid duplicates.
|
| - while (pending_callbacks_.find(next_callback_id_) != pending_callbacks_.end())
|
| - next_callback_id_++;
|
| + while (pending_callbacks_.count(next_callback_id_))
|
| + ++next_callback_id_;
|
|
|
| - pending_callbacks_[next_callback_id_] = new TrackedCallback(this, callback);
|
| + pending_callbacks_[next_callback_id_] = callback;
|
| return next_callback_id_++;
|
| }
|
|
|
|
|