1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef PPAPI_CPP_PRIVATE_PASS_FILE_HANDLE_H_
6#define PPAPI_CPP_PRIVATE_PASS_FILE_HANDLE_H_
7
8#include <string.h>
9
10#include "ppapi/c/private/pp_file_handle.h"
11#include "ppapi/cpp/output_traits.h"
12
13namespace pp {
14
15// A wrapper class for PP_FileHandle to make sure a file handle is
16// closed. This object takes the ownership of the file handle when it
17// is constructed. This loses the ownership when this object is
18// assigned to another object, just like auto_ptr.
19class PassFileHandle {
20 public:
21  PassFileHandle();
22  // This constructor takes the ownership of |handle|.
23  explicit PassFileHandle(PP_FileHandle handle);
24  // Moves the ownership of |handle| to this object.
25  PassFileHandle(PassFileHandle& handle);
26  ~PassFileHandle();
27
28  // Releases |handle_|. The caller must close the file handle returned.
29  PP_FileHandle Release();
30
31 private:
32  // PassFileHandleRef allows users to return PassFileHandle as a
33  // value. This technique is also used by auto_ptr_ref.
34  struct PassFileHandleRef {
35    PP_FileHandle handle;
36    explicit PassFileHandleRef(PP_FileHandle h)
37        : handle(h) {
38    }
39  };
40
41 public:
42  PassFileHandle(PassFileHandleRef ref)
43      : handle_(ref.handle) {
44  }
45
46  operator PassFileHandleRef() {
47    return PassFileHandleRef(Release());
48  }
49
50 private:
51  void operator=(const PassFileHandle&);
52
53  void Close();
54
55  PP_FileHandle handle_;
56};
57
58namespace internal {
59
60template<>
61struct CallbackOutputTraits<PassFileHandle> {
62  typedef PP_FileHandle* APIArgType;
63  typedef PP_FileHandle StorageType;
64
65  static inline APIArgType StorageToAPIArg(StorageType& t) {
66    return &t;
67  }
68
69  static inline PassFileHandle StorageToPluginArg(StorageType& t) {
70    return PassFileHandle(t);
71  }
72
73  static inline void Initialize(StorageType* t) {
74    memset(t, 0, sizeof(*t));
75  }
76};
77
78}  // namespace internal
79}  // namespace pp
80
81#endif  // PPAPI_CPP_PRIVATE_PASS_FILE_HANDLE_H_
82