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
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 * , int )
00164 {
00165
00166
00167 return -1;
00168 }
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180