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/real_pepper_interface.h"
6
7#include <assert.h>
8#include <stdio.h>
9#include <ppapi/c/pp_errors.h>
10
11#include "nacl_io/log.h"
12
13namespace nacl_io {
14
15#include "nacl_io/pepper/undef_macros.h"
16#define BEGIN_INTERFACE(BaseClass, PPInterface, InterfaceString) \
17    class Real##BaseClass : public BaseClass { \
18     public: \
19      explicit Real##BaseClass(const PPInterface* interface);
20#define END_INTERFACE(BaseClass, PPInterface) \
21     private: \
22      const PPInterface* interface_; \
23    };
24#define METHOD0(Class, ReturnType, MethodName) \
25    virtual ReturnType MethodName();
26#define METHOD1(Class, ReturnType, MethodName, Type0) \
27    virtual ReturnType MethodName(Type0);
28#define METHOD2(Class, ReturnType, MethodName, Type0, Type1) \
29    virtual ReturnType MethodName(Type0, Type1);
30#define METHOD3(Class, ReturnType, MethodName, Type0, Type1, Type2) \
31    virtual ReturnType MethodName(Type0, Type1, Type2);
32#define METHOD4(Class, ReturnType, MethodName, Type0, Type1, Type2, Type3) \
33    virtual ReturnType MethodName(Type0, Type1, Type2, Type3);
34#define METHOD5(Class, ReturnType, MethodName, Type0, Type1, Type2, Type3, \
35                Type4) \
36    virtual ReturnType MethodName(Type0, Type1, Type2, Type3, Type4);
37#include "nacl_io/pepper/all_interfaces.h"
38
39
40#include "nacl_io/pepper/undef_macros.h"
41#define BEGIN_INTERFACE(BaseClass, PPInterface, InterfaceString) \
42    Real##BaseClass::Real##BaseClass(const PPInterface* interface) \
43        : interface_(interface) {}
44
45#define END_INTERFACE(BaseClass, PPInterface)
46
47#define METHOD0(BaseClass, ReturnType, MethodName) \
48    ReturnType Real##BaseClass::MethodName() { \
49      return interface_->MethodName(); \
50    }
51#define METHOD1(BaseClass, ReturnType, MethodName, Type0) \
52    ReturnType Real##BaseClass::MethodName(Type0 arg0) { \
53      return interface_->MethodName(arg0); \
54    }
55#define METHOD2(BaseClass, ReturnType, MethodName, Type0, Type1) \
56    ReturnType Real##BaseClass::MethodName(Type0 arg0, Type1 arg1) { \
57      return interface_->MethodName(arg0, arg1); \
58    }
59#define METHOD3(BaseClass, ReturnType, MethodName, Type0, Type1, Type2) \
60    ReturnType Real##BaseClass::MethodName(Type0 arg0, Type1 arg1, \
61                                           Type2 arg2) { \
62      return interface_->MethodName(arg0, arg1, arg2); \
63    }
64#define METHOD4(BaseClass, ReturnType, MethodName, Type0, Type1, Type2, Type3) \
65    ReturnType Real##BaseClass::MethodName(Type0 arg0, Type1 arg1, Type2 arg2, \
66                                           Type3 arg3) { \
67      return interface_->MethodName(arg0, arg1, arg2, arg3); \
68    }
69#define METHOD5(BaseClass, ReturnType, MethodName, Type0, Type1, Type2, Type3, \
70                Type4) \
71    ReturnType Real##BaseClass::MethodName(Type0 arg0, Type1 arg1, Type2 arg2, \
72                                           Type3 arg3, Type4 arg4) { \
73      return interface_->MethodName(arg0, arg1, arg2, arg3, arg4); \
74    }
75#include "nacl_io/pepper/all_interfaces.h"
76
77
78RealPepperInterface::RealPepperInterface(PP_Instance instance,
79                                         PPB_GetInterface get_browser_interface)
80    : instance_(instance) {
81#include "nacl_io/pepper/undef_macros.h"
82#include "nacl_io/pepper/define_empty_macros.h"
83#undef BEGIN_INTERFACE
84#define BEGIN_INTERFACE(BaseClass, PPInterface, InterfaceString) { \
85    const PPInterface* iface = static_cast<const PPInterface*>( \
86        get_browser_interface(InterfaceString)); \
87    BaseClass##interface_ = NULL; \
88    if (iface) \
89      BaseClass##interface_ = new Real##BaseClass(iface); \
90    else \
91      LOG_ERROR("interface missing: %s\n", InterfaceString); \
92  }
93#include "nacl_io/pepper/all_interfaces.h"
94}
95
96PP_Instance RealPepperInterface::GetInstance() {
97  return instance_;
98}
99
100// Define getter function.
101#include "nacl_io/pepper/undef_macros.h"
102#include "nacl_io/pepper/define_empty_macros.h"
103#undef BEGIN_INTERFACE
104#define BEGIN_INTERFACE(BaseClass, PPInterface, InterfaceString) \
105  BaseClass* RealPepperInterface::Get##BaseClass() {             \
106    return BaseClass##interface_;                                \
107  }
108#include "nacl_io/pepper/all_interfaces.h"
109
110}  // namespace nacl_io
111