Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

/home/gilberto/prog/tesi2.31/TelepatiTcp/TelepatiTcp.h

Go to the documentation of this file.
00001 
00002 /*
00003 TelepatiTcp ver 1.5
00004 
00005 Copyright (C) 2005 Gilberto Decaro
00006 email: msgid@email.it
00007 
00008 This program is free software; you can redistribute it and/or
00009 modify it under the terms of the GNU General Public License
00010 as published by the Free Software Foundation; either version 2
00011 of the License, or (at your option) any later version.
00012 
00013 This program is distributed in the hope that it will be useful,
00014 but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 GNU General Public License for more details.
00017 
00018 You should have received a copy of the GNU General Public License
00019 along with this program; if not, write to the Free Software
00020 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00021 */
00022 
00023 #ifndef TelepatiTcp_h_DEFINED
00024 #define TelepatiTcp_h_DEFINED
00025 
00026 #include <OPENR/OObject.h>
00027 #include <OPENR/OSubject.h>
00028 #include <OPENR/OObserver.h>
00029 
00030 /*Strutture delle connessioni usate da Telepati*/
00031 #include "TCPConnection.h"  
00032 /*Header per la gestione dello stack TCP/IP di IPStack*/
00033 #include <ant.h>  
00034 /*tipi di Endpoint*/
00035 #include <EndpointTypes.h>  
00036 /*package usati da Telepati i TelepatiPkges*/
00037 #include <Packages.h>
00038 /*Tipi di messaggi TCP*/ 
00039 #include <TCPEndpointMsg.h>
00040 
00041 //***
00042 #include <fstream>
00043 
00044 #include <vector> 
00045 #include <queue>
00046 #include "def.h"
00047 
00050 #include "EtherStat.h"
00051 
00054 #define TLPT_BEG_COLOR "\e[32m" 
00055 
00057 #define TLPT_END_COLOR "\e[0m"
00058 
00062 #define TLPT_NAME TLPT_BEG_COLOR"TelepatiTcp"TLPT_END_COLOR
00063 
00064 
00065 using namespace std; 
00070 const char* const AIBONET="/MS/OPEN-R/MW/CONF/AIBONET.CFG";
00071 
00087 class TelepatiTcp : public OObject {
00088  public:
00089     
00091   TelepatiTcp();
00093   virtual ~TelepatiTcp();
00094   
00096   OSubject*    subject[numOfSubject]; 
00098   OObserver*   observer[numOfObserver];
00099 
00103   virtual OStatus DoInit   (const OSystemEvent& event); 
00107   virtual OStatus DoStart  (const OSystemEvent& event); 
00110   virtual OStatus DoStop   (const OSystemEvent& event); 
00114   virtual OStatus DoDestroy(const OSystemEvent& event); 
00115   
00122   void SendCont(ANTENVMSG msg);  
00126   void ReceiveCont(ANTENVMSG msg); 
00130   void ListenCont(ANTENVMSG msg);  
00135   void ConnectCont(ANTENVMSG msg);  
00141   void EtherStat(void* msg);  
00142 
00149   void SendNotify(const ONotifyEvent& event);  
00152   void ObserverReady(const OReadyEvent& event); 
00153 
00155   static const int TELEPATI_BUFFER_SIZE= 65535;  
00159   static const longword TELEPATI_BONE_TIME= 8; 
00163   static const int TELEPATI_BASE_PORT= 30000;  
00167   static const int TELEPATI_MAX_CONNECT_ERROR= 50; 
00171   static const int TELEPATI_MAX_MESSAGE_TO_OBSERVER = 20; 
00175   static const longword TELEPATI_RECONNECT_TIME= 800000000; 
00176   
00177  private:
00178   /*--- Variabili per le statistiche di comunicazione ---*/
00179   unsigned int sendMessage;          /*numero di messaggi spediti*/         
00180   unsigned int totalRecvMessage;     /*numero di messaggi totali ricevuti*/ 
00181   unsigned int dataRecvMessage;      /*numero di messaggi di dati ricevuti*/
00182   unsigned int byteSended;           /*numero di byte spediti*/
00183   unsigned int byteReceived;         /*numero di byte ricevuti*/
00184   int sendSpeed;                     /* velcita' di spedizione in byte/s*/
00185   /* memorizza il momento in cui e' iniziata la spedizione del pkg
00186      della i-esima connessione*/
00187   SystemTime** startSendTime;        
00188 
00189   /* Vettore di indirizzi IP degli AIBO*/
00190   vector<IPAddress> aiboIp;          
00191   /* Array di connessioni per la ricezione*/
00192   TCPRecvConnection* recvConnection; 
00193   /* Array di connessioni per la spedizione*/
00194   TCPSendConnection* sendConnection; 
00195  /* Riferimento allo stack IP (richiesto da OPENR)*/
00196   antStackRef ipstackRef;        
00197   /* Stato di attivita' degli aibo presenti. Array di aiboState,in link
00198      con aiboIp*/
00199   aiboState* aiboIpActive;          
00200   /* Numero di aibo presenti nel campo meno 1 (escluso colui su cui
00201      gira Telepati)*/
00202   int numaibo;                     
00203 
00204   /* Coda di TelepatiPkg. Si occupa della memorizazione dei messaggi
00205      in attesa di essere spediti*/
00206   queue<TelepatiPkg*> sendQueue;   
00207   /* Coda dei messaggi in attesa di essere spediti all'observer.*/
00208   queue<TelepatiPkg*> interObjectQueue; 
00209 
00210   /* Array di byte dove l'i-esimo elemento rappresenta il numero di
00211      errori di connessione della i-esima connessione di spedizione. */
00212   byte* numOfReconnect;  
00213 
00214   /* Array di buffer di byte contenente "pezzi" di messaggi. Usato in
00215      ReceiveCont per poter riassemblare i messaggi che vengono
00216      tagliati in quanto spediti in due pacchetti TCP differenti.*/
00217   byte** chunk;
00218   /* Dimensione del buffer chunk.*/
00219   size_t* chunkSize;
00220 
00221   /* Il mio indirizzo IP*/
00222   IPAddress* myIp;               
00223 
00224   /* Buffer per il parsing dei file*/
00225   static const size_t LINEBUFFERSIZE= 256; 
00226   
00227   /* Parser del file di configurazione. Imposta e inizializza numaibo,
00228      aiboIp, aiboIpActive, numOfReconnect, startSendTime, chunk e
00229      chunkSize e imposta le porte di comunicazione TCP delle varie
00230      connessioni. @return oSUCCESS se ha avuto successo; oFAIL
00231      altrimenti.*/
00232   OStatus parseIpConfigFile();       
00233   /* Inizializza le connessioni di spedizione e di ricezione. @return
00234      oSUCCESS se ha avuto successo; oFAIL altrimenti.*/
00235   OStatus initConnections();       
00236   /* Attiva la ricezione della i-esima connessione. @return oSUCCESS
00237      se ha avuto successo; oFAIL altrimenti.*/
00238   OStatus listen(int i);         
00239   /* Connette l'i-esima connessione. @return oSUCCESS se ha avuto
00240      successo; oFAIL altrimenti. */
00241   OStatus connect(int i);           
00242   
00243   /* Spedisce il messaggio. Imposta IPStack mandandogli i dati da
00244      spedire attraverso la connessione di spedizione corretta, non
00245      appena il buffer di spedizione di IPStack sara' riempito verra'
00246      invocata SendCont(). In caso la connessione sia in spedizione
00247      accoda il messaggio nella coda sendQueue.@param msg messaggio da
00248      spedire*/
00249   void send(TelepatiPkg* msg); 
00250   
00251   /* Avvia la ricezione sulla i-esima connessione. Imposta IPStack in
00252      modo da restare in ascolto sulla rete, non appena verra' ricevuto
00253      un pacchetto verra' invocata la funzione ReceiveCont().*/
00254   void receive(int i);          
00255   
00256   /* Fa il merge del buffer contenuto nel messaggio con il buffer di
00257      chunk della i-esima connessione. @param msg messaggio TCP su cui
00258      fare il merge. @param connID id della connessione.*/
00259   byte* mergeWithChunk(const TCPEndpointReceiveMsg* msg, int connID);
00260   /* Salva nel chunk della connID connessione i byte contenuti in ptr
00261      a partire dall'offset offset. @param ptr buffer contenente i dati
00262      da copiare. @param offset l'offset di ptr da cui iniziare a
00263      copiare i dati. @param size quanti byte copiare. @connID id della
00264      connessione. */
00265   void saveInChunk(const byte* ptr, int offset, int size, int connID);
00266   
00267   /* Manda un ByeMsg (msg di arrivederci) all'i-esimo Aibo; blocca
00268      l'esecuzione dell'oggetto fino al completamento della
00269      spedizione. @param i aibo a cui mandare il byte message*/
00270   void sendByeMsg(int i);
00271   /* Manda il package agli observer se pronti a riceverlo, altrimenti
00272      lo acconda. @param pkg package da mandare.*/
00273   void sendToObserver(TelepatiPkg* pkg);
00274   /* Manda un HiMsg (msg di saluto) all'i-esimo Aibo. @param i aibo a
00275      cui mandare l'hy message*/
00276   inline void sendHiMsg(int i){
00277     OSYSDEBUG((TLPT_NAME"::sendHiMsg(%d)\n",i));
00278     send(new HiPkg(i));
00279   };
00280 
00281   /* Manda un HiReplyMsg (msg di risposta al saluto) all'i-esimo
00282      Aibo. @param i aibo a cui mandare l'HiReply message*/
00283   inline void sendHiReplyMsg(int i){
00284     OSYSDEBUG((TLPT_NAME"::sendHiReplyMsg(%d)\n",i));
00285     send(new HiReplyPkg(i));
00286   };
00287   
00288   /* Manda un AiboInfoMsg, messaggio di informazione sullo stato degli
00289      Aibo, all'observer di Telepati*/
00290   void sendAiboInfoMsg();  
00291   /* Manda un CounterPkg all'observer di Telepati*/
00292   void sendCounterMsg();
00293   /* Controlla la presenza di messaggi in attesa di essere spediti e,
00294      se presenti, li spedisce.*/
00295   void checkQueue();
00296   /* Recupera l'indirizzo IP dell'Aibo stesso*/
00297   IPAddress* retrieveMyIp();     
00298   /* Imposta l'array aiboIpActive per i-esimo Aibo in base al valore
00299      passato e se cambia ne informa l'observer. @param aibo aibo di
00300      cui modificare lo stato di attivita'. @param newVal nuovo stato
00301      di attivitą. @return true: se ha cambiato stato; false:
00302      altrimenti.*/
00303   bool setAiboIpActive(int aibo, aiboState newVal);  
00304   /* Calcola la velocita' di spedizione, aggiorna e stampa
00305      sendSpeed. @param aibo indice della connessione di spedizione su
00306      cui calcolare la velocita'*/
00307   void computeSpeed(int aibo);
00308 
00309   //***
00310   ofstream* debugFile;
00311 
00312 };
00313 
00314 #endif  //TelepatiTcp_h_DEFINED

Generated on Tue Mar 1 16:20:13 2005 for TelepatiTcp by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002