| // Copyright (c) 2013 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef PPAPI_CPP_PRIVATE_PASS_FILE_HANDLE_H_ | |
| #define PPAPI_CPP_PRIVATE_PASS_FILE_HANDLE_H_ | |
| #include <string.h> | |
| #include "ppapi/c/private/pp_file_handle.h" | |
| #include "ppapi/cpp/output_traits.h" | |
| namespace pp { | |
| // A wrapper class for PP_FileHandle to make sure a file handle is | |
| // closed. This object takes the ownership of the file handle when it | |
| // is constructed. This loses the ownership when this object is | |
| // assigned to another object, just like auto_ptr. | |
| class PassFileHandle { | |
| public: | |
| PassFileHandle(); | |
| // This constructor takes the ownership of |handle|. | |
| explicit PassFileHandle(PP_FileHandle handle); | |
| // Moves the ownership of |handle| to this object. | |
| PassFileHandle(PassFileHandle& handle); | |
| ~PassFileHandle(); | |
| // Releases |handle_|. The caller must close the file handle returned. | |
| PP_FileHandle Release(); | |
| private: | |
| // PassFileHandleRef allows users to return PassFileHandle as a | |
| // value. This technique is also used by auto_ptr_ref. | |
| struct PassFileHandleRef { | |
| PP_FileHandle handle; | |
| explicit PassFileHandleRef(PP_FileHandle h) | |
| : handle(h) { | |
| } | |
| }; | |
| public: | |
| PassFileHandle(PassFileHandleRef ref) | |
| : handle_(ref.handle) { | |
| } | |
| operator PassFileHandleRef() { | |
| return PassFileHandleRef(Release()); | |
| } | |
| private: | |
| void operator=(const PassFileHandle&); | |
| void Close(); | |
| PP_FileHandle handle_; | |
| }; | |
| namespace internal { | |
| template<> | |
| struct CallbackOutputTraits<PassFileHandle> { | |
| typedef PP_FileHandle* APIArgType; | |
| typedef PP_FileHandle StorageType; | |
| static inline APIArgType StorageToAPIArg(StorageType& t) { | |
| return &t; | |
| } | |
| static inline PassFileHandle StorageToPluginArg(StorageType& t) { | |
| return PassFileHandle(t); | |
| } | |
| static inline void Initialize(StorageType* t) { | |
| memset(t, 0, sizeof(*t)); | |
| } | |
| }; | |
| } // namespace internal | |
| } // namespace pp | |
| #endif // PPAPI_CPP_PRIVATE_PASS_FILE_HANDLE_H_ |