blob: b7a6e4e31cab869044406070d467da11b3bf20e2 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "nacl_io/real_pepper_interface.h"
#include <assert.h>
#include <stdio.h>
#include <ppapi/c/pp_errors.h>
#include "nacl_io/log.h"
namespace nacl_io {
#include "nacl_io/pepper/undef_macros.h"
#define BEGIN_INTERFACE(BaseClass, PPInterface, InterfaceString) \
class Real##BaseClass : public BaseClass { \
public: \
explicit Real##BaseClass(const PPInterface* interface);
#define END_INTERFACE(BaseClass, PPInterface) \
private: \
const PPInterface* interface_; \
};
#define METHOD0(Class, ReturnType, MethodName) \
virtual ReturnType MethodName();
#define METHOD1(Class, ReturnType, MethodName, Type0) \
virtual ReturnType MethodName(Type0);
#define METHOD2(Class, ReturnType, MethodName, Type0, Type1) \
virtual ReturnType MethodName(Type0, Type1);
#define METHOD3(Class, ReturnType, MethodName, Type0, Type1, Type2) \
virtual ReturnType MethodName(Type0, Type1, Type2);
#define METHOD4(Class, ReturnType, MethodName, Type0, Type1, Type2, Type3) \
virtual ReturnType MethodName(Type0, Type1, Type2, Type3);
#define METHOD5(Class, ReturnType, MethodName, Type0, Type1, Type2, Type3, \
Type4) \
virtual ReturnType MethodName(Type0, Type1, Type2, Type3, Type4);
#include "nacl_io/pepper/all_interfaces.h"
#include "nacl_io/pepper/undef_macros.h"
#define BEGIN_INTERFACE(BaseClass, PPInterface, InterfaceString) \
Real##BaseClass::Real##BaseClass(const PPInterface* interface) \
: interface_(interface) {}
#define END_INTERFACE(BaseClass, PPInterface)
#define METHOD0(BaseClass, ReturnType, MethodName) \
ReturnType Real##BaseClass::MethodName() { \
return interface_->MethodName(); \
}
#define METHOD1(BaseClass, ReturnType, MethodName, Type0) \
ReturnType Real##BaseClass::MethodName(Type0 arg0) { \
return interface_->MethodName(arg0); \
}
#define METHOD2(BaseClass, ReturnType, MethodName, Type0, Type1) \
ReturnType Real##BaseClass::MethodName(Type0 arg0, Type1 arg1) { \
return interface_->MethodName(arg0, arg1); \
}
#define METHOD3(BaseClass, ReturnType, MethodName, Type0, Type1, Type2) \
ReturnType Real##BaseClass::MethodName(Type0 arg0, Type1 arg1, \
Type2 arg2) { \
return interface_->MethodName(arg0, arg1, arg2); \
}
#define METHOD4(BaseClass, ReturnType, MethodName, Type0, Type1, Type2, Type3) \
ReturnType Real##BaseClass::MethodName(Type0 arg0, Type1 arg1, Type2 arg2, \
Type3 arg3) { \
return interface_->MethodName(arg0, arg1, arg2, arg3); \
}
#define METHOD5(BaseClass, ReturnType, MethodName, Type0, Type1, Type2, Type3, \
Type4) \
ReturnType Real##BaseClass::MethodName(Type0 arg0, Type1 arg1, Type2 arg2, \
Type3 arg3, Type4 arg4) { \
return interface_->MethodName(arg0, arg1, arg2, arg3, arg4); \
}
#include "nacl_io/pepper/all_interfaces.h"
RealPepperInterface::RealPepperInterface(PP_Instance instance,
PPB_GetInterface get_browser_interface)
: instance_(instance) {
#include "nacl_io/pepper/undef_macros.h"
#include "nacl_io/pepper/define_empty_macros.h"
#undef BEGIN_INTERFACE
#define BEGIN_INTERFACE(BaseClass, PPInterface, InterfaceString) { \
const PPInterface* iface = static_cast<const PPInterface*>( \
get_browser_interface(InterfaceString)); \
BaseClass##interface_ = NULL; \
if (iface) \
BaseClass##interface_ = new Real##BaseClass(iface); \
else \
LOG_ERROR("interface missing: %s\n", InterfaceString); \
}
#include "nacl_io/pepper/all_interfaces.h"
}
PP_Instance RealPepperInterface::GetInstance() {
return instance_;
}
// Define getter function.
#include "nacl_io/pepper/undef_macros.h"
#include "nacl_io/pepper/define_empty_macros.h"
#undef BEGIN_INTERFACE
#define BEGIN_INTERFACE(BaseClass, PPInterface, InterfaceString) \
BaseClass* RealPepperInterface::Get##BaseClass() { \
return BaseClass##interface_; \
}
#include "nacl_io/pepper/all_interfaces.h"
} // namespace nacl_io