void DccChatWindow::sslError(const char * msg) { #ifdef COMPILE_SSL_SUPPORT if(!KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnDCCChatError, this, QString(msg), m_pDescriptor->idString())) output(KVI_OUT_DCCERROR, __tr2qs_ctx("[SSL ERROR]: %s", "dcc"), msg); #endif }
void KviQueryWindow::ownAction(const QString & szBuffer) { if(!connection()) { outputNoFmt(KVI_OUT_SYSTEMWARNING,__tr2qs("This query has no active targets, no message sent")); } else { if(szBuffer.isEmpty()) return; QString szTmpBuffer; //see bug ticket #220 if(KVI_OPTION_BOOL(KviOption_boolStripMircColorsInUserMessages)) szTmpBuffer = KviControlCodes::stripControlBytes(szBuffer); else szTmpBuffer = szBuffer; QByteArray szBuffer = encodeText(szTmpBuffer); QString sz = windowName(); if(sz.isEmpty()) return; if(KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnMeAction,this,szTmpBuffer,sz)) return; if(!connection()->sendFmtData("PRIVMSG %s :%cACTION %s%c", connection()->encodeText(sz).data(),0x01,szBuffer.data(),0x01)) return; output(KVI_OUT_ACTION,"\r!nc\r%Q\r %Q",&(connection()->currentNickName()),&szTmpBuffer); m_pUserListView->userAction(connection()->currentNickName(),KVI_USERACTION_ACTION); } }
void KviWindow::updateCaption() { fillCaptionBuffers(); bool bHaltOutput = false; bHaltOutput = KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnWindowTitleRequest, this, id(), m_szPlainTextCaption); if(!bHaltOutput) setWindowTitle(m_szPlainTextCaption); if(m_pWindowListItem) m_pWindowListItem->captionChanged(); }
void DccChatWindow::handleMarshalError(KviError::Code eError) { QString szErr = KviError::getDescription(eError); if(!KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnDCCChatError, this, szErr, m_pDescriptor->idString())) output(KVI_OUT_DCCERROR, __tr2qs_ctx("DCC %Q failed: %Q", "dcc"), &(m_pDescriptor->szType), &szErr); }
bool DccChatWindow::event(QEvent * e) { if(e->type() == KVI_THREAD_EVENT) { switch(((KviThreadEvent *)e)->id()) { case KVI_DCC_THREAD_EVENT_ERROR: { KviError::Code * pError = ((KviThreadDataEvent<KviError::Code> *)e)->getData(); QString szErr = KviError::getDescription(*pError); if(!KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnDCCChatError, this, szErr, m_pDescriptor->idString())) output(KVI_OUT_DCCERROR, __tr2qs_ctx("ERROR: %Q", "dcc"), &szErr); KVS_TRIGGER_EVENT_1(KviEvent_OnDCCChatDisconnected, this, m_pDescriptor->idString()); delete pError; return true; } break; case KVI_DCC_THREAD_EVENT_DATA: { KviCString * encoded = ((KviThreadDataEvent<KviCString> *)e)->getData(); KviCString d = KviCString(decodeText(encoded->ptr())); if(d.firstCharIs(0x01)) { d.cutLeft(1); if(d.lastCharIs(0x01)) d.cutRight(1); if(kvi_strEqualCIN("ACTION", d.ptr(), 6)) d.cutLeft(6); d.stripLeftWhiteSpace(); output(KVI_OUT_ACTION, "%Q %s", &(m_pDescriptor->szNick), d.ptr()); if(!hasAttention(KviWindow::MainWindowIsVisible)) { if(KVI_OPTION_BOOL(KviOption_boolFlashDccChatWindowOnNewMessages)) { demandAttention(); } if(KVI_OPTION_BOOL(KviOption_boolPopupNotifierOnNewDccChatMessages)) { QString szMsg = "<b>"; szMsg += m_pDescriptor->szNick; szMsg += "</b> "; szMsg += KviQString::toHtmlEscaped(QString(d.ptr())); //qDebug("KviIrcServerParser_ctcp.cpp:975 debug: %s",szMsg.data()); g_pApp->notifierMessage(this, KVI_OPTION_MSGTYPE(KVI_OUT_ACTION).pixId(), szMsg, KVI_OPTION_UINT(KviOption_uintNotifierAutoHideTime)); } } } else { #ifdef COMPILE_CRYPT_SUPPORT if(KviCryptSessionInfo * cinf = cryptSessionInfo()) { if(cinf->m_bDoDecrypt) { KviCString decryptedStuff; switch(cinf->m_pEngine->decrypt(d.ptr(), decryptedStuff)) { case KviCryptEngine::DecryptOkWasEncrypted: case KviCryptEngine::DecryptOkWasEncoded: case KviCryptEngine::DecryptOkWasPlainText: if(!KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnDCCChatMessage, this, QString(decryptedStuff.ptr()), m_pDescriptor->idString())) { g_pMainWindow->firstConsole()->outputPrivmsg(this, KVI_OUT_DCCCHATMSG, m_pDescriptor->szNick.toUtf8().data(), m_pDescriptor->szUser.toUtf8().data(), m_pDescriptor->szHost.toUtf8().data(), decryptedStuff.ptr()); } delete encoded; return true; break; default: // also case KviCryptEngine::DecryptError { QString szErr = cinf->m_pEngine->lastError(); output(KVI_OUT_SYSTEMERROR, __tr2qs_ctx("The following message appears to be encrypted, but the encryption engine failed to decode it: %Q", "dcc"), &szErr); } break; } } } else { #endif // FIXME! if(!KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnDCCChatMessage, this, QString(d.ptr()), m_pDescriptor->idString())) { g_pMainWindow->firstConsole()->outputPrivmsg(this, KVI_OUT_DCCCHATMSG, m_pDescriptor->szNick.toUtf8().data(), m_pDescriptor->szUser.toUtf8().data(), m_pDescriptor->szHost.toUtf8().data(), d.ptr()); if(!hasAttention(KviWindow::MainWindowIsVisible)) { if(KVI_OPTION_BOOL(KviOption_boolFlashDccChatWindowOnNewMessages)) { demandAttention(); } if(KVI_OPTION_BOOL(KviOption_boolPopupNotifierOnNewDccChatMessages)) { QString szMsg = KviQString::toHtmlEscaped(QString(d.ptr())); g_pApp->notifierMessage(this, KviIconManager::DccChatMsg, szMsg, KVI_OPTION_UINT(KviOption_uintNotifierAutoHideTime)); } } } #ifdef COMPILE_CRYPT_SUPPORT } #endif } delete encoded; return true; } break; } } return KviWindow::event(e); }
void KviQueryWindow::ownAction(const QString & szBuffer) { if(!connection()) return; QString szTmpBuffer; //see bug ticket #220 if(KVI_OPTION_BOOL(KviOption_boolStripMircColorsInUserMessages)) szTmpBuffer = KviControlCodes::stripControlBytes(szBuffer); else szTmpBuffer = szBuffer; //my full mask as seen by other users QString szMyName = connection()->userInfo()->nickName(); QString szMyFullMask = szMyName + "!" + connection()->userInfo()->userName() + "@" + connection()->userInfo()->hostName(); QByteArray myFullMask = connection()->encodeText(szMyFullMask); QByteArray name = connection()->encodeText(windowName()); QByteArray data = encodeText(szTmpBuffer); /* max length of a PRIVMSG text. Max buffer length for our send is 512 byte, but we have to * remember that the server will prepend to the message our full mask and truncate the resulting * at 512 bytes again.. * So we have: * :[email protected] PRIVMSG #channel :text of message(CrLf) * [email protected]#channeltext of message * 512(rfc) -2(CrLf) -2(:) -3(spaces) -7(PRIVMSG) -8(\x01ACTION\x01) = 490 * usable bytes, excluding our full mask and the target name. */ int iMaxMsgLen = 490 - name.length() - myFullMask.length(); if(KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnMeAction, this, szTmpBuffer, windowName())) return; #ifdef COMPILE_CRYPT_SUPPORT if(cryptSessionInfo() && cryptSessionInfo()->m_bDoEncrypt) { if(szTmpBuffer[0] != KviControlCodes::CryptEscape) { KviCString szEncrypted; cryptSessionInfo()->m_pEngine->setMaxEncryptLen(iMaxMsgLen); switch(cryptSessionInfo()->m_pEngine->encrypt(data.data(), szEncrypted)) { case KviCryptEngine::Encrypted: { if(!connection()->sendFmtData("PRIVMSG %s :%cACTION %s%c", name.data(), 0x01, szEncrypted.ptr(), 0x01)) return; output(KVI_OUT_OWNACTIONCRYPTED, "\r!nc\r%Q\r %Q", &szMyName, &szTmpBuffer); } break; case KviCryptEngine::Encoded: { if(!connection()->sendFmtData("PRIVMSG %s :%cACTION %s%c", name.data(), 0x01, szEncrypted.ptr(), 0x01)) return; // ugly, but we must redecode here QString szRedecoded = decodeText(szEncrypted.ptr()); output(KVI_OUT_OWNACTIONCRYPTED, "\r!nc\r%Q\r %Q", &szMyName, &szRedecoded); } break; default: // also case KviCryptEngine::EncryptError { QString szEngineError = cryptSessionInfo()->m_pEngine->lastError(); output(KVI_OUT_SYSTEMERROR, __tr2qs("The encryption engine was unable to encrypt the current message (%Q): %Q, no data sent to the server"), &szBuffer, &szEngineError); } } userAction(szMyName, KVI_USERACTION_ACTION); return; } else { //eat the escape code szTmpBuffer.remove(0, 1); data = encodeText(szTmpBuffer); } } #endif //COMPILE_CRYPT_SUPPORT if(!connection()->sendFmtData("PRIVMSG %s :%cACTION %s%c", name.data(), 0x01, data.data(), 0x01)) return; output(KVI_OUT_OWNACTION, "\r!nc\r%Q\r %Q", &szMyName, &szTmpBuffer); m_pUserListView->userAction(szMyName, KVI_USERACTION_ACTION); }
void KviLagMeter::timerEvent(QTimerEvent *) { if(m_pConnection->state() != KviIrcConnection::Connected)return; // do nothing atm // If the lag has changed emit our signals if((m_uLag / 10) != (m_uLastEmittedLag / 10)) { m_uLastEmittedLag = m_uLag; g_pMainWindow->childConnectionLagChange(m_pConnection); KviCString szLag(KviCString::Format,"%u",m_uLag); bool bDeletionSignal = false; m_pDeletionSignal = &bDeletionSignal; if((!m_bOnAlarm) && (m_uLag > KVI_OPTION_UINT(KviOption_uintLagAlarmTime))) { KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnLagAlarmTimeUp, m_pConnection->console(),m_pConnection->serverInfo()->name(),QString(szLag.ptr())); if(bDeletionSignal)return; // killed, probably by a quit -f -u m_bOnAlarm = true; } else if(m_bOnAlarm) { KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnLagAlarmTimeDown, m_pConnection->console(),m_pConnection->serverInfo()->name(),QString(szLag.ptr())); if(bDeletionSignal)return; // killed, probably by a quit -f -u m_bOnAlarm = false; } KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnLagCheck, m_pConnection->console(),m_pConnection->serverInfo()->name(),QString(szLag.ptr())); if(bDeletionSignal)return; // killed, probably by a quit -f -u m_pDeletionSignal = 0; } // get current time struct timeval tv; kvi_gettimeofday(&tv,0); unsigned int uDiff = tv.tv_sec - m_tLastCompleted; unsigned int uHeartbeat = KVI_OPTION_UINT(KviOption_uintLagMeterHeartbeat) / 1000; if(uHeartbeat < 2)uHeartbeat = 2; // we keep the last lag value for an amount of time // depending on its reliability. // Since reliability ranges from 10 to 100 we keep the lags // for (hrtbt * 4) + (reliability / 2) seconds (which means from 25 to 70 seconds by default) if(uDiff <= ((uHeartbeat * 4) + (m_uLastReliability / 2)))return; // nothing to do, the actual value is accurate // the last completed check has been completed a lot of time ago // do we have some checks on the queue ? if(m_pCheckList->count() > 0) { // if the first registered check is not too outdated // we wait a little more for it to return KviLagCheck * c = m_pCheckList->first(); if(c) { if((tv.tv_sec - c->lSecs) <= 10)return; } // the first check was registered more than 10 secs before if(m_tLastOwnCheck > 0) { // hm.. we have already sent our own (reliable) check after the last completed // make the lag grow (we're pretty sure it's growing) uDiff = (tv.tv_sec - m_tFirstOwnCheck) * 1000; if(m_uLag < uDiff)m_uLag = uDiff; // the lag grows for sure uDiff = tv.tv_sec - m_tLastOwnCheck; if(uDiff < (uHeartbeat * 4))return; // wait a bit...send own checks only every 20 secs (by default) at this point } } // or we have no checks in the queue at all // or it's really time to do something... if(m_tFirstOwnCheck == 0) { if(_OUTPUT_PARANOIC) m_pConnection->console()->output(KVI_OUT_VERBOSE,__tr2qs("Sending out PING based lag probe")); // this is the first our own lag check since the last succesfull one: use the ping lagCheckRegister("@ping@",70); // the ping may be fooled easily m_pConnection->sendFmtData("PING %s %s", m_pConnection->encodeText( m_pConnection->userInfo()->nickName() ).data(), m_pConnection->encodeText( m_pConnection->serverInfo()->name() ).data() ); m_tFirstOwnCheck = tv.tv_sec; } else { if(_OUTPUT_PARANOIC) m_pConnection->console()->output(KVI_OUT_VERBOSE,__tr2qs("Sending out CTCP based lag probe")); // we have already sent a ping but we got no reply // try with another method... even if this will reset our idle time KviCString tmp(KviCString::Format,"%d%d-yeah-:)",tv.tv_sec,tv.tv_usec); lagCheckRegister(tmp.ptr(),100); // almost impossible to fool m_pConnection->sendFmtData("NOTICE %s :%cLAGCHECK %s%c", m_pConnection->encodeText( m_pConnection->userInfo()->nickName() ).data(), 0x01, tmp.ptr(), 0x01); } m_tLastOwnCheck = tv.tv_sec; }