示例#1
0
int SendIM::putBody(unsigned char *buf) 
{
	int pos=0;
	// bit 0-3 sender
	pos += EvaUtil::write32(buf+pos, getQQ());
	// bit 4-7 receiver
	pos += EvaUtil::write32(buf+pos, receiver);
	
	//  bit 8-9 qq client version
	pos += EvaUtil::write16(buf+pos, version);
	
	// bit 10-13 sender again
	pos += EvaUtil::write32(buf+pos, getQQ());
	
	// bit 14-17 receiver
	pos += EvaUtil::write32(buf+pos, receiver);
	
	// bit 18-33 file transfer session key
	memcpy( buf+pos, getFileSessionKey(), QQ_KEY_LENGTH);
	pos+=QQ_KEY_LENGTH;
	
	// bit 34-35 contents type ( is it normal text message or file transfer...)
	pos += EvaUtil::write16(buf+pos, contentType);
	
	// sequence number
//	short tmpSeq = htons(sequence);
//	memcpy(buf+pos, &tmpSeq,2);
//	pos+=2;	
	if(m_MsgSequence)
		pos += EvaUtil::write16(buf+pos, m_MsgSequence);
	else
		pos+= EvaUtil::write16(buf+pos, sequence);
		
	// sending time
	pos += EvaUtil::write32(buf+pos, m_SendTime);

	pos += EvaUtil::write16(buf+pos, face);
	
	memset(buf+pos, 0, 3);
	pos+=3;
	
	// font information, set as 1
	buf[pos++] = 0x01;

	if(contentType == QQ_IM_NORMAL_TEXT){
		// note that, for QQ_IM_NORMAL_TEXT the contents should 
		// be 4 bytes(multi-fragment information) more than others
		pos+= putContents(buf+pos);  // put all contents in	
	} else {
		// unknown 4 bytes
		memset(buf + pos, 0, 4);
		pos+=4;

		pos+= putContents(buf+pos);  // put all contents in
	}
	return pos;
} 
示例#2
0
int KeepAlivePacket::putBody(unsigned char *buf) 
{
	char tmp[20];
	sprintf(tmp, "%d", getQQ());
	memcpy(buf, tmp, strlen(tmp));
        return 4; 
}
示例#3
0
int OutPacket::putHead(unsigned char *buf) 
{
	int pos=0;
	if(!isUDP()){
		buf[0]=buf[1]=0;
		pos+=2;
	}
	buf[pos++]=(unsigned char)QQ_PACKET_TAG;
	
	short tmp = htons(version);
	memcpy(buf+pos, &tmp, 2);
	pos+=2; 
	
	tmp = htons(command);
	memcpy(buf+pos, &tmp, 2);
	pos+=2; 

	tmp = htons(sequence);
	memcpy(buf+pos, &tmp, 2);
	pos+=2; 
	
	int id = htonl(getQQ());
	memcpy(buf+pos, &id, 4);
	pos+=4;
		
	return pos;
}