00001 
00064 #if !defined(_CIGI_INCOMING_MESSAGE_INCLUDED_)
00065 #define _CIGI_INCOMING_MESSAGE_INCLUDED_
00066 
00067 #include <stdlib.h>
00068 #include "CigiMessage.h"
00069 #include "CigiMessageBuffer.h"
00070 #include "CigiBaseEventProcessor.h"
00071 #include "CigiBaseSignalProcessing.h"
00072 #include "CigiSignalType.h"
00073 
00074 
00075 
00078 typedef void (* CigiCBProcessor)(CigiBasePacket *Packet);
00079 
00080 
00081 class CigiDefaultPacket;
00082 
00083 class CigiSession;
00084 
00085 
00086 
00089 class CIGI_SPEC CigiIncomingMsg : public CigiMessage  
00090 {
00091 
00092    friend class CigiSession;
00093 
00094 public:
00095 
00096 
00097    
00098 
00099    
00102    CigiIncomingMsg();
00103 
00104    
00107         virtual ~CigiIncomingMsg();
00108 
00109 
00110 
00111    
00112 
00113 
00114    
00115 
00116    
00128         int ProcessIncomingMsg(Cigi_uint8 *Buff, int Size);
00129 
00130    
00140         int ProcessIncomingMsg(void)
00141    {
00142       int Rslt = CIGI_ERROR_UNEXPECTED_NULL;
00143       if(CrntMsgBuf != NULL)
00144          Rslt = ProcessIncomingMsg(CrntMsgBuf->Buffer,
00145                                    CrntMsgBuf->BufferFillCnt);
00146 
00147       return(Rslt);
00148    }
00149 
00150    
00159         void ProcessPacket(int PcktId, CigiBasePacket *Pckt);
00160 
00161 
00162    
00163 
00164    
00169         CigiBasePacket * GetFirstPacket(void);
00170 
00171    
00176         CigiBasePacket * GetNextPacket(void);
00177 
00178 
00179    
00180 
00181    
00191         int RegisterEventProcessor(int PacketID,
00192                               CigiBaseEventProcessor *EventMgr);
00193 
00194    
00204         int UnregisterEventProcessor(int PacketID,
00205                               CigiBaseEventProcessor *EventMgr);
00206 
00207 
00208    
00218    int RegisterCallBack(int PacketID, CigiCBProcessor CallBack);
00219 
00220    
00230    int UnregisterCallBack(int PacketID, CigiCBProcessor CallBack);
00231 
00232 
00233    
00241    int RegisterSignalProcessor(CigiBaseSignalProcessing *SignalMgr);
00242 
00243    
00251    int UnregisterSignalProcessor(CigiBaseSignalProcessing *SignalMgr);
00252 
00253 
00254    
00262    int RegisterUnrecognizedPacketEvent(CigiBaseEventProcessor *EventMgr)
00263    {
00264         return(RegisterEventProcessor(0,EventMgr));
00265    }
00266 
00267    
00275    int UnregisterUnrecognizedPacketEvent(CigiBaseEventProcessor *EventMgr)
00276    {
00277       return(UnregisterEventProcessor(0,EventMgr));
00278    }
00279 
00280 
00281    
00289    int RegisterUnrecognizedPacketCallBack(CigiCBProcessor CallBack)
00290    {
00291       return(RegisterCallBack(0,CallBack));
00292    }
00293 
00294    
00302    int UnregisterUnrecognizedPacketCallBack(CigiCBProcessor CallBack)
00303    {
00304       return(UnregisterCallBack(0,CallBack));
00305    }
00306 
00307    
00315    int RegisterUnhandledPacketEvent(CigiBaseEventProcessor *EventMgr)
00316    {
00317         return(RegisterEventProcessor(256,EventMgr));
00318    }
00319 
00320    
00328    int UnregisterUnhandledPacketEvent(CigiBaseEventProcessor *EventMgr)
00329    {
00330       return(UnregisterEventProcessor(256,EventMgr));
00331    }
00332 
00333 
00334    
00342    int RegisterUnhandledPacketCallBack(CigiCBProcessor CallBack)
00343    {
00344       return(RegisterCallBack(256,CallBack));
00345    }
00346 
00347    
00355    int UnregisterUnhandledPacketCallBack(CigiCBProcessor CallBack)
00356    {
00357       return(UnregisterCallBack(256,CallBack));
00358    }
00359 
00360 
00361    
00362 
00363 
00364    
00369    Cigi_uint8 *GetNextBuffToLoad(void);
00370 
00371    
00375    void AdvanceCrntBuffer(void);
00376 
00377    
00382    void SetCrntMsgSize(int MsgSize)
00383    {
00384       if(CrntMsgBuf != NULL)
00385          CrntMsgBuf->BufferFillCnt = MsgSize;
00386    }
00387 
00388 
00389 
00390    
00391 
00392    
00396    Cigi_uint8 * GetMsgBuffer()
00397    {
00398       if(CrntMsgBuf == NULL)
00399          AdvanceCrntBuffer();
00400 
00401       return(CrntMsgBuf->Buffer);
00402    }
00403 
00404    
00408    int GetMsgBufSize(void) { return(CrntMsgBuf->BufferSize); }
00409 
00410 
00411    
00412 
00413    
00420    void UsingIteration(bool IterationIn=true) { Iteration = IterationIn; }
00421 
00422    
00429    bool CheckIteration(void) { return(Iteration); }
00430 
00431 
00432    
00433 
00434    
00442         void SetReaderVersion(CigiVersionID &Version);
00443 
00444    
00453    int SetReaderCigiVersion(const int CigiVersionIn, bool bndchk=true)
00454    {
00455       CigiVersionID tVer(CigiVersionIn,0);
00456       SetReaderVersion(tVer);
00457       return(CIGI_SUCCESS);
00458    }
00459 
00460    
00471    int SetReaderCigiVersion(const int CigiVersionIn, const int CigiMinorVersionIn, bool bndchk=true)
00472    {
00473       CigiVersionID tVer(CigiVersionIn,CigiMinorVersionIn);
00474       SetReaderVersion(tVer);
00475       return(CIGI_SUCCESS);
00476    }
00477 
00478    
00482    int GetReaderCigiVersion(void) const
00483    {
00484       return(ReaderVersion.CigiMajorVersion);
00485    }
00486 
00487    
00491    int GetReaderCigiMinorVersion(void) const { return(ReaderVersion.CigiMinorVersion); }
00492 
00493 
00494    
00495 
00496    
00508         int RegisterUserPacket(CigiBasePacket *Packet,
00509                           Cigi_uint8 PacketID,
00510                           bool HostSend,
00511                           bool IGSend);
00512 
00513 
00514 
00515 protected:
00516 
00517    
00518 
00519    
00526    bool Iteration;
00527 
00528    
00532    Cigi_uint8 *CrntPacket;
00533 
00534    
00539    int ReadBufferPos;
00540 
00541    
00545    list<CigiBaseEventProcessor *>EventList[257];
00546 
00547    
00551    list<CigiCBProcessor>CallBackList[257];
00552 
00553    
00557    list<CigiBaseSignalProcessing *>SignalList;
00558 
00559    
00563    bool Swap;
00564 
00565    
00569    CigiVersionID MostMatureCigiVersionReceived;
00570 
00571    
00575    CigiVersionID ProcessingVersion;
00576 
00577    
00582    CigiVersionID ReaderVersion;
00583 
00584    
00587    CigiBasePacket *IncomingHandlerTbl[256];
00588 
00589    
00593    CigiSignalType::Type SignalTbl[256];
00594 
00595    
00599    CigiDefaultPacket *DefaultPckt;
00600 
00601 
00602    
00603 
00604    
00612    bool SignalJump(const Cigi_uint8 PacketID, CigiBasePacket *Packet);
00613 
00614    
00620         void ClearTbls(bool Complete);
00621 
00622    
00626         void SetIncomingHostV1Tbls(void);
00627 
00628    
00632         void SetIncomingIGV1Tbls(void);
00633 
00634    
00638         void SetIncomingHostV2Tbls(void);
00639 
00640    
00644         void SetIncomingIGV2Tbls(void);
00645 
00646    
00650         void SetIncomingHostV3Tbls(void);
00651 
00652    
00656         void SetIncomingIGV3Tbls(void);
00657 
00658    
00662         int CheckFirstPacket(Cigi_uint8 *Buff);
00663 
00664 
00665 };
00666 
00667 #endif // !defined(_CIGI_INCOMING_MESSAGE_INCLUDED_)