13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)/* Copyright (c) 2013 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) * found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) */
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#ifndef LIBRARIES_NACL_IO_PEPPER_INTERFACE_DELEGATE_H_
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define LIBRARIES_NACL_IO_PEPPER_INTERFACE_DELEGATE_H_
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "nacl_io/pepper_interface.h"
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// This class allows you to delegate Interface requests to different
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// PepperInterface-derived classes.
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// For example:
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//  class FooPepperInterface : public PepperInterface {
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//    ...
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//    CoreInterface* GetCoreInterface() { ... };
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//    ...
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//  };
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//  class BarPepperInterface : public PepperInterface {
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//    ...
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//    VarInterface* GetVarInterface() { ... };
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//    ...
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//  };
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//  void SomeFunction() {
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//    FooPepperInterface foo;
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//    BarPepperInterface bar;
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//    PepperInterfaceDelegate delegate(pp_instance);
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//    delegate.SetCoreInterface(foo.GetCoreInterface());
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//    delegate.SetVarInterface(bar.GetVarInterface());
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//    ...
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//  }
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace nacl_io {
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class PepperInterfaceDelegate : public PepperInterface {
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  explicit PepperInterfaceDelegate(PP_Instance instance);
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~PepperInterfaceDelegate();
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual PP_Instance GetInstance();
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Interface getters.
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// These declarations look like:
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//   CoreInterface* GetCoreInterface();
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "nacl_io/pepper/undef_macros.h"
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "nacl_io/pepper/define_empty_macros.h"
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#undef BEGIN_INTERFACE
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define BEGIN_INTERFACE(BaseClass, PPInterface, InterfaceString) \
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual BaseClass* Get##BaseClass();
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "nacl_io/pepper/all_interfaces.h"
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Interface delegate setters.
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// These declarations look like:
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//   void SetCoreInterface(CoreInterface* delegate);
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "nacl_io/pepper/undef_macros.h"
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "nacl_io/pepper/define_empty_macros.h"
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#undef BEGIN_INTERFACE
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define BEGIN_INTERFACE(BaseClass, PPInterface, InterfaceString) \
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void Set##BaseClass##Delegate(BaseClass* delegate);
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "nacl_io/pepper/all_interfaces.h"
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  PP_Instance instance_;
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Interface delegate pointers.
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "nacl_io/pepper/undef_macros.h"
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "nacl_io/pepper/define_empty_macros.h"
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#undef BEGIN_INTERFACE
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define BEGIN_INTERFACE(BaseClass, PPInterface, InterfaceString) \
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  BaseClass* BaseClass##delegate_;
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "nacl_io/pepper/all_interfaces.h"
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace nacl_io
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif  // LIBRARIES_NACL_IO_PEPPER_INTERFACE_DELEGATE_H_
83