void LogViewWindow::itemSelected(QTreeWidgetItem * it, QTreeWidgetItem *) { //A parent node m_pIrcView->clearBuffer(); if(!it || !it->parent() || !(((LogListViewItem *)it)->m_pFileData)) return; QString szText; ((LogListViewItem *)it)->m_pFileData->getText(szText); QStringList lines = szText.split('\n'); bool bOk; int iMsgType; for(QStringList::Iterator it = lines.begin(); it != lines.end(); ++it) { QString szNum = (*it).section(' ',0,0); iMsgType = szNum.toInt(&bOk); if(iMsgType < 0 || iMsgType > (KVI_NUM_MSGTYPE_OPTIONS-1)) iMsgType=0; if(bOk) outputNoFmt(iMsgType,(*it).section(' ',1),KviIrcView::NoRepaint | KviIrcView::NoTimestamp); else outputNoFmt(0,*it,KviIrcView::NoRepaint | KviIrcView::NoTimestamp); } m_pIrcView->repaint(); }
void DccChatWindow::startingSSLHandshake() { #ifdef COMPILE_SSL_SUPPORT outputNoFmt(KVI_OUT_SSL, __tr2qs_ctx("Low-level transport connection established", "dcc")); outputNoFmt(KVI_OUT_SSL, __tr2qs_ctx("Starting Secure Socket Layer handshake", "dcc")); #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); } }
bool DccVoiceWindow::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 ssss = KviError::getDescription(*pError); output(KVI_OUT_DCCERROR,__tr2qs_ctx("ERROR: %Q","dcc"),&(ssss)); delete pError; m_pUpdateTimer->stop(); updateInfo(); m_pTalkButton->setEnabled(false); m_pRecordingLabel->setEnabled(false); m_pPlayingLabel->setEnabled(false); return true; } break; case KVI_DCC_THREAD_EVENT_MESSAGE: { KviCString * str = ((KviThreadDataEvent<KviCString> *)e)->getData(); outputNoFmt(KVI_OUT_DCCMSG,__tr_no_xgettext_ctx(str->ptr(),"dcc")); delete str; return true; } break; case KVI_DCC_THREAD_EVENT_ACTION: { int * act = ((KviThreadDataEvent<int> *)e)->getData(); switch(*act) { case KVI_DCC_VOICE_THREAD_ACTION_START_RECORDING: m_pRecordingLabel->setEnabled(true); break; case KVI_DCC_VOICE_THREAD_ACTION_STOP_RECORDING: m_pRecordingLabel->setEnabled(false); break; case KVI_DCC_VOICE_THREAD_ACTION_START_PLAYING: m_pPlayingLabel->setEnabled(true); break; case KVI_DCC_VOICE_THREAD_ACTION_STOP_PLAYING: m_pPlayingLabel->setEnabled(false); break; } delete act; return true; } break; default: qDebug("Invalid event type %d received",((KviThreadEvent *)e)->id()); break; } } return KviWindow::event(e); }
void KviWindow::listWindowTypes() { outputNoFmt(KVI_OUT_SYSTEMMESSAGE, __tr2qs("List of window types available in this release of KVIrc:")); for(auto & i : m_typeTable) outputNoFmt(KVI_OUT_SYSTEMMESSAGE, i); }
bool SocketSpyWindow::outgoingMessage(const char * message) { outputNoFmt(KVI_OUT_RAW,console()->decodeText(message)); return false; }
bool SocketSpyWindow::incomingMessage(const char * message) { outputNoFmt(KVI_OUT_SOCKETMESSAGE,console()->decodeText(message)); return false; }
void KviWindow::listWindowTypes() { outputNoFmt(KVI_OUT_SYSTEMMESSAGE,__tr2qs("List of window types available in this release of KVIrc:")); for(int i=0; i< KviWindow::TypeCount; i++) outputNoFmt(KVI_OUT_SYSTEMMESSAGE,m_typeTable[i]); }
void KviQueryWindow::ownMessage(const QString & szBuffer, bool bUserFeedback) { if(!connection()) { outputNoFmt(KVI_OUT_SYSTEMWARNING, __tr2qs("This query has no active targets, no message sent")); return; } //my full mask as seen by other users QString szTmpMask = connection()->userInfo()->nickName() + "!" + connection()->userInfo()->userName() + "@" + connection()->userInfo()->hostName(); QByteArray szMyFullMask = connection()->encodeText(szTmpMask); //target name QByteArray szName = connection()->encodeText(windowName()); //message QByteArray szData = encodeText(szBuffer); const char * pcData = szData.data(); /* max length of a PRIVMSG text. Max buffer length for our sszEnd is 512 byte, but we have to * remember that the server will prepszEnd 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) = 498 * usable bytes, excluding our full mask and the target name. */ int iMaxMsgLen = 498 - szName.length() - szMyFullMask.length(); // our copy of the message QString szTmpBuffer(szBuffer); if(!pcData) return; #ifdef COMPILE_CRYPT_SUPPORT if(cryptSessionInfo()) { if(cryptSessionInfo()->m_bDoEncrypt) { if(*pcData != KviControlCodes::CryptEscape) { KviCString szEncrypted; cryptSessionInfo()->m_pEngine->setMaxEncryptLen(500 - szName.length()); switch(cryptSessionInfo()->m_pEngine->encrypt(pcData, szEncrypted)) { case KviCryptEngine::Encrypted: if(!connection()->sendFmtData("PRIVMSG %s :%s", szName.data(), szEncrypted.ptr())) return; if(bUserFeedback) m_pConsole->outputPrivmsg(this, KVI_OUT_OWNPRIVMSGCRYPTED, QString(), QString(), QString(), szBuffer, KviConsoleWindow::NoNotifications); break; case KviCryptEngine::Encoded: { if(!connection()->sendFmtData("PRIVMSG %s :%s", szName.data(), szEncrypted.ptr())) return; if(bUserFeedback) { // ugly,but we must redecode here QString szRedecoded = decodeText(szEncrypted.ptr()); m_pConsole->outputPrivmsg(this, KVI_OUT_OWNPRIVMSG, QString(), QString(), QString(), szRedecoded, KviConsoleWindow::NoNotifications); } } 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): %s, no data sent to the server"), &szBuffer, &szEngineError); } break; } userAction(connection()->currentNickName(), KVI_USERACTION_PRIVMSG); return; } else { //eat the escape code pcData++; szTmpBuffer.remove(0, 1); //let the normal function do it } } } #endif if(szData.length() > iMaxMsgLen) { /* Multi message; we want to split the message, preferably on a word boundary, * and sszEnd each message part as a different PRIVMSG * Due to encoding stuff, this is frikin'time eater */ QTextEncoder * pEncoder = makeEncoder(); // our temp encoder QByteArray szTmp; // used to calculate the length of an encoded message int iPos; // contains the index where to truncate szTmpBuffer int iC; // cycles counter (debugging/profiling purpose) float fPosDiff; // optimization internal; aggressivity factor QString szCurSubString; // truncated parts as reported to the user // run until we've something remaining in the message while(szTmpBuffer.length()) { // init counters iPos = szTmpBuffer.length(); iC = 0; // first part (optimization): quickly find an high index that is _surely_lesser_ // than the correct one while(1) { iC++; szTmp = pEncoder->fromUnicode(szTmpBuffer.left(iPos)); if(szTmp.length() <= iMaxMsgLen) break; //if szTmp.length() == 0 we already have break'ed out from here, // so we can safely use it as a divisor fPosDiff = (float)iMaxMsgLen / (float)szTmp.length(); iPos = (int)(iPos * fPosDiff); // cut the string at each cycle //printf("OPTIMIZATION: fPosDiff %f, iPos %d\n", fPosDiff, iPos); } //printf("Multi message: %d optimization cyles", iC); // now, do it the simple way: increment our index until we perfectly fit into the // available space while(1) { iC++; szTmp = pEncoder->fromUnicode(szTmpBuffer.left(iPos)); // perfect match if(iPos == szTmpBuffer.length()) break; if(szTmp.length() > iMaxMsgLen) { // overflowed.. last one was the good one iPos--; szTmp = pEncoder->fromUnicode(szTmpBuffer.left(iPos)); break; } else { //there's still free space.. add another char iPos++; } } //printf(", finished at %d cycles, truncated at pos %d\n", iC, iPos); //prepare the feedback string for the user szCurSubString = szTmpBuffer.left(iPos); //sszEnd the string to the server if(connection()->sendFmtData("PRIVMSG %s :%s", szName.data(), szTmp.data())) { //feeedback the user if(bUserFeedback) m_pConsole->outputPrivmsg(this, KVI_OUT_OWNPRIVMSG, QString(), QString(), QString(), szCurSubString, KviConsoleWindow::NoNotifications); userAction(connection()->currentNickName(), KVI_USERACTION_PRIVMSG); } else { // skipped a part in this multi message.. we don't want to continue return; } // remove the sent part of the string szTmpBuffer.remove(0, iPos); //printf("Sent %d chars, %d remaining in the Qstring\n",iPos, szTmpBuffer.length()); } } else { if(connection()->sendFmtData("PRIVMSG %s :%s", szName.data(), pcData)) { if(bUserFeedback) m_pConsole->outputPrivmsg(this, KVI_OUT_OWNPRIVMSG, QString(), QString(), QString(), szTmpBuffer, KviConsoleWindow::NoNotifications); userAction(connection()->currentNickName(), KVI_USERACTION_PRIVMSG); } } }