int stream_seekfn(struct iw_context *ctx, struct iw_iodescr *iodescr, iw_int64 offset, int whence) { //FILE *fp = (FILE*)iodescr->fp; //fseek(fp, (long)offset, whence); ByteStream* stream = (ByteStream*)iodescr->fp; stream->seek(whence); return 1; }
void Client::start(){ bool hasHeader = false; Packet pak; ByteStream header; ByteStream* read = &header; pak.mData.reserve(1024); header.reserve(16); header.setDataSize(startHandshake()); bool error = false; while(!error){ if(mSocket->canRead()){ int result = mSocket->read(read->data() + read->tell(), read->size() - read->tell()); if(result == -1){ error = true; break; }else if(result > 0){ read->skip(result); if(read->tell() != read->size()) continue; if(mHandshakeStage != HS_COMPLETE){ read->setDataSize(onReceiveHandshake(read)); read->seek(0); continue; } if(!hasHeader){ uint32 hSize = Packet::getHeaderSize(*read); if(read->size() < hSize){ read->setDataSize(hSize); continue; } read->seek(0); pak.deserialise(*read); hasHeader = true; read = &pak.mData; read->seek(0); read->setDataSize(pak.mHeader.mBodySize + pak.mHeader.mBodySize / mChunkSize); }else{ read->dechunk(mChunkSize); read->seek(0); onReceivePacket(&pak); hasHeader = false; read = &header; read->seek(0); read->setDataSize(1); } } if(error) break; } if(mSocket->canWrite() && mSendData.size()){ mSendLock->lock(); while(mSendData.size()){ ByteStream* stream = mSendData.front(); mSocket->write(stream->data(), stream->size()); delete stream; mSendData.pop(); } mSendLock->unlock(); } }; mSocket->getLastError(); disconnect(); }
static toff_t seekproc(thandle_t h, toff_t offset, int mode) { ByteStream *bs = (ByteStream*)h; bs->seek((long)offset, mode); return (toff_t)bs->tell(); }