VR-Exchange 2.5 API Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
pMacros.h
Go to the documentation of this file.
1 /*********************************************************************
2  ** Copyright (c) 2013 VT MAK
3  *********************************************************************/
4 
5 // This file defines macros that make creating translation easier
6 
7 // The first 5 functions in this macro must be defined in your CXX file. the next 3 are automatically defined by the DT_DEFINE macro
8 #define DT_DECLARE_PORTAL_CALLBACKS(DtBrokerObjectNamespace,DtPortalReflectedObjType) \
9  virtual void createPortalPublisher(DtBrokerObjectNamespace::DtBrokerObject* brokerObject); \
10  virtual bool isPortalPublishable(const DtBrokerObjectNamespace::DtBrokerObject* brokerObject) const; \
11  virtual void deletePortalPublisher(DtBrokerObjectNamespace::DtBrokerObject* brokerObject); \
12  virtual void discoverPortalObject(const DtPortalReflectedObjType &obj); \
13  virtual void receivePortalUpdate(const DtPortalReflectedObjType &obj); \
14  \
15  static void portalObjectAddedCb(const DtPortalReflectedObjType &obj, void *ud); \
16  static void portalObjectUpdatedCb(const DtPortalReflectedObjType &obj, void *ud); \
17  static void portalObjectDeletedCb(const DtPortalReflectedObjType &obj, void *ud);
18 
19 
20 #define DT_DEFINE_CREATE_PORTAL_PUBLISHER(DtTranslatorClass,DtBrokerObjectNamespace,DtPortalObjectType,DtReflectedObject) \
21  void DtTranslatorClass::createPortalPublisher( DtBrokerObjectNamespace::DtBrokerObject *brokerObject ) \
22 { \
23  MAKVrExchange::DtPortalObjectPublisherTemplate<DtPortalObjectType> *publisher = \
24  new MAKVrExchange::DtPortalObjectPublisherTemplate<DtPortalObjectType>(broker()->portalConnection()); \
25  \
26  const DtReflectedObject* reflectedObj = \
27  static_cast<const DtReflectedObject*>( brokerObject->reflectedObjPtr() ); \
28  \
29  publisher->sr()->setIdentifier(reflectedObj->globalId()); \
30  brokerObject->setPublisherPtr(publisher); \
31 }
32 
33 #define DT_DEFINE_IS_PORTAL_PUBLISHABLE(DtTranslatorClass, DtBrokerObjectNamespace, Protocol) \
34 bool DtTranslatorClass::isPortalPublishable( const DtBrokerObjectNamespace::DtBrokerObject *brokerObject ) const \
35 { \
36  assert( brokerObject->protocol() == DtBrokerObjectNamespace::DtBrokerObject::Protocol );\
37  return true;\
38 }
39 
40 #define DT_DEFINE_DELETE_PORTAL_PUBLISHER(DtTranslatorClass, DtBrokerObjectNamespace, DtPortalObjectType) \
41 void DtTranslatorClass::deletePortalPublisher(DtBrokerObjectNamespace::DtBrokerObject* brokerObject) \
42 { \
43  MAKVrExchange::DtPortalObjectPublisherTemplate<DtPortalObjectType> *publisher = \
44  static_cast<MAKVrExchange::DtPortalObjectPublisherTemplate<DtPortalObjectType> *>(brokerObject->publisherPtr()); \
45  \
46  if (publisher) \
47  { \
48  DtDELETE( publisher ); \
49  brokerObject->setPublisherPtr( publisher ); \
50  } \
51 }
52 
53 #define DT_DEFINE_DISCOVER_PORTAL_OBJECT(DtTranslatorClass,DtBrokerObjectNamespace,DtPortalReflectedObjType,DtProtocol) \
54 void DtTranslatorClass::discoverPortalObject(const DtPortalReflectedObjType &refObj) \
55 { \
56  DtBrokerObjectNamespace::DtBrokerObject* brokerObject = findBrokerObject(&refObj); \
57  if (!brokerObject) \
58  { \
59  brokerObject = createBrokerObject(&refObj); \
60  } \
61  \
62  brokerObject->setLastUpdate(myBroker->simTime()); \
63  brokerObject->setObjectName(refObj.sr()->identifier()); \
64  brokerObject->setIsDiscovered(true); \
65  \
66  create##DtProtocol##Publisher( brokerObject ); \
67  \
68  refObj.addUpdateCallback(DtTranslatorClass::portalObjectUpdatedCb, this); \
69  receivePortalUpdate(refObj); \
70 }
71 
72 #define DT_DEFINE_RECEIVE_PORTAL_UPDATE(DtTranslatorClass, DtBrokerObjectNamespace, DtPortalReflectedObjType, \
73  DtPortalObjType, DtProtocolPublisher, DtProtocolStateRepository,DtProtocol) \
74 void DtTranslatorClass::receivePortalUpdate(const DtPortalReflectedObjType &refObj) \
75 { \
76  DtBrokerObjectNamespace::DtBrokerObject* brokerObject = findBrokerObject(&refObj); \
77  assert( brokerObject ); \
78  \
79  brokerObject->setLastUpdate(myBroker->simTime()); \
80  \
81  const DtPortalObjType &sr = *(refObj.sr()); \
82  \
83  if (!brokerObject->isPublishable()) \
84  { \
85  brokerObject->setIsPublishable( is##DtProtocol##Publishable( brokerObject )); \
86  } \
87  \
88  callObjectUpdateCallbacks( brokerObject ); \
89  \
90  if (brokerObject->isDropped()) \
91  { \
92  return; \
93  } \
94  \
95  DtProtocolPublisher *publisher = \
96  static_cast<DtProtocolPublisher*>( brokerObject->publisherPtr() ); \
97  assert(publisher); \
98  \
99  DtProtocolStateRepository &newSr = * \
100  static_cast<DtProtocolStateRepository*>(publisher->sr()); \
101  \
102  translate( &newSr, sr, refObj ); \
103  \
104  if ( myBroker->isTranslatorDebuggingOn(name()) ) \
105  { \
106  printIncomingOutgoingStateReps( sr, newSr ); \
107  } \
108  \
109  if ( myBroker->brokerInitializer()->oneToOneMapping() ) \
110  { \
111  publisher->forceUpdate(); \
112  } \
113  if ( ! myBroker->isTranslatorDisabled(name()) ) \
114  { \
115  publisher->tick(); \
116  } \
117  performPortalDebugging( sr, newSr ); \
118 }
119 
120 
121 #define DT_DEFINE_PORTAL_CALLBACKS( DtTranslatorClass, DtPortalReflectedObjType, DtTemplates ) \
122  DtTemplates \
123 void DtTranslatorClass::portalObjectAddedCb( const DtPortalReflectedObjType& reflectedObj, void* ud ) \
124 { \
125  DtTranslatorClass* et = (DtTranslatorClass*) ud; \
126  et->discoverPortalObject( reflectedObj ); \
127 }; \
128  \
129  DtTemplates \
130 void DtTranslatorClass::portalObjectUpdatedCb( const DtPortalReflectedObjType& reflectedObj, void* ud ) \
131 { \
132  DtTranslatorClass* et = (DtTranslatorClass*) ud; \
133  et->receivePortalUpdate( reflectedObj ); \
134 }; \
135  \
136  DtTemplates \
137 void DtTranslatorClass::portalObjectDeletedCb( const DtPortalReflectedObjType& reflectedObj, void* ud ) \
138 { \
139  DtTranslatorClass* et = (DtTranslatorClass*) ud; \
140  et->removePortalObject( &reflectedObj ); \
141 }
142 
143 #define DT_TICK_ALL_PUBLISHERS(DtPublisherContainerType, DtBrokerObjectNamespace, DtPublisherContainer, DtPublisherType) \
144  DtPublisherContainerType::iterator pubItr = DtPublisherContainer.begin(); \
145  DtPublisherContainerType::iterator pubEnd = DtPublisherContainer.end(); \
146  for ( ; pubItr != pubEnd; ++pubItr ) \
147  { \
148  DtBrokerObjectNamespace::DtBrokerObject* brokerObject = pubItr->second; \
149  DtPublisherType* publisher = static_cast<DtPublisherType*>( brokerObject->publisherPtr() ); \
150  if ( publisher && brokerObject->isPublishable() ) \
151  { \
152  publisher->tick(); \
153  } \
154  }
155 
156 #define DT_DECLARE_INTERACTION_PORTAL_CALLBACKS(DtPortalInteractionType,DtInteractionType) \
157  virtual void createPortalInteraction( const DtInteractionType& incomming ); \
158  static void receivePortalInteraction( const DtPortalInteractionType& inter, void* usr );
159 
160 #define DT_DEFINE_CREATE_PORTAL_INTERACTION( DtTranslatorClass, DtPortalInteractionType, DtInteractionType, DtObjectKind ) \
161 void DtTranslatorClass::createPortalInteraction( const DtInteractionType& in ) \
162 { \
163  DtPortalInteractionType out; \
164  out.setKind( DtObjectKind ); \
165 \
166  translate( &out, in ); \
167 \
168  if ( broker()->isTranslatorDebuggingOn(name()) ) \
169  { \
170  printIncomingOutgoingInteractions( in, out ); \
171  } \
172  broker()->portalConnection()->send( out ); \
173 }
174 
175 #define DT_DEFINE_RECEIVE_PORTAL_INTERACTION( DtTranslatorClass, DtPortalInteractionType, DtProtocol ) \
176 void DtTranslatorClass::receivePortalInteraction( \
177  const DtPortalInteractionType& inter, void* usr ) \
178 { \
179  DtTranslatorClass* trans = (DtTranslatorClass*) usr; \
180  trans->create##DtProtocol##Interaction( inter ); \
181 }

Document ID: Generated on Wed Dec 21 15:05:11 EST 2016 from SVN revision 171891
Copyright © 2005-2016 VT MÄK. All Rights Reserved (www.mak.com)