1// Copyright (c) 2012 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#include "nacl_io/pepper_interface.h"
6#include <errno.h>
7#include <ppapi/c/pp_errors.h>
8
9namespace nacl_io {
10
11void PepperInterface::AddRefResource(PP_Resource resource) {
12  GetCoreInterface()->AddRefResource(resource);
13}
14
15void PepperInterface::ReleaseResource(PP_Resource resource) {
16  GetCoreInterface()->ReleaseResource(resource);
17}
18
19ScopedResource::ScopedResource(PepperInterface* ppapi)
20    : ppapi_(ppapi), resource_(0) {
21}
22
23ScopedResource::ScopedResource(PepperInterface* ppapi, PP_Resource resource)
24    : ppapi_(ppapi), resource_(resource) {
25}
26
27ScopedResource::~ScopedResource() {
28  if (resource_)
29    ppapi_->ReleaseResource(resource_);
30}
31
32void ScopedResource::Reset(PP_Resource resource) {
33  if (resource_)
34    ppapi_->ReleaseResource(resource_);
35
36  resource_ = resource;
37}
38
39PP_Resource ScopedResource::Release() {
40  PP_Resource result = resource_;
41  resource_ = 0;
42  return result;
43}
44
45ScopedVar::ScopedVar(PepperInterface* ppapi)
46    : ppapi_(ppapi), var_(PP_MakeUndefined()) {}
47
48ScopedVar::ScopedVar(PepperInterface* ppapi, PP_Var var)
49    : ppapi_(ppapi), var_(var) {}
50
51ScopedVar::~ScopedVar() {
52  ppapi_->GetVarInterface()->Release(var_);
53}
54
55void ScopedVar::Reset(PP_Var var) {
56  ppapi_->GetVarInterface()->Release(var_);
57  var_ = var;
58}
59
60PP_Var ScopedVar::Release() {
61  PP_Var result = var_;
62  var_ = PP_MakeUndefined();
63  return result;
64}
65
66int PPErrorToErrno(int32_t err) {
67  // If not an error, then just return it.
68  if (err >= PP_OK)
69    return err;
70
71  switch (err) {
72    case PP_OK_COMPLETIONPENDING: return 0;
73    case PP_ERROR_FAILED: return EPERM;
74    case PP_ERROR_ABORTED: return EPERM;
75    case PP_ERROR_BADARGUMENT: return EINVAL;
76    case PP_ERROR_BADRESOURCE: return EBADF;
77    case PP_ERROR_NOINTERFACE: return ENOSYS;
78    case PP_ERROR_NOACCESS: return EACCES;
79    case PP_ERROR_NOMEMORY: return ENOMEM;
80    case PP_ERROR_NOSPACE: return ENOSPC;
81    case PP_ERROR_NOQUOTA: return ENOSPC;
82    case PP_ERROR_INPROGRESS: return EBUSY;
83    case PP_ERROR_NOTSUPPORTED: return ENOSYS;
84    case PP_ERROR_BLOCKS_MAIN_THREAD: return EPERM;
85    case PP_ERROR_FILENOTFOUND: return ENOENT;
86    case PP_ERROR_FILEEXISTS: return EEXIST;
87    case PP_ERROR_FILETOOBIG: return EFBIG;
88    case PP_ERROR_FILECHANGED: return EINVAL;
89    case PP_ERROR_TIMEDOUT: return EBUSY;
90    case PP_ERROR_USERCANCEL: return EPERM;
91    case PP_ERROR_NO_USER_GESTURE: return EPERM;
92    case PP_ERROR_CONTEXT_LOST: return EPERM;
93    case PP_ERROR_NO_MESSAGE_LOOP: return EPERM;
94    case PP_ERROR_WRONG_THREAD: return EPERM;
95    case PP_ERROR_CONNECTION_ABORTED: return ECONNABORTED;
96    case PP_ERROR_CONNECTION_REFUSED: return ECONNREFUSED;
97    case PP_ERROR_CONNECTION_FAILED: return ECONNREFUSED;
98    case PP_ERROR_CONNECTION_TIMEDOUT: return ETIMEDOUT;
99    case PP_ERROR_ADDRESS_UNREACHABLE: return ENETUNREACH;
100    case PP_ERROR_ADDRESS_IN_USE: return EADDRINUSE;
101  }
102
103  return EINVAL;
104}
105
106}  // namespace nacl_io
107