Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Platform/Aperios1.3.2/TCPHandler.cpp

Go to the documentation of this file.
00001 /** 
00002 * @file  Platform/Aperios1.3.2/TCPHandler.cpp
00003 *
00004 * Class for using NetSender/NetReceivers over a TCP connection
00005 *
00006 * @author <A href=mailto:robocup@m-wachter.de>Michael Wachter</A>
00007 * 
00008 */
00009 
00010 #include "TCPHandler.h"
00011 
00012 #include <stdio.h>
00013 #include <iostream.h>
00014 #include <iomanip.h>
00015 
00016 
00017 TCPHandler::TCPHandler(NetSenderBase &theSender, NetReceiverBase &theReceiver)
00018 :TCPEndpoint(16384,16384)
00019 {
00020    sender = &theSender;
00021    receiver = &theReceiver;
00022    sender->setHandler(this);
00023    sizeOfDataToRead = 0;
00024    sendingDone = true;
00025   
00026    sender->getPackage(131072*2);
00027    receiver->getPackage(8192);
00028  
00029 }
00030 
00031 void TCPHandler::setTransmitters(NetSenderBase& theSender, NetReceiverBase& theReceiver)
00032 {
00033   sender = &theSender;
00034   receiver = &theReceiver;
00035   sender->setHandler(this);
00036 }
00037 
00038 void TCPHandler::onReceive(void* someData, int size)
00039 {
00040    // "size" is always the number of bytes left to read
00041    
00042    // cout << "TCPHandler::onReceive(" << someData <<","<<size<<") \n";
00043 
00044    // if(sendingDone) sender->sendDone();
00045 
00046 
00047    while(size > 0)  
00048    {
00049      
00050   //   cout << "Bytes left: " << size << " SomeData " << someData << " \n" << flush;
00051      
00052      if (sizeOfDataToRead == 0)           
00053      {
00054        // Get size of Data
00055        // cout << "   - Stream start \n " ;
00056        memcpy(&sizeOfDataToRead,someData,sizeof(int));
00057 
00058        // Todo : Unwahrscheinlichen Fall das die Size auf 2 Packete verteilt
00059        // ankommt abfangen
00060        ASSERT(size>3);
00061 
00062        // cout << "    Size = " << sizeOfDataToRead << "\n" ;
00063        (char*)someData+=sizeof(int);
00064        size-=sizeof(int);                  
00065 
00066        // Get the buffer to store the data into
00067        if (sizeOfDataToRead > 0)
00068        { 
00069           receiveBuffer=receiver->getPackage(sizeOfDataToRead);
00070        }
00071       /* Heartbeat or other data received received  */
00072      /*if(sendingDone) sender->sendDone(); */
00073      }
00074      else 
00075      {
00076         // Get Data
00077         if (sizeOfDataToRead > 0 && size != 0)
00078         {
00079           int bytesToRead = sizeOfDataToRead;        
00080           if (bytesToRead > size) bytesToRead = size;   
00081 
00082            // cout << "   - need " << sizeOfDataToRead << " more bytes " 
00083            //     << "- Getting " << bytesToRead << " bytes \n" << flush; 
00084 
00085           memcpy(receiveBuffer,someData,bytesToRead); 
00086       
00087           sizeOfDataToRead -= bytesToRead;
00088           (char*)receiveBuffer += bytesToRead; // Position to copy next package
00089       
00090           size -= bytesToRead;
00091           (char*)someData += bytesToRead;       // Position to read next data
00092 
00093         }
00094               // All Data copied ?
00095         if (sizeOfDataToRead == 0)
00096         {
00097            // cout << "   - All Data collected : Streaming - \n";
00098            receiver->onReceive();
00099         }
00100      }
00101   }
00102 }
00103 
00104 void TCPHandler::onConnect(void)
00105 {
00106   cout << "TCPHandler::Connection established \n" << flush;
00107   sizeOfDataToRead = 0;
00108   sendingDone = true;
00109   sender->sendDone();
00110 }
00111 
00112 void TCPHandler::onClose(int reason)
00113 {
00114     cout << "TCPHandler::Connection closed \n" << flush;
00115  
00116 }
00117 
00118 void TCPHandler::onSendingDone(void)
00119 {
00120    sendingDone=true;
00121    sender->sendDone();
00122 }
00123 
00124 void TCPHandler::sendPackage(int senderNumber, void* someData,int size)
00125 {
00126   // cout << "TCPHandler::sendPackage : size " << size << "\n" << flush;
00127   sendingDone=false;
00128   if(status==connected) 
00129   {
00130     send(someData,size);  // Calls send from TCPEndpoint
00131   }
00132 }
00133 
00134 
00135 /*
00136  * Change log :
00137  * 
00138  * $Log: TCPHandler.cpp,v $
00139  * Revision 1.3  2004/09/12 20:10:47  wachter
00140  * Documentation-fixes
00141  *
00142  * Revision 1.2  2004/05/25 14:39:35  wachter
00143  * Debug-communication does not need special handshaking any more
00144  *
00145  * Revision 1.1.1.1  2004/05/22 17:23:40  cvsadm
00146  * created new repository GT2004_WM
00147  *
00148  * Revision 1.7  2004/01/26 13:44:07  wachter
00149  * shared-memory-buffers now have variable sizes
00150  *
00151  * Revision 1.6  2004/01/20 14:21:41  wachter
00152  * - Added sender-number to NetSender
00153  * - worked on with Team-Communication
00154  *
00155  * Revision 1.5  2004/01/20 13:45:36  wachter
00156  * Changed sizes of MessageQueue and memory-allocation
00157  *
00158  * Revision 1.4  2004/01/16 16:23:58  wachter
00159  * Bugfixes
00160  *
00161  * Revision 1.3  2004/01/03 18:57:50  wachter
00162  * Debug-communication working now
00163  *
00164  * Revision 1.2  2004/01/03 16:18:25  wachter
00165  * debug-communication mostly working now
00166  *
00167  * Revision 1.1  2003/12/21 19:27:03  wachter
00168  * Added classes for Sender/Receiver over TCP and UDP.
00169  * ( PLEASE DO NOT USE THIS NOW ! )
00170  *
00171  * 
00172  */
00173 

Generated on Thu Sep 23 19:57:34 2004 for GT2004 by doxygen 1.3.6