00001
00072 #if !defined(_CIGI_OUTGOING_MESSAGE_INCLUDED_)
00073 #define _CIGI_OUTGOING_MESSAGE_INCLUDED_
00074
00075 #include <string>
00076 #include <list>
00077
00078 #include "CigiMessage.h"
00079 #include "CigiBasePacket.h"
00080 #include "CigiBaseEntityCtrl.h"
00081 #include "CigiBaseIGCtrl.h"
00082 #include "CigiBaseSOF.h"
00083 #include "CigiMessageBuffer.h"
00084 #include "CigiBaseVariableSizePckt.h"
00085 #include "CigiDefaultPacket.h"
00086
00087 class CigiSession;
00088
00089
00092 class CIGI_SPEC CigiOutgoingMsg : public CigiMessage
00093 {
00094
00095 friend class CigiSession;
00096
00097 public:
00098
00099
00100
00103 CigiOutgoingMsg();
00104
00105
00108 virtual ~CigiOutgoingMsg();
00109
00110
00111
00112
00113
00114
00115
00116
00121 CigiOutgoingMsg & operator <<(CigiBaseIGCtrl &refPacket);
00122
00123
00128 inline CigiOutgoingMsg & pack(CigiBaseIGCtrl &refPacket)
00129 {
00130 return (*this) << refPacket;
00131 }
00132
00133
00138 CigiOutgoingMsg & operator <<(CigiBaseSOF &refPacket);
00139
00140
00145 CigiOutgoingMsg & pack(CigiBaseSOF &refPacket)
00146 {
00147 return (*this) << refPacket;
00148 }
00149
00150
00155 CigiOutgoingMsg & operator <<(CigiBaseEntityCtrl &refPacket);
00156
00157
00162 CigiOutgoingMsg & pack(CigiBaseEntityCtrl &refPacket)
00163 {
00164 return (*this) << refPacket;
00165 }
00166
00167
00173 CigiOutgoingMsg & operator <<(CigiBaseEnvCtrl &refPacket);
00174
00175
00181 CigiOutgoingMsg & pack(CigiBaseEnvCtrl &refPacket)
00182 {
00183 return (*this) << refPacket;
00184 }
00185
00186
00191 CigiOutgoingMsg & operator <<(CigiBaseVariableSizePckt &refPacket);
00192
00193
00198 CigiOutgoingMsg & pack(CigiBaseVariableSizePckt &refPacket)
00199 {
00200 return (*this) << refPacket;
00201 }
00202
00203
00208 CigiOutgoingMsg & operator <<(CigiBasePacket &refBasePacket);
00209
00210
00215 CigiOutgoingMsg & pack(CigiBasePacket &refBasePacket)
00216 {
00217 return (*this) << refBasePacket;
00218 }
00219
00220
00221
00222
00223
00228 CigiOutgoingMsg & operator <<(CigiBaseIGCtrl *refPacket)
00229 {
00230 return(operator<<(*refPacket));
00231 }
00232
00233
00238 CigiOutgoingMsg & pack(CigiBaseIGCtrl *refPacket)
00239 {
00240 return this->pack(*refPacket);
00241 }
00242
00243
00248 CigiOutgoingMsg & operator <<(CigiBaseSOF *refPacket)
00249 {
00250 return(operator<<(*refPacket));
00251 }
00252
00253
00258 CigiOutgoingMsg & pack(CigiBaseSOF *refPacket)
00259 {
00260 return this->pack(*refPacket);
00261 }
00262
00263
00268 CigiOutgoingMsg & operator <<(CigiBaseEntityCtrl *refPacket)
00269 {
00270 return(operator<<(*refPacket));
00271 }
00272
00273
00278 CigiOutgoingMsg & pack(CigiBaseEntityCtrl *refPacket)
00279 {
00280 return this->pack(*refPacket);
00281 }
00282
00283
00289 CigiOutgoingMsg & operator <<(CigiBaseEnvCtrl *refPacket)
00290 {
00291 return(operator<<(*refPacket));
00292 }
00293
00294
00300 CigiOutgoingMsg & pack(CigiBaseEnvCtrl *refPacket)
00301 {
00302 return this->pack(*refPacket);
00303 }
00304
00305
00310 CigiOutgoingMsg & operator <<(CigiBaseVariableSizePckt *refPacket)
00311 {
00312 return(operator<<(*refPacket));
00313 }
00314
00315
00320 CigiOutgoingMsg & pack(CigiBaseVariableSizePckt *refPacket)
00321 {
00322 return this->pack(*refPacket);
00323 }
00324
00325
00330 CigiOutgoingMsg & operator <<(CigiBasePacket *refBasePacket)
00331 {
00332 return(operator<<(*refBasePacket));
00333 }
00334
00335
00340 CigiOutgoingMsg & pack(CigiBasePacket *refBasePacket)
00341 {
00342 return this->pack(*refBasePacket);
00343 }
00344
00345
00346
00347
00348
00349
00355 int BeginMsg(void)
00356 {
00357 if(Buffers.empty())
00358 AdvanceBuffer();
00359 return(CIGI_SUCCESS);
00360 }
00361
00362
00369 int UpdateFrameCntr(void);
00370
00371
00381 int UpdateFrameCntr(Cigi_uint8 *OutgoingMsg, Cigi_uint8 *IncomingMsg = NULL);
00382
00383
00391 int UpdateIGCtrl(Cigi_uint8 *OutgoingMsg, Cigi_uint8 *IncomingMsg);
00392
00393
00401 int UpdateSOF(Cigi_uint8 *OutgoingMsg, Cigi_uint8 *IncomingMsg = NULL)
00402 {
00403 return(UpdateFrameCntr(OutgoingMsg,IncomingMsg));
00404 }
00405
00406
00412 int LockMsg(void);
00413
00414
00419
00422 Cigi_uint8 * GetMsg(int &length);
00423
00424
00428 Cigi_uint8 * GetBuffer(void);
00429
00430
00435 int GetMsgLength(void);
00436
00437
00444 std::string GetBufferString(void);
00445
00446
00452 int UnlockMsg(void);
00453
00454
00465 int PackageMsg(Cigi_uint8 **Msg, int &length);
00466
00467
00478 int GetCurrentlyPackagedMsg(Cigi_uint8 **Msg, int &length)
00479 {
00480 if(PackagedMsg != NULL)
00481 {
00482 *Msg = PackagedMsg->Buffer;
00483 length = PackagedMsg->BufferFillCnt;
00484 return(CIGI_SUCCESS);
00485 }
00486 else
00487 {
00488 *Msg = (Cigi_uint8 *)0;
00489 length = 0;
00490 return(CIGI_ERROR_UNEXPECTED_NULL);
00491 }
00492 }
00493
00494
00500 int FreeMsg(void);
00501
00502
00503
00504
00508 void SetFrameCnt(const Cigi_uint32 FrameCntIn) { FrameCnt = FrameCntIn; }
00509
00510
00514 Cigi_uint32 GetFrameCnt(void) const { return(FrameCnt); }
00515
00516
00517
00518
00526 void SetSynchronous(const bool Sync) { };
00527
00528
00534 bool IsSynchronous(void) const;
00535
00536
00537
00538
00539
00551 int RegisterUserPacket(CigiBasePacket *Packet,
00552 Cigi_uint8 PacketID,
00553 bool HostSend,
00554 bool IGSend);
00555
00556
00557
00558
00559 protected:
00560
00561
00562
00568 int Reset(void);
00569
00570
00576 int InitMsg(void)
00577 {
00578 AdvanceBuffer();
00579 return(CIGI_SUCCESS);
00580 }
00581
00582
00592 int SetOutgoingCigiVersion(CigiVersionID &Version,
00593 bool bndchk=true);
00594
00595
00605 CigiVersionID GetOutgoingCigiVersion(void)
00606 {
00607 return(OutgoingVersion);
00608 }
00609
00610
00612
00619 void SetMostMatureReceivedCigiVersion(CigiVersionID &Version);
00620
00621
00628 void SetLastRcvdFrame(Cigi_uint32 LastRcvdFrameIn)
00629 {
00630 LastRcvdFrame = LastRcvdFrameIn;
00631 }
00632
00633
00637 void ChangeBufferCigiVersion(CigiVersionID &Version);
00638
00639
00643 void ClearHandlerTable(void);
00644
00645
00649 void SetOutgoingHostV1Tbls(void);
00650
00651
00655 void SetOutgoingIGV1Tbls(void);
00656
00657
00661 void SetOutgoingHostV2Tbls(void);
00662
00663
00667 void SetOutgoingIGV2Tbls(void);
00668
00669
00673 void SetOutgoingHostV3Tbls(void);
00674
00675
00679 void SetOutgoingIGV3Tbls(void);
00680
00681
00685 void AdvanceBuffer(void);
00686
00687
00694 CigiOutgoingMsg & PackObj(CigiBasePacket &DataPacket,
00695 CigiBasePacket &PackingPacket,
00696 void *Spec);
00697
00698
00702 void ChangeOutgoingCigiVersion(CigiVersionID &Version);
00703
00704
00707 CigiVersionID OutgoingVersion;
00708
00709
00712 bool CmdVersionChng;
00713
00714
00717 CigiVersionID CmdVersion;
00718
00719
00722 CigiVersionID MostMatureVersionReceived;
00723
00724
00727 CigiDefaultPacket DefaultPacket;
00728
00729
00732 CigiBasePacket *OutgoingHandlerTbl[256];
00733
00734
00737 bool VldSnd[256];
00738
00739
00742 Cigi_uint32 FrameCnt;
00743
00744
00747 Cigi_uint32 LastRcvdFrame;
00748
00749
00752 CigiBaseIGCtrl *pIGCtrlPck[6];
00753
00754
00757 CigiBaseSOF *pSOFPck[5];
00758
00759
00760
00761
00762 };
00763
00764 #endif // !defined(_CIGI_OUTGOING_MESSAGE_INCLUDED_)