char * clsZlibUtility::CreateZPipe(const char *sInData, const size_t &szInDataSize, uint32_t &ui32OutDataLen) { // prepare Zbuffer if(szZbufferSize < szInDataSize + 128) { size_t szOldZbufferSize = szZbufferSize; szZbufferSize = Allign128K(szInDataSize + 128); char * pOldBuf = pZbuffer; #ifdef _WIN32 pZbuffer = (char *)HeapReAlloc(clsServerManager::hPtokaXHeap, HEAP_NO_SERIALIZE, (void *)pOldBuf, szZbufferSize); #else pZbuffer = (char *)realloc(pOldBuf, szZbufferSize); #endif if(pZbuffer == NULL) { pZbuffer = pOldBuf; szZbufferSize = szOldZbufferSize; ui32OutDataLen = 0; AppendDebugLogFormat("[MEM] Cannot reallocate %" PRIu64 " bytes for pZbuffer in clsZlibUtility::CreateZPipe\n", (uint64_t)szZbufferSize); return pZbuffer; } } z_stream stream; // init zlib struct memset(&stream, 0 , sizeof(stream)); stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.data_type = Z_TEXT; deflateInit(&stream, Z_BEST_COMPRESSION); stream.next_in = (Bytef*)sInData; stream.avail_in = (uInt)szInDataSize; stream.next_out = (Bytef*)pZbuffer+5; stream.avail_out = (uInt)(szZbufferSize-5); // compress if(deflate(&stream, Z_FINISH) != Z_STREAM_END) { deflateEnd(&stream); AppendDebugLog("%s - [ERR] deflate error\n"); ui32OutDataLen = 0; return pZbuffer; } ui32OutDataLen = stream.total_out+5; // cleanup zlib deflateEnd(&stream); if(ui32OutDataLen >= szInDataSize) { ui32OutDataLen = 0; return pZbuffer; } return pZbuffer; }
void clsGlobalDataQueue::ProcessSingleItems(User * u) const { size_t szLen = 0; SingleDataItem * pNext = pSingleItems; while(pNext != NULL) { SingleDataItem * pCur = pNext; pNext = pCur->pNext; if(pCur->pFromUser != u) { switch(pCur->ui8Type) { case SI_PM2ALL: { // send PM to ALL size_t szWanted = szLen+pCur->szDataLen+u->ui8NickLen+13; if(clsServerManager::szGlobalBufferSize < szWanted) { if(CheckAndResizeGlobalBuffer(szWanted) == false) { AppendDebugLog("%s - [MEM] Cannot reallocate %" PRIu64 " bytes in clsGlobalDataQueue::ProcessSingleItems\n", (uint64_t)Allign128K(szWanted)); break; } } int iret = sprintf(clsServerManager::sGlobalBuffer+szLen, "$To: %s From: ", u->sNick); szLen += iret; CheckSprintf1(iret, szLen, clsServerManager::szGlobalBufferSize, "clsGlobalDataQueue::ProcessSingleItems1"); memcpy(clsServerManager::sGlobalBuffer+szLen, pCur->sData, pCur->szDataLen); szLen += pCur->szDataLen; clsServerManager::sGlobalBuffer[szLen] = '\0'; break; } case SI_PM2OPS: { // send PM only to operators if(((u->ui32BoolBits & User::BIT_OPERATOR) == User::BIT_OPERATOR) == true) { size_t szWanted = szLen+pCur->szDataLen+u->ui8NickLen+13; if(clsServerManager::szGlobalBufferSize < szWanted) { if(CheckAndResizeGlobalBuffer(szWanted) == false) { AppendDebugLog("%s - [MEM] Cannot reallocate %" PRIu64 " bytes in clsGlobalDataQueue::ProcessSingleItems1\n", (uint64_t)Allign128K(szWanted)); break; } } int iret = sprintf(clsServerManager::sGlobalBuffer+szLen, "$To: %s From: ", u->sNick); szLen += iret; CheckSprintf1(iret, szLen, clsServerManager::szGlobalBufferSize, "clsGlobalDataQueue::ProcessSingleItems2"); memcpy(clsServerManager::sGlobalBuffer+szLen, pCur->sData, pCur->szDataLen); szLen += pCur->szDataLen; clsServerManager::sGlobalBuffer[szLen] = '\0'; } break; } case SI_OPCHAT: { // send OpChat only to allowed users... if(clsProfileManager::mPtr->IsAllowed(u, clsProfileManager::ALLOWEDOPCHAT) == true) { size_t szWanted = szLen+pCur->szDataLen+u->ui8NickLen+13; if(clsServerManager::szGlobalBufferSize < szWanted) { if(CheckAndResizeGlobalBuffer(szWanted) == false) { AppendDebugLog("%s - [MEM] Cannot reallocate %" PRIu64 " bytes in clsGlobalDataQueue::ProcessSingleItems2\n", (uint64_t)Allign128K(szWanted)); break; } } int iret = sprintf(clsServerManager::sGlobalBuffer+szLen, "$To: %s From: ", u->sNick); szLen += iret; CheckSprintf1(iret, szLen, clsServerManager::szGlobalBufferSize, "clsGlobalDataQueue::ProcessSingleItems3"); memcpy(clsServerManager::sGlobalBuffer+szLen, pCur->sData, pCur->szDataLen); szLen += pCur->szDataLen; clsServerManager::sGlobalBuffer[szLen] = '\0'; } break; } case SI_TOPROFILE: { // send data only to given profile... if(u->iProfile == pCur->i32Profile) { size_t szWanted = szLen+pCur->szDataLen; if(clsServerManager::szGlobalBufferSize < szWanted) { if(CheckAndResizeGlobalBuffer(szWanted) == false) { AppendDebugLog("%s - [MEM] Cannot reallocate %" PRIu64 " bytes in clsGlobalDataQueue::ProcessSingleItems3\n", (uint64_t)Allign128K(szWanted)); break; } } memcpy(clsServerManager::sGlobalBuffer+szLen, pCur->sData, pCur->szDataLen); szLen += pCur->szDataLen; clsServerManager::sGlobalBuffer[szLen] = '\0'; } break; } case SI_PM2PROFILE: { // send pm only to given profile... if(u->iProfile == pCur->i32Profile) { size_t szWanted = szLen+pCur->szDataLen+u->ui8NickLen+13; if(clsServerManager::szGlobalBufferSize < szWanted) { if(CheckAndResizeGlobalBuffer(szWanted) == false) { AppendDebugLog("%s - [MEM] Cannot reallocate %" PRIu64 " bytes in clsGlobalDataQueue::ProcessSingleItems4\n", (uint64_t)Allign128K(szWanted)); break; } } int iret = sprintf(clsServerManager::sGlobalBuffer+szLen, "$To: %s From: ", u->sNick); szLen += iret; CheckSprintf1(iret, szLen, clsServerManager::szGlobalBufferSize, "clsGlobalDataQueue::ProcessSingleItems4"); memcpy(clsServerManager::sGlobalBuffer+szLen, pCur->sData, pCur->szDataLen); szLen += pCur->szDataLen; clsServerManager::sGlobalBuffer[szLen] = '\0'; } break; } default: break; } } } if(szLen != 0) { u->SendCharDelayed(clsServerManager::sGlobalBuffer, szLen); } ReduceGlobalBuffer(); }