void KviProxy::setNamedProtocol(const char * proto) { if(kvi_strEqualCI(proto, "SOCKSv5")) m_protocol = KviProxy::Socks5; else if(kvi_strEqualCI(proto, "HTTP")) m_protocol = KviProxy::Http; else m_protocol = KviProxy::Socks4; }
bool kvi_dcc_voice_is_valid_codec(const char * codecName) { #ifdef COMPILE_USE_GSM if(kvi_strEqualCI("gsm",codecName)) { return kvi_gsm_codec_init(); } #endif if(kvi_strEqualCI("adpcm",codecName))return true; if(kvi_strEqualCI("null",codecName))return true; return false; }
static DccVoiceCodec * kvi_dcc_voice_get_codec(const char * codecName) { #ifdef COMPILE_USE_GSM if(kvi_strEqualCI("gsm",codecName)) { if(kvi_gsm_codec_init())return new DccVoiceGsmCodec(); } #endif if(kvi_strEqualCI("adpcm",codecName))return new DccVoiceAdpcmCodec(); if(kvi_strEqualCI("null",codecName))return new DccVoiceNullCodec(); return new DccVoiceAdpcmCodec(); }
static bool logview_module_ctrl(KviModule *, const char * pcOperation, void * pParam) { if(!kvi_strEqualCI("logview::export",pcOperation)) return false; LogFileData * pData = (LogFileData *)pParam; if(!pData) return false; LogFile * pLog = new LogFile(pData->szName); int iId = LogFile::PlainText; if(pData->szType == "html") iId = LogFile::HTML; g_pLogViewWindow->createLog(pLog,iId,&(pData->szFile)); return true; }
bool KviHttpRequest::processHeader(KviCString &szHeader) { int idx = szHeader.findFirstIdx("\r\n"); KviCString szResponse; if(idx != -1) { szResponse = szHeader.left(idx); szHeader.cutLeft(idx + 2); } else { szResponse = szHeader; szHeader = ""; } szResponse.trim(); bool bValid = false; unsigned int uStatus = 0; // check the response value if(kvi_strEqualCSN(szResponse.ptr(),"HTTP",4)) { KviCString szR = szResponse; szR.cutToFirst(' '); szR.trim(); int idx = szR.findFirstIdx(' '); KviCString szNumber; if(idx != -1)szNumber = szR.left(idx); else szNumber = szR; bool bOk; uStatus = szNumber.toUInt(&bOk); if(bOk)bValid = true; } QString szUniResponse = QString::fromUtf8(szResponse.ptr()); if(!bValid) { // the response is invalid ? resetInternalStatus(); m_szLastError = __tr2qs("Invalid HTTP response: %1").arg(szUniResponse); emit terminated(false); return false; } emit status(__tr2qs("Received HTTP response: %1").arg(szUniResponse)); KviPointerList<KviCString> hlist; hlist.setAutoDelete(true); idx = szHeader.findFirstIdx("\r\n"); while(idx != -1) { if(idx > 0) { hlist.append(new KviCString(szHeader.ptr(),idx)); szHeader.cutLeft(idx + 2); } idx = szHeader.findFirstIdx("\r\n"); } if(szHeader.hasData())hlist.append(new KviCString(szHeader)); KviPointerHashTable<const char *,KviCString> hdr(11,false,true); hdr.setAutoDelete(true); for(KviCString * s = hlist.first();s;s = hlist.next()) { idx = s->findFirstIdx(":"); if(idx != -1) { KviCString szName = s->left(idx); s->cutLeft(idx + 1); s->trim(); hdr.replace(szName.ptr(),new KviCString(*s)); //qDebug("FOUND HEADER (%s)=(%s)",szName.ptr(),s->ptr()); } } KviCString * size = hdr.find("Content-length"); if(size) { bool bOk; m_uTotalSize = size->toUInt(&bOk); if(!bOk)m_uTotalSize = 0; } KviCString * contentEncoding = hdr.find("Content-encoding"); if(contentEncoding) { m_bGzip = contentEncoding->equalsCI("gzip"); } KviCString * transferEncoding = hdr.find("Transfer-Encoding"); if(transferEncoding) { if(kvi_strEqualCI(transferEncoding->ptr(),"chunked")) { // be prepared to handle the chunked transfer encoding as required by HTTP/1.1 m_bChunkedTransferEncoding = true; m_uRemainingChunkSize = 0; } } // check the status // case 200: // OK // case 206: // Partial content // case 100: // Continue ?? // case 101: // Switching protocols ??? // case 201: // Created // case 202: // Accepted // case 203: // Non-Authoritative Information // case 204: // No content // case 205: // Reset content // case 300: // Multiple choices // case 301: // Moved permanently // case 302: // Found // case 303: // See Other // case 304: // Not modified // case 305: // Use Proxy // case 306: // ??? // case 307: // Temporary Redirect // case 400: // Bad request // case 401: // Unauthorized // case 402: // Payment Required // case 403: // Forbidden // case 404: // Not found // case 405: // Method not allowed // case 406: // Not acceptable // case 407: // Proxy authentication required // case 408: // Request timeout // case 409: // Conflict // case 410: // Gone // case 411: // Length required // case 412: // Precondition failed // case 413: // Request entity too large // case 414: // Request-URI Too Long // case 415: // Unsupported media type // case 416: // Requested range not satisfiable // case 417: // Expectation Failed // case 500: // Internal server error // case 501: // Not implemented // case 502: // Bad gateway // case 503: // Service unavailable // case 504: // Gateway timeout // case 505: // HTTP Version not supported if( (uStatus != 200) && // OK (uStatus != 206) // Partial content ) { // This is not "OK" and not "Partial content" // Error, redirect or something confusing if(m_eProcessingType != HeadersOnly) { switch(uStatus) { case 301: // Moved permanently case 302: // Found case 303: // See Other case 307: // Temporary Redirect { if(!m_bFollowRedirects) { resetInternalStatus(); m_szLastError = szResponse.ptr(); emit terminated(false); return false; } m_uRedirectCount++; if(m_uRedirectCount > m_uMaximumRedirectCount) { resetInternalStatus(); m_szLastError = __tr2qs("Too many redirects"); emit terminated(false); return false; } KviCString * location = hdr.find("Location"); if(!location) { resetInternalStatus(); m_szLastError = __tr2qs("Bad redirect"); emit terminated(false); return false; } KviUrl url(location->ptr()); if( (url.url() == m_connectionUrl.url()) || (url.url() == m_url.url()) ) { resetInternalStatus(); m_szLastError = __tr2qs("Redirect loop"); emit terminated(false); return false; } m_connectionUrl = url; emit status(__tr2qs("Following Redirect to %1").arg(url.url())); if(!start()) emit terminated(false); return false; // will exit the call stack } break; break; default: // assume error resetInternalStatus(); m_szLastError = szResponse.ptr(); emit terminated(false); return false; break; } // this is an error then } // else the server will terminate (it was a HEAD request) } emit receivedResponse(szUniResponse); emit header(&hdr); if((m_uMaxContentLength > 0) && (m_uTotalSize > ((unsigned int)m_uMaxContentLength))) { resetInternalStatus(); m_szLastError=__tr2qs("The amount of received data exceeds the maximum length"); emit terminated(false); return false; } // fixme: could check for data type etc... return true; }
KviLocale::KviLocale(QApplication * pApp, const QString & szLocaleDir, const QString & szForceLocaleDir) { m_pApp = pApp; // first of all try to find out the current locale QString szLangFile = QString("%1/%2").arg(szForceLocaleDir, KVI_FORCE_LOCALE_FILE_NAME); if(KviFileUtils::fileExists(szLangFile)) KviFileUtils::readFile(szLangFile, g_szLang); if(g_szLang.isEmpty()) g_szLang = KviEnvironment::getVariable("KVIRC_LANG"); #ifdef COMPILE_KDE_SUPPORT if(g_szLang.isEmpty()) g_szLang = KviEnvironment::getVariable("KDE_LANG"); #endif //COMPILE_KDE_SUPPORT if(g_szLang.isEmpty()) g_szLang = KviEnvironment::getVariable("LC_MESSAGES"); if(g_szLang.isEmpty()) g_szLang = KviEnvironment::getVariable("LANG"); if(g_szLang.isEmpty()) g_szLang = QLocale::system().name(); if(g_szLang.isEmpty()) g_szLang = "en"; g_szLang = g_szLang.trimmed(); g_szDefaultLocalePath = szLocaleDir; // the main catalogue is supposed to be kvirc_<language>.mo g_pMainCatalogue = new KviMessageCatalogue(); // the catalogue dict g_pCatalogueDict = new KviPointerHashTable<const char *, KviMessageCatalogue>; g_pCatalogueDict->setAutoDelete(true); // the smart codec dict g_pSmartCodecDict = new KviPointerHashTable<const char *, KviSmartTextCodec>; // the Qt docs explicitly state that we shouldn't delete // the codecs by ourselves... g_pSmartCodecDict->setAutoDelete(false); if(!g_szLang.isEmpty()) { // ensure Qt will use the right locale when formatting dates, numbers, .. // Note: Qt will use the system() locale anyway, we need to construct an empty QLocale() // to get it use our specified locale. QLocale::setDefault(QLocale(g_szLang)); QString szBuffer; if(findCatalogue(szBuffer, "kvirc", szLocaleDir)) { g_pMainCatalogue->load(szBuffer); g_pTranslator = new KviTranslator(m_pApp); m_pApp->installTranslator(g_pTranslator); } else { KviCString szTmp = g_szLang; szTmp.cutFromFirst('.'); szTmp.cutFromFirst('_'); szTmp.cutFromFirst('@'); szTmp.toLower(); if(!(kvi_strEqualCI(szTmp.ptr(), "en") || kvi_strEqualCI(szTmp.ptr(), "c") || kvi_strEqualCI(szTmp.ptr(), "us") || kvi_strEqualCI(szTmp.ptr(), "gb") || kvi_strEqualCI(szTmp.ptr(), "posix"))) { // FIXME: THIS IS NO LONGER VALID!!! qDebug("Can't find the catalogue for locale \"%s\" (%s)", g_szLang.toUtf8().data(), szTmp.ptr()); qDebug("There is no such translation or the $LANG variable was incorrectly set"); qDebug("You can use $KVIRC_LANG to override the catalogue name"); qDebug("For example you can set KVIRC_LANG to it_IT to force usage of the it.mo catalogue"); } } } }
int parseArgs(ParseArgs * a) { QString szServer; QString szPort; int idx; if(a->argc < 2)return KVI_ARGS_RETCODE_OK; for(idx = 1;idx < a->argc;idx++) { QString szMessage; char * p = a->argv[idx]; if((kvi_strLen(p) > 3) && (*p == '-') && (*(p+1) == '-'))p++; if(kvi_strEqualCI("-v",p) || kvi_strEqualCI("-version",p)) { KviQString::appendFormatted(szMessage,"KVIrc %s '%s'\n",KVI_VERSION,KVI_RELEASE_NAME); KviQString::appendFormatted(szMessage,"Sources date: %s\n",KVI_SOURCES_DATE); szMessage += "Build date: "; szMessage += KviBuildInfo::buildDate(); szMessage += "\n"; KviQString::appendFormatted(szMessage,"Home page: http://www.kvirc.net/\n"); #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW) MessageBox(0,szMessage.toLocal8Bit().data(),"KVIrc",0); #else qDebug("%s",szMessage.toLocal8Bit().data()); #endif return KVI_ARGS_RETCODE_STOP; } if(kvi_strEqualCI("-h",p) || kvi_strEqualCI("-help",p)) { KviQString::appendFormatted(szMessage,"Usage:\n"); KviQString::appendFormatted(szMessage," %s [options] [server [port]] [ircurl [ircurl [...]]]\n",a->argv[0]); KviQString::appendFormatted(szMessage," \n"); KviQString::appendFormatted(szMessage,"Available options:\n"); KviQString::appendFormatted(szMessage," -h, --help : Print this help and exit\n"); KviQString::appendFormatted(szMessage," -v, --version: Print version information and exit\n"); KviQString::appendFormatted(szMessage," -c <file> : Use <file> as config file instead of ~/%s\n",KVI_HOME_CONFIG_FILE_NAME); KviQString::appendFormatted(szMessage," (defaults to $HOME/%s if <file> does not exist)\n",KVI_HOME_CONFIG_FILE_NAME); KviQString::appendFormatted(szMessage," -n <file> : Use <file> as config file instead of $HOME/%s\n",KVI_HOME_CONFIG_FILE_NAME); KviQString::appendFormatted(szMessage," (create <file> if it does not exist)\n"); #ifdef COMPILE_NO_IPC KviQString::appendFormatted(szMessage," -f : Accepted but ignored (for compatibility)\n"); #else KviQString::appendFormatted(szMessage," -f : Force a new KVIrc session, even if there is already\n"); KviQString::appendFormatted(szMessage," a running one.\n"); #endif KviQString::appendFormatted(szMessage," -e <commands>: If a KVIrc session is already running, execute\n"); KviQString::appendFormatted(szMessage," the <commands> in that session, otherwise start up\n"); KviQString::appendFormatted(szMessage," normally and execute <commands>\n"); KviQString::appendFormatted(szMessage," <commands> must be a single shell token.\n"); KviQString::appendFormatted(szMessage," You can eventually use this switch more than once\n"); KviQString::appendFormatted(szMessage," -x <commands>: If a KVIrc session is already running, execute\n"); KviQString::appendFormatted(szMessage," the <commands> in that session, otherwise exit from application without doing anything/\n"); KviQString::appendFormatted(szMessage," <commands> must be a single shell token.\n"); KviQString::appendFormatted(szMessage," You can eventually use this switch more than once\n"); KviQString::appendFormatted(szMessage," -r <commands>: If a KVIrc session is already running, execute the <commands>\n"); KviQString::appendFormatted(szMessage," in that session, otherwise start up normally (do not execute).\n"); KviQString::appendFormatted(szMessage," <commands> must be a single shell token.\n"); KviQString::appendFormatted(szMessage," You can eventually use this switch more than once\n"); KviQString::appendFormatted(szMessage," -m : If a KVIrc session is already running, show an informational\n"); KviQString::appendFormatted(szMessage," popup dialog instead of writing to the console\n"); KviQString::appendFormatted(szMessage," --nosplash : Do not show the splash screen at startup\n"); KviQString::appendFormatted(szMessage," [server] : Connect to this server after startup\n"); KviQString::appendFormatted(szMessage," [port] : Use this port for connection\n"); KviQString::appendFormatted(szMessage," [ircurl] : URL in the following form:\n"); KviQString::appendFormatted(szMessage," irc[6]://<server>[:<port>][/<channel>[?<pass>]]\n"); #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW) MessageBox(0,szMessage.toLocal8Bit().data(),"KVIrc",0); #else qDebug("%s",szMessage.toLocal8Bit().data()); #endif return KVI_ARGS_RETCODE_STOP; } if(kvi_strEqualCI("-c",p)) { idx++; if(idx >= a->argc) { qDebug("Option -c requires a config file name"); return KVI_ARGS_RETCODE_ERROR; } p = a->argv[idx]; a->configFile = p; qDebug("Using file %s as config",p); continue; } if(kvi_strEqualCI("-e",p)) { idx++; if(idx >= a->argc) { qDebug("Option -e requires a command"); return KVI_ARGS_RETCODE_ERROR; } p = a->argv[idx]; if(!a->szExecCommand.isEmpty()) a->szExecCommand.append("\n"); a->szExecCommand.append(p); continue; } if(kvi_strEqualCI("-x",p)) { idx++; if(idx >= a->argc) { qDebug("Option -x requires a command"); return KVI_ARGS_RETCODE_ERROR; } p = a->argv[idx]; if(!a->szExecCommand.isEmpty()) a->szExecCommand.append("\n"); a->szExecCommand.append(p); a->bExecuteCommandAndClose=true; continue; } if(kvi_strEqualCI("-r",p)) { idx++; if(idx >= a->argc) { qDebug("Option -r requires a command"); return KVI_ARGS_RETCODE_ERROR; } p = a->argv[idx]; if(!a->szExecRemoteCommand.isEmpty()) a->szExecRemoteCommand.append("\n"); a->szExecRemoteCommand.append(p); continue; } if(kvi_strEqualCI("-m",p)) { a->bShowPopup = true; continue; } if(kvi_strEqualCI("-n",p)) { idx++; if(idx >= a->argc) { qDebug("Option -n requires a config file name"); return KVI_ARGS_RETCODE_ERROR; } p = a->argv[idx]; a->configFile = p; a->createFile=true; qDebug("Using file %s as config",p); continue; } if(kvi_strEqualCI("-nosplash",p)) { a->bShowSplashScreen = false; continue; } if(kvi_strEqualCI("-f",p)) { a->bForceNewSession = true; continue; } if(kvi_strEqualCI("-session",p)||kvi_strEqualCI("-display",p)||kvi_strEqualCI("-name",p)) { // Qt apps are supposed to handle the params to these switches, but we'll skip arg for now idx++; continue; } if(kvi_strEqualCI("-external",p)) { idx++; if(idx >= a->argc) { qDebug("Option --external requires n irc:// url"); return KVI_ARGS_RETCODE_ERROR; } p = a->argv[idx]; if(kvi_strEqualCIN(p,"irc://",6) || kvi_strEqualCIN(p,"irc6://",7) || kvi_strEqualCIN(p,"ircs://",7) || kvi_strEqualCIN(p,"ircs6://",8)) { a->szExecCommand = "openurl "; a->szExecCommand.append(QString::fromLocal8Bit(p).remove(QChar('$')).remove(QChar(';')).remove(QChar('%'))); return KVI_ARGS_RETCODE_OK; } return KVI_ARGS_RETCODE_ERROR; } if(*p != '-') { // no dash if(kvi_strEqualCIN(p,"irc://",6) || kvi_strEqualCIN(p,"irc6://",7) || kvi_strEqualCIN(p,"ircs://",7) || kvi_strEqualCIN(p,"ircs6://",8)) { if(!a->szExecCommand.isEmpty()) a->szExecCommand.append('\n'); a->szExecCommand = "openurl "; a->szExecCommand.append(QString::fromLocal8Bit(p).remove(QChar('$')).remove(QChar(';')).remove(QChar('%'))); } else { QString szTmp = QString::fromLocal8Bit(p); bool bOk; szTmp.toUInt(&bOk); if(bOk) { szPort = szTmp; } else { QString ri = szTmp.right(4); if(KviQString::equalCI(ri,".kvs")) { if(!a->szExecCommand.isEmpty()) a->szExecCommand.append('\n'); a->szExecCommand.append("parse \""); szTmp.replace(QChar('$'), QString("\\$")); szTmp.replace(QChar('\\'), QString("\\\\")); a->szExecCommand.append(szTmp); a->szExecCommand.append('"'); } else if(KviQString::equalCI(ri,".kvt")) { if(!a->szExecCommand.isEmpty()) a->szExecCommand.append('\n'); a->szExecCommand.append("theme.install \""); szTmp.replace(QChar('$'), QString("\\$")); szTmp.replace(QChar('\\'), QString("\\\\")); a->szExecCommand.append(szTmp); a->szExecCommand.append('"'); } else if(KviQString::equalCI(ri,".kva")) { if(!a->szExecCommand.isEmpty()) a->szExecCommand.append('\n'); a->szExecCommand.append("addon.install \""); szTmp.replace(QChar('$'), QString("\\$")); szTmp.replace(QChar('\\'), QString("\\\\")); a->szExecCommand.append(szTmp); a->szExecCommand.append('"'); } else { szServer = szTmp; // assume a plain server name } } } } } if(!szServer.isEmpty()) { if(!a->szExecCommand.isEmpty()) a->szExecCommand.append('\n'); a->szExecCommand.append("server -u "); a->szExecCommand.append(szServer); if(!szPort.isEmpty()) { a->szExecCommand.append(' '); a->szExecCommand.append(szPort); } } return KVI_ARGS_RETCODE_OK; }
static void dccModuleParseDccChat(KviDccRequest * dcc) { // // We have received a DCC CHAT request in the following form: // // DCC CHAT chat <ipaddress> <port> // // This means that we're requested to setup an ACTIVE chat connection // ... Easy task :) // // Anybody understands the meaning of the secondo "chat" in there ? // It was meant to simplify the parsing ? :DDD // // There is a mIrc extension that allows <port> to be 0 // and adds a last parameter that seems to be a random number (thnx YaP :) // that is used to keep track of the connection. // This extension is used by firewalled machines to initiate a DCC CHAT: // the receiving side should respond with a DCC CHAT offer // with the same random number appended, and then should listen for a connection. // // when a zero port request is initiated by another party we get // // DCC CHAT chat <fakeipaddress> 0 <tag> // // and we reply with // // DCC CHAT chat <ourip> <ourport> <tag> // // when a zero port request is initiated by us we send out // // DCC CHAT chat <fakeipaddress> 0 <tag> // // and we get // // DCC CHAT chat <remoteip> <remoteport> <tag> // // Thus if there is a <tag> and the port is 0, then the remote party // wanted to estabilish a dcc with us and wants us to listen, but if the port is nonzero then // we have sent out a zero port request and the remote party acked it // thus we have to connect instead! // // First of all we check the dcc slot limits if(!dcc_module_check_limits(dcc)) return; // Then we check the target host data if(!dcc_module_normalize_target_data(dcc, dcc->szParam2, dcc->szParam3)) return; if(!kvi_strEqualCI(dcc->szParam1.ptr(), "chat")) { if(!dcc->ctcpMsg->msg->haltOutput()) { dcc->ctcpMsg->msg->console()->output(KVI_OUT_DCCMSG, __tr2qs_ctx("The above request is broken: the second parameter is '%s' and should be 'chat', trying to continue", "dcc"), dcc->szParam1.ptr()); } } KviCString szExtensions = dcc->szType; szExtensions.cutRight(4); // cut off CHAT #ifdef COMPILE_SSL_SUPPORT bool bSSLExtension = szExtensions.contains('S', false); #else //!COMPILE_SSL_SUPPORT if(szExtensions.contains('S', false)) { dcc_module_request_error(dcc, __tr2qs_ctx("This executable has been compiled without SSL support, the SSL extension to DCC CHAT is not available", "dcc")); return; } #endif //!COMPILE_SSL_SUPPORT DccDescriptor * d = new DccDescriptor(dcc->pConsole); d->szNick = dcc->ctcpMsg->pSource->nick(); d->szUser = dcc->ctcpMsg->pSource->user(); d->szHost = dcc->ctcpMsg->pSource->host(); dcc_fill_local_nick_user_host(d, dcc); d->szIp = dcc->szParam2.ptr(); d->szPort = dcc->szParam3.ptr(); if(dcc->szParam4.hasData()) { // zero port tag ? if(d->szPort == "0") { // zero port request if(KVI_OPTION_BOOL(KviOption_boolDccSendFakeAddressByDefault)) { d->szFakeIp = KVI_OPTION_STRING(KviOption_stringDefaultDccFakeAddress); if(d->szFakeIp.isEmpty()) KVI_OPTION_BOOL(KviOption_boolDccSendFakeAddressByDefault) = false; } d->setZeroPortRequestTag(dcc->szParam4.ptr()); QString tmp; if(!dcc_kvs_get_listen_ip_address(nullptr, d->console(), tmp)) d->szListenIp = "0.0.0.0"; else d->szListenIp = tmp; d->szListenPort = "0"; // any port is OK d->bAutoAccept = KVI_OPTION_BOOL(KviOption_boolAutoAcceptDccChat); d->bActive = false; // we must listen then... } else { // zero port acknowledge // check if this is a tag that we have sent out QString szTag = QString(dcc->szParam4.ptr()); KviDccZeroPortTag * t = g_pDccBroker->findZeroPortTag(szTag); if(!t) { // hum.. not our tag // FIXME: As signalled by PRAEDO, ezbounce seems to send a fourth parameter in response to /quote ezb log // Pragma: That's a bug in ezbounce, it sends the filesize of the log as a DCC CHAT parameter... // The author probably copied and pasted the CTCP line from DCC SEND and forgot to remove the filesize. // We *could* add an option to ignore the last parameter and treat it as a standard DCC chat // request, but since we don't encourage bugs, we don't do it :D // Mail me at pragma at kvirc dot net if you really think it's necessary. dcc->ctcpMsg->msg->console()->output(KVI_OUT_DCCMSG, __tr2qs_ctx("The above request is broken: it looks like a zero port tag acknowledge but I have either never seen this tag or it was sent more than 120 seconds ago", "dcc")); dcc_module_request_error(dcc, __tr2qs_ctx("It seems that I haven't requested this DCC chat", "dcc")); delete d; return; } else { g_pDccBroker->removeZeroPortTag(szTag); } d->bAutoAccept = true; // auto-accept it (we have sent it out) d->bActive = true; } } else { d->bAutoAccept = KVI_OPTION_BOOL(KviOption_boolAutoAcceptDccChat); d->bActive = true; // we have to connect (standard active chat) } #ifdef COMPILE_SSL_SUPPORT d->bIsSSL = bSSLExtension; #endif dcc_module_set_dcc_type(d, "CHAT"); d->triggerCreationEvent(); g_pDccBroker->handleChatRequest(d); }
bool KviApplication::checkUriAssociations(const char * pcProto) { #define QUERY_BUFFER 2048 char * pcBuffer; DWORD len = QUERY_BUFFER; DWORD err; pcBuffer = (char *)malloc(len * sizeof(char)); HKEY hKey; KviCString szStoredKey = pcProto; KviCString szKey = szStoredKey; len = QUERY_BUFFER; if(RegOpenKeyEx(HKEY_CLASSES_ROOT, szKey, 0, KEY_READ, &hKey) != ERROR_SUCCESS) { free(pcBuffer); return false; } if((err = RegQueryValueEx(hKey, 0, 0, 0, (LPBYTE)pcBuffer, &len)) != ERROR_SUCCESS) { free(pcBuffer); return false; } else { if(!kvi_strEqualCI(__tr2qs("URL:IRC Protocol").toLocal8Bit().data(), pcBuffer)) { free(pcBuffer); return false; } } len = QUERY_BUFFER; if((err = RegQueryValueEx(hKey, "URL Protocol", 0, 0, (LPBYTE)pcBuffer, &len)) != ERROR_SUCCESS) { free(pcBuffer); return false; } szKey = szStoredKey + "\\DefaultIcon"; len = QUERY_BUFFER; if(RegOpenKeyEx(HKEY_CLASSES_ROOT, szKey, 0, KEY_READ, &hKey) != ERROR_SUCCESS) { free(pcBuffer); return false; } if(RegQueryValueEx(hKey, 0, 0, 0, (LPBYTE)pcBuffer, &len) != ERROR_SUCCESS) { free(pcBuffer); return false; } else { QString szIcon = applicationFilePath() + ",0"; szIcon.replace('/', "\\"); if(!kvi_strEqualCI(szIcon.toLocal8Bit().data(), pcBuffer)) { free(pcBuffer); return false; } } len = QUERY_BUFFER; szKey = szStoredKey + "\\Shell\\open"; if(RegOpenKeyEx(HKEY_CLASSES_ROOT, szKey, 0, KEY_READ, &hKey) != ERROR_SUCCESS) { free(pcBuffer); return false; } if(RegQueryValueEx(hKey, 0, 0, 0, (LPBYTE)pcBuffer, &len) != ERROR_SUCCESS) { free(pcBuffer); return false; } else { if(!kvi_strEqualCI(__tr2qs("Open with KVIrc").toLocal8Bit().data(), pcBuffer)) { free(pcBuffer); return false; } } len = QUERY_BUFFER; szKey = szStoredKey + "\\Shell\\open\\command"; if(RegOpenKeyEx(HKEY_CLASSES_ROOT, szKey, 0, KEY_READ, &hKey) != ERROR_SUCCESS) { free(pcBuffer); return false; } if(RegQueryValueEx(hKey, 0, 0, 0, (LPBYTE)pcBuffer, &len) != ERROR_SUCCESS) { free(pcBuffer); return false; } else { QString szCmd = applicationFilePath() + " \"%1\""; szCmd.replace('/', "\\"); if(!kvi_strEqualCI(szCmd.toLocal8Bit().data(), pcBuffer)) { free(pcBuffer); return false; } } free(pcBuffer); #else bool KviApplication::checkUriAssociations(const char *) { #endif return true; } #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW) void KviApplication::setupUriAssociations(const char * pcProto) { HKEY hKey; DWORD err; KviCString szStoredKey = pcProto; KviCString szKey = szStoredKey; QByteArray tmp; QString szAppPath = applicationFilePath(); szAppPath.replace('/', "\\"); SHDeleteKey(HKEY_CLASSES_ROOT, szKey); err = RegCreateKeyEx(HKEY_CLASSES_ROOT, szKey, 0, 0, 0, KEY_WRITE, 0, &hKey, 0); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE) "URL:IRC Protocol", 16); RegSetValueEx(hKey, "URL Protocol", 0, REG_SZ, (LPBYTE) "", 0); szKey = szStoredKey + "\\DefaultIcon"; RegCreateKeyEx(HKEY_CLASSES_ROOT, szKey, 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = QString(szAppPath + ",0").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); szKey = szStoredKey + "\\Shell\\open"; RegCreateKeyEx(HKEY_CLASSES_ROOT, szKey, 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = __tr2qs("Open with KVIrc").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); szKey = szStoredKey + "\\Shell\\open\\command"; RegCreateKeyEx(HKEY_CLASSES_ROOT, szKey, 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = QString(szAppPath + " --external \"%1\"").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); #else void KviApplication::setupUriAssociations(const char *) { #endif } void KviApplication::setupFileAssociations() { #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW) HKEY hKey; DWORD err; QByteArray tmp; QString szAppPath = applicationFilePath(); szAppPath.replace('/', "\\"); SHDeleteKey(HKEY_CLASSES_ROOT, ".kvs"); err = RegCreateKeyEx(HKEY_CLASSES_ROOT, ".kvs", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE) "KVIrcScript", 11); SHDeleteKey(HKEY_CLASSES_ROOT, "KVIrcScript"); RegCreateKeyEx(HKEY_CLASSES_ROOT, "KVIrcScript", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = __tr2qs("KVIrc KVS Script").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); RegCreateKeyEx(HKEY_CLASSES_ROOT, "KVIrcScript\\DefaultIcon", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = QString(szAppPath + ",1").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); RegCreateKeyEx(HKEY_CLASSES_ROOT, "KVIrcScript\\Shell\\Parse", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = __tr2qs("Run KVS Script").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); RegCreateKeyEx(HKEY_CLASSES_ROOT, "KVIrcScript\\Shell\\Parse\\command", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = QString(szAppPath + " \"%1\"").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); //Configs SHDeleteKey(HKEY_CLASSES_ROOT, ".kvc"); err = RegCreateKeyEx(HKEY_CLASSES_ROOT, ".kvc", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE) "KVIrcConfig", 11); SHDeleteKey(HKEY_CLASSES_ROOT, "KVIrcConfig"); RegCreateKeyEx(HKEY_CLASSES_ROOT, "KVIrcConfig", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = __tr2qs("KVIrc Configuration File").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); RegCreateKeyEx(HKEY_CLASSES_ROOT, "KVIrcConfig\\DefaultIcon", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = QString(szAppPath + ",2").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); // Themes SHDeleteKey(HKEY_CLASSES_ROOT, ".kvt"); err = RegCreateKeyEx(HKEY_CLASSES_ROOT, ".kvt", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE) "KVIrcTheme", 11); SHDeleteKey(HKEY_CLASSES_ROOT, "KVIrcTheme"); RegCreateKeyEx(HKEY_CLASSES_ROOT, "KVIrcTheme", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = __tr2qs("KVIrc Theme Package").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); RegCreateKeyEx(HKEY_CLASSES_ROOT, "KVIrcTheme\\DefaultIcon", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = QString(szAppPath + ",3").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); RegCreateKeyEx(HKEY_CLASSES_ROOT, "KVIrcTheme\\Shell\\Install", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = __tr2qs("Install Theme Package").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); RegCreateKeyEx(HKEY_CLASSES_ROOT, "KVIrcTheme\\Shell\\Install\\command", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = QString(szAppPath + " \"%1\"").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); //Addons SHDeleteKey(HKEY_CLASSES_ROOT, ".kva"); err = RegCreateKeyEx(HKEY_CLASSES_ROOT, ".kva", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE) "KVIrcAddon", 11); SHDeleteKey(HKEY_CLASSES_ROOT, "KVIrcAddon"); RegCreateKeyEx(HKEY_CLASSES_ROOT, "KVIrcAddon", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = __tr2qs("KVIrc Addon Package").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); RegCreateKeyEx(HKEY_CLASSES_ROOT, "KVIrcAddon\\DefaultIcon", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = QString(szAppPath + ",4").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); RegCreateKeyEx(HKEY_CLASSES_ROOT, "KVIrcAddon\\Shell\\Install", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = __tr2qs("Install Package").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); RegCreateKeyEx(HKEY_CLASSES_ROOT, "KVIrcAddon\\Shell\\Install\\command", 0, 0, 0, KEY_WRITE, 0, &hKey, 0); tmp = QString(szAppPath + " \"%1\"").toLocal8Bit(); RegSetValueEx(hKey, 0, 0, REG_SZ, (LPBYTE)tmp.data(), tmp.length()); #endif }
bool KviApplication::checkFileAssociations() { #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW) #define QUERY_BUFFER 2048 char * pcBuffer; DWORD len = QUERY_BUFFER; DWORD err; pcBuffer = (char *)malloc(len * sizeof(char)); HKEY hKey; if(RegOpenKeyEx(HKEY_CLASSES_ROOT, ".kvs", 0, KEY_READ, &hKey) != ERROR_SUCCESS) { free(pcBuffer); return false; } if((err = RegQueryValueEx(hKey, 0, 0, 0, (LPBYTE)pcBuffer, &len)) != ERROR_SUCCESS) { free(pcBuffer); return false; } else { if(!kvi_strEqualCIN("KVIrcScript", pcBuffer, 11)) { free(pcBuffer); return false; } } len = QUERY_BUFFER; if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "KVIrcScript", 0, KEY_READ, &hKey) != ERROR_SUCCESS) { free(pcBuffer); return false; } if((err = RegQueryValueEx(hKey, 0, 0, 0, (LPBYTE)pcBuffer, &len)) != ERROR_SUCCESS) { free(pcBuffer); return false; } else { if(!kvi_strEqualCI(__tr2qs("KVIrc KVS Script").toLocal8Bit().data(), pcBuffer)) { free(pcBuffer); return false; } } len = QUERY_BUFFER; if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "KVIrcScript\\DefaultIcon", 0, KEY_READ, &hKey) != ERROR_SUCCESS) { free(pcBuffer); return false; } if(RegQueryValueEx(hKey, 0, 0, 0, (LPBYTE)pcBuffer, &len) != ERROR_SUCCESS) { free(pcBuffer); return false; } else { QString szIcon = applicationFilePath() + ",1"; szIcon.replace('/', "\\"); if(!kvi_strEqualCI(szIcon.toLocal8Bit().data(), pcBuffer)) { free(pcBuffer); return false; } } len = QUERY_BUFFER; if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "KVIrcScript\\Shell\\Parse", 0, KEY_READ, &hKey) != ERROR_SUCCESS) { free(pcBuffer); return false; } if(RegQueryValueEx(hKey, 0, 0, 0, (LPBYTE)pcBuffer, &len) != ERROR_SUCCESS) { free(pcBuffer); return false; } else { if(!kvi_strEqualCI(__tr2qs("Run KVS Script").toLocal8Bit().data(), pcBuffer)) { free(pcBuffer); return false; } } len = QUERY_BUFFER; if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "KVIrcScript\\Shell\\Parse\\command", 0, KEY_READ, &hKey) != ERROR_SUCCESS) { free(pcBuffer); return false; } if(RegQueryValueEx(hKey, 0, 0, 0, (LPBYTE)pcBuffer, &len) != ERROR_SUCCESS) { free(pcBuffer); return false; } else { QString szCmd = applicationFilePath() + " \"%1\""; szCmd.replace('/', "\\"); if(!kvi_strEqualCI(szCmd.toLocal8Bit().data(), pcBuffer)) { free(pcBuffer); return false; } } //Config if(RegOpenKeyEx(HKEY_CLASSES_ROOT, ".kvc", 0, KEY_READ, &hKey) != ERROR_SUCCESS) { free(pcBuffer); return false; } if((err = RegQueryValueEx(hKey, 0, 0, 0, (LPBYTE)pcBuffer, &len)) != ERROR_SUCCESS) { free(pcBuffer); return false; } else { if(!kvi_strEqualCIN("KVIrcConfig", pcBuffer, 11)) { free(pcBuffer); return false; } } len = QUERY_BUFFER; if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "KVIrcConfig", 0, KEY_READ, &hKey) != ERROR_SUCCESS) { free(pcBuffer); return false; } //Addon if(RegOpenKeyEx(HKEY_CLASSES_ROOT, ".kva", 0, KEY_READ, &hKey) != ERROR_SUCCESS) { free(pcBuffer); return false; } if((err = RegQueryValueEx(hKey, 0, 0, 0, (LPBYTE)pcBuffer, &len)) != ERROR_SUCCESS) { free(pcBuffer); return false; } else { if(!kvi_strEqualCIN("KVIrcAddon", pcBuffer, 11)) { free(pcBuffer); return false; } } len = QUERY_BUFFER; if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "KVIrcAddon", 0, KEY_READ, &hKey) != ERROR_SUCCESS) { free(pcBuffer); return false; } //Theme if(RegOpenKeyEx(HKEY_CLASSES_ROOT, ".kvt", 0, KEY_READ, &hKey) != ERROR_SUCCESS) { free(pcBuffer); return false; } if((err = RegQueryValueEx(hKey, 0, 0, 0, (LPBYTE)pcBuffer, &len)) != ERROR_SUCCESS) { free(pcBuffer); return false; } else { if(!kvi_strEqualCIN("KVIrcTheme", pcBuffer, 11)) { free(pcBuffer); return false; } } len = QUERY_BUFFER; if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "KVIrcTheme", 0, KEY_READ, &hKey) != ERROR_SUCCESS) { free(pcBuffer); return false; } free(pcBuffer); #endif return true; }