|
|
|
//=============================================================================
|
|
|
|
//
|
|
|
|
// File : kvi_ircserver.cpp
|
|
|
|
// Creation date : Mon Jul 10 2000 03:42:59 by Szymon Stefanek
|
|
|
|
//
|
|
|
|
// This file is part of the KVirc irc client distribution
|
|
|
|
// Copyright (C) 2000-2004 Szymon Stefanek (pragma at kvirc dot net)
|
|
|
|
//
|
|
|
|
// This program is FREE software. You can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU General Public License
|
|
|
|
// as published by the Free Software Foundation; either version 2
|
|
|
|
// of the License, or (at your opinion) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the HOPE that it will be USEFUL,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
// See the GNU General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program. If not, write to the Free Software Foundation,
|
|
|
|
// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
//
|
|
|
|
//=============================================================================
|
|
|
|
|
|
|
|
#define __KVILIB__
|
|
|
|
|
|
|
|
#include "kvi_ircserver.h"
|
|
|
|
#include "kvi_malloc.h"
|
|
|
|
|
|
|
|
#include "kvi_config.h"
|
|
|
|
#include "kvi_nickserv.h"
|
|
|
|
#include "kvi_time.h"
|
|
|
|
#include "kvi_proxydb.h"
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
// This is not allowed on windows unless we force the symbol to be undefined
|
|
|
|
// It works on linux since gcc allows undefined symbols by default
|
|
|
|
// but it is also "theoretically" wrong:
|
|
|
|
// kvilib is not linked to kvirc: it's kvirc being linked to kvilib
|
|
|
|
// thus kvilib should not depend on symbols defined in the kvirc core.
|
|
|
|
// We must find another way to do that (like having just the id and finding
|
|
|
|
// the proxy in the kvirc core, or just passing the pointer to the db from outside).
|
|
|
|
// Pragma
|
|
|
|
|
|
|
|
//extern KVIRC_API KviProxyDataBase * g_pProxyDataBase;
|
|
|
|
|
|
|
|
// FIXME: This should be renamed to KviServer or sth like that
|
|
|
|
KviIrcServer::KviIrcServer()
|
|
|
|
{
|
|
|
|
m_pReconnectInfo=0;
|
|
|
|
m_uFlags = 0;
|
|
|
|
m_uPort = 6667;
|
|
|
|
m_pChannelList = 0;
|
|
|
|
m_bAutoConnect = false;
|
|
|
|
m_iProxy = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
KviProxy* KviIrcServer::proxyServer(KviProxyDataBase * pDb)
|
|
|
|
{
|
|
|
|
int i=0;
|
|
|
|
if(proxy()<0) return 0;
|
|
|
|
KviPointerList<KviProxy> * proxylist = pDb->proxyList();
|
|
|
|
for(KviProxy * p = proxylist->first();p;p = proxylist->next())
|
|
|
|
{
|
|
|
|
if(i==proxy()) return p;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
KviIrcServer::KviIrcServer(const KviIrcServer &serv)
|
|
|
|
{
|
|
|
|
m_pReconnectInfo = 0;
|
|
|
|
m_szHostname = serv.m_szHostname;
|
|
|
|
m_szIp = serv.m_szIp;
|
|
|
|
m_szDescription = serv.m_szDescription;
|
|
|
|
m_szUser = serv.m_szUser;
|
|
|
|
m_szPass = serv.m_szPass;
|
|
|
|
m_uPort = serv.m_uPort;
|
|
|
|
m_szNick = serv.m_szNick;
|
|
|
|
m_szRealName = serv.m_szRealName;
|
|
|
|
m_szEncoding = serv.m_szEncoding;
|
|
|
|
m_uFlags = serv.m_uFlags;
|
|
|
|
m_szInitUMode = serv.m_szInitUMode;
|
|
|
|
m_szOnConnectCommand = serv.m_szOnConnectCommand;
|
|
|
|
m_szOnLoginCommand = serv.m_szOnLoginCommand;
|
|
|
|
m_szLinkFilter = serv.m_szLinkFilter;
|
|
|
|
m_szId = serv.m_szId;
|
|
|
|
m_iProxy = serv.m_iProxy;
|
|
|
|
m_szUserIdentityId = serv.m_szUserIdentityId;
|
|
|
|
if(serv.m_pChannelList)
|
|
|
|
m_pChannelList = new TQStringList(*(serv.m_pChannelList));
|
|
|
|
else m_pChannelList = 0;
|
|
|
|
m_bAutoConnect = serv.m_bAutoConnect;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KviIrcServer::operator=(const KviIrcServer &serv)
|
|
|
|
{
|
|
|
|
m_szHostname = serv.m_szHostname;
|
|
|
|
m_szIp = serv.m_szIp;
|
|
|
|
m_szDescription = serv.m_szDescription;
|
|
|
|
m_szUser = serv.m_szUser;
|
|
|
|
m_szPass = serv.m_szPass;
|
|
|
|
m_uPort = serv.m_uPort;
|
|
|
|
m_szNick = serv.m_szNick;
|
|
|
|
m_szRealName = serv.m_szRealName;
|
|
|
|
m_szEncoding = serv.m_szEncoding;
|
|
|
|
m_uFlags = serv.m_uFlags;
|
|
|
|
m_szInitUMode = serv.m_szInitUMode;
|
|
|
|
m_szOnConnectCommand = serv.m_szOnConnectCommand;
|
|
|
|
m_szOnLoginCommand = serv.m_szOnLoginCommand;
|
|
|
|
m_szLinkFilter = serv.m_szLinkFilter;
|
|
|
|
m_szId = serv.m_szId;
|
|
|
|
m_szUserIdentityId = serv.m_szUserIdentityId;
|
|
|
|
m_iProxy = serv.m_iProxy;
|
|
|
|
if(m_pChannelList)delete m_pChannelList;
|
|
|
|
if(serv.m_pChannelList)
|
|
|
|
m_pChannelList = new TQStringList(*(serv.m_pChannelList));
|
|
|
|
else m_pChannelList = 0;
|
|
|
|
m_bAutoConnect = serv.m_bAutoConnect;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
KviIrcServer::~KviIrcServer()
|
|
|
|
{
|
|
|
|
if(m_pChannelList)delete m_pChannelList;
|
|
|
|
if(m_pReconnectInfo) delete m_pReconnectInfo;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KviIrcServer::generateUniqueId()
|
|
|
|
{
|
|
|
|
struct timeval tv;
|
|
|
|
kvi_gettimeofday(&tv,0);
|
|
|
|
KviTQString::sprintf(m_szId,"myserver%d%d%d",tv.tv_usec,rand() % 1000,rand() % 1000);
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString KviIrcServer::ircUri()
|
|
|
|
{
|
|
|
|
TQString uri("irc");
|
|
|
|
if(useSSL())uri += "s";
|
|
|
|
if(isIpV6())uri += "6";
|
|
|
|
uri += "://";
|
|
|
|
uri += m_szHostname;
|
|
|
|
|
|
|
|
if(m_uPort!=6667)
|
|
|
|
{
|
|
|
|
uri += ":";
|
|
|
|
TQString num;
|
|
|
|
num.setNum(m_uPort);
|
|
|
|
uri += num;
|
|
|
|
}
|
|
|
|
return uri;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KviIrcServer::setAutoJoinChannelList(TQStringList * pNewChannelList)
|
|
|
|
{
|
|
|
|
if(m_pChannelList)delete m_pChannelList;
|
|
|
|
m_pChannelList = pNewChannelList;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool KviIrcServer::load(KviConfig * cfg,const TQString &prefix)
|
|
|
|
{
|
|
|
|
TQString tmp;
|
|
|
|
KviTQString::sprintf(tmp,"%TQHostname",&prefix);
|
|
|
|
m_szHostname = cfg->readTQStringEntry(tmp);
|
|
|
|
KviTQString::sprintf(tmp,"%TQIp",&prefix);
|
|
|
|
m_szIp = cfg->readTQStringEntry(tmp);
|
|
|
|
if(m_szHostname.isEmpty() && m_szIp.isEmpty())return false;
|
|
|
|
KviTQString::sprintf(tmp,"%TQDescription",&prefix);
|
|
|
|
m_szDescription = cfg->readTQStringEntry(tmp);
|
|
|
|
KviTQString::sprintf(tmp,"%TQUser",&prefix);
|
|
|
|
m_szUser = cfg->readTQStringEntry(tmp);
|
|
|
|
KviTQString::sprintf(tmp,"%TQPass",&prefix);
|
|
|
|
m_szPass = cfg->readTQStringEntry(tmp);
|
|
|
|
KviTQString::sprintf(tmp,"%TQNick",&prefix);
|
|
|
|
m_szNick = cfg->readTQStringEntry(tmp);
|
|
|
|
KviTQString::sprintf(tmp,"%TQRealName",&prefix);
|
|
|
|
m_szRealName = cfg->readTQStringEntry(tmp);
|
|
|
|
KviTQString::sprintf(tmp,"%TQInitUmode",&prefix);
|
|
|
|
m_szInitUMode = cfg->readTQStringEntry(tmp);
|
|
|
|
KviTQString::sprintf(tmp,"%TQAutoJoinChannels",&prefix);
|
|
|
|
TQStringList l = cfg->readStringListEntry(tmp,TQStringList());
|
|
|
|
if(l.count() > 0)setAutoJoinChannelList(new TQStringList(l));
|
|
|
|
KviTQString::sprintf(tmp,"%TQAutoConnect",&prefix);
|
|
|
|
m_bAutoConnect = cfg->readBoolEntry(tmp,false);
|
|
|
|
KviTQString::sprintf(tmp,"%TQEncoding",&prefix);
|
|
|
|
m_szEncoding = cfg->readTQStringEntry(tmp);
|
|
|
|
KviTQString::sprintf(tmp,"%TQOnConnectCommand",&prefix);
|
|
|
|
m_szOnConnectCommand = cfg->readTQStringEntry(tmp);
|
|
|
|
KviTQString::sprintf(tmp,"%TQOnLoginCommand",&prefix);
|
|
|
|
m_szOnLoginCommand = cfg->readTQStringEntry(tmp);
|
|
|
|
KviTQString::sprintf(tmp,"%TQLinkFilter",&prefix);
|
|
|
|
m_szLinkFilter = cfg->readTQStringEntry(tmp);
|
|
|
|
KviTQString::sprintf(tmp,"%TQPort",&prefix);
|
|
|
|
m_uPort = cfg->readUIntEntry(tmp,6667);
|
|
|
|
KviTQString::sprintf(tmp,"%TQId",&prefix);
|
|
|
|
m_szId = cfg->readTQStringEntry(tmp);
|
|
|
|
if(m_szId.isEmpty())generateUniqueId();
|
|
|
|
KviTQString::sprintf(tmp,"%TQIpV6",&prefix);
|
|
|
|
setIpV6(cfg->readBoolEntry(tmp,false));
|
|
|
|
KviTQString::sprintf(tmp,"%TQCacheIp",&prefix);
|
|
|
|
setCacheIp(cfg->readBoolEntry(tmp,false)); // true ?
|
|
|
|
KviTQString::sprintf(tmp,"%TQSSL",&prefix);
|
|
|
|
setUseSSL(cfg->readBoolEntry(tmp,false));
|
|
|
|
KviTQString::sprintf(tmp,"%TQProxy",&prefix);
|
|
|
|
setProxy(cfg->readIntEntry(tmp,-2));
|
|
|
|
KviTQString::sprintf(tmp,"%TQUserIdentityId",&prefix);
|
|
|
|
m_szUserIdentityId = cfg->readTQStringEntry(tmp);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KviIrcServer::save(KviConfig * cfg,const TQString &prefix)
|
|
|
|
{
|
|
|
|
TQString tmp;
|
|
|
|
KviTQString::sprintf(tmp,"%TQHostname",&prefix);
|
|
|
|
cfg->writeEntry(tmp,m_szHostname);
|
|
|
|
KviTQString::sprintf(tmp,"%TQId",&prefix);
|
|
|
|
cfg->writeEntry(tmp,m_szId);
|
|
|
|
if(!m_szIp.isEmpty())
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQIp",&prefix);
|
|
|
|
cfg->writeEntry(tmp,m_szIp);
|
|
|
|
}
|
|
|
|
if(!m_szDescription.isEmpty())
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQDescription",&prefix);
|
|
|
|
cfg->writeEntry(tmp,m_szDescription);
|
|
|
|
}
|
|
|
|
if(!m_szUser.isEmpty())
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQUser",&prefix);
|
|
|
|
cfg->writeEntry(tmp,m_szUser);
|
|
|
|
}
|
|
|
|
if(!m_szPass.isEmpty())
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQPass",&prefix);
|
|
|
|
cfg->writeEntry(tmp,m_szPass);
|
|
|
|
}
|
|
|
|
if(!m_szNick.isEmpty())
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQNick",&prefix);
|
|
|
|
cfg->writeEntry(tmp,m_szNick);
|
|
|
|
}
|
|
|
|
if(!m_szRealName.isEmpty())
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQRealName",&prefix);
|
|
|
|
cfg->writeEntry(tmp,m_szRealName);
|
|
|
|
}
|
|
|
|
if(!m_szInitUMode.isEmpty())
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQInitUMode",&prefix);
|
|
|
|
cfg->writeEntry(tmp,m_szInitUMode);
|
|
|
|
}
|
|
|
|
if(autoJoinChannelList())
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQAutoJoinChannels",&prefix);
|
|
|
|
cfg->writeEntry(tmp,*(autoJoinChannelList()));
|
|
|
|
}
|
|
|
|
if(autoConnect()) // otherwise it defaults to false anyway
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQAutoConnect",&prefix);
|
|
|
|
cfg->writeEntry(tmp,autoConnect());
|
|
|
|
}
|
|
|
|
if(!m_szEncoding.isEmpty())
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQEncoding",&prefix);
|
|
|
|
cfg->writeEntry(tmp,m_szEncoding);
|
|
|
|
}
|
|
|
|
if(!m_szOnConnectCommand.isEmpty())
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQOnConnectCommand",&prefix);
|
|
|
|
cfg->writeEntry(tmp,m_szOnConnectCommand);
|
|
|
|
}
|
|
|
|
if(!m_szOnLoginCommand.isEmpty())
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQOnLoginCommand",&prefix);
|
|
|
|
cfg->writeEntry(tmp,m_szOnLoginCommand);
|
|
|
|
}
|
|
|
|
if(!m_szLinkFilter.isEmpty())
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQLinkFilter",&prefix);
|
|
|
|
cfg->writeEntry(tmp,m_szLinkFilter);
|
|
|
|
}
|
|
|
|
if(m_uPort != 6667)
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQPort",&prefix);
|
|
|
|
cfg->writeEntry(tmp,m_uPort);
|
|
|
|
}
|
|
|
|
if(isIpV6())
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQIpV6",&prefix);
|
|
|
|
cfg->writeEntry(tmp,isIpV6());
|
|
|
|
}
|
|
|
|
if(cacheIp())
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQCacheIp",&prefix);
|
|
|
|
cfg->writeEntry(tmp,cacheIp());
|
|
|
|
}
|
|
|
|
if(useSSL())
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQSSL",&prefix);
|
|
|
|
cfg->writeEntry(tmp,useSSL());
|
|
|
|
}
|
|
|
|
if(proxy()!=-2)
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQProxy",&prefix);
|
|
|
|
cfg->writeEntry(tmp,proxy());
|
|
|
|
}
|
|
|
|
if(!m_szUserIdentityId.isEmpty())
|
|
|
|
{
|
|
|
|
KviTQString::sprintf(tmp,"%TQUserIdentityId",&prefix);
|
|
|
|
cfg->writeEntry(tmp,m_szUserIdentityId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
KviIrcNetwork::KviIrcNetwork(const KviIrcNetwork &src)
|
|
|
|
{
|
|
|
|
m_pChannelList = 0;
|
|
|
|
m_pNickServRuleSet = 0;
|
|
|
|
copyFrom(src);
|
|
|
|
}
|
|
|
|
|
|
|
|
KviIrcNetwork::KviIrcNetwork(const TQString &name)
|
|
|
|
{
|
|
|
|
m_szName = name;
|
|
|
|
m_pChannelList = 0;
|
|
|
|
m_pNickServRuleSet = 0;
|
|
|
|
m_bAutoConnect = false;
|
|
|
|
// m_szEncoding = TQString(); // set by default
|
|
|
|
}
|
|
|
|
|
|
|
|
KviIrcNetwork::~KviIrcNetwork()
|
|
|
|
{
|
|
|
|
if(m_pChannelList)delete m_pChannelList;
|
|
|
|
if(m_pNickServRuleSet)delete m_pNickServRuleSet;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KviIrcNetwork::setAutoJoinChannelList(TQStringList * pNewChannelList)
|
|
|
|
{
|
|
|
|
if(m_pChannelList)delete m_pChannelList;
|
|
|
|
m_pChannelList = pNewChannelList;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KviIrcNetwork::setNickServRuleSet(KviNickServRuleSet * s)
|
|
|
|
{
|
|
|
|
if(m_pNickServRuleSet)delete m_pNickServRuleSet;
|
|
|
|
m_pNickServRuleSet = s;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void KviIrcNetwork::copyFrom(const KviIrcNetwork &src)
|
|
|
|
{
|
|
|
|
m_szName = src.m_szName;
|
|
|
|
m_szEncoding = src.m_szEncoding;
|
|
|
|
m_szDescription = src.m_szDescription;
|
|
|
|
m_szNickName = src.m_szNickName;
|
|
|
|
m_szRealName = src.m_szRealName;
|
|
|
|
m_szUserName = src.m_szUserName;
|
|
|
|
m_bAutoConnect = src.m_bAutoConnect;
|
|
|
|
m_szUserIdentityId = src.m_szUserIdentityId;
|
|
|
|
m_szOnConnectCommand = src.m_szOnConnectCommand;
|
|
|
|
m_szOnLoginCommand = src.m_szOnLoginCommand;
|
|
|
|
if(m_pChannelList)delete m_pChannelList;
|
|
|
|
if(src.m_pChannelList)m_pChannelList = new TQStringList(*(src.m_pChannelList));
|
|
|
|
else m_pChannelList = 0;
|
|
|
|
if(m_pNickServRuleSet)delete m_pNickServRuleSet;
|
|
|
|
if(src.m_pNickServRuleSet)m_pNickServRuleSet = new KviNickServRuleSet(*(src.m_pNickServRuleSet));
|
|
|
|
else m_pNickServRuleSet = 0;
|
|
|
|
}
|
|
|
|
|