PageRenderTime 55ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/kvirc-4.2.0/src/kvilib/irc/KviIrcServer.cpp

#
C++ | 430 lines | 372 code | 26 blank | 32 comment | 52 complexity | 59c954e6c0479db19ab4f0df46602c1b MD5 | raw file
Possible License(s): GPL-2.0, GPL-3.0, AGPL-1.0
  1. //=============================================================================
  2. //
  3. // File : KviIrcServer.cpp
  4. // Creation date : Mon Jul 10 2000 03:42:59 by Szymon Stefanek
  5. //
  6. // This file is part of the KVIrc irc client distribution
  7. // Copyright (C) 2000-2010 Szymon Stefanek (pragma at kvirc dot net)
  8. //
  9. // This program is FREE software. You can redistribute it and/or
  10. // modify it under the terms of the GNU General Public License
  11. // as published by the Free Software Foundation; either version 2
  12. // of the License, or (at your opinion) any later version.
  13. //
  14. // This program is distributed in the HOPE that it will be USEFUL,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. //
  19. // You should have received a copy of the GNU General Public License
  20. // along with this program. If not, write to the Free Software Foundation,
  21. // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  22. //
  23. //=============================================================================
  24. #include "KviIrcServer.h"
  25. #include "KviIrcServerReconnectInfo.h"
  26. #include "KviMemory.h"
  27. #include "KviConfigurationFile.h"
  28. #include "KviNickServRuleSet.h"
  29. #include "KviTimeUtils.h"
  30. #include "KviProxyDataBase.h"
  31. #include <stdlib.h>
  32. // This is not allowed on windows unless we force the symbol to be undefined
  33. // It works on linux since gcc allows undefined symbols by default
  34. // but it is also "theoretically" wrong:
  35. // kvilib is not linked to kvirc: it's kvirc being linked to kvilib
  36. // thus kvilib should not depend on symbols defined in the kvirc core.
  37. // We must find another way to do that (like having just the id and finding
  38. // the proxy in the kvirc core, or just passing the pointer to the db from outside).
  39. // Pragma
  40. //extern KVIRC_API KviProxyDataBase * g_pProxyDataBase;
  41. KviIrcServer::KviIrcServer()
  42. {
  43. m_pReconnectInfo = NULL;
  44. m_uFlags = 0;
  45. m_uPort = 6667;
  46. m_pAutoJoinChannelList = NULL;
  47. m_bAutoConnect = false;
  48. m_iProxy = -1;
  49. }
  50. KviProxy * KviIrcServer::proxyServer(KviProxyDataBase * pDb)
  51. {
  52. int i = 0;
  53. if(proxy() < 0)
  54. return 0;
  55. KviPointerList<KviProxy> * proxylist = pDb->proxyList();
  56. for(KviProxy * pProxy = proxylist->first(); pProxy; pProxy = proxylist->next())
  57. {
  58. if(i == proxy())
  59. return pProxy;
  60. i++;
  61. }
  62. return 0;
  63. }
  64. KviIrcServer::KviIrcServer(const KviIrcServer & serv)
  65. {
  66. m_szHostname = serv.m_szHostname;
  67. m_szIp = serv.m_szIp;
  68. m_szDescription = serv.m_szDescription;
  69. m_szUser = serv.m_szUser;
  70. m_szPass = serv.m_szPass;
  71. m_uPort = serv.m_uPort;
  72. m_szNick = serv.m_szNick;
  73. m_szAlternativeNick = serv.m_szAlternativeNick;
  74. m_szRealName = serv.m_szRealName;
  75. m_szEncoding = serv.m_szEncoding;
  76. m_szTextEncoding = serv.m_szTextEncoding;
  77. m_uFlags = serv.m_uFlags;
  78. m_szInitUMode = serv.m_szInitUMode;
  79. m_szOnConnectCommand = serv.m_szOnConnectCommand;
  80. m_szOnLoginCommand = serv.m_szOnLoginCommand;
  81. m_szLinkFilter = serv.m_szLinkFilter;
  82. m_szId = serv.m_szId;
  83. m_iProxy = serv.m_iProxy;
  84. m_szUserIdentityId = serv.m_szUserIdentityId;
  85. m_bAutoConnect = serv.m_bAutoConnect;
  86. m_szSaslNick = serv.m_szSaslNick;
  87. m_szSaslPass = serv.m_szSaslPass;
  88. if(serv.m_pAutoJoinChannelList)
  89. m_pAutoJoinChannelList = new QStringList(*(serv.m_pAutoJoinChannelList));
  90. else
  91. m_pAutoJoinChannelList = NULL;
  92. if(serv.m_pReconnectInfo)
  93. m_pReconnectInfo = new KviIrcServerReconnectInfo(*(serv.m_pReconnectInfo));
  94. else
  95. m_pReconnectInfo = NULL;
  96. }
  97. void KviIrcServer::operator=(const KviIrcServer & serv)
  98. {
  99. m_szHostname = serv.m_szHostname;
  100. m_szIp = serv.m_szIp;
  101. m_szDescription = serv.m_szDescription;
  102. m_szUser = serv.m_szUser;
  103. m_szPass = serv.m_szPass;
  104. m_uPort = serv.m_uPort;
  105. m_szNick = serv.m_szNick;
  106. m_szAlternativeNick = serv.m_szAlternativeNick;
  107. m_szRealName = serv.m_szRealName;
  108. m_szEncoding = serv.m_szEncoding;
  109. m_szTextEncoding = serv.m_szTextEncoding;
  110. m_uFlags = serv.m_uFlags;
  111. m_szInitUMode = serv.m_szInitUMode;
  112. m_szOnConnectCommand = serv.m_szOnConnectCommand;
  113. m_szOnLoginCommand = serv.m_szOnLoginCommand;
  114. m_szLinkFilter = serv.m_szLinkFilter;
  115. m_szId = serv.m_szId;
  116. m_szUserIdentityId = serv.m_szUserIdentityId;
  117. m_iProxy = serv.m_iProxy;
  118. m_bAutoConnect = serv.m_bAutoConnect;
  119. m_szSaslNick = serv.m_szSaslNick;
  120. m_szSaslPass = serv.m_szSaslPass;
  121. if(m_pAutoJoinChannelList)
  122. delete m_pAutoJoinChannelList;
  123. if(serv.m_pAutoJoinChannelList)
  124. m_pAutoJoinChannelList = new QStringList(*(serv.m_pAutoJoinChannelList));
  125. else
  126. m_pAutoJoinChannelList = NULL;
  127. if(m_pReconnectInfo)
  128. delete m_pReconnectInfo;
  129. if(serv.m_pReconnectInfo)
  130. m_pReconnectInfo = new KviIrcServerReconnectInfo(*(serv.m_pReconnectInfo));
  131. else
  132. m_pReconnectInfo = NULL;
  133. }
  134. KviIrcServer::~KviIrcServer()
  135. {
  136. if(m_pAutoJoinChannelList)
  137. {
  138. delete m_pAutoJoinChannelList;
  139. m_pAutoJoinChannelList = NULL;
  140. }
  141. if(m_pReconnectInfo)
  142. {
  143. delete m_pReconnectInfo;
  144. m_pReconnectInfo = NULL;
  145. }
  146. }
  147. void KviIrcServer::setReconnectInfo(KviIrcServerReconnectInfo * pInfo)
  148. {
  149. if(m_pReconnectInfo)
  150. delete m_pReconnectInfo;
  151. m_pReconnectInfo = pInfo;
  152. }
  153. void KviIrcServer::clearReconnectInfo()
  154. {
  155. if(!m_pReconnectInfo)
  156. return;
  157. delete m_pReconnectInfo;
  158. m_pReconnectInfo = NULL;
  159. }
  160. void KviIrcServer::generateUniqueId()
  161. {
  162. struct timeval tv;
  163. kvi_gettimeofday(&tv,0);
  164. m_szId = QString("myserver%1%2%3").arg(tv.tv_usec).arg(rand() % 1000).arg(rand() % 1000);
  165. }
  166. QString KviIrcServer::ircUri()
  167. {
  168. QString szUri("irc");
  169. if(useSSL())
  170. szUri += "s";
  171. if(isIPv6())
  172. szUri += "6";
  173. szUri += "://";
  174. szUri += m_szHostname;
  175. if(m_uPort != 6667)
  176. {
  177. szUri += ":";
  178. QString szNum;
  179. szNum.setNum(m_uPort);
  180. szUri += szNum;
  181. }
  182. return szUri;
  183. }
  184. void KviIrcServer::setAutoJoinChannelList(QStringList * pNewChannelList)
  185. {
  186. if(m_pAutoJoinChannelList)
  187. delete m_pAutoJoinChannelList;
  188. m_pAutoJoinChannelList = pNewChannelList;
  189. }
  190. void KviIrcServer::setAutoJoinChannelList(const QString & szNewChannelList)
  191. {
  192. if(m_pAutoJoinChannelList)
  193. delete m_pAutoJoinChannelList;
  194. QStringList lChans = szNewChannelList.split(",");
  195. if(lChans.isEmpty())
  196. m_pAutoJoinChannelList = NULL;
  197. else
  198. m_pAutoJoinChannelList = new QStringList(lChans);
  199. }
  200. bool KviIrcServer::load(KviConfigurationFile * pCfg, const QString & szPrefix)
  201. {
  202. QString szTmp;
  203. szTmp = QString("%1Hostname").arg(szPrefix);
  204. m_szHostname = pCfg->readEntry(szTmp);
  205. szTmp = QString("%1Ip").arg(szPrefix);
  206. m_szIp = pCfg->readEntry(szTmp);
  207. if(m_szHostname.isEmpty() && m_szIp.isEmpty())
  208. return false;
  209. szTmp = QString("%1Description").arg(szPrefix);
  210. m_szDescription = pCfg->readEntry(szTmp);
  211. szTmp = QString("%1User").arg(szPrefix);
  212. m_szUser = pCfg->readEntry(szTmp);
  213. szTmp = QString("%1Pass").arg(szPrefix);
  214. m_szPass = pCfg->readEntry(szTmp);
  215. szTmp = QString("%1Nick").arg(szPrefix);
  216. m_szNick = pCfg->readEntry(szTmp);
  217. szTmp = QString("%1AlternativeNick").arg(szPrefix);
  218. m_szAlternativeNick = pCfg->readEntry(szTmp);
  219. szTmp = QString("%1SaslPass").arg(szPrefix);
  220. m_szSaslPass = pCfg->readEntry(szTmp);
  221. szTmp = QString("%1SaslNick").arg(szPrefix);
  222. m_szSaslNick = pCfg->readEntry(szTmp);
  223. szTmp = QString("%1RealName").arg(szPrefix);
  224. m_szRealName = pCfg->readEntry(szTmp);
  225. szTmp = QString("%1InitUmode").arg(szPrefix);
  226. m_szInitUMode = pCfg->readEntry(szTmp);
  227. szTmp = QString("%1AutoJoinChannels").arg(szPrefix);
  228. QStringList l = pCfg->readStringListEntry(szTmp,QStringList());
  229. if(l.count() > 0)
  230. setAutoJoinChannelList(new QStringList(l));
  231. szTmp = QString("%1AutoConnect").arg(szPrefix);
  232. m_bAutoConnect = pCfg->readBoolEntry(szTmp,false);
  233. szTmp = QString("%1Encoding").arg(szPrefix);
  234. m_szEncoding = pCfg->readEntry(szTmp);
  235. szTmp = QString("%1TextEncoding").arg(szPrefix);
  236. m_szTextEncoding = pCfg->readEntry(szTmp);
  237. szTmp = QString("%1OnConnectCommand").arg(szPrefix);
  238. m_szOnConnectCommand = pCfg->readEntry(szTmp);
  239. szTmp = QString("%1OnLoginCommand").arg(szPrefix);
  240. m_szOnLoginCommand = pCfg->readEntry(szTmp);
  241. szTmp = QString("%1LinkFilter").arg(szPrefix);
  242. m_szLinkFilter = pCfg->readEntry(szTmp);
  243. szTmp = QString("%1Port").arg(szPrefix);
  244. m_uPort = pCfg->readUIntEntry(szTmp,6667);
  245. szTmp = QString("%1Id").arg(szPrefix);
  246. m_szId = pCfg->readEntry(szTmp);
  247. if(m_szId.isEmpty())
  248. generateUniqueId();
  249. szTmp = QString("%1IPv6").arg(szPrefix);
  250. setIPv6(pCfg->readBoolEntry(szTmp,false));
  251. szTmp = QString("%1CacheIp").arg(szPrefix);
  252. setCacheIp(pCfg->readBoolEntry(szTmp,false)); // true ?
  253. szTmp = QString("%1SSL").arg(szPrefix);
  254. setUseSSL(pCfg->readBoolEntry(szTmp,false));
  255. szTmp = QString("%1EnabledCAP").arg(szPrefix);
  256. setEnabledCAP(pCfg->readBoolEntry(szTmp,true));
  257. szTmp = QString("%1EnabledSTARTTLS").arg(szPrefix);
  258. setEnabledSTARTTLS(pCfg->readBoolEntry(szTmp,true));
  259. szTmp = QString("%1EnabledSASL").arg(szPrefix);
  260. setEnabledSASL(pCfg->readBoolEntry(szTmp,false));
  261. szTmp = QString("%1Proxy").arg(szPrefix);
  262. setProxy(pCfg->readIntEntry(szTmp,-2));
  263. szTmp = QString("%1UserIdentityId").arg(szPrefix);
  264. m_szUserIdentityId = pCfg->readEntry(szTmp);
  265. return true;
  266. }
  267. void KviIrcServer::save(KviConfigurationFile * pCfg, const QString & szPrefix)
  268. {
  269. QString szTmp;
  270. szTmp = QString("%1Hostname").arg(szPrefix);
  271. pCfg->writeEntry(szTmp,m_szHostname);
  272. szTmp = QString("%1Id").arg(szPrefix);
  273. pCfg->writeEntry(szTmp,m_szId);
  274. if(!m_szIp.isEmpty())
  275. {
  276. szTmp = QString("%1Ip").arg(szPrefix);
  277. pCfg->writeEntry(szTmp,m_szIp);
  278. }
  279. if(!m_szDescription.isEmpty())
  280. {
  281. szTmp = QString("%1Description").arg(szPrefix);
  282. pCfg->writeEntry(szTmp,m_szDescription);
  283. }
  284. if(!m_szUser.isEmpty())
  285. {
  286. szTmp = QString("%1User").arg(szPrefix);
  287. pCfg->writeEntry(szTmp,m_szUser);
  288. }
  289. if(!m_szPass.isEmpty())
  290. {
  291. szTmp = QString("%1Pass").arg(szPrefix);
  292. pCfg->writeEntry(szTmp,m_szPass);
  293. }
  294. if(!m_szNick.isEmpty())
  295. {
  296. szTmp = QString("%1Nick").arg(szPrefix);
  297. pCfg->writeEntry(szTmp,m_szNick);
  298. }
  299. if(!m_szAlternativeNick.isEmpty())
  300. {
  301. szTmp = QString("%1AlternativeNick").arg(szPrefix);
  302. pCfg->writeEntry(szTmp,m_szAlternativeNick);
  303. }
  304. if(!m_szSaslPass.isEmpty())
  305. {
  306. szTmp = QString("%1SaslPass").arg(szPrefix);
  307. pCfg->writeEntry(szTmp,m_szSaslPass);
  308. }
  309. if(!m_szSaslNick.isEmpty())
  310. {
  311. szTmp = QString("%1SaslNick").arg(szPrefix);
  312. pCfg->writeEntry(szTmp,m_szSaslNick);
  313. }
  314. if(!m_szRealName.isEmpty())
  315. {
  316. szTmp = QString("%1RealName").arg(szPrefix);
  317. pCfg->writeEntry(szTmp,m_szRealName);
  318. }
  319. if(!m_szInitUMode.isEmpty())
  320. {
  321. szTmp = QString("%1InitUMode").arg(szPrefix);
  322. pCfg->writeEntry(szTmp,m_szInitUMode);
  323. }
  324. if(autoJoinChannelList())
  325. {
  326. szTmp = QString("%1AutoJoinChannels").arg(szPrefix);
  327. pCfg->writeEntry(szTmp,*(autoJoinChannelList()));
  328. }
  329. if(autoConnect()) // otherwise it defaults to false anyway
  330. {
  331. szTmp = QString("%1AutoConnect").arg(szPrefix);
  332. pCfg->writeEntry(szTmp,autoConnect());
  333. }
  334. if(!m_szEncoding.isEmpty())
  335. {
  336. szTmp = QString("%1Encoding").arg(szPrefix);
  337. pCfg->writeEntry(szTmp,m_szEncoding);
  338. }
  339. if(!m_szTextEncoding.isEmpty())
  340. {
  341. szTmp = QString("%1TextEncoding").arg(szPrefix);
  342. pCfg->writeEntry(szTmp,m_szTextEncoding);
  343. }
  344. if(!m_szOnConnectCommand.isEmpty())
  345. {
  346. szTmp = QString("%1OnConnectCommand").arg(szPrefix);
  347. pCfg->writeEntry(szTmp,m_szOnConnectCommand);
  348. }
  349. if(!m_szOnLoginCommand.isEmpty())
  350. {
  351. szTmp = QString("%1OnLoginCommand").arg(szPrefix);
  352. pCfg->writeEntry(szTmp,m_szOnLoginCommand);
  353. }
  354. if(!m_szLinkFilter.isEmpty())
  355. {
  356. szTmp = QString("%1LinkFilter").arg(szPrefix);
  357. pCfg->writeEntry(szTmp,m_szLinkFilter);
  358. }
  359. if(m_uPort != 6667)
  360. {
  361. szTmp = QString("%1Port").arg(szPrefix);
  362. pCfg->writeEntry(szTmp,m_uPort);
  363. }
  364. if(isIPv6())
  365. {
  366. szTmp = QString("%1IPv6").arg(szPrefix);
  367. pCfg->writeEntry(szTmp,isIPv6());
  368. }
  369. if(cacheIp())
  370. {
  371. szTmp = QString("%1CacheIp").arg(szPrefix);
  372. pCfg->writeEntry(szTmp,cacheIp());
  373. }
  374. if(useSSL())
  375. {
  376. szTmp = QString("%1SSL").arg(szPrefix);
  377. pCfg->writeEntry(szTmp,useSSL());
  378. }
  379. if(!enabledCAP())
  380. {
  381. szTmp = QString("%1EnabledCAP").arg(szPrefix);
  382. pCfg->writeEntry(szTmp,enabledCAP());
  383. }
  384. if(!enabledSTARTTLS())
  385. {
  386. szTmp = QString("%1EnabledSTARTTLS").arg(szPrefix);
  387. pCfg->writeEntry(szTmp,enabledSTARTTLS());
  388. }
  389. if(enabledSASL())
  390. {
  391. szTmp = QString("%1EnabledSASL").arg(szPrefix);
  392. pCfg->writeEntry(szTmp,enabledSASL());
  393. }
  394. if(proxy()!=-2)
  395. {
  396. szTmp = QString("%1Proxy").arg(szPrefix);
  397. pCfg->writeEntry(szTmp,proxy());
  398. }
  399. if(!m_szUserIdentityId.isEmpty())
  400. {
  401. szTmp = QString("%1UserIdentityId").arg(szPrefix);
  402. pCfg->writeEntry(szTmp,m_szUserIdentityId);
  403. }
  404. }