// 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_