int DetailWorker::serial(net_head_t* head, char* message, char zip) { head->size = 0; uint32_t nBufSize = _message.ByteSize(); do { if(zip == 'Z') { char szBuf[nBufSize + 1]; int ret = _message.SerializeToArray(szBuf, nBufSize); if(ret == 0) { break; } uLong nComprSize = compressBound(nBufSize) + 1; if(nComprSize >= DEFAULT_MESSAGE_SIZE - sizeof(net_head_t)) { break; } ret = zcompress((Bytef *)(message+sizeof(net_head_t)), &nComprSize, (Bytef *)szBuf, nBufSize); if(ret != 0) { break; } head->cmpr = 'Z'; head->size = nComprSize; } else { if(nBufSize >= DEFAULT_MESSAGE_SIZE - sizeof(net_head_t)) { break; } int ret = _message.SerializeToArray(message+sizeof(net_head_t), nBufSize); if(ret == 0) { break; } head->cmpr = 'N'; head->size = nBufSize; } } while(0); *(net_head_t*)message = *head; head->size += sizeof(net_head_t); return head->size; }
int process_keda_one_protocol(char **pOneProto, u32 *len_one_proto) { puts("----------- ONE PROTOCOL ---------------"); t_disbuf(*pOneProto, *len_one_proto); puts("-- -- -- -- -- -- -- -- -- -- -- -- -- -- --"); //const static char FLG_COMP[] = "\x02\x23"; u16 inet_len_msg_compress = 0; //u16 host_len_msg_compress = 0; u16 len_msg_uncompress = 0; unsigned long host_len_msg_compress_l = 0; unsigned long len_msg_uncompress_l = 0; unsigned char *pUncompress = NULL; unsigned char *ptr = NULL; //puts("process_keda_one_protocol: 1"); //if (memcmp(*pOneProto + 18, FLG_COMP, sizeof(FLG_COMP)-1) != 0) //return 1; //puts("process_keda_one_protocol: 2"); memcpy(&inet_len_msg_compress, *pOneProto + OFFSET_LEN_MSG, 2); host_len_msg_compress_l = ntohs(inet_len_msg_compress) - 4; //puts("process_keda_one_protocol: 3"); //inet_len_msg_compress = htons(ntohs(inet_len_msg_compress) - 4); //len_msg_compress_l = ntohs(inet_len_msg_compress) - 4; memcpy(&len_msg_uncompress, *pOneProto + 41, 2); len_msg_uncompress_l = len_msg_uncompress; //printf("len_msg_uncompress:%d\n", len_msg_uncompress); //puts("process_keda_one_protocol: 4"); if (oss_malloc(&pUncompress, len_msg_uncompress) < 0) { logerr_out("malloc uncompress memory failed!"); return -1; } //puts("process_keda_one_protocol: 5"); ptr = (unsigned char*)(*pOneProto + LEN_PROTO_HEAD + 4); //puts("--------- before uncompress -----------"); //t_disbuf(ptr, len_msg_compress_l); if (zdecompress(ptr,host_len_msg_compress_l, pUncompress, &len_msg_uncompress_l) < 0) { oss_free(&pUncompress); puts("-------------------------------------------------"); t_disbuf(ptr, host_len_msg_compress_l); logerr_out("uncompress failed!"); return 1; } //puts("process_keda_one_protocol: 6"); //printf("uncompress len:%ld\n", len_msg_uncompress_l); //puts("-------- uncompress ----------------------------------------"); t_disbuf(pUncompress, len_msg_uncompress_l); //if (process_keda_uncompress(put, &pUncompress, &len_msg_uncompress) < 0) //{ //oss_free(&pUncompress); //logerr_out("process keda uncompress failed!"); //return -1; //} //puts("process_keda_one_protocol: 7"); // ReCompress unsigned char *pNewCompress = NULL; unsigned long len_new_compress = len_msg_uncompress + 128; // sometimes compress data is larger than that uncompress. if (oss_malloc(&pNewCompress, len_new_compress) < 0) { logerr_fmt("malloc failed! size:%lu", len_new_compress); return -1; } if (zcompress(pUncompress,len_msg_uncompress_l, pNewCompress,&len_new_compress) < 0) { printf("pUn:%p, len_un:%lu, pNew:%p, len_new:%lu\n", pUncompress, len_msg_uncompress_l, pNewCompress,len_new_compress); oss_free(&pUncompress); oss_free(&pNewCompress); logerr_out("compress failed!"); exit(-1); return -1; } //puts("process_keda_one_protocol: 8"); //puts("------------ new compress ----------------------------"); //t_disbuf(pNewCompress, len_new_compress); // update data if ((ptr = (unsigned char*)realloc(*pOneProto, LEN_PROTO_HEAD + 4 + len_new_compress)) == NULL) { oss_free(&pUncompress); oss_free(&pNewCompress); logerr_out("realloc failed!"); return -1; } //puts("process_keda_one_protocol: 9"); *pOneProto= (char*)ptr; *len_one_proto = LEN_PROTO_HEAD + 4 + len_new_compress; memcpy(*pOneProto + LEN_PROTO_HEAD + 4, pNewCompress, len_new_compress); len_new_compress += 4; u16 inet_len_new_compress = htons(len_new_compress); memcpy(*pOneProto + 20, &inet_len_new_compress, 2); //puts("process_keda_one_protocol: 10"); //puts("-------- new data -----------"); //t_disbuf((unsigned char*)*ut_buf, *pack_len); oss_free(&pUncompress); oss_free(&pNewCompress); //puts("process_keda_one_protocol: 11"); return 1; }