void NetworkCoding::receiveCodedBlock(NetworkCoding_t networkcoding) { printf("received coded block=%s\n",networkcoding.getName().c_str()); m_stat.totalBlockReceived++; std::string parentObjectName = networkcoding.parentObjectName; printf("unreject=%s\n",parentObjectName.c_str()); this->rejectedobject[parentObjectName] = false; const bool is_already_completed = this->networkcodingobjectsreceived.find(parentObjectName) != this->networkcodingobjectsreceived.end(); if(is_already_completed) { //do nothing return; } trackCodedBlock(parentObjectName,networkcoding); //check if we already started decoding for this object if( this->decoder.find(parentObjectName) == this->decoder.end() ) { //create decoder std::string randomFileName = "out-"+gen_random_string(10); size_t blockSize= OBJECT_BLOCK_SIZE; long fileSize = networkcoding.parentObjectFileSize; decoderptr _decoder( new codetorrentdecoder(fileSize,randomFileName.c_str(),blockSize)); this->decoder[parentObjectName] = _decoder; } std::string blockStorageId = networkcoding.getName(); printf("calling getfile\n"); codedblockptr_t block = getFile(networkcoding.getBlockIdOnly()); printf("after getfile\n"); //TODO read should be threadsafe //boost::lock_guard<boost::mutex> guard(codedblockstoragemutex); //codedblockptr block = codedblockstorage[blockStorageId]; decoderptr localDecoder = this->decoder[parentObjectName]; int gen = 0; bool isHelpful = localDecoder->store_block(gen,block->coeffs,block->sums); printf("isHelpful=%d coded block=%s isMixed=%d targetnodeid=%d\n", isHelpful,networkcoding.getName().c_str(),networkcoding.isMixed, networkcoding.targetNodeId+1); bool isDone = localDecoder->decode(); if(isDone) { m_stat.totalObjectReconstructed++; //this->RegisterObject(networkcoding.parentObjectName); this->networkcodingobjectsreceived.insert(networkcoding.parentObjectName); //clean up once constructed no longer need decoder this->decoder.erase(parentObjectName); this->cleanUpBlocksInDataStore(parentObjectName); this->parenttoblockidsmapping.erase(parentObjectName); SetIcanEvent(m_node, 0, MSG_ROUTING_ICAN_DTNMANAGER_NETWORKCODINGOBJECTCONSTRUCTED, sizeof(networkcoding), &networkcoding); } }
void DecodeBufferWorker::Execute () { CImg<unsigned char> * img = NULL; string err; char * metadata = NULL; err = _decoder(_buffer, _buffsize, &img, &metadata); if (img == NULL) { SetErrorMessage(err.c_str()); return; } _trans = img->spectrum() == 2 || img->spectrum() == 4; err = toRGBA(&img); if (err != "") { if (img) delete img; SetErrorMessage(err.c_str()); return; } img->_is_shared = true; // don't free image data. need it for callback. _pixbuf = img->data(); _width = img->width(); _height = img->height(); _channels = 4; _metadata = metadata; delete img; return; }
std::size_t HexBinaryEncoding::decode(const ByteBuffer& buffer, ByteBuffer& decodedBuffer) { decodedBuffer.clear(); ByteBufferInputStream is(buffer); Poco::HexBinaryDecoder _decoder(is); return ByteBufferUtils::copyStreamToBuffer(_decoder, decodedBuffer); }