IpcMessageObjSize ExMsgFragment::packObjIntoMessage(IpcMessageBufferPtr buffer) { // See description of packed format in packedLength() method IpcMessageBufferPtr start = buffer; // Pack the base class packBaseClassIntoMessage(buffer); alignBufferForNextObj(buffer); // Pack the fixed length fields str_cpy_all(buffer, (const char *) &f_, sizeof(f_)); buffer += sizeof(f_); alignBufferForNextObj(buffer); // Pack the query ID if (f_.queryId_ != NULL) { str_cpy_all(buffer, f_.queryId_, f_.queryIdLen_); buffer += f_.queryIdLen_; alignBufferForNextObj(buffer); } // Pack the user name if (f_.userName_ != NULL) { str_cpy_all(buffer, f_.userName_, f_.userNameLen_); buffer += f_.userNameLen_; alignBufferForNextObj(buffer); } // Pack the fragment itself if (f_.compressedLength_ > 0 && f_.compressedLength_ < f_.fragmentLength_) { size_t cmprSize = str_compress(buffer,fragment_,f_.fragmentLength_); ex_assert(cmprSize == f_.compressedLength_, "Error during compress a fragment for download"); buffer += f_.compressedLength_; } else { #pragma nowarn(1506) // warning elimination str_cpy_all(buffer,fragment_,f_.fragmentLength_); #pragma warn(1506) // warning elimination buffer += f_.fragmentLength_; } alignBufferForNextObj(buffer); // Pack the fragment key (is an IpcMessageObj itself) buffer += key_.packDependentObjIntoMessage(buffer); return (IpcMessageObjSize) (buffer - start); }
int main() { std::cout << str_compress("aaaaabbbc") << std::endl; std::cout << str_compress("aaabc") << std::endl; }