INOS
cinostaskexdef.h
Go to the documentation of this file.
1//******************************************************************************
24//******************************************************************************
25
26#ifndef INC_CINOSTASKEXDEF_H
27#define INC_CINOSTASKEXDEF_H
28
29//
30//------------------------------------------------------------------------------
31// includes
32//------------------------------------------------------------------------------
33
34// system
35#include <inos.h>
36#include <cincotype.h>
37
38// C++
39#include <typeinfo>
40#include <memory>
41// project
42
43
44//------------------------------------------------------------------------------
45// definitions
46//------------------------------------------------------------------------------
47//
54typedef uint32 tMcAppError;
55
56#define DF_INOS_TASKEX_MSG_PARAM_NAME_LENGTH 32
57
58
59//------------------------------------------------------------------------------
60// forward declarations
61//------------------------------------------------------------------------------
62//
63
71{
72 public:
73 // message types
74 enum EMsgTypes {
75 eMsgCmd,
76 eMsgCall,
77 eMsgEvent,
78 eMsgReply,
79 eMsgUser,
80 eMsgSub,
81 eMsgInternal,
82 eMsgMessage
83 };
84
85 // reply id's. If extending this, consider doing the same
86 // change/extension at CINOSTaskEx::ERplId. If extending this enum,
87 // consider extending the 'inix' INCOExplorer, CIncoProcedure.cpp,
88 // CIncoProcedure::TicketCompleted which has a switch case which
89 // converts these values into strings.
90 enum ERplId {
91 eRplOk=0,
92 eRplSkipped,
93 eRplInComplete,
94 eRplIgnored,
95 eRplPaused, // Deprecated
96 eRplStopped,
97 eRplCanceled,
98 eRplRejected,
99 eRplFailed,
100 eRplError,
101 eRplFatal,
102 eRplTimeout
103 };
104
105 // array with strings for all reply id's.
106 static constexpr char* const s_pReplyIdStrings[CINOSTaskExDef::eRplTimeout + 1] = {
107 "OK",
108 "Skipped",
109 "Incomplete",
110 "Ignored",
111 "Paused",
112 "Stopped",
113 "Canceled",
114 "Rejected",
115 "Failed",
116 "Error",
117 "Fatal",
118 "Timeout"
119 };
120};
121
122class CINOSTaskExMsg;
123
124
125//------------------------------------------------------------------------------
126// class CINOSTaskExMsgParam
127//------------------------------------------------------------------------------
128
130{
131 public :
133 enum {
137 };
138 char* GetName()
139 {return m_pName;};
140 const char* GetName() const
141 {return m_pName;};
142 uint16 GetType() const
143 {return m_uType;};
145 uint32 GetFlag()
146 { return m_uFlags;};
149 uint32 GetTypeSize() const
150 {return m_uTypeSize;};
151 const std::type_info* GetTypeInfo() const;
152 void* GetValue() {
153 if( m_uType == defType_pointer) {
154 // don't return CPtrContainerBase, as this class should be considered
155 // begin an implementation detail. Instead, return the pointer value:
156 return const_cast<void*>(((CINOSTaskExMsgParam::CPtrContainerBase*)m_uValue)->GetPointer());
157 }
158 if (m_pValue) return m_pValue; else return m_uValue;
159 };
160 const void* GetValue() const
161 {return const_cast<CINOSTaskExMsgParam*>(this)->GetValue();};
164 template <typename T>
165 T GetTypedValue() const {
166 // Is this of type pointer
167 if(m_uType == defType_pointer) {
168 // yes -> The value is a pointer container
169 CINOSTaskExMsgParam::CPtrContainerBase* pContainer =
170 (CINOSTaskExMsgParam::CPtrContainerBase*)m_uValue;
171
172 // Check the type of the container
173 if(*(pContainer->GetTypeInfo()) == typeid(T)) {
174 // Type is correct, call receive on the container, gets the pointer and
175 // sets back internals of the container if needed.
176
177 return ((CINOSTaskExMsgParam::CPtrContainer<T>*)pContainer)->Receive();
178 // If the compiler prints the following line:
179 //
180 // error: 'class CINOSTaskExMsgParam::CPtrContainer<void*>' has no member named 'Receive'
181 //
182 // A message parameter of type "void*" has been tried to be instantiated
183 // this is forbidden because in case of a "lost" message it
184 // is not possible to delete the according object without type
185 // information.
186 // Instead it is possible to either use type 'const void*' for
187 // constant data that doesn't need deallocation or to use the correct
188 // type (e.g. AddParam<CMyClass*>, GetResult<CMyClass*>) in which case the
189 // object will be correctly deallocated in case of a "lost" message.
190 //
191 // Don't fix this problem here, go to "instantiated from here" and change
192 // the type accordingly.
193 }
194 return T();
195 }
196 else {
197 return m_pValue ? (*((T*)&m_pValue)) : (*((T*)&m_uValue));
198 }
199 };
200
202 template <typename T>
203 uint32 SetTypedValue(T aValue) {
204 if(m_uType != TINCOType<T>::eType) {
205 return 1; // TODO error code
206 }
207
208 // Is param of type pointer
209 if(m_uType == defType_pointer) {
210 auto pContainer = (CINOSTaskExMsgParam::CPtrContainerBase*)m_uValue;
211 pContainer->SetPointer(aValue);
212 // If the compiler prints the following line:
213 //
214 // error: no matching function for call to 'CINOSTaskExMsgParam::CPtrContainer<void*>::SetPointer(void*)'
215 //
216 // A message parameter of type "void*" has been tried to be instantiated
217 // this is forbidden because in case of a "lost" message it
218 // is not possible to delete the according object without type
219 // information.
220 // Instead it is possible to either use type 'const void*' for
221 // constant data that does not need deallocation or use the correct
222 // type (e.g. AddParam<CINOSMcDataInst*>) in which case the
223 // object will be correctly deallocated in case of a "lost" message.
224 //
225 // Don't fix this problem here, go to "instantiated from here" and change
226 // the type accordingly.
227 }
228 else {
229 SetValue(&aValue, sizeof(T), false);
230 }
231 return INOS_OK;
232 }
233
235 uint32 SetTypedValue(const char* value) {
236 SetValue(value, false);
237 return INOS_OK;
238
239 }
240
243 {if (m_pValue) return m_pPartition->GetPartitionSize(); else return sizeof(m_uValue);};
244 void SetValue(const char* apValue, bool abInINCOVContext);
247 void SetValue(const void* apValue, const uint32 auDataLength, bool abInINCOVContext);
248 void SetName(const char* apName);
249 virtual void SetFlag(uint32 auFlag) {
250 INOS_OR(m_uFlags, auFlag);
251 }
252 virtual void ClearFlag(uint32 auFlag) {
253 INOS_AND(m_uFlags, ~auFlag);
254 }
255 bool IsNumber() const
256 {return (m_uType != defType_string);}
257 bool IsString() const
258 {return (m_uType == defType_string);}
260 void ToString(char* apDest, uint32 aSize);
269 void AddPrintfFormat(char*& apDest, bool abWithReadabilitySupport);
281 int32 ToINCOValue(uint16* apINCOType, uint8* apINCOValue,
282 const uint32 auBufferSize, const uint32 auDataLength, const bool abCut = false) const;
286 { return m_pNext; }
287 void SetNext(CINOSTaskExMsgParam* apParam)
288 { m_pNext = apParam; }
289 enum {
290 eFlgMandatory = 0x00000001,
291 eFlgNoSubstitution = 0x00000002,
292 eFlgOversized = 0x00000004,
293 eFlgStructure = 0x0000008,
294 };
295
296 // Dummy implementations of additional methods in CINOSTaskExMsgDefaultParam
297 virtual real64 GetMinValue() { return REAL64MIN;};
298 virtual real64 GetMaxValue() { return REAL64MAX;};
299 virtual const char* GetUnit() { return "";};
300 virtual uint64 GetCharacteristics() { return 0;};
301 virtual const char* GetComboData() { return NULL;};
302
310 template <typename T>
311 CINOSTaskExMsgParam(T aValue, const char* apName = NULL, bool abInINCOVContext = false) {
312 m_pValue = NULL; m_uFlags = 0; m_pNext = 0;
313 SetName(apName);
314 m_uType = TINCOType<T>::eType;
315 // Is param of type pointer
316 if(m_uType == defType_pointer) {
317 // Yes -> Create a pointer container
318 static_assert(sizeof(CPtrContainer<T>) <= sizeof(m_uValue), "PtrContainer doesn't fit into preallocated buffer.");
319 m_uTypeSize = sizeof(CPtrContainer<T>);
320 // Create a container for the pointer in place, 32 Bytes should
321 // be fairly enough for the CPtrContainer
322 new (&(m_uValue)) CPtrContainer<T>(std::move(aValue));
323 // If the compiler prints the following line:
324 //
325 // error: no matching function for call to 'CINOSTaskExMsgParam::CPtrContainer<void*>::CPtrContainer(void*&)'
326 //
327 // A message parameter of type "void*" has been tried to be instantiated
328 // this is forbidden because in case of a "lost" message it
329 // is not possible to delete the according object without type
330 // information.
331 // Instead it is possible to either use type 'const void*' for
332 // constant data that does not need deallocation or use the correct
333 // type (e.g. AddParam<CINOSMcDataInst*>) in which case the
334 // object will be correctly deallocated in case of a "lost" message.
335 //
336 // Don't fix this problem here, go to "instantiated from here" and change
337 // the type accordingly.
338 }
339 else {
340 m_uTypeSize = sizeof(aValue);
341
342 SetValue(&aValue, sizeof(T), false);
343 }
344 }
347 CINOSTaskExMsgParam(char* aValue, const char* apName = NULL, bool abInINCOVContext = false) {
348 m_pValue = NULL; m_uFlags = 0; m_pNext = 0;
349 SetName(apName);
350 m_uType = defType_string;
351 m_uTypeSize = 0;
352 SetValue(aValue, abInINCOVContext);
353 }
356 CINOSTaskExMsgParam(const char* aValue, const char* apName = NULL, bool abInINCOVContext = false) {
357 m_pValue = NULL; m_uFlags = 0; m_pNext = 0;
358 SetName(apName);
359 m_uType = defType_string;
360 m_uTypeSize = 0;
361 SetValue(aValue, abInINCOVContext);
362 }
365 : m_uFlags(std::move(a.m_uFlags)),
366 m_uType(std::move(a.m_uType)),
367 m_uTypeSize(std::move(a.m_uTypeSize)),
368 m_pValue(std::move(a.m_pValue)),
369 m_pPartition(std::move(a.m_pPartition)),
370 m_pNext(std::move(a.m_pNext))
371 {
372 SetName(a.m_cName);
373 if( !m_pValue ) {
374 memcpy(m_uValue, a.m_uValue, m_uTypeSize);
375 }
376 }
377
380 return new CINOSTaskExMsgParam(*this);
381 }
384
385 private :
386 void AllocExBuffer();
387 void FreeExBuffer();
388
389 private :
390
391 friend class CINOSTaskEx;
392 friend class CINOSTaskExMsg;
393 friend class CINOSTaskExMsgDefaultParam;
394 friend class CINOSTaskExTracer;
395 friend class CINOSEvtLogMsgArg;
396 friend class CMcResult;
397 friend class CMcResultStream;
398 friend class CINOSMovePath;
399
402 { m_cName[0] = 0; m_uFlags = 0; m_pNext = 0; m_pValue = 0;
403 m_uTypeSize = 0; m_uType = defType_Invalid;
404 memset(m_uValue, 0, sizeof(m_uValue));};
407
408
410 char m_cName[DF_INOS_TASKEX_MSG_PARAM_NAME_LENGTH];
412 char* m_pName = m_cName;
414 uint32 m_uFlags;
416 uint16 m_uType;
419 uint16 m_uTypeSize;
423 double m_uValue[4];
425 void* m_pValue;
427 CINOSPartitionMemory* m_pPartition = nullptr;
429 CINOSTaskExMsgParam* m_pNext;
430
431 //------------------------------------------------------------------------------
432 // local class declaration
433 //------------------------------------------------------------------------------
434 //
435 // CPtrContainerBase is the abstract base of all pointer containers
436 class CPtrContainerBase
437 {
438 public:
439 CPtrContainerBase(const std::type_info* aTypeInfo) :
440 m_pTypeInfo(aTypeInfo) {};
441
442 virtual ~CPtrContainerBase() {};
443
444 // Returns the pointer value
445 virtual const void* GetPointer() { return nullptr; };
446
447 template <typename T>
448 bool SetPointer(T pPointer) {
449 if(&typeid(T) != m_pTypeInfo) {
450 return false;
451 }
452 reinterpret_cast<CPtrContainer<T>*>(this)->iSetPointer(pPointer);
453 return true;
454 };
455
456 // To avoid compilation errors we need to implement the double variant
457 // directly, even it is never called
458 bool SetPointer(double pPointer) {
459 return false;
460 };
461
462 // Get the type info, used for type checking or for reflection.
463 const std::type_info* GetTypeInfo() { return m_pTypeInfo; };
464 private:
465 const std::type_info* m_pTypeInfo;
466 };
467
468 // CPtrContainer<T> is the type specific derived class for each type.
469 // The non-specialiced template is for non-pointer types. It
470 // Should never be instantiated. Only pointer type variants should be
471 // instantiated. The template still needs to be a valid class to avoid
472 // compiler warnings.
473 template <class T>
474 class CPtrContainer : CPtrContainerBase
475 {
476 public:
477 // Constructer yields an assert, it should never be called.
478 explicit CPtrContainer(T aValue) :
479 CPtrContainerBase((const std::type_info*)NULL) { ASSERT_ALWAYS(false); };
480 virtual ~CPtrContainer() {};
481
482 T Receive() {
483 // Originally, it was 'return T();', which caused warning with gcc7,
484 // complaining that the returned value may be uninitialized. This matches
485 // the explanation here, and thus the following solution:
486 // http://stackoverflow.com/questions/2143022/how-to-correctly-initialize-variable-of-template-type
487 return T{};
488 }
489
490 // Dummy implementation for all non pointer types
491 virtual void iSetPointer(T pPointer) {};
492
493 };
494
495 // CPtrContainer<T*> is the partial specialization for non-const pointers
496 // it implements all members and deletes the date on destruction if
497 // needed.
498 template <class T>
499 class CPtrContainer<T*> : CPtrContainerBase
500 {
501 public:
502 explicit CPtrContainer(T* apPointer) :
503 CPtrContainerBase(&typeid(T*)),
504 m_pPointer(apPointer) {};
505
506 virtual ~CPtrContainer() {
507 if(m_pPointer)
508 delete m_pPointer;
509 };
510
511 // Receive returns the pointer and invalidates the internal
512 // pointer to avoid double deletes.
513 T* Receive() {
514 T* pTemp = m_pPointer;
515 m_pPointer = NULL;
516 return pTemp;
517 };
518 virtual const void* GetPointer() override { return m_pPointer; };
519
520 virtual void iSetPointer(T* pPointer) {
521 if(m_pPointer)
522 delete m_pPointer;
523 m_pPointer = (T*)pPointer;
524 };
525 private:
526 T* m_pPointer;
527 };
528
529 // CPtrContainer<const T*> is the partial specialization for const pointers
530 // it implements all members and does not delete the data on destruction if
531 // needed.
532 template <class T>
533 class CPtrContainer<const T*> : CPtrContainerBase
534 {
535 public:
536 explicit CPtrContainer(const T* apPointer) :
537 CPtrContainerBase(&typeid(const T*)),
538 m_pPointer(apPointer) {};
539
540 virtual ~CPtrContainer() {};
541
542 // Returns the pointer, no need to invalidate the pointer,
543 // as no delete is performed on const pointers.
544 const T* Receive() { return m_pPointer; }
545 virtual const void* GetPointer() override { return m_pPointer; }
546 virtual void iSetPointer(const T* pPointer) {
547 m_pPointer = (T*)pPointer;
548 };
549
550 private:
551 const T* m_pPointer;
552 };
553
554 // CPtrContainer<std::shared_ptr<T>> is the partial specialization for sharder_ptr pointers
555 // it implements all members and does not delete the data (unles the ref count is 0)
556 template <class T>
557 class CPtrContainer<std::shared_ptr<T>> : CPtrContainerBase
558 {
559 public:
560 explicit CPtrContainer(std::shared_ptr<T> apPointer) :
561 CPtrContainerBase(&typeid(std::shared_ptr<T>)),
562 m_ShrdPtr(std::move(apPointer)) {};
563
564 virtual ~CPtrContainer() {};
565
566 // Don't allow casting shared pointer to void
567 std::shared_ptr<T> Receive() { return m_ShrdPtr; }
568
569 virtual void iSetPointer(std::shared_ptr<T> pPointer) {
570
571 };
572
573 private:
574 std::shared_ptr<T> m_ShrdPtr;
575 };
576
579};
580
581//------------------------------------------------------------------------------
582// TTemplate specialization for CINOSTaskExMsgParam::GetTypedValue for types
583// char* and const char*
584//------------------------------------------------------------------------------
585//
586// They are needed for GetResult<char*> and GetResult<const char*> to work.
587// They are not needed for GetParam as GetParam with strings is over
588// loaded and not a template specialization.
589template <>
591
592template <>
593const char* CINOSTaskExMsgParam::GetTypedValue() const;
594//------------------------------------------------------------------------------
595// Template class specialization for CPtrContainer<void*>
596//------------------------------------------------------------------------------
597// This class constructor is intentionally private. Type "void*" should not be
598// used with this template, instead "const void*" or any specific pointer type
599// should be used.
600template <>
601class CINOSTaskExMsgParam::CPtrContainer<void*> : CINOSTaskExMsgParam::CPtrContainerBase
602{
603private:
604 CPtrContainer() : CPtrContainerBase(NULL) {};
605public:
609 virtual const void* GetPointer() override {return NULL; };
610};
611// If the compiler prints the following lines:
612//
613// error: cannot allocate an object of abstract type 'CINOSTaskExMsgParam::CPtrContainer<void*>'
614// note: error: no matching function for call to 'CINOSTaskExMsgParam::CPtrContainer<void*>::CPtrContainer(void*&)'
615// note: note: candidates are: CINOSTaskExMsgParam::CPtrContainer<void*>::CPtrContainer()
616// note: CINOSTaskExMsgParam::CPtrContainer<void*>::CPtrContainer(const CINOSTaskExMsgParam::CPtrContainer<void*>&)
617//
618// A message parameter of type "void*" has been tried to be instantiated
619// this is forbidden because in case of a "lost" message it
620// is not possible to delete the according object.
621// Instead it is possible to either use type 'const void*' for
622// constant data that doesn't need deallocation or use the correct
623// type (e.g. AddParam<CINOSMcDataInst*>) in which case the
624// object will be correctly deallocated in case of a "lost" message.
625//
626// Don't fix this problem here, go to "instantiated from here" and change
627// the type accordingly.
628
629//------------------------------------------------------------------------------
630// class CINOSTaskExMsgDefaultParam
631//------------------------------------------------------------------------------
632
634{
635public:
636 // Param object with additional format value like inco characteristics
637 // unit and combo data min/max values for default param objects.
638 virtual real64 GetMinValue() override { return m_rMinValue;};
639 virtual void SetMinValue(real64 aMinValue) { m_rMinValue = aMinValue;};
640
641 virtual real64 GetMaxValue() override { return m_rMaxValue;};
642 virtual void SetMaxValue(real64 aMaxValue) { m_rMaxValue = aMaxValue;};
643
644 virtual const char* GetUnit() override { return m_pUnit != NULL ? m_pUnit : "";};
645 virtual void SetUnit(const char* apUnit);
646
647 virtual uint64 GetCharacteristics() override { return m_uCharacteristics;};
648 virtual void SetCharacteristics(uint64 auCharacteristics) { m_uCharacteristics = auCharacteristics;};
649
650 virtual const char* GetComboData() override { return m_pComboData;};
651 virtual void SetComboData(const char* apComboData);
652
653 friend class CINOSTaskExMsg;
654
658 m_rMinValue(REAL64MIN),
659 m_rMaxValue(REAL64MAX),
660 m_uCharacteristics(0),
661 m_pUnit(NULL),
662 m_pComboData(NULL) {};
666 m_rMinValue(a.m_rMinValue),
667 m_rMaxValue(a.m_rMaxValue),
668 m_uCharacteristics(a.m_uCharacteristics),
669 m_pUnit(NULL),
670 m_pComboData(NULL)
671 {
672 SetUnit(a.m_pUnit);
673 SetComboData(a.m_pComboData);
674 };
677 template <typename T>
678 explicit CINOSTaskExMsgDefaultParam(T aValue) :
679 CINOSTaskExMsgParam(aValue),
680 m_rMinValue(REAL64MIN),
681 m_rMaxValue(REAL64MAX),
682 m_uCharacteristics(0),
683 m_pUnit(NULL),
684 m_pComboData(NULL) {};
687 explicit CINOSTaskExMsgDefaultParam(char* aValue) :
688 CINOSTaskExMsgParam(aValue),
689 m_rMinValue(REAL64MIN),
690 m_rMaxValue(REAL64MAX),
691 m_uCharacteristics(0),
692 m_pUnit(NULL),
693 m_pComboData(NULL) {};
696 explicit CINOSTaskExMsgDefaultParam(const char* aValue) :
697 CINOSTaskExMsgParam(aValue),
698 m_rMinValue(REAL64MIN),
699 m_rMaxValue(REAL64MAX),
700 m_uCharacteristics(0),
701 m_pUnit(NULL),
702 m_pComboData(NULL) {};
703
705 virtual CINOSTaskExMsgParam* Clone() override {
706 return new CINOSTaskExMsgDefaultParam(*this);
707 }
708
711
712private:
713 real64 m_rMinValue;
714 real64 m_rMaxValue;
715 uint64 m_uCharacteristics;
716 char* m_pUnit;
717 char* m_pComboData;
719};
720
721//------------------------------------------------------------------------------
722
723#endif // INC_CINOSTASKEXDEF_H
724
725
726//------------------------------------------------------------------------------
727// end of file
#define DECLARE_DYNAMIC(aClass)
Definition cinospartitionmemory.h:328
uint32 tMcAppError
Definition cinostaskexdef.h:54
Definition cinospartitionmemory.h:157
Definition cinostaskexdef.h:71
Definition cinostaskexdef.h:634
virtual ~CINOSTaskExMsgDefaultParam()
destructor
CINOSTaskExMsgDefaultParam()
constructor
Definition cinostaskexdef.h:656
CINOSTaskExMsgDefaultParam(const CINOSTaskExMsgDefaultParam &a)
copy constructor
Definition cinostaskexdef.h:664
CINOSTaskExMsgDefaultParam(char *aValue)
Definition cinostaskexdef.h:687
CINOSTaskExMsgDefaultParam(T aValue)
Definition cinostaskexdef.h:678
CINOSTaskExMsgDefaultParam(const char *aValue)
Definition cinostaskexdef.h:696
virtual CINOSTaskExMsgParam * Clone() override
clone function (to be able to copy also derived member variables)
Definition cinostaskexdef.h:705
virtual const void * GetPointer() override
Definition cinostaskexdef.h:609
Definition cinostaskexdef.h:130
uint32 GetValueBufferSize()
Definition cinostaskexdef.h:242
uint32 SetTypedValue(const char *value)
SetTypedValue, makes the cast internally.
Definition cinostaskexdef.h:235
void ToString(char *apDest, uint32 aSize)
Writes the string representation into the buffer, always 0 determinated.
T GetTypedValue() const
Definition cinostaskexdef.h:165
int32 ToINCOValue(uint16 *apINCOType, uint8 *apINCOValue, const uint32 auBufferSize, const uint32 auDataLength, const bool abCut=false) const
CINOSTaskExMsgParam(const char *aValue, const char *apName=NULL, bool abInINCOVContext=false)
Definition cinostaskexdef.h:356
virtual CINOSTaskExMsgParam * Clone()
clone function (to be able to copy also derived member variables)
Definition cinostaskexdef.h:379
CINOSTaskExMsgParam * GetNext() const
Definition cinostaskexdef.h:285
@ ePrintfFormatMaxSize
Definition cinostaskexdef.h:136
uint32 GetFlag()
get param flags
Definition cinostaskexdef.h:145
CINOSTaskExMsgParam(char *aValue, const char *apName=NULL, bool abInINCOVContext=false)
Definition cinostaskexdef.h:347
CINOSTaskExMsgParam(T aValue, const char *apName=NULL, bool abInINCOVContext=false)
Definition cinostaskexdef.h:311
uint32 SetTypedValue(T aValue)
SetTypedValue.
Definition cinostaskexdef.h:203
uint32 GetTypeSize() const
Definition cinostaskexdef.h:149
virtual ~CINOSTaskExMsgParam()
destructor
void SetValue(const void *apValue, const uint32 auDataLength, bool abInINCOVContext)
CINOSTaskExMsgParam(CINOSTaskExMsgParam &&a)
Move CTOR used by e.g. CINCOVServerSession::AsyncResultReady.
Definition cinostaskexdef.h:364
void AddPrintfFormat(char *&apDest, bool abWithReadabilitySupport)
Definition cinostaskex.h:396
Definition cinostaskex.h:2370
Definition cinostaskex.h:966
uint32 INOS_OK
Definition inoserror.h:1726
#define INOS_OR(variable, mask)
Definition inosmacro.h:201
#define ASSERT_ALWAYS(f)
Definition inosmacro.h:696
#define INOS_AND(variable, mask)
Definition inosmacro.h:210