bool File::OpenData(int openmode) { Close(); srctype = MODE_MYDATA; if(openmode == 0) return false; ResizeDataBuffer(64); mode = openmode; return true; }
bool File::WriteData(const void* d, int size) { if(mode & FILEWRITE) { switch(srctype) { case MODE_MYFILE: case MODE_EXTFILE: return FileWrite(file,d,size); case MODE_MYDATA: //resize if buffer's not big enough if(datapos + size > datasize) { int a=datapos+size,b=datasize*2; ResizeDataBuffer(Max(a,b)); } memcpy(datafile+datapos, d, size); datapos += size; return true; case MODE_EXTDATA: if(datapos + size > datasize) return false; memcpy(datafile+datapos, d, size); datapos += size; return true; case MODE_TCPSOCKET: case MODE_UDPSOCKET: { const char* msg = (const char*)d; int totalsent = 0; while(totalsent < size) { int n = SocketWrite(socket,msg+totalsent,size-totalsent); if(n < 0) { perror("File(socket) SocketWrite"); return false; } if(n == 0) { printf("File(socket): SocketWrite returned %d, what does it mean?\n",n); ThreadSleep(0.001); } totalsent += n; } assert(totalsent == size); return true; } } } return false; }
bool File::WriteData(const void* d, int size) { if(mode & FILEWRITE) { switch(srctype) { case MODE_MYFILE: case MODE_EXTFILE: return FileWrite(file,d,size); case MODE_MYDATA: //resize if buffer's not big enough if(datapos + size > datasize) { int a=datapos+size,b=datasize*2; ResizeDataBuffer(Max(a,b)); } memcpy(datafile+datapos, d, size); datapos += size; return true; case MODE_EXTDATA: if(datapos + size > datasize) return false; memcpy(datafile+datapos, d, size); datapos += size; return true; case MODE_TCPSOCKET: case MODE_UDPSOCKET: { const char* msg = (const char*)d; int totalsent = 0; while(totalsent < size) { int n = write((int)file,msg+totalsent,size-totalsent); if(n <= 0) { return false; } totalsent += n; } assert(totalsent == size); return true; } } } return false; }