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; }
int KeepAlivePacket::putBody(unsigned char *buf) { char tmp[20]; sprintf(tmp, "%d", getQQ()); memcpy(buf, tmp, strlen(tmp)); return 4; }
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; }