コード例 #1
0
ファイル: networkcoding.cpp プロジェクト: uclanrl/dt-icansim
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);
	}

}
コード例 #2
0
ファイル: buffer_worker.cpp プロジェクト: neophob/lwip
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;
}
コード例 #3
0
std::size_t HexBinaryEncoding::decode(const ByteBuffer& buffer,
                                      ByteBuffer& decodedBuffer)
{
    decodedBuffer.clear();
    ByteBufferInputStream is(buffer);
    Poco::HexBinaryDecoder _decoder(is);
    return ByteBufferUtils::copyStreamToBuffer(_decoder, decodedBuffer);
}