Homepage Demos Overview Downloads Tutorials Reference
Credits

Socket.cc

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

Tekkotsu v2.2.2
Generated Tue Jan 4 15:43:15 2005 by Doxygen 1.4.0