1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifdef UNSAFE_BUFFERS_BUILD
// TODO(crbug.com/390223051): Remove C-library calls to fix the errors.
#pragma allow_unsafe_libc_calls
#endif
#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_
|