00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifdef HAVE_CONFIG_H
00026 # include <config.h>
00027 #endif
00028
00029 #define DISABLE_DEBUGLOG
00030
00031
00032
00033 #include "syncio_memory_p.h"
00034 #include "i18n_l.h"
00035
00036 #include <gwenhywfar/misc.h>
00037 #include <gwenhywfar/debug.h>
00038 #include <gwenhywfar/gui.h>
00039
00040 #include <assert.h>
00041 #include <errno.h>
00042 #include <string.h>
00043
00044
00045
00046 GWEN_INHERIT(GWEN_SYNCIO, GWEN_SYNCIO_MEMORY)
00047
00048
00049
00050 GWEN_SYNCIO *GWEN_SyncIo_Memory_new(GWEN_BUFFER *buffer, int take) {
00051 GWEN_SYNCIO *sio;
00052 GWEN_SYNCIO_MEMORY *xio;
00053
00054 sio=GWEN_SyncIo_new(GWEN_SYNCIO_MEMORY_TYPE, NULL);
00055 GWEN_NEW_OBJECT(GWEN_SYNCIO_MEMORY, xio);
00056 GWEN_INHERIT_SETDATA(GWEN_SYNCIO, GWEN_SYNCIO_MEMORY, sio, xio, GWEN_SyncIo_Memory_FreeData);
00057
00058 GWEN_SyncIo_SetReadFn(sio, GWEN_SyncIo_Memory_Read);
00059 GWEN_SyncIo_SetWriteFn(sio, GWEN_SyncIo_Memory_Write);
00060
00061 if (buffer) {
00062 xio->buffer=buffer;
00063 xio->own=take?1:0;
00064 }
00065 else {
00066 xio->buffer=GWEN_Buffer_new(0, 256, 0, 1);
00067 xio->own=1;
00068 }
00069
00070 GWEN_SyncIo_SetStatus(sio, GWEN_SyncIo_Status_Connected);
00071
00072 return sio;
00073 }
00074
00075
00076
00077 GWEN_SYNCIO *GWEN_SyncIo_Memory_fromBuffer(const uint8_t *buffer, int size) {
00078 GWEN_SYNCIO *sio;
00079 GWEN_SYNCIO_MEMORY *xio;
00080
00081 sio=GWEN_SyncIo_new(GWEN_SYNCIO_MEMORY_TYPE, NULL);
00082 GWEN_NEW_OBJECT(GWEN_SYNCIO_MEMORY, xio);
00083 GWEN_INHERIT_SETDATA(GWEN_SYNCIO, GWEN_SYNCIO_MEMORY, sio, xio, GWEN_SyncIo_Memory_FreeData);
00084
00085 GWEN_SyncIo_SetReadFn(sio, GWEN_SyncIo_Memory_Read);
00086 GWEN_SyncIo_SetWriteFn(sio, GWEN_SyncIo_Memory_Write);
00087
00088
00089 if (size==-1) {
00090 if (buffer)
00091 size=strlen((const char*) buffer)+1;
00092 else
00093 size=0;
00094 }
00095
00096 xio->buffer=GWEN_Buffer_new(0, size, 0, 1);
00097 xio->own=1;
00098 if (buffer && size>0) {
00099 GWEN_Buffer_AppendBytes(xio->buffer, (const char*) buffer, size);
00100 GWEN_Buffer_Rewind(xio->buffer);
00101 }
00102 GWEN_SyncIo_SetStatus(sio, GWEN_SyncIo_Status_Connected);
00103 return sio;
00104 }
00105
00106
00107
00108 void GWENHYWFAR_CB GWEN_SyncIo_Memory_FreeData(void *bp, void *p) {
00109 GWEN_SYNCIO_MEMORY *xio;
00110
00111 xio=(GWEN_SYNCIO_MEMORY*) p;
00112 if (xio->buffer && xio->own)
00113 GWEN_Buffer_free(xio->buffer);
00114 GWEN_FREE_OBJECT(xio);
00115 }
00116
00117
00118
00119 GWEN_BUFFER *GWEN_SyncIo_Memory_GetBuffer(const GWEN_SYNCIO *sio) {
00120 GWEN_SYNCIO_MEMORY *xio;
00121
00122 assert(sio);
00123 xio=GWEN_INHERIT_GETDATA(GWEN_SYNCIO, GWEN_SYNCIO_MEMORY, sio);
00124 assert(xio);
00125
00126 return xio->buffer;
00127 }
00128
00129
00130
00131 GWEN_BUFFER *GWEN_SyncIo_Memory_TakeBuffer(const GWEN_SYNCIO *sio) {
00132 GWEN_SYNCIO_MEMORY *xio;
00133 GWEN_BUFFER *buf;
00134
00135 assert(sio);
00136 xio=GWEN_INHERIT_GETDATA(GWEN_SYNCIO, GWEN_SYNCIO_MEMORY, sio);
00137 assert(xio);
00138
00139 if (xio->own==0 || xio->buffer==NULL) {
00140 DBG_ERROR(GWEN_LOGDOMAIN, "Can't give away buffer, object does not own it");
00141 return NULL;
00142 }
00143 buf=xio->buffer;
00144 xio->buffer=NULL;
00145 xio->own=0;
00146 return buf;
00147 }
00148
00149
00150
00151 int GWENHYWFAR_CB GWEN_SyncIo_Memory_Read(GWEN_SYNCIO *sio,
00152 uint8_t *buffer,
00153 uint32_t size) {
00154 GWEN_SYNCIO_MEMORY *xio;
00155 uint32_t bytesLeft;
00156
00157 assert(sio);
00158 xio=GWEN_INHERIT_GETDATA(GWEN_SYNCIO, GWEN_SYNCIO_MEMORY, sio);
00159 assert(xio);
00160
00161 if (xio->buffer==NULL) {
00162 DBG_ERROR(GWEN_LOGDOMAIN, "No buffer");
00163 return GWEN_ERROR_INTERNAL;
00164 }
00165
00166 bytesLeft=GWEN_Buffer_GetBytesLeft(xio->buffer);
00167 if (bytesLeft==0) {
00168 DBG_VERBOUS(GWEN_LOGDOMAIN, "EOF met");
00169 return 0;
00170 }
00171
00172 if (size>bytesLeft)
00173 size=bytesLeft;
00174 memmove(buffer, GWEN_Buffer_GetPosPointer(xio->buffer), size);
00175 GWEN_Buffer_IncrementPos(xio->buffer, size);
00176
00177 return size;
00178 }
00179
00180
00181
00182 int GWENHYWFAR_CB GWEN_SyncIo_Memory_Write(GWEN_SYNCIO *sio,
00183 const uint8_t *buffer,
00184 uint32_t size) {
00185 GWEN_SYNCIO_MEMORY *xio;
00186
00187 assert(sio);
00188 xio=GWEN_INHERIT_GETDATA(GWEN_SYNCIO, GWEN_SYNCIO_MEMORY, sio);
00189 assert(xio);
00190
00191 if (xio->buffer==NULL) {
00192 DBG_ERROR(GWEN_LOGDOMAIN, "No socket");
00193 return GWEN_ERROR_INTERNAL;
00194 }
00195
00196 if (size) {
00197 int rv;
00198
00199 rv=GWEN_Buffer_AppendBytes(xio->buffer, (const char*) buffer, size);
00200 if (rv<0) {
00201 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
00202 return rv;
00203 }
00204 }
00205
00206 return size;
00207 }
00208
00209
00210
00211
00212