#ifndef __TMrbC2Lynx_h__
#define __TMrbC2Lynx_h__
#include "TSystem.h"
#include "TString.h"
#include "TNamed.h"
#include "TServerSocket.h"
#include "TSocket.h"
#include "TMessage.h"
#include "TMrbNamedX.h"
#include "TMrbLofNamedX.h"
#include "TC2LVMEModule.h"
#include "M2L_MessageTypes.h"
#include "M2L_CommonStructs.h"
class TMrbC2Lynx : public TNamed {
public:
enum EC2LServerLog { kC2LServerLogNone = 0,
kC2LServerLogCout,
kC2LServerLogXterm
};
public:
TMrbC2Lynx() { this->Reset(); };
TMrbC2Lynx(const Char_t * HostName, const Char_t * Server = NULL, const Char_t * LogFile = NULL, Int_t Port = 9010,
const Char_t * ServerLog = "cout", Bool_t ConnectFlag = kTRUE);
~TMrbC2Lynx() {};
Bool_t SetServerLog(const Char_t * Output);
Bool_t SetServerLog(EC2LServerLog Output);
inline void SetNonBlocking(Bool_t Flag = kFALSE) { fNonBlocking = Flag; };
inline const Char_t * GetHost() { return(fHost.Data()); };
inline const Char_t * GetServerName() { return(fServerName.Data()); };
inline const Char_t * GetServerPath() { return(fServerPath.Data()); };
inline const Char_t * GetLogFile() { return(fLogFile.Data()); };
inline Int_t GetPort() { return(fPort); };
inline TSocket * GetSocket() { return(fSocket); };
inline Bool_t IsVerbose() { return(fVerboseMode); };
inline Bool_t IsDebug() { return(fDebugMode); };
inline Bool_t IsNonBlocking() { return(fNonBlocking); };
inline Bool_t LogNone() { return(fServerLog->GetIndex() == kC2LServerLogNone); };
inline Bool_t LogCout() { return(fServerLog->GetIndex() == kC2LServerLogCout); };
inline Bool_t LogXterm() { return(fServerLog->GetIndex() == kC2LServerLogXterm); };
inline TMrbNamedX * GetServerLog() { return(fServerLog); };
inline Bool_t IsConnected() { return(fSocket != NULL); }
Bool_t Connect(Bool_t WaitFlag = kTRUE);
Bool_t WaitForConnection();
Bool_t Send(M2L_MsgHdr * Hdr);
Bool_t Recv(M2L_MsgHdr * Hdr);
inline void AddModule(TMrbNamedX * Module) { fLofModules.AddLast(Module); };
inline TMrbLofNamedX * LofModules() { return(&fLofModules); };
inline TC2LVMEModule * FindModule(const Char_t * ModuleName) { return((TC2LVMEModule *) fLofModules.FindByName(ModuleName)); };
inline UInt_t What(M2L_MsgHdr * Hdr) { return(Hdr->fWhat); };
inline Int_t Length(M2L_MsgHdr * Hdr) { return(Hdr->fLength); };
void InitMessage(M2L_MsgHdr * Hdr, Int_t Length, UInt_t What);
M2L_MsgHdr * AllocMessage(Int_t Length, Int_t Wc, UInt_t What);
void Bye();
Bool_t CheckAccessToLynxOs(const Char_t * Host, const Char_t * ServerPath);
Bool_t CheckVersion(TString & Cpu, TString & Lynx, const Char_t * Host = NULL, const Char_t * ServerPath = NULL);
inline void Help() { gSystem->Exec(Form("mrbHelp %s", this->ClassName())); };
protected:
void Reset();
protected:
Bool_t fVerboseMode;
Bool_t fDebugMode;
TMrbNamedX * fServerLog;
Bool_t fNonBlocking;
Bool_t fUseXterm;
TString fHost;
TString fServerPath;
TString fServerName;
TString fLogFile;
TSocket * fSocket;
Int_t fPort;
TMrbLofNamedX fLofServerLogs;
TMrbLofNamedX fLofModules;
ClassDef(TMrbC2Lynx, 1)
};
#endif