Homepage Demos Overview Downloads Tutorials Reference
Credits
Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members | Related Pages | Search

Socket.cc

Go to the documentation of this file.
00001 #include "Socket.h"
00002 #include <stdio.h>
00003 #include "Wireless.h"
00004 #include "Shared/Config.h"
00005 #include <unistd.h>
00006 
00007 Socket* sout=NULL;
00008 Socket* serr=NULL;
00009 
00010 byte*
00011 Socket::getWriteBuffer(int bytesreq)
00012 {
00013   if (sendBufSize-writeSize>=bytesreq
00014       && state==CONNECTION_CONNECTED)
00015     return writeData+writeSize;
00016   if (state!=CONNECTION_CONNECTED) {
00017     if(forwardSock!=NULL)
00018       return forwardSock->getWriteBuffer(bytesreq);
00019     if(textForward)
00020       return (byte*)(textForwardBuf=new char[bytesreq]);
00021   }
00022   return NULL;
00023 }
00024 
00025 void
00026 Socket::write(int size)
00027 {
00028   writeSize+=size;
00029   if(textForwardBuf) {
00030     ::write(STDOUT_FILENO,textForwardBuf,size);
00031     delete textForwardBuf;
00032     textForwardBuf=NULL;
00033   } else
00034     flush();
00035 }
00036 
00037 int
00038 Socket::read()
00039 {
00040   return -1;
00041 }
00042 
00043 byte*
00044 Socket::getReadBuffer()
00045 {
00046   return NULL;
00047 //  return readData+readSize;
00048 }
00049 
00050 void
00051 Socket::init()
00052 {
00053   sendSize=0;
00054   writeSize=0;
00055 }
00056 
00057 int
00058 Socket::setFlushType(FlushType_t fType)
00059 {
00060   if (state != CONNECTION_CLOSED) return -1;
00061   flType=fType;
00062   return 0;
00063 }
00064 
00065 void
00066 Socket::flush()
00067 {
00068   if (state!=CONNECTION_CONNECTED) {
00069     if(forwardSock!=NULL)
00070       return forwardSock->flush();
00071   } else {
00072     if (flType==FLUSH_NONBLOCKING) {
00073       if (!tx) {
00074         byte *tempData=sendData;
00075         int tempSize=sendSize;
00076         sendData=writeData;
00077         writeData=tempData;
00078         sendSize=writeSize;
00079         writeSize=tempSize;
00080       wireless->send(sock); 
00081       }
00082     } else {
00083       sendData=writeData;
00084       sendSize=writeSize;
00085       wireless->blockingSend(sock);
00086     }
00087   }
00088 }
00089 
00090 int
00091 Socket::pprintf(int vlevel, const char *fmt, ...)
00092 {
00093   if (vlevel>verbosity) return 0;
00094 
00095   int ret;
00096   va_list al;
00097   va_start(al,fmt);
00098   ret=this->printf(fmt, al); 
00099   va_end(al);
00100 
00101   return ret;
00102 }
00103 
00104 int
00105 Socket::printf(const char *fmt, ...)
00106 {
00107   va_list al;
00108   va_start(al,fmt);
00109   int ret=vprintf(fmt,al);
00110   va_end(al);
00111   return ret;
00112 }
00113 
00114 int
00115 Socket::vprintf(const char *fmt, va_list al)
00116 {
00117   if (state==CONNECTION_CONNECTED && (sendBufSize-writeSize<256)) {
00118     flush();
00119     if (sendBufSize-writeSize<256)
00120       return -1;
00121   }
00122 
00123   if (state!=CONNECTION_CONNECTED) {
00124     if(forwardSock!=NULL)
00125       return forwardSock->vprintf(fmt,al);
00126     if(textForward)
00127       return vfprintf(stdout, fmt, al);
00128   } else {
00129     int ret=vsprintf((char *)(writeData+writeSize), fmt, al);
00130     writeSize+=ret;
00131     flush();
00132     return ret;
00133   }
00134   return -1;
00135 }
00136 
00137 int
00138 Socket::write(const byte *buf, int size)
00139 {
00140   if (state!=CONNECTION_CONNECTED) {
00141     if(forwardSock!=NULL)
00142       return forwardSock->write(buf,size);
00143     if(textForward)
00144       return ::write(STDOUT_FILENO,buf,size);
00145   } else {
00146     byte *destbuf=getWriteBuffer(size);
00147     if (destbuf==NULL) return -1;
00148     memcpy(destbuf, buf, size);
00149     write(size);
00150     return size;
00151   }
00152   return -1;
00153 }
00154 
00155 int
00156 Socket::read(byte * /*buf*/, int /*size*/)
00157 {  
00158 /*  if (size>=recvBufSize-recvPos) return -1;
00159   memcpy(buf,recvData+recvPos,size);*/
00160   return -1;
00161 }
00162 
00163 /*! @file
00164  * @brief Implements Tekkotsu wireless Socket class, also sout and serr
00165  * @author alokl (Creator)
00166  * 
00167  * $Author: ejt $
00168  * $Name: tekkotsu-1_4_1 $
00169  * $Revision: 1.13 $
00170  * $State: Exp $
00171  * $Date: 2003/06/12 23:41:41 $
00172  */
00173 

Tekkotsu v1.4
Generated Sat Jul 19 00:06:31 2003 by Doxygen 1.3.2