static int AwayMsgHook(WPARAM wParam, LPARAM lParam, LPARAM pObj) { PLUGINDATA *pdp = (PLUGINDATA*)pObj; if (pdp == NULL) return 0; ACKDATA *ack = (ACKDATA *)lParam; if (ack->type != ACKTYPE_AWAYMSG || ack->hProcess != pdp->hAwayMsgProcess) return 0; //The first thing we go is removing the hook from the chain to avoid useless calls. UnhookEvent(pdp->hAwayMsgHook); pdp->hAwayMsgHook = NULL; if (ack->result != ACKRESULT_SUCCESS) return 0; MCONTACT hContact = PUGetContact(pdp->hWnd); ptrT pstzLast( db_get_tsa(hContact, MODULE, "LastPopupText")); TCHAR *tszStatus = (TCHAR*)ack->lParam; if (tszStatus == NULL || *tszStatus == 0) return 0; TCHAR stzText[1024]; if (pstzLast) mir_sntprintf(stzText, SIZEOF(stzText), _T("%s\n%s"), pstzLast, tszStatus); else _tcsncpy(stzText, tszStatus, SIZEOF(stzText)); SendMessage(pdp->hWnd, WM_SETREDRAW, FALSE, 0); PUChangeTextT(pdp->hWnd, stzText); SendMessage(pdp->hWnd, WM_SETREDRAW, TRUE, 0); return 0; }
void ReceivedAwayMessage(HWND hWnd, LPARAM lParam, PLUGINDATA * pdp) { HANDLE hContact = PUGetContact(hWnd); ACKDATA *ack = (ACKDATA *)lParam; if (ack->type != ACKTYPE_AWAYMSG) return; if (ack->hProcess == pdp->hAwayMsgProcess) //It's my hProcess, so it's ok to continue. { //The first thing we go is removing the hook from the chain to avoid useless calls. UnhookEvent(pdp->hAwayMsgHook); pdp->hAwayMsgHook = NULL; if (ack->result != ACKRESULT_SUCCESS) return; DBVARIANT dbv; TCHAR stzText[MAX_SECONDLINE]; if (!DBGetContactSettingTString(hContact, MODULE, "LastPopupText", &dbv)) { _tcscpy(stzText, dbv.ptszVal); DBFreeVariant(&dbv); if (!DBGetContactSettingTString(ack->hContact, "CList", "StatusMsg", &dbv)) { if (dbv.ptszVal && dbv.ptszVal[0]) { if (stzText[0]) _tcscat(stzText, _T("\n")); _tcscat(stzText, dbv.ptszVal); SendMessage(hWnd, WM_SETREDRAW, FALSE, 0); PUChangeTextT(hWnd, stzText); SendMessage(hWnd, WM_SETREDRAW, TRUE, 0); } DBFreeVariant(&dbv); } } } }
int PopupUpdate(MCONTACT hContact, MEVENT hEvent) { // merge only message popups PLUGIN_DATA *pdata = (PLUGIN_DATA*)PopupList[NumberPopupData(hContact, EVENTTYPE_MESSAGE)]; if (hEvent) { pdata->countEvent++; pdata->lastEventData->next = (EVENT_DATA_EX *)mir_alloc(sizeof(EVENT_DATA_EX)); pdata->lastEventData->next->prev = pdata->lastEventData; pdata->lastEventData = pdata->lastEventData->next; pdata->lastEventData->hEvent = hEvent; pdata->lastEventData->number = pdata->lastEventData->prev->number + 1; pdata->lastEventData->next = NULL; if (!pdata->pluginOptions->bShowON && pdata->countEvent > pdata->pluginOptions->iNumberMsg && pdata->pluginOptions->iNumberMsg) pdata->firstShowEventData = pdata->firstShowEventData->next; //re-init timer delay KillTimer(pdata->hWnd, TIMER_TO_ACTION); SetTimer(pdata->hWnd, TIMER_TO_ACTION, pdata->iSeconds * 1000, NULL); } TCHAR lpzText[MAX_SECONDLINE*2] = _T("\0\0"); if (pdata->pluginOptions->bShowHeaders) mir_sntprintf(lpzText, TranslateT("[b]Number of new message(s): %d[/b]\n"), pdata->countEvent); int doReverse = pdata->pluginOptions->bShowON; if ((pdata->firstShowEventData != pdata->firstEventData && doReverse) || (pdata->firstShowEventData != pdata->lastEventData && !doReverse)) mir_sntprintf(lpzText, _T("%s...\n"), lpzText); //take the active event as starting one EVENT_DATA_EX *eventData = pdata->firstShowEventData; int iEvent = 0; while (true) { if (iEvent) eventData = (doReverse) ? eventData->next : eventData->prev; iEvent++; //get DBEVENTINFO with pBlob if preview is needed (when is test then is off) DBEVENTINFO dbe = {0}; dbe.cbSize = sizeof(dbe); dbe.pBlob = NULL; dbe.cbBlob = 0; if (pdata->pluginOptions->bPreview && eventData->hEvent) { dbe.cbBlob = db_event_getBlobSize(eventData->hEvent); dbe.pBlob = (PBYTE)mir_alloc(dbe.cbBlob); } if (eventData->hEvent) db_event_get(eventData->hEvent, &dbe); if (pdata->pluginOptions->bShowDate || pdata->pluginOptions->bShowTime) { TCHAR timestamp[MAX_DATASIZE]; TCHAR formatTime[MAX_DATASIZE]; if (pdata->pluginOptions->bShowDate) _tcsncpy(formatTime, _T("%Y.%m.%d"), _countof(formatTime)); else if (pdata->pluginOptions->bShowTime) mir_tstrncat(formatTime, _T(" %H:%M"), _countof(formatTime) - mir_tstrlen(formatTime)); time_t localTime = dbe.timestamp; _tcsftime(timestamp, _countof(timestamp), formatTime, localtime(&localTime)); mir_sntprintf(lpzText, _T("%s[b][i]%s[/i][/b]\n"), lpzText, timestamp); } // prepare event preview TCHAR* szEventPreview = GetEventPreview(&dbe); mir_sntprintf(lpzText, _T("%s%s"), lpzText, szEventPreview); mir_free(szEventPreview); if (dbe.pBlob) mir_free(dbe.pBlob); if (doReverse) { if ((iEvent >= pdata->pluginOptions->iNumberMsg && pdata->pluginOptions->iNumberMsg) || !eventData->next) break; } else if ((iEvent >= pdata->pluginOptions->iNumberMsg && pdata->pluginOptions->iNumberMsg) || !eventData->prev) break; mir_sntprintf(lpzText, _T("%s\n"), lpzText); } if ((doReverse && eventData->next) || (!doReverse && eventData->prev)) mir_sntprintf(lpzText, _T("%s\n..."), lpzText); PUChangeTextT(pdata->hWnd, lpzText); return 0; }