Options.cpp
上传用户:surprise9
上传日期:2007-01-04
资源大小:426k
文件大小:13k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // This is part of the WAR SOFTWARE SERIES initiated by Jarle Aase
  2. // Copyright 1996 by Jarle Aase. All rights reserved.
  3. // See the "War Software Series Licende Agreement" for details concerning 
  4. // use and distribution.
  5. // ---
  6. // This source code, executables and programs containing source code or
  7. // binaries or proprietetary technology from the War Software Series are
  8. // NOT alloed used, viewed or tested by any governmental agencies in
  9. // any countries. This includes the government, departments, police, 
  10. // military etc.
  11. // ---
  12. // This file is intended for use with Tab space = 2
  13. // Created and maintained in MSVC Developer Studio
  14. // ---
  15. // NAME : Options.cpp
  16. // PURPOSE : Class COptions
  17. // PROGRAM : 
  18. // DATE : Sept. 21 1996
  19. // AUTHOR : Jarle Aase
  20. // ---
  21. // REVISION HISTORY
  22. // 
  23. #include "stdafx.h"
  24. #include "..IncludeWarSoftware.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. // Rarely used externals
  31. extern LPSTR StrDataTypeName[];
  32. // Static data
  33. CLookupList COptions::m_OptionsList;
  34. CString COptions::m_DefaultIniFile = "Daemon.ini";
  35. COptions::COptions()
  36. {
  37. m_IniName.Empty();
  38. m_Remote = NULL;
  39. m_Section = NULL;
  40. }
  41. COptions::~COptions()
  42. {
  43. m_OptionsList.DeleteItem(0,m_Section);
  44. m_IniName.Empty();
  45. m_Options.KillAll();
  46. if (m_Section)
  47. delete m_Section;
  48. }
  49. void COptions::Create(LPVOID Remote, LPCSTR Origin, LPCSTR Section, int SymbolicNumber)
  50. {
  51. m_IniName = Origin ? Origin : m_DefaultIniFile;
  52. m_Remote = Remote;
  53. m_Section = strdup(Section);
  54. m_OptionsList.AddItem(this, SymbolicNumber, Section, DATATYPE_LPSTR);
  55. }
  56. CLookupListItem *COptions::ResolveOption(LPCSTR Option, CString& cPending)
  57. {
  58. LPSTR p, buf = strdup(Option);
  59. COptions *pOptGrp = NULL;
  60. CLookupListItem *pOpt = NULL;
  61. cPending.Empty();
  62. if ((p = strtok(buf,"/")) == NULL)
  63. goto done;
  64. if ((pOptGrp = FindOptionGroup(p)) == NULL)
  65. goto done;
  66. ASSERT(AfxIsValidAddress(pOptGrp,sizeof(COptions)));
  67. if ((p = strtok(NULL,"=")) == NULL)
  68. goto done;
  69. if ((pOpt = pOptGrp->FindOption(p)) == NULL)
  70. goto done;
  71. ASSERT(AfxIsValidAddress(pOpt,sizeof(CLookupListItem)));
  72. ASSERT(AfxIsValidAddress(pOpt->m_Ptr,1));
  73. if ((p = strtok(NULL,"")) != NULL)
  74. cPending = p;
  75. done:
  76. free(buf);
  77. return pOpt;
  78. }
  79. BOOL COptions::SetOption(LPCSTR Option, BOOL DoMap)
  80. {
  81. // Options have the form: Group/Name=new value
  82. BOOL Rval = FALSE;
  83. CString cBuf;
  84. CLookupListItem *pOpt;
  85. if ((pOpt = ResolveOption(Option, cBuf)) == NULL)
  86. return FALSE;
  87. if (cBuf.IsEmpty())
  88. cBuf = "";
  89. CString MappedOption = cBuf;
  90. if (DoMap)
  91. ::ConvertToMultiline(MappedOption, cBuf);
  92. if (! ::PutData(pOpt->m_Ptr,pOpt->m_DataType, MappedOption))
  93. return FALSE;
  94. return TRUE;
  95. }
  96. CString COptions::GetOption(int Grp, int Item)
  97. {
  98. CString Value("");
  99. CString Key;
  100. Key.Format("%d/%d", Grp, Item);
  101. if (!GetOption(Key, Value))
  102. Value.Format("Illegal or unavailable option: %s", Key);
  103. return Value;
  104. }
  105. BOOL COptions::GetOption(LPCSTR Option, CString& cValue, BOOL DoMap)
  106. {
  107. // Options have the form: Group/Name
  108. BOOL Rval = FALSE;
  109. CString cBuf;
  110. CLookupListItem *pOpt;
  111. if ((pOpt = ResolveOption(Option, cBuf)) == NULL)
  112. return FALSE;
  113. if (! ::GetData(pOpt->m_Ptr,pOpt->m_DataType, cValue))
  114. return FALSE;
  115. if (DoMap)
  116. {
  117. cBuf = cValue;
  118. ::ConvertToSingelline(cValue, cBuf);
  119. }
  120. return TRUE;
  121. }
  122. // Save all declered options
  123. BOOL COptions::SaveAll()
  124. {
  125. CLinkedListItem *Item = m_Options.First();
  126. CLookupListItem *Ptr;
  127. CString cBuf;
  128. while(Item)
  129. {
  130. Ptr = (CLookupListItem *)(m_Options.LookupPtr(Item));
  131. switch(Ptr->m_DataType)
  132. {
  133. case DATATYPE_CSTRING:
  134. ASSERT(AfxIsValidString(*((CString *)(Ptr->m_Ptr))));
  135. ConvertToSingelline(cBuf, *((CString *)(Ptr->m_Ptr))); 
  136. PutIniItem(Ptr->m_Name, cBuf);
  137. break;
  138. case DATATYPE_INT:
  139. case DATATYPE_BOOL:
  140. PutIniItem(Ptr->m_Name, *((int *)(Ptr->m_Ptr)));
  141. break;
  142. case DATATYPE_LPSTR:
  143. ASSERT(FALSE); // Strings should not eb used!
  144. break;
  145. default:
  146. ASSERT(FALSE); // Datatype must be handled!
  147. break;
  148. }
  149. Item = m_Options.Next(Item);
  150. }
  151. return TRUE;
  152. }
  153. BOOL COptions::LoadAll()
  154. {
  155. CLinkedListItem *Item = m_Options.First();
  156. CLookupListItem *Ptr;
  157. CString cBuf;
  158. while(Item)
  159. {
  160. Ptr = (CLookupListItem *)(m_Options.LookupPtr(Item));
  161. switch(Ptr->m_DataType)
  162. {
  163. case DATATYPE_CSTRING:
  164. ConvertToSingelline(cBuf, *((CString *)(Ptr->m_Ptr)));
  165. GetIniItem(Ptr->m_Name, cBuf, cBuf);
  166. ConvertToMultiline(*((CString *)(Ptr->m_Ptr)), cBuf);
  167. break;
  168. case DATATYPE_INT:
  169. case DATATYPE_BOOL:
  170. GetIniItem(Ptr->m_Name, *((int *)(Ptr->m_Ptr)), *((int *)(Ptr->m_Ptr)));
  171. break;
  172. case DATATYPE_LPSTR:
  173. ASSERT(FALSE); // Strings should not be used!
  174. break;
  175. default:
  176. ASSERT(FALSE); // Datatype must be handled!
  177. break;
  178. }
  179. Item = m_Options.Next(Item);
  180. }
  181. return TRUE;
  182. }
  183. void COptions::ResetSection(LPCSTR Section)
  184. {
  185. ::ResetSection(m_Remote, m_IniName, Section ? Section : m_Section);
  186. }
  187. void COptions::GetIniItem(LPCSTR Key, CString& Value, LPCSTR DefValue)
  188. {
  189. ::GetIniItem(m_Remote, m_IniName, m_Section, Key, Value, DefValue);
  190. }
  191. void COptions::GetIniItem(LPCSTR Key, int& Value, int DefValue)
  192. {
  193. ::GetIniItem(m_Remote, m_IniName, m_Section, Key, Value, DefValue);
  194. }
  195. void COptions::PutIniItem(LPCSTR Key, CString& Value)
  196. {
  197. ::PutIniItem(m_Remote, m_IniName, m_Section, Key, Value);
  198. }
  199. void COptions::PutIniItem(LPCSTR Key, int Value)
  200. {
  201. ::PutIniItem(m_Remote, m_IniName, m_Section, Key, Value);
  202. }
  203. COptions *COptions::FindOptionGroup(LPCSTR Name)
  204. {
  205. LPVOID Item;
  206. Item = m_OptionsList.Find(atoi(Name),Name);
  207. if (!Item)
  208. return NULL;
  209. ASSERT(AfxIsValidAddress(Item,4));
  210. return ((COptions *)Item);
  211. }
  212. CLookupListItem *COptions::FindOption(LPCSTR Name)
  213. {
  214. CLinkedListItem *Item;
  215. Item = m_Options.FindItem(atoi(Name),Name);
  216. if (!Item)
  217. return NULL;
  218. ASSERT(AfxIsValidAddress(Item,sizeof(CLookupListItem)));
  219. return m_Options.LookupPtr(Item);
  220. }
  221. // Create a report of the available option groups (OptionGroupName == NULL)
  222. // or of the options in a group.
  223. BOOL COptions::ListOptions(LPCSTR OptionGroupName, CString& cReturnBuf)
  224. {
  225. CLinkedListItem *Item;
  226. CLookupListItem *Ptr;
  227. COptions *MyOption;
  228. CString cBuf;
  229. cReturnBuf.Empty();
  230. if (OptionGroupName && *OptionGroupName)
  231. {
  232. // List the options within the named group
  233. MyOption = FindOptionGroup(OptionGroupName);
  234. if (!MyOption)
  235. return FALSE;
  236. ASSERT(AfxIsValidAddress(MyOption,sizeof(MyOption)));
  237. return MyOption->ListGroupOptions(cReturnBuf);
  238. }
  239. // List all option groups
  240. Item = m_OptionsList.First();
  241. if (!Item)
  242. return FALSE;
  243. while(Item)
  244. {
  245. Ptr = (CLookupListItem *)(m_OptionsList.LookupPtr(Item));
  246. ASSERT(Ptr);
  247. ASSERT(AfxIsValidAddress(Ptr,sizeof(CLookupListItem)));
  248. ASSERT(AfxIsValidString(Ptr->m_Name));
  249. cBuf.Format("%3d WarOptions://%s/n", Ptr->m_Number, Ptr->m_Name);
  250. cReturnBuf += cBuf;
  251. Item = m_OptionsList.Next(Item);
  252. }
  253. return TRUE;
  254. }
  255. // Create a report of the available options and their values
  256. // Format: Symbolic value<sp>Datatype<sp>Name<sp>=<sp>Value<n>
  257. BOOL COptions::ListGroupOptions(CString& cReturnBuf)
  258. {
  259. CLinkedListItem *Item = m_Options.First();
  260. CLookupListItem *Ptr;
  261. CString cBuf, cTmpBuf;
  262. cReturnBuf.Format("WarOptions://%s/{%s}n", m_Section, m_IniName);
  263. while(Item)
  264. {
  265. Ptr = (CLookupListItem *)(m_Options.LookupPtr(Item));
  266. cBuf.Format("%3d %-8s %s = %sn",
  267. Ptr->m_Number, 
  268. SafeStringIndex(StrDataTypeName,Ptr->m_DataType,DATATYPE_INVALID),
  269. Ptr->m_Name, m_Options.GetData(Ptr, cTmpBuf));
  270. cReturnBuf += cBuf;
  271. Item = m_Options.Next(Item);
  272. }
  273. return TRUE;
  274. }
  275. ////////////////////////////////////////////////////////////////////////////
  276. // Low level ini file handling
  277. LPCSTR ConvertToMultiline(CString& cDest, LPCSTR Src)
  278. {
  279. ASSERT(Src != NULL);
  280. cDest.Empty();
  281. while(*Src)
  282. {
  283. if (*Src == '\')
  284. {
  285. if (Src[1] == '\')
  286. cDest += '\';
  287. else if (Src[1] == 'n') // n ..
  288. cDest += 'n';
  289. else if (Src[1] == 'r') // r ..
  290. cDest += 'r';
  291. else if (Src[1] == 't') // t ..
  292. cDest += 't';
  293. if (Src[1])
  294. ++Src;
  295. }
  296. else
  297. cDest += *Src;
  298. ++Src;
  299. }
  300. return (LPCSTR)cDest;
  301. }
  302. LPCSTR ConvertToSingelline(CString& cDest, LPCSTR Src)
  303. {
  304. ASSERT(Src != NULL);
  305. cDest.Empty();
  306. while(*Src)
  307. {
  308. if (*Src == 'n')
  309. cDest += "\n";
  310. else if (*Src == '\')
  311. cDest += "\\";
  312. else if (*Src == 'r')
  313. cDest += "\r";
  314. else if (*Src == 't')
  315. cDest += "\t";
  316. else
  317. cDest += *Src;
  318. ++Src;
  319. }
  320. return (LPCSTR)cDest;
  321. }
  322. void ResetSection(LPVOID Remote, LPCSTR IniName, LPCSTR Section)
  323. {
  324. ASSERT(Remote == NULL);
  325. if (IniName)
  326. WritePrivateProfileString(Section, NULL, NULL, IniName);
  327. else
  328. AfxGetApp()->WriteProfileString(Section, NULL, NULL);
  329. }
  330. void GetIniItem(LPVOID Remote, LPCSTR IniName, LPCSTR Section, LPCSTR Key, CString& Value, LPCSTR DefValue)
  331. {
  332. if (Remote)
  333. {
  334. CRemoteInterface *pRI = (CRemoteInterface *)Remote;
  335. ASSERT(AfxIsValidAddress(pRI, sizeof(CRemoteInterface)));
  336. CString cBuf, cMyValue;
  337. cBuf.Format("GET OPTION %s/%s", Section, Key);
  338. if (!pRI->Req((HANDLE)pRI, cBuf, cMyValue, 1000 * 60))
  339. AfxThrowResourceException();
  340. if ((atoi(cMyValue) != 200) || (cMyValue.GetLength() < 4))
  341. Value = DefValue;
  342. else
  343. Value = (LPCSTR)cMyValue + 4;
  344. }
  345. else if (IniName && *IniName)
  346. {
  347. char buf[1024 * 4];
  348. *buf = '';
  349. GetPrivateProfileString(Section,Key,DefValue,buf,sizeof(buf),IniName);
  350. Value = buf;
  351. }
  352. else
  353. Value = AfxGetApp()->GetProfileString(Section,Key,DefValue);
  354. }
  355. void GetIniItem(LPVOID Remote, LPCSTR IniName, LPCSTR Section, LPCSTR Key, int& Value, int DefValue)
  356. {
  357. CString cBuf, cTmp;
  358. cTmp.Format("%d", DefValue);
  359. GetIniItem(Remote, IniName, Section, Key, cBuf, cTmp);
  360. if (cBuf == "TRUE")
  361. Value = TRUE;
  362. else
  363. Value = atoi(cBuf);
  364. }
  365. void PutIniItem(LPVOID Remote, LPCSTR IniName, LPCSTR Section, LPCSTR Key, LPCSTR Value)
  366. {
  367. if (Remote)
  368. {
  369. CRemoteInterface *pRI = (CRemoteInterface *)Remote;
  370. ASSERT(AfxIsValidAddress(pRI, sizeof(CRemoteInterface)));
  371. CString cBuf, cRbuf;
  372. cBuf.Format("SET OPTION %s/%s=%s", Section, Key, Value);
  373. if (!pRI->Req((HANDLE)pRI, cBuf, cRbuf, 1000 * 60))
  374. AfxThrowResourceException();
  375. if (atoi(cRbuf) != 200)
  376. {
  377. cBuf.Format("PutIniItem([%s], %s = '%s') - failed. (%s)",
  378. Section, Key, Value, cRbuf);
  379. AfxMessageBox(cBuf);
  380. }
  381. }
  382. else if (IniName && *IniName)
  383. {
  384. WritePrivateProfileString(Section,Key,Value,IniName);
  385. }
  386. else
  387. AfxGetApp()->WriteProfileString(Section,Key,Value);
  388. }
  389. void PutIniItem(LPVOID Remote, LPCSTR IniName, LPCSTR Section, LPCSTR Key, int Value)
  390. {
  391. CString cBuf;
  392. cBuf.Format("%d", Value);
  393. PutIniItem(Remote, IniName, Section, Key, cBuf);
  394. }
  395. DWORD GetIniItemSectionNames(LPVOID Remote, LPCSTR IniName, LPCSTR Pattern, CString& cBuf)
  396. {
  397. LPSTR Buffer, Key;
  398. DWORD BufLen = 1024 * 4;
  399. DWORD Rval = 0;
  400. ASSERT(IniName);
  401. cBuf.Empty();
  402. for(;;BufLen += (1024 * 32))
  403. {
  404. if ((Buffer = (LPSTR)malloc(BufLen)) == NULL)
  405. return 0;
  406. if (GetPrivateProfileSectionNames(Buffer, BufLen, IniName) != (BufLen - 2))
  407. break;
  408. free(Buffer);
  409. }
  410. for(Key = Buffer; *Key;)
  411. {
  412. ASSERT(AfxIsValidString(Key));
  413. if (Pattern && *Pattern)
  414. {
  415. if (!PatternMatchesName(Key, Pattern))
  416. goto next;
  417. }
  418. if (!cBuf.IsEmpty())
  419. cBuf += "rn";
  420. cBuf += Key;
  421. ++Rval;
  422. next:
  423. while(*Key)
  424. ++Key;
  425. ++Key;
  426. }
  427. free(Buffer);
  428. return Rval;
  429. }
  430. DWORD GetIniItemSection(LPVOID Remote, LPCSTR IniName, LPCSTR SectKey, LPCSTR Pattern, CString& cBuf)
  431. {
  432. LPSTR Buffer, Key;
  433. DWORD BufLen = 1024 * 4;
  434. DWORD Rval = 0;
  435. cBuf.Empty();
  436. ASSERT(IniName);
  437. for(;;BufLen += (1024 * 32))
  438. {
  439. if ((Buffer = (LPSTR)malloc(BufLen)) == NULL)
  440. return 0;
  441. if (GetPrivateProfileSection(SectKey, Buffer, BufLen, IniName) != (BufLen - 2))
  442. break;
  443. free(Buffer);
  444. }
  445. for(Key = Buffer; *Key;)
  446. {
  447. ASSERT(AfxIsValidString(Key));
  448. if (Pattern && *Pattern)
  449. {
  450. if (!PatternMatchesName(Key, Pattern))
  451. goto next;
  452. }
  453. if (!cBuf.IsEmpty())
  454. cBuf += "rn";
  455. cBuf += Key;
  456. ++Rval;
  457. next:
  458. while(*Key)
  459. ++Key;
  460. ++Key;
  461. }
  462. free(Buffer);
  463. return Rval;
  464. }
  465. ////////////////////////////////////////////////////////////////////
  466. // CFTPDaemonCoreOptions
  467. CFTPDaemonCoreOptions::CFTPDaemonCoreOptions()
  468. {
  469. DECLARE_FTPDCORE_OPTIONS
  470. }
  471. CLogOptions::CLogOptions()
  472. {
  473. DECLARE_LOG_OPTIONS
  474. }
  475. CRemoteAdminOptions::CRemoteAdminOptions()
  476. {
  477. DECLARE_RA_OPTIONS
  478. }
  479. CDaemonNTSOptions::CDaemonNTSOptions()
  480. {
  481. DECLARE_NTSERVICE_OPTIONS
  482. }
  483. int CAdvancedOptions::m_PriMap[4] =
  484. {
  485. REALTIME_PRIORITY_CLASS,
  486. HIGH_PRIORITY_CLASS,
  487. NORMAL_PRIORITY_CLASS,
  488. IDLE_PRIORITY_CLASS
  489. };
  490. int CAdvancedOptions::m_OverlappedMap[9] =
  491. {
  492. 0,
  493. (8 * 1024),
  494. (16 * 1024),
  495. (32 * 1024),
  496. (64 * 1024),
  497. (128 * 1024),
  498. (255 * 1024),
  499. (512 * 1024),
  500. (1024 * 1024)
  501. };
  502. CAdvancedOptions::CAdvancedOptions()
  503. {
  504. DECLARE_ADVANCED_OPTIONS
  505. if (!IsNT())
  506. m_OverlappedIO = 0;
  507. }
  508. CFTPClientOptions::CFTPClientOptions()
  509. {
  510. DECLARE_FTPC_OPTIONS
  511. }
  512. CGUIOptions::CGUIOptions()
  513. {
  514. DECLARE_GUI_OPTIONS
  515. }
  516. CFTPClientFirewallOptions::CFTPClientFirewallOptions()
  517. {
  518. DECLARE_FTPCFIREWALL_OPTIONS
  519. }