QSProfile.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:18k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. /*
  2. All rights reserved.
  3. */
  4. #include "stdafx.h"
  5. #include "QSProfile.h"
  6. #include "ProxySocket.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // CQSProfile
  14. CQSProfile & AfxGetQSProfile()
  15. {
  16. static CQSProfile s_qsprofile;
  17. return s_qsprofile;
  18. }
  19. //////////////////////////////////////////////////////////////////////
  20. // Construction/Destruction
  21. //////////////////////////////////////////////////////////////////////
  22. CQSProfile::CQSProfile()
  23. {
  24. m_nAccessType = 0; // INTERNET_OPEN_TYPE_PRECONFIG
  25. m_nProxyType = CProxySocket::TypeHTTP;
  26. m_nProxyPort = 80; // INTERNET_DEFAULT_HTTP_PORT
  27. m_nCurrentServer = -1;
  28. m_bCycleConnect = TRUE;
  29. }
  30. CQSProfile::~CQSProfile()
  31. {
  32. }
  33. char szQuoteServerProfileName[] = "QuoteServer.ini";
  34. char szProfile_Proxy[] = "Proxy";
  35. char szProfile_AccessType[] = "AccessType";
  36. char szProfile_ProxyType[] = "ProxyType";
  37. char szProfile_ProxyAddress[] = "ProxyAddress";
  38. char szProfile_ProxyPort[] = "ProxyPort";
  39. char szProfile_ProxyUser[] = "ProxyUser";
  40. char szProfile_ProxyPasswd[] = "ProxyPasswd";
  41. char szProfile_Server[] = "Server";
  42. char szProfile_ServerNumber[] = "ServerNumber";
  43. char szProfile_CurrentServer[] = "CurrentServer";
  44. char szProfile_CycleConnect[] = "CycleConnect";
  45. char szProfile_ServerFmt[] = "-Server%d";
  46. char szProfile_Name[] = "Name";
  47. char szProfile_Address[] = "Address";
  48. char szProfile_Port[] = "Port";
  49. char szProfile_User[] = "User";
  50. char szProfile_Passwd[] = "Passwd";
  51. char szProfile_SavePasswd[] = "SavePasswd";
  52. void CQSProfile::LoadProfile()
  53. {
  54. CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
  55. m_nCurrentServer = ::GetPrivateProfileInt( szProfile_Server, szProfile_CurrentServer, 0, sFileName );
  56. m_bCycleConnect = ::GetPrivateProfileInt( szProfile_Server, szProfile_CycleConnect, TRUE, sFileName );
  57. int nServerNumber = ::GetPrivateProfileInt( szProfile_Server, szProfile_ServerNumber, 0, sFileName );
  58. m_aQuoteServers.SetSize( 0, nServerNumber + 3 );
  59. char buffer[1024];
  60. for( int k=0; k<nServerNumber; k++ )
  61. {
  62. CString sSession;
  63. sSession.Format( szProfile_ServerFmt, k );
  64. CQuoteServer qs;
  65. memset( buffer, 0, sizeof(buffer) );
  66. ::GetPrivateProfileString( sSession, szProfile_Name, "", buffer, sizeof(buffer)-2, sFileName );
  67. qs.m_strName = buffer;
  68. memset( buffer, 0, sizeof(buffer) );
  69. ::GetPrivateProfileString( sSession, szProfile_Address, "", buffer, sizeof(buffer)-2, sFileName );
  70. qs.m_strAddress = buffer;
  71. qs.m_nPort = ::GetPrivateProfileInt( sSession, szProfile_Port, 8001, sFileName );
  72. memset( buffer, 0, sizeof(buffer) );
  73. ::GetPrivateProfileString( sSession, szProfile_User, "", buffer, sizeof(buffer)-2, sFileName );
  74. qs.m_strUser = buffer;
  75. memset( buffer, 0, sizeof(buffer) );
  76. ::GetPrivateProfileString( sSession, szProfile_Passwd, "", buffer, sizeof(buffer)-2, sFileName );
  77. qs.m_strPasswd = buffer;
  78. qs.m_bSavePasswd = ::GetPrivateProfileInt( sSession, szProfile_SavePasswd, TRUE, sFileName );
  79. if( qs.m_strName.IsEmpty() )
  80. qs.m_strName = qs.m_strAddress;
  81. if( !qs.m_strName.IsEmpty() )
  82. m_aQuoteServers.Add( qs );
  83. }
  84. LoadAliases();
  85. }
  86. void CQSProfile::StoreProfile()
  87. {
  88. CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
  89. CString sTemp;
  90. sTemp.Format( "%d", m_aQuoteServers.GetSize() );
  91. ::WritePrivateProfileString( szProfile_Server, szProfile_ServerNumber, sTemp, sFileName );
  92. sTemp.Format( "%d", m_nCurrentServer );
  93. ::WritePrivateProfileString( szProfile_Server, szProfile_CurrentServer, sTemp, sFileName );
  94. sTemp.Format( "%d", m_bCycleConnect );
  95. ::WritePrivateProfileString( szProfile_Server, szProfile_CycleConnect, sTemp, sFileName );
  96. ::GetPrivateProfileInt( szProfile_Server, szProfile_ServerNumber, m_aQuoteServers.GetSize(), sFileName );
  97. for( int k=0; k<m_aQuoteServers.GetSize(); k++ )
  98. {
  99. CQuoteServer & qs = m_aQuoteServers.ElementAt(k);
  100. CString sSession;
  101. sSession.Format( szProfile_ServerFmt, k );
  102. ::WritePrivateProfileString( sSession, szProfile_Name, qs.m_strName, sFileName );
  103. ::WritePrivateProfileString( sSession, szProfile_Address, qs.m_strAddress, sFileName );
  104. sTemp.Format( "%d", qs.m_nPort );
  105. ::WritePrivateProfileString( sSession, szProfile_Port, sTemp, sFileName );
  106. ::WritePrivateProfileString( sSession, szProfile_User, qs.m_strUser, sFileName );
  107. ::WritePrivateProfileString( sSession, szProfile_Passwd, qs.m_strPasswd, sFileName );
  108. sTemp.Format( "%d", qs.m_bSavePasswd );
  109. ::WritePrivateProfileString( sSession, szProfile_SavePasswd, sTemp, sFileName );
  110. }
  111. }
  112. static HKEY QSP_GetSectionKey( HKEY hKey, LPCTSTR szRegKeyGroup, LPCTSTR szRegKeyCompany, LPCTSTR szRegKeyApp, LPCTSTR lpszVersion, LPCTSTR lpszSection )
  113. {
  114. HKEY hGroupKey = NULL;
  115. HKEY hCompanyKey = NULL;
  116. HKEY hAppKey = NULL;
  117. HKEY hVersionKey = NULL;
  118. HKEY hSectionKey = NULL;
  119. if (RegOpenKeyEx( hKey, szRegKeyGroup, 0, KEY_WRITE|KEY_READ,
  120. &hGroupKey) == ERROR_SUCCESS)
  121. {
  122. DWORD dw;
  123. if (RegCreateKeyEx(hGroupKey, szRegKeyCompany, 0, REG_NONE,
  124. REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,
  125. &hCompanyKey, &dw) == ERROR_SUCCESS )
  126. {
  127. RegCreateKeyEx(hCompanyKey, szRegKeyApp, 0, REG_NONE,
  128. REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,
  129. &hAppKey, &dw);
  130. }
  131. }
  132. if (hGroupKey != NULL)
  133. RegCloseKey(hGroupKey);
  134. if (hCompanyKey != NULL)
  135. RegCloseKey(hCompanyKey);
  136. DWORD dw;
  137. if( NULL == hAppKey )
  138. return FALSE;
  139. RegCreateKeyEx(hAppKey, lpszVersion, 0, REG_NONE,
  140. REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,
  141. &hVersionKey, &dw);
  142. RegCloseKey(hAppKey);
  143. if( NULL == hVersionKey )
  144. return FALSE;
  145. RegCreateKeyEx(hVersionKey, lpszSection, 0, REG_NONE,
  146. REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,
  147. &hSectionKey, &dw);
  148. RegCloseKey(hVersionKey);
  149. return hSectionKey;
  150. }
  151. static DWORD QSP_RegQueryDWORD(HKEY hKey, LPCTSTR szRegKeyGroup, LPCTSTR szRegKeyCompany, LPCTSTR szRegKeyApp, LPCTSTR lpszVersion, LPCTSTR lpszSection, LPCTSTR lpszEntry, DWORD dwDefault )
  152. // hKey = HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, or so
  153. {
  154. HKEY hSecKey = QSP_GetSectionKey(hKey, szRegKeyGroup, szRegKeyCompany, szRegKeyApp, lpszVersion, lpszSection);
  155. if (hSecKey == NULL)
  156. return dwDefault;
  157. DWORD dwValue;
  158. DWORD dwType, dwCount = 4;
  159. LONG lResult = RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  160. (LPBYTE)&dwValue, &dwCount);
  161. RegCloseKey(hSecKey);
  162. if (lResult == ERROR_SUCCESS)
  163. {
  164. ASSERT(dwType == REG_DWORD);
  165. return dwValue;
  166. }
  167. return dwDefault;
  168. }
  169. static CString QSP_RegQueryString(HKEY hKey, LPCTSTR szRegKeyGroup, LPCTSTR szRegKeyCompany, LPCTSTR szRegKeyApp, LPCTSTR lpszVersion, LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszDefault )
  170. // hKey = HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, or so
  171. {
  172. HKEY hSecKey = QSP_GetSectionKey(hKey, szRegKeyGroup, szRegKeyCompany, szRegKeyApp, lpszVersion, lpszSection);
  173. if (hSecKey == NULL)
  174. return lpszDefault;
  175. CString strValue;
  176. DWORD dwType, dwCount;
  177. LONG lResult = RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  178. NULL, &dwCount);
  179. if (lResult == ERROR_SUCCESS)
  180. {
  181. ASSERT(dwType == REG_SZ);
  182. lResult = RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  183. (LPBYTE)strValue.GetBuffer(dwCount/sizeof(TCHAR)), &dwCount);
  184. strValue.ReleaseBuffer();
  185. }
  186. RegCloseKey(hSecKey);
  187. if (lResult == ERROR_SUCCESS)
  188. {
  189. ASSERT(dwType == REG_SZ);
  190. return strValue;
  191. }
  192. return lpszDefault;
  193. }
  194. static BOOL QSP_ParseProxyString( LPCTSTR lpszProxy, int & nProxyType, CString & rProxyAddress, UINT & nProxyPort )
  195. {
  196. CString strProxy = lpszProxy;
  197. int nIndex1, nIndex2, nIndex3;
  198. char szSocks[] = "socks=";
  199. nIndex1 = strProxy.Find( szSocks );
  200. if( -1 != nIndex1 )
  201. {
  202. nIndex1 = nIndex1 + strlen(szSocks);
  203. nIndex2 = strProxy.Find( ":", nIndex1 );
  204. if( -1 != nIndex2 )
  205. {
  206. nIndex3 = strProxy.Find( ";", nIndex2 );
  207. if( -1 == nIndex3 ) nIndex3 = strProxy.GetLength();
  208. nProxyType = CProxySocket::TypeSocks5;
  209. rProxyAddress = strProxy.Mid( nIndex1, nIndex2-nIndex1 );
  210. nProxyPort = atol(strProxy.Mid( nIndex2+1, nIndex3-nIndex2-1) );
  211. return TRUE;
  212. }
  213. }
  214. char szHttp[] = "http=";
  215. nIndex1 = strProxy.Find( szHttp );
  216. if( -1 != nIndex1 )
  217. {
  218. nIndex1 = nIndex1 + strlen(szHttp);
  219. nIndex2 = strProxy.Find( ":", nIndex1 );
  220. if( -1 != nIndex2 )
  221. {
  222. nIndex3 = strProxy.Find( ";", nIndex2 );
  223. if( -1 == nIndex3 ) nIndex3 = strProxy.GetLength();
  224. nProxyType = CProxySocket::TypeHTTP;
  225. rProxyAddress = strProxy.Mid( nIndex1, nIndex2-nIndex1 );
  226. nProxyPort = atol(strProxy.Mid( nIndex2+1, nIndex3-nIndex2-1) );
  227. return TRUE;
  228. }
  229. }
  230. // All is the same
  231. nIndex1 = 0;
  232. nIndex2 = strProxy.Find( ":", nIndex1 );
  233. if( -1 != nIndex2 )
  234. {
  235. nIndex3 = strProxy.Find( ";", nIndex2 );
  236. if( -1 == nIndex3 ) nIndex3 = strProxy.GetLength();
  237. nProxyType = CProxySocket::TypeSocks5;
  238. rProxyAddress = strProxy.Mid( nIndex1, nIndex2-nIndex1 );
  239. nProxyPort = atol(strProxy.Mid( nIndex2+1, nIndex3-nIndex2-1) );
  240. return TRUE;
  241. }
  242. return FALSE;
  243. }
  244. BOOL CQSProfile::GetCompoundConfig( int & nProxyType, CString & strProxyAddress, UINT & nProxyPort )
  245. {
  246. int nAccessType = GetAccessType();
  247. nProxyType = GetProxyType();
  248. strProxyAddress = GetProxyAddress();
  249. nProxyPort = GetProxyPort();
  250. if( INTERNET_OPEN_TYPE_PRECONFIG == nAccessType )
  251. {
  252. DWORD dwProxyEnable = QSP_RegQueryDWORD( HKEY_CURRENT_USER, _T("Software"), _T("Microsoft"), _T("Windows"),
  253. _T("CurrentVersion"), _T("Internet Settings"), _T("ProxyEnable"), 0 );
  254. if( dwProxyEnable )
  255. {
  256. CString strProxy = QSP_RegQueryString( HKEY_CURRENT_USER, _T("Software"), _T("Microsoft"), _T("Windows"),
  257. _T("CurrentVersion"), _T("Internet Settings"), _T("ProxyServer"), "" );
  258. QSP_ParseProxyString( strProxy, nProxyType, strProxyAddress, nProxyPort );
  259. }
  260. else
  261. nProxyType = CProxySocket::TypeNone;
  262. }
  263. else if( INTERNET_OPEN_TYPE_DIRECT == nAccessType )
  264. nProxyType = CProxySocket::TypeNone;
  265. return TRUE;
  266. }
  267. int CQSProfile::GetAccessType( )
  268. {
  269. /* if( INTERNET_OPEN_TYPE_DIRECT != m_nAccessType
  270. && INTERNET_OPEN_TYPE_PRECONFIG != m_nAccessType
  271. && INTERNET_OPEN_TYPE_PROXY != m_nAccessType )
  272. return INTERNET_OPEN_TYPE_DIRECT;
  273. */
  274. CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
  275. m_nAccessType = ::GetPrivateProfileInt( szProfile_Proxy, szProfile_AccessType, 0, sFileName );
  276. return m_nAccessType;
  277. }
  278. void CQSProfile::SetAccessType( int nAccessType )
  279. {
  280. m_nAccessType = nAccessType;
  281. CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
  282. CString sTemp;
  283. sTemp.Format( "%d", m_nAccessType );
  284. ::WritePrivateProfileString( szProfile_Proxy, szProfile_AccessType, sTemp, sFileName );
  285. }
  286. int CQSProfile::GetProxyType( )
  287. {
  288. CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
  289. m_nProxyType = ::GetPrivateProfileInt( szProfile_Proxy, szProfile_ProxyType, 3, sFileName );
  290. return m_nProxyType;
  291. }
  292. void CQSProfile::SetProxyType( int nProxyType )
  293. {
  294. m_nProxyType = nProxyType;
  295. CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
  296. CString sTemp;
  297. sTemp.Format( "%d", m_nProxyType );
  298. ::WritePrivateProfileString( szProfile_Proxy, szProfile_ProxyType, sTemp, sFileName );
  299. }
  300. CString CQSProfile::GetProxyAddress( )
  301. {
  302. CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
  303. char szAddress[CProxySocket::MaxLenAddress+2];
  304. memset( szAddress, 0, sizeof(szAddress) );
  305. ::GetPrivateProfileString( szProfile_Proxy, szProfile_ProxyAddress, "", szAddress, sizeof(szAddress)-2, sFileName );
  306. m_strProxyAddress = szAddress;
  307. return m_strProxyAddress;
  308. }
  309. void CQSProfile::SetProxyAddress( LPCTSTR lpszProxyAddress )
  310. {
  311. m_strProxyAddress = lpszProxyAddress;
  312. CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
  313. ::WritePrivateProfileString( szProfile_Proxy, szProfile_ProxyAddress, m_strProxyAddress, sFileName );
  314. }
  315. WORD CQSProfile::GetProxyPort( )
  316. {
  317. CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
  318. m_nProxyPort = ::GetPrivateProfileInt( szProfile_Proxy, szProfile_ProxyPort, 80, sFileName );
  319. return m_nProxyPort;
  320. }
  321. void CQSProfile::SetProxyPort( WORD nPort )
  322. {
  323. m_nProxyPort = nPort;
  324. CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
  325. CString sTemp;
  326. sTemp.Format( "%d", m_nProxyPort );
  327. ::WritePrivateProfileString( szProfile_Proxy, szProfile_ProxyPort, sTemp, sFileName );
  328. }
  329. CString CQSProfile::GetProxyUser( )
  330. {
  331. CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
  332. char szUser[CProxySocket::MaxLenUser+2];
  333. memset( szUser, 0, sizeof(szUser) );
  334. ::GetPrivateProfileString( szProfile_Proxy, szProfile_ProxyUser, "", szUser, sizeof(szUser)-2, sFileName );
  335. m_strProxyUser = szUser;
  336. return m_strProxyUser;
  337. }
  338. void CQSProfile::SetProxyUser( LPCTSTR lpszProxyUser )
  339. {
  340. m_strProxyUser = lpszProxyUser;
  341. CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
  342. ::WritePrivateProfileString( szProfile_Proxy, szProfile_ProxyUser, m_strProxyUser, sFileName );
  343. }
  344. CString CQSProfile::GetProxyPasswd( )
  345. {
  346. CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
  347. char szPasswd[CProxySocket::MaxLenPasswd+2];
  348. memset( szPasswd, 0, sizeof(szPasswd) );
  349. ::GetPrivateProfileString( szProfile_Proxy, szProfile_ProxyPasswd, "", szPasswd, sizeof(szPasswd)-2, sFileName );
  350. m_strProxyPasswd = szPasswd;
  351. return m_strProxyPasswd;
  352. }
  353. void CQSProfile::SetProxyPasswd( LPCTSTR lpszProxyPasswd )
  354. {
  355. m_strProxyPasswd = lpszProxyPasswd;
  356. CString sFileName = GetWorkDirectory() + szQuoteServerProfileName;
  357. ::WritePrivateProfileString( szProfile_Proxy, szProfile_ProxyPasswd, m_strProxyPasswd, sFileName );
  358. }
  359. static CString QSP_AfxGetFileDirectory( CString strPathName, CString strDefault )
  360. {
  361. if( strPathName.IsEmpty() )
  362. return strDefault;
  363. CString strResult = strPathName;
  364. if( strResult.GetLength() > 0 )
  365. {
  366. int nIndex = strResult.ReverseFind( '\' );
  367. if( -1 == nIndex )
  368. nIndex = strResult.ReverseFind( '/' );
  369. if( -1 == nIndex )
  370. strResult = strDefault;
  371. else
  372. strResult = strResult.Left( nIndex );
  373. }
  374. if( strResult.GetLength() <= 0 )
  375. return strDefault;
  376. int nLen = strResult.GetLength();
  377. if( nLen > 0 && strResult[nLen-1] != '\' && strResult[nLen-1] != '/' )
  378. strResult += "\";
  379. return strResult;
  380. }
  381. CString CQSProfile::GetWorkDirectory( )
  382. {
  383. if( m_strWorkDirectory.IsEmpty() )
  384. {
  385. TCHAR szLongPathName[_MAX_PATH];
  386. ::GetModuleFileName( AfxGetModuleHandle(), szLongPathName, _MAX_PATH);
  387. m_strWorkDirectory = QSP_AfxGetFileDirectory( szLongPathName, "" );
  388. }
  389. return m_strWorkDirectory;
  390. }
  391. int CQSProfile::GetCurrentServerIndex()
  392. {
  393. if( m_nCurrentServer < 0 || m_nCurrentServer >= m_aQuoteServers.GetSize() )
  394. m_nCurrentServer = 0;
  395. if( 0 == m_aQuoteServers.GetSize() )
  396. m_nCurrentServer = -1;
  397. return m_nCurrentServer;
  398. }
  399. CQuoteServer CQSProfile::GetCurrentServer()
  400. {
  401. CQuoteServer qs;
  402. int nIndex = GetCurrentServerIndex();
  403. if( nIndex >= 0 && nIndex < m_aQuoteServers.GetSize() )
  404. qs = m_aQuoteServers.ElementAt(nIndex);
  405. return qs;
  406. }
  407. void CQSProfile::SetCurrentServer( int nServer )
  408. {
  409. m_nCurrentServer = nServer;
  410. }
  411. BOOL CQSProfile::GetCycleConnect()
  412. {
  413. return m_bCycleConnect;
  414. }
  415. void CQSProfile::SetCycleConnect( BOOL bCycleConnect )
  416. {
  417. m_bCycleConnect = bCycleConnect;
  418. }
  419. CQuoteServerArray & CQSProfile::GetQuoteServers( )
  420. {
  421. return m_aQuoteServers;
  422. }
  423. int CQSProfile::AddQuoteServers( CQuoteServerArray & aNew )
  424. {
  425. int nCount = 0;
  426. for( int i=0; i<aNew.GetSize(); i++ )
  427. {
  428. CQuoteServer & qs = aNew.ElementAt(i);
  429. for( int j=0; j<m_aQuoteServers.GetSize(); j++ )
  430. {
  431. if( 0 == qs.m_strName.CompareNoCase(m_aQuoteServers.ElementAt(j).m_strName)
  432. || 0 == qs.m_strAddress.CompareNoCase(m_aQuoteServers.ElementAt(j).m_strAddress) )
  433. {
  434. m_aQuoteServers.SetAt( j, qs );
  435. nCount ++;
  436. break;
  437. }
  438. }
  439. if( j == m_aQuoteServers.GetSize() )
  440. {
  441. m_aQuoteServers.Add( qs );
  442. nCount ++;
  443. }
  444. }
  445. return nCount;
  446. }
  447. void SerializeAlias( CArchive & ar, CAliasArray & aAliases )
  448. {
  449. char szFileMagic[] = "NETTSALIAS";
  450. DWORD dwFileVersion = 0x20040825;
  451. if( ar.IsStoring() )
  452. {
  453. ar.WriteString( szFileMagic );
  454. ar << dwFileVersion;
  455. ar << (int)aAliases.GetSize();
  456. for( int i=0; i<aAliases.GetSize(); i++ )
  457. {
  458. CAlias & a = aAliases.ElementAt(i);
  459. ar << a.m_strName;
  460. ar << a.m_strValue;
  461. }
  462. }
  463. else
  464. {
  465. TCHAR buffer[64];
  466. memset( buffer, 0, sizeof(buffer) );
  467. ar.ReadString( buffer, strlen(szFileMagic) );
  468. if( 0 != strncmp( szFileMagic, buffer, strlen(szFileMagic) ) )
  469. return;
  470. DWORD dwVer;
  471. ar >> dwVer;
  472. if( dwVer > dwFileVersion )
  473. return;
  474. int size;
  475. ar >> size;
  476. if( size < 0 || size > 10000 ) // too big
  477. return;
  478. aAliases.SetSize( 0, size+2 );
  479. for( int i=0; i<size; i++ )
  480. {
  481. CAlias a;
  482. ar >> a.m_strName;
  483. ar >> a.m_strValue;
  484. aAliases.Add( a );
  485. }
  486. }
  487. }
  488. CString GetNetTSAliasFileName( )
  489. {
  490. TCHAR buffer[MAX_PATH];
  491. memset( buffer, 0, sizeof(buffer) );
  492. GetWindowsDirectory(buffer, sizeof(buffer));
  493. buffer[sizeof(buffer)-1] = 0;
  494. CString string = buffer;
  495. int nLen = string.GetLength();
  496. if( nLen > 0 && '\' != string[nLen-1] )
  497. string += '\';
  498. return string + "NetTSAlias";
  499. }
  500. BOOL CQSProfile::StoreAliases( CAliasArray & aNew )
  501. {
  502. m_aAliases.SetSize( 0, aNew.GetSize() + 2 );
  503. for( int i=0; i<aNew.GetSize(); i++ )
  504. {
  505. CAlias & alias = aNew.ElementAt(i);
  506. m_aAliases.Add( alias );
  507. }
  508. CFile file;
  509. if( file.Open( GetNetTSAliasFileName(), CFile::modeWrite | CFile::modeCreate ) )
  510. {
  511. CArchive ar( &file, CArchive::store );
  512. SerializeAlias( ar, m_aAliases );
  513. ar.Close();
  514. file.Close();
  515. return TRUE;
  516. }
  517. return FALSE;
  518. }
  519. BOOL CQSProfile::LoadAliases( )
  520. {
  521. CFile file;
  522. if( file.Open( GetNetTSAliasFileName(), CFile::modeRead ) )
  523. {
  524. DWORD dwLen = (DWORD)file.GetLength();
  525. if( 0 == dwLen || dwLen > 102400 ) // too big
  526. {
  527. file.Close();
  528. return FALSE;
  529. }
  530. CArchive ar( &file, CArchive::load );
  531. SerializeAlias( ar, m_aAliases );
  532. ar.Close();
  533. file.Close();
  534. return TRUE;
  535. }
  536. return FALSE;
  537. }
  538. CString CQSProfile::GetAlias( LPCTSTR lpszName )
  539. {
  540. for( int i=0; i<m_aAliases.GetSize(); i++ )
  541. {
  542. CAlias & alias = m_aAliases.ElementAt(i);
  543. if( 0 == alias.m_strName.CompareNoCase(lpszName) )
  544. return alias.m_strValue;
  545. }
  546. return lpszName;
  547. }