Home | History | Annotate | Download | only in nacl_io
      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 
     13 namespace 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 
     78 RealPepperInterface::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 
     96 PP_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