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
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 * , int )
00157 {
00158
00159
00160 return -1;
00161 }
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173