void LSBSoundCoder::SetMessage( Container* _container, const std::string& _message, 
                                const Key* _key )
{
    // Must be BMP container
    if ( _container->IsWaveContainer() )
    {
        // Get container
        const WAVContainer* container = 
            static_cast<const WAVContainer*>(_container);

        // Setup Wave container
        SetupContainer(container);

        //Hide message length first
        SetMessageLength( _message.length() );

        // Hide message text
        SetMessageText(_message);
    }
}
// -----------------------------------------------------------------------------
// CNATFWUNSAFMessage::EncodeL
// -----------------------------------------------------------------------------
//
EXPORT_C CBufBase* CNATFWUNSAFMessage::EncodeL() const
{
    CBufBase* msg = EncodeMessageHeaderLC();

    for (TInt i = 0; i < iAttributes.Count(); ++i)
    {
        if (iAttributes[i]->Type() != CNATFWUNSAFAttribute::EMessageIntegrity &&
                iAttributes[i]->Type() != CNATFWUNSAFAttribute::EFingerprint)
        {
            HBufC8* attribute = iAttributes[i]->EncodeL();
            CleanupStack::PushL(attribute);
            msg->InsertL(msg->Size(), *attribute);
            CleanupStack::PopAndDestroy(attribute);
        }
    }
    CleanupStack::Pop(msg);
    msg->Compress();
    SetMessageLength(*msg);

    return msg;
}
// -----------------------------------------------------------------------------
// CNATFWUNSAFMessage::SetMessageLength
// UNSAF message length does not include the NATFWUNSAF header
// -----------------------------------------------------------------------------
//
void CNATFWUNSAFMessage::SetMessageLength(CBufBase& aNATFWUNSAFMessage)
{
    SetMessageLength(aNATFWUNSAFMessage,
                     aNATFWUNSAFMessage.Size() - EHeaderSize);
}
Exemple #4
0
DWORD RTMPChunkOutputStream::GetNextChunk(BYTE *data,DWORD size,DWORD maxChunkSize)
{
	//lock now
	pthread_mutex_lock(&mutex);
	//Message basic header
	RTMPChunkBasicHeader header;
	//Set chunk stream id
	header.SetStreamId(chunkStreamId);
	//Chunk header
	RTMPObject* chunkHeader = NULL;
	//Extended timestamp
	RTMPExtendedTimestamp extts;
	//Use extended timestamp flag
	bool useExtTimestamp = false;

	//If we are not processing an object
	if (!message)
	{
		//Check we hve still data
		if (messages.empty())
		{
			//Unlock
			pthread_mutex_unlock(&mutex);
			//No more data to send here
			return 0;
		}
		//Get the next message to send
		message = messages.front();
		//Remove from queue
		messages.pop_front();
		//Get message values
		RTMPMessage::Type    msgType	= message->GetType();
		DWORD   msgStreamId 		= message->GetStreamId();
		DWORD   msgLength 		= message->GetLength();
		DWORD   msgTimestamp 		= message->GetTimestamp();
		DWORD	msgTimestampDelta 	= msgTimestamp-timestamp;
		//Start sending 
		pos = 0;

		//Allocate data for serialized message
		msgBuffer = (BYTE*)malloc(msgLength);
		//Serialize it
		message->Serialize(msgBuffer,msgLength);

		//Select wich header
		if (!msgStreamId || msgStreamId!=streamId || msgTimestamp<timestamp)
		{
			//Create chunk header type 0 (last check is for backward time on Seek)
			RTMPChunkType0* type0 = new RTMPChunkType0();
			//Set header type
			header.SetFmt(0);
			//Check timestamp
			if (msgTimestamp>=0xFFFFFF)
			{
				//Set flag
				useExtTimestamp = true;
				//Use extended header
				type0->SetTimestamp(0xFFFFFF);
				//Set it
				extts.SetTimestamp(msgTimestamp);

			} else {
				//Set timestamp
				type0->SetTimestamp(msgTimestamp);
			}
			//Set data in chunk header
			type0->SetMessageLength(msgLength);
			type0->SetMessageTypeId(msgType);
			type0->SetMessageStreamId(msgStreamId);
			//Not delta available for next packet
			msgTimestampDelta = 0;
			//Store object
			chunkHeader = type0;
		} else if (msgLength!=length || msgType!=type) {
			//Create chunk header type 1
			RTMPChunkType1* type1 = new RTMPChunkType1();
			//Set header type
			header.SetFmt(1);
			//Set data in chunk header
			type1->SetTimestampDelta(msgTimestampDelta);
			type1->SetMessageLength(msgLength);
			type1->SetMessageTypeId(msgType);
			//Store object
			chunkHeader = type1;
		} else if (msgTimestampDelta!=timestampDelta) {
			//Create chunk header type 1
			RTMPChunkType2* type2 = new RTMPChunkType2();
			//Set header type
			header.SetFmt(2);
			//Set data in chunk header
			type2->SetTimestampDelta(msgTimestampDelta);
			//Store object
			chunkHeader = type2;
		} else {
			//Set header type 3 as it shares all data with previous
			header.SetFmt(3);
			//Store object
			chunkHeader = NULL;
		}
		//And update the stream values with latest message values
		SetTimestamp(msgTimestamp);
		SetTimestampDelta(msgTimestampDelta);
		SetMessageLength(msgLength);
		SetMessageTypeId(msgType);
		SetMessageStreamId(msgStreamId);
	} else {
		//Set header type 3 as it shares all data with previous
		header.SetFmt(3);
		//Store object
		chunkHeader = NULL;
	}

	//Serialize header
	DWORD headersLen = header.Serialize(data,size);
	//Check if we need chunk header
	if (chunkHeader)
		//Serialize chunk header
		headersLen += chunkHeader->Serialize(data+headersLen,size-headersLen);
	//Check if need to use extended timestamp
	if (useExtTimestamp)
		//Serialize extened header
		headersLen += extts.Serialize(data+headersLen,size-headersLen);

	//Size of the msg data of the chunk
	DWORD payloadLen = maxChunkSize;
	//If we have more than needed
	if (payloadLen>length-pos)
		//Just copy until the oend of the object
		payloadLen = length-pos;
	
	//Copy
	memcpy(data+headersLen,msgBuffer+pos,payloadLen);

	//Increase sent data from msg
	pos += payloadLen;
	//Check if we have finished with this message	
	if (pos==length)
	{
		//Delete buffer
		free(msgBuffer);
		//Null
		msgBuffer = NULL;
		//Delete message
		delete(message);
		//Next one
		message = NULL;
	}

	//Check
	if (chunkHeader)
		//Delete it
		delete (chunkHeader);

	//Unlock
	pthread_mutex_unlock(&mutex);

	//Return copied data
	return headersLen+payloadLen;	
}