PacketHeader::PacketHeader() { auto session = GetActiveSession(); if (!session) { memset(this, 0, sizeof(*this)); return; } typedef void(*InitPacketPtr)(int addressIndex, PacketHeader *packet); auto InitPacket = reinterpret_cast<InitPacketPtr>(0x482040); InitPacket(session->AddressIndex, this); }
static INT_PTR Service_AddEvent(WPARAM wParam, LPARAM lParam) { GCEVENT *gce = (GCEVENT*)lParam, save_gce; GCDEST *gcd = NULL, save_gcd; TCHAR* pWnd = NULL; char* pMod = NULL; BOOL bIsHighlighted = FALSE; BOOL bRemoveFlag = FALSE; int iRetVal = GC_EVENT_ERROR; if ( gce == NULL ) return GC_EVENT_ERROR; gcd = gce->pDest; if ( gcd == NULL ) return GC_EVENT_ERROR; if ( gce->cbSize != SIZEOF_STRUCT_GCEVENT_V1 && gce->cbSize != SIZEOF_STRUCT_GCEVENT_V2 ) return GC_EVENT_WRONGVER; if ( !IsEventSupported( gcd->iType ) ) return GC_EVENT_ERROR; EnterCriticalSection(&cs); #if defined( _UNICODE ) if ( !( gce->dwFlags & GC_UNICODE )) { save_gce = *gce; save_gcd = *gce->pDest; gce->pDest->ptszID = a2tf( gce->pDest->ptszID, gce->dwFlags ); gce->ptszUID = a2tf( gce->ptszUID, gce->dwFlags ); gce->ptszNick = a2tf( gce->ptszNick, gce->dwFlags ); gce->ptszStatus = a2tf( gce->ptszStatus, gce->dwFlags ); gce->ptszText = a2tf( gce->ptszText, gce->dwFlags ); gce->ptszUserInfo = a2tf( gce->ptszUserInfo, gce->dwFlags ); } #endif // Do different things according to type of event switch(gcd->iType) { case GC_EVENT_ADDGROUP: { STATUSINFO* si = SM_AddStatus( gce->pDest->ptszID, gce->pDest->pszModule, gce->ptszStatus); if ( si && gce->dwItemData) si->hIcon = CopyIcon((HICON)gce->dwItemData); } iRetVal = 0; goto LBL_Exit; case GC_EVENT_CHUID: case GC_EVENT_CHANGESESSIONAME: case GC_EVENT_SETITEMDATA: case GC_EVENT_GETITEMDATA: case GC_EVENT_CONTROL: case GC_EVENT_SETSBTEXT: case GC_EVENT_ACK: case GC_EVENT_SENDMESSAGE : case GC_EVENT_SETSTATUSEX : iRetVal = DoControl(gce, wParam); goto LBL_Exit; case GC_EVENT_SETCONTACTSTATUS: iRetVal = SM_SetContactStatus( gce->pDest->ptszID, gce->pDest->pszModule, gce->ptszUID, (WORD)gce->dwItemData ); goto LBL_Exit; case GC_EVENT_TOPIC: { SESSION_INFO* si = SM_FindSession(gce->pDest->ptszID, gce->pDest->pszModule); if ( si ) { if ( gce->pszText ) { replaceStr( &si->ptszTopic, gce->ptszText); DBWriteContactSettingTString( si->windowData.hContact, si->pszModule , "Topic", RemoveFormatting( si->ptszTopic )); if ( DBGetContactSettingByte( NULL, "Chat", "TopicOnClist", 0 )) DBWriteContactSettingTString( si->windowData.hContact, "CList" , "StatusMsg", RemoveFormatting( si->ptszTopic )); } } break; } case GC_EVENT_ADDSTATUS: SM_GiveStatus( gce->pDest->ptszID, gce->pDest->pszModule, gce->ptszUID, gce->ptszStatus ); break; case GC_EVENT_REMOVESTATUS: SM_TakeStatus( gce->pDest->ptszID, gce->pDest->pszModule, gce->ptszUID, gce->ptszStatus); break; case GC_EVENT_MESSAGE: case GC_EVENT_ACTION: if ( !gce->bIsMe && gce->pDest->pszID && gce->pszText ) { SESSION_INFO* si = SM_FindSession( gce->pDest->ptszID, gce->pDest->pszModule ); if ( si ) if ( IsHighlighted( si, gce->ptszText )) bIsHighlighted = TRUE; } break; case GC_EVENT_NICK: SM_ChangeNick( gce->pDest->ptszID, gce->pDest->pszModule, gce); break; case GC_EVENT_JOIN: AddUser(gce); break; case GC_EVENT_PART: case GC_EVENT_QUIT: case GC_EVENT_KICK: bRemoveFlag = TRUE; break; } // Decide which window (log) should have the event if ( gcd->pszID ) { pWnd = gcd->ptszID; pMod = gcd->pszModule; } else if ( gcd->iType == GC_EVENT_NOTICE || gcd->iType == GC_EVENT_INFORMATION ) { SESSION_INFO* si = GetActiveSession(); if ( si && !lstrcmpA( si->pszModule, gcd->pszModule )) { pWnd = si->ptszID; pMod = si->pszModule; } else { iRetVal = 0; goto LBL_Exit; } } else { // Send the event to all windows with a user pszUID. Used for broadcasting QUIT etc SM_AddEventToAllMatchingUID( gce ); if ( !bRemoveFlag ) { iRetVal = 0; goto LBL_Exit; } } // add to log if ( pWnd ) { SESSION_INFO* si = SM_FindSession(pWnd, pMod); // fix for IRC's old stuyle mode notifications. Should not affect any other protocol if ((gce->pDest->iType == GC_EVENT_ADDSTATUS || gce->pDest->iType == GC_EVENT_REMOVESTATUS) && !( gce->dwFlags & GCEF_ADDTOLOG )) { iRetVal = 0; goto LBL_Exit; } if (gce && gce->pDest->iType == GC_EVENT_JOIN && gce->time == 0) { iRetVal = 0; goto LBL_Exit; } if (si && (si->bInitDone || gce->pDest->iType == GC_EVENT_TOPIC || (gce->pDest->iType == GC_EVENT_JOIN && gce->bIsMe))) { if (SM_AddEvent(pWnd, pMod, gce, bIsHighlighted) && si->hWnd) { SendMessage(si->hWnd, GC_ADDLOG, 0, 0); } else if (si->hWnd) { SendMessage(si->hWnd, GC_REDRAWLOG2, 0, 0); } DoSoundsFlashPopupTrayStuff(si, gce, bIsHighlighted, 0); if ((gce->dwFlags & GCEF_ADDTOLOG) && g_Settings.LoggingEnabled) LogToFile(si, gce); } if ( !bRemoveFlag ) { iRetVal = 0; goto LBL_Exit; } } if ( bRemoveFlag ) iRetVal = ( SM_RemoveUser( gce->pDest->ptszID, gce->pDest->pszModule, gce->ptszUID ) == 0 ) ? 1 : 0; LBL_Exit: LeaveCriticalSection(&cs); #if defined( _UNICODE ) if ( !( gce->dwFlags & GC_UNICODE )) { mir_free((void*)gce->ptszText ); mir_free((void*)gce->ptszNick ); mir_free((void*)gce->ptszUID ); mir_free((void*)gce->ptszStatus ); mir_free((void*)gce->ptszUserInfo ); mir_free((void*)gce->pDest->ptszID ); *gce = save_gce; *gce->pDest = save_gcd; } #endif return iRetVal; }