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