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

金融证券系统

开发平台:

Visual C++

  1. /*
  2. Cross Platform Core Code.
  3. Copyright(R) 2001-2002 Balang Software.
  4. All rights reserved.
  5. Using:
  6. class CPackages;
  7. class CNetDatabase;
  8. */
  9. #include "stdafx.h"
  10. #include "../Include/XMLDoc.h"
  11. #include "../Include/HttpClt.h"
  12. #include "../Include/NetDB.h"
  13. #include "../Include/InfoZip.h"
  14. #include "Strings.h"
  15. #include <direct.h>
  16. #include <io.h>
  17. #ifdef _DEBUG
  18. #undef THIS_FILE
  19. static char THIS_FILE[]=__FILE__;
  20. #define new DEBUG_NEW
  21. #endif
  22. const char *szMarkupStockana = "stockana"; // For CMarkup Use
  23. const char *szMarkupSetting = "setting"; // For CMarkup Use
  24. const char *szMarkupServer = "server"; // For CMarkup Use
  25. const char *szMarkupQuoteServer = "quoteserver"; // For CMarkup Use
  26. const char *szMarkupAlias = "alias"; // For CMarkup Use
  27. const char *szMarkupPackage = "package"; // For CMarkup Use
  28. const char *szMarkupElement = "element"; // For CMarkup Use
  29. const char *szSettingElement = "/stockana/setting/element";
  30. const char *szSettingType = "type";
  31. const char *szSettingValue = "value";
  32. const char *szSettingVersion = "version";
  33. const char *szSettingDataVersion= "dataversion";
  34. const char *szSettingBasepath = "basepath";
  35. const char *szSettingYearfmt = "yearfmt";
  36. const char *szSettingMonthfmt = "monthfmt";
  37. const char *szSettingDayfmt = "dayfmt";
  38. const char *szSettingInfo = "info";
  39. const char *szSettingInfourl = "infourl";
  40. const char *szSettingLatestver = "latestver";
  41. const char *szServerElement = "/stockana/server/element";
  42. const char *szServerAddress = "address";
  43. const char *szServerPort = "port";
  44. const char *szServerDescript = "discript";
  45. const char *szQuoteServerElement = "/stockana/quoteserver/element";
  46. const char *szQuoteServerName = "name";
  47. const char *szQuoteServerAddress= "address";
  48. const char *szQuoteServerPort = "port";
  49. const char *szQuoteServerUser = "user";
  50. const char *szQuoteServerPasswd = "passwd";
  51. const char *szAliasElement = "/stockana/alias/element";
  52. const char *szAliasName = "name";
  53. const char *szAliasValue = "value";
  54. const char *szPackageElement = "/stockana/package/element";
  55. const char *szPackageURL = "url";
  56. const char *szPackageType = "type";
  57. const char *szPackageTypeCode = "code";
  58. const char *szPackageTypeDay = "day";
  59. const char *szPackageTypeMin5 = "min5";
  60. const char *szPackageTypeDR = "dr";
  61. const char *szPackageTypeBasetext = "basetext";
  62. const char *szPackageTypeBasetable = "basetable";
  63. const char *szPackageLength = "length";
  64. const char *szPackageDescript = "discript";
  65. const char *szPackageFrom = "from";
  66. const char *szPackageTo = "to";
  67. const char *szPackageZipStatus = "zipstatus";
  68. const char *szPackageTimefmt = "timefmt";
  69. const char *szPackageAlternateURL = "alter";
  70. //////////////////////////////////////////////////////////////////////////////////
  71. // class CPackage
  72. CPackage::CPackage()
  73. {
  74. m_nType = packageUnknown;
  75. m_nLength = 0;
  76. m_tmFrom = CSPTime(NULL);
  77. m_tmTo = CSPTime(NULL);
  78. m_bIsZipped = FALSE;
  79. m_bIsTimefmt= FALSE;
  80. m_bDownloadOK = FALSE;
  81. m_pExpandPackages = NULL;
  82. }
  83. CPackage::CPackage( const CPackage &src )
  84. {
  85. m_pExpandPackages = NULL;
  86. *this = src;
  87. }
  88. CPackage::~CPackage( )
  89. {
  90. if( m_pExpandPackages )
  91. {
  92. delete m_pExpandPackages;
  93. m_pExpandPackages = NULL;
  94. }
  95. }
  96. CPackage & CPackage::operator = ( const CPackage &src )
  97. {
  98. if( m_pExpandPackages )
  99. {
  100. delete m_pExpandPackages;
  101. m_pExpandPackages = NULL;
  102. }
  103. m_strURL = src.m_strURL;
  104. m_strAlternateURL = src.m_strAlternateURL;
  105. m_nType = src.m_nType;
  106. m_tmFrom = src.m_tmFrom;
  107. m_tmTo = src.m_tmTo;
  108. m_nLength = src.m_nLength;
  109. m_strDescript = src.m_strDescript;
  110. m_bIsZipped = src.m_bIsZipped;
  111. m_bIsTimefmt = src.m_bIsTimefmt;
  112. // temp data
  113. m_bDownloadOK = src.m_bDownloadOK;
  114. m_strLocalFilename = src.m_strLocalFilename;
  115. if( src.HasExpandPackage() )
  116. {
  117. m_pExpandPackages = new CPackages;
  118. m_pExpandPackages->AppendPackages( src.m_pExpandPackages );
  119. }
  120. return *this;
  121. }
  122. BOOL CPackage::SetAttribute( CMarkup & markup )
  123. {
  124. m_nType = packageUnknown;
  125. CString strType = CXMLNode::getAttrValue( markup, szPackageType );
  126. if( 0 == strType.CompareNoCase( szPackageTypeCode ) )
  127. m_nType = packageCode;
  128. else if( 0 == strType.CompareNoCase( szPackageTypeDay ) )
  129. m_nType = packageDay;
  130. else if( 0 == strType.CompareNoCase( szPackageTypeMin5 ) )
  131. m_nType = packageMin5;
  132. else if( 0 == strType.CompareNoCase( szPackageTypeDR ) )
  133. m_nType = packageDR;
  134. else if( 0 == strType.CompareNoCase( szPackageTypeBasetext ) )
  135. m_nType = packageBasetext;
  136. else if( 0 == strType.CompareNoCase( szPackageTypeBasetable ) )
  137. m_nType = packageBasetable;
  138. m_strURL = CXMLNode::getAttrValue( markup, szPackageURL );
  139. m_strAlternateURL = CXMLNode::getAttrValue( markup, szPackageAlternateURL );
  140. m_tmFrom = CXMLNode::getAttrValue_T( markup, szPackageFrom );
  141. m_tmTo = CXMLNode::getAttrValue_T( markup, szPackageTo );
  142. m_nLength = CXMLNode::getAttrValue_I( markup, szPackageLength );
  143. m_strDescript = CXMLNode::getAttrValue( markup, szPackageDescript );
  144. m_bIsZipped = CXMLNode::getAttrValue_I( markup, szPackageZipStatus );
  145. m_bIsTimefmt= CXMLNode::getAttrValue_I( markup, szPackageTimefmt );
  146. if( m_tmFrom > m_tmTo )
  147. m_tmFrom = m_tmTo;
  148. if( m_tmTo.GetHour() == 0 )
  149. m_tmTo += CSPTimeSpan( 0, 23, 59, 59 );
  150. return TRUE;
  151. }
  152. BOOL CPackage::operator<(CPackage& p) const
  153. {
  154. return (m_tmFrom < p.m_tmFrom);
  155. }
  156. CString CPackage::GetURL( CString strBasePath )
  157. {
  158. if( !m_bIsTimefmt )
  159. return strBasePath + m_strURL;
  160. else
  161. {
  162. CSPTime time = CSPTime::GetCurrentTime();
  163. int nWeekDay = time.GetDayOfWeek( );
  164. if( nWeekDay == 1 )
  165. {
  166. time -= CSPTimeSpan( 2, 0, 0, 0 );
  167. }
  168. else if( nWeekDay == 7 )
  169. {
  170. time -= CSPTimeSpan( 1, 0, 0, 0 );
  171. }
  172. return strBasePath + (LPCTSTR)time.Format( m_strURL );
  173. }
  174. }
  175. BOOL CPackage::HasAlternateURL( ) const
  176. {
  177. return !m_strAlternateURL.IsEmpty();
  178. }
  179. CString CPackage::GetAlternateURL( CString strBasePath )
  180. {
  181. return strBasePath + m_strAlternateURL;
  182. }
  183. BOOL CPackage::HasExpandPackage( ) const
  184. {
  185. return ( m_pExpandPackages && m_pExpandPackages->GetSize() > 0 );
  186. }
  187. BOOL CPackage::ExpandYearPackage( CString strMonthfmt, CString strDayfmt, int nYear )
  188. {
  189. if( NULL != m_pExpandPackages )
  190. {
  191. delete m_pExpandPackages;
  192. m_pExpandPackages = NULL;
  193. }
  194. m_pExpandPackages = new CPackages( );
  195. if( m_pExpandPackages && !strMonthfmt.IsEmpty() )
  196. {
  197. int nMonthStart = 1;
  198. int nMonthEnd = 12;
  199. for( int nMonth=nMonthStart; nMonth<=nMonthEnd; nMonth ++ )
  200. {
  201. CPackage pac;
  202. pac.m_bIsTimefmt = FALSE;
  203. pac.m_bIsZipped = TRUE;
  204. pac.m_nLength = 400000;
  205. pac.m_nType = CPackage::packageDay;
  206. pac.m_strDescript.Format( szFmtMonthDescript, nYear, nMonth );
  207. CSPTime tmMonth( nYear, nMonth, 1, 0, 0, 0 );
  208. pac.m_strURL = tmMonth.Format( strMonthfmt );
  209. pac.m_tmFrom = CSPTime( nYear, nMonth, 1, 0, 0, 0 );
  210. pac.m_tmTo = CSPTime( nYear, nMonth, 31, 23, 59, 59 );
  211. if( nMonth == nMonthEnd )
  212. pac.ExpandMonthPackage( strDayfmt, nYear, nMonth );
  213. m_pExpandPackages->Add( pac );
  214. }
  215. return TRUE;
  216. }
  217. return FALSE;
  218. }
  219. BOOL CPackage::ExpandMonthPackage( CString strDayfmt, int nYear, int nMonth )
  220. {
  221. if( NULL != m_pExpandPackages )
  222. {
  223. delete m_pExpandPackages;
  224. m_pExpandPackages = NULL;
  225. }
  226. m_pExpandPackages = new CPackages( );
  227. if( m_pExpandPackages && !strDayfmt.IsEmpty() )
  228. {
  229. int nDayStart = 1;
  230. CSPTime tmDay( nYear, nMonth, nDayStart, 23, 0, 0 );
  231. for( ; tmDay.GetMonth() == nMonth; tmDay += CSPTimeSpan(1,0,0,0) )
  232. {
  233. CPackage pac;
  234. pac.m_bIsTimefmt = FALSE;
  235. pac.m_bIsZipped = FALSE;
  236. pac.m_nLength = 20000;
  237. pac.m_nType = CPackage::packageDay;
  238. pac.m_strDescript.Format( szFmtDayDescript, nYear, nMonth, tmDay.GetDay() );
  239. pac.m_strURL = tmDay.Format( strDayfmt );
  240. pac.m_tmFrom = CSPTime( nYear, nMonth, tmDay.GetDay(), 0, 0, 0 );
  241. pac.m_tmTo = CSPTime( nYear, nMonth, tmDay.GetDay(), 23, 59, 59 );
  242. if( tmDay.GetDayOfWeek() != 1 && tmDay.GetDayOfWeek() != 7 )
  243. m_pExpandPackages->Add( pac );
  244. }
  245. return TRUE;
  246. }
  247. return FALSE;
  248. }
  249. CPackages * CPackage::GetExpandPackages( )
  250. {
  251. ASSERT( HasExpandPackage() );
  252. return m_pExpandPackages;
  253. }
  254. void CPackage::DeleteExpandPackages( )
  255. {
  256. if( m_pExpandPackages )
  257. {
  258. delete m_pExpandPackages;
  259. m_pExpandPackages = NULL;
  260. }
  261. }
  262. //////////////////////////////////////////////////////////////////////////////////
  263. // class CPackages
  264. CPackages::CPackages()
  265. {
  266. Clear( );
  267. }
  268. CPackages::~CPackages()
  269. {
  270. Clear();
  271. }
  272. void CPackages::Clear( )
  273. {
  274. m_bIsOK = FALSE;
  275. m_xmlDocument.Release();
  276. m_strVersion.Empty();
  277. m_nDataVersion = 0;
  278. m_strBasePath.Empty();
  279. m_strYearfmt.Empty();
  280. m_strMonthfmt.Empty();
  281. m_strDayfmt.Empty();
  282. m_strInfo.Empty();
  283. m_strInfourl.Empty();
  284. m_strLatestver.Empty();
  285. SetSize( 0 );
  286. }
  287. BOOL CPackages::IsOK( )
  288. {
  289. return m_bIsOK;
  290. }
  291. BOOL CPackages::AddSmartAdditional( )
  292. {
  293. CSPTime tmLatest;
  294. GetLatestTime( tmLatest, CPackage::packageDay );
  295. CSPTime tmNow = CSPTime::GetCurrentTime();
  296. CSPTime tmBegin = tmLatest + CSPTimeSpan( 1, 0, 0, 0 );
  297. if( !m_strYearfmt.IsEmpty() )
  298. {
  299. int nYearStart = tmBegin.GetYear();
  300. int nYearEnd = tmNow.GetYear()-1;
  301. for( int nYear=nYearStart; nYear<=nYearEnd; nYear ++ )
  302. {
  303. CPackage pac;
  304. pac.m_bIsTimefmt = FALSE;
  305. pac.m_bIsZipped = TRUE;
  306. pac.m_nLength = 5000000;
  307. pac.m_nType = CPackage::packageDay;
  308. pac.m_strDescript.Format( szFmtYearDescript, nYear );
  309. CSPTime tmYear( nYear, tmBegin.GetMonth(), 1, 0, 0, 0 );
  310. pac.m_strURL = tmYear.Format( m_strYearfmt );
  311. pac.m_tmFrom = CSPTime( nYear, 1, 1, 0, 0, 0 );
  312. pac.m_tmTo = CSPTime( nYear, 12, 31, 23, 59, 59 );
  313. if( nYear == nYearEnd )
  314. pac.ExpandYearPackage( m_strMonthfmt, m_strDayfmt, nYear );
  315. Add( pac );
  316. }
  317. }
  318. if( !m_strMonthfmt.IsEmpty() )
  319. {
  320. int nMonthStart = 1;
  321. if( tmBegin.GetYear() == tmNow.GetYear() )
  322. nMonthStart = tmBegin.GetMonth();
  323. int nMonthEnd = tmNow.GetMonth()-1;
  324. for( int nMonth=nMonthStart; nMonth<=nMonthEnd; nMonth ++ )
  325. {
  326. CPackage pac;
  327. pac.m_bIsTimefmt = FALSE;
  328. pac.m_bIsZipped = TRUE;
  329. pac.m_nLength = 400000;
  330. pac.m_nType = CPackage::packageDay;
  331. pac.m_strDescript.Format( szFmtMonthDescript, tmNow.GetYear(), nMonth );
  332. CSPTime tmMonth( tmNow.GetYear(), nMonth, 1, 0, 0, 0 );
  333. pac.m_strURL = tmMonth.Format( m_strMonthfmt );
  334. pac.m_tmFrom = CSPTime( tmNow.GetYear(), nMonth, 1, 0, 0, 0 );
  335. pac.m_tmTo = CSPTime( tmNow.GetYear(), nMonth, 31, 23, 59, 59 );
  336. if( nMonth == nMonthEnd )
  337. pac.ExpandMonthPackage( m_strDayfmt, tmNow.GetYear(), nMonth );
  338. Add( pac );
  339. }
  340. }
  341. if( !m_strDayfmt.IsEmpty() )
  342. {
  343. int nDayStart = 1;
  344. if( tmBegin.GetYear() == tmNow.GetYear() && tmBegin.GetMonth() == tmNow.GetMonth() )
  345. nDayStart = tmBegin.GetDay();
  346. int nDayEnd = tmNow.GetDay();
  347. for( int nDay=nDayStart; nDay<=nDayEnd; nDay ++ )
  348. {
  349. CPackage pac;
  350. pac.m_bIsTimefmt = FALSE;
  351. pac.m_bIsZipped = FALSE;
  352. pac.m_nLength = 20000;
  353. pac.m_nType = CPackage::packageDay;
  354. pac.m_strDescript.Format( szFmtDayDescript, tmNow.GetYear(), tmNow.GetMonth(), nDay );
  355. CSPTime tmDay( tmNow.GetYear(), tmNow.GetMonth(), nDay, 23, 0, 0 );
  356. pac.m_strURL = tmDay.Format( m_strDayfmt );
  357. pac.m_tmFrom = CSPTime( tmNow.GetYear(), tmNow.GetMonth(), nDay, 0, 0, 0 );
  358. pac.m_tmTo = CSPTime( tmNow.GetYear(), tmNow.GetMonth(), nDay, 23, 59, 59 );
  359. if( tmDay.GetDayOfWeek() != 1 && tmDay.GetDayOfWeek() != 7 )
  360. Add( pac );
  361. }
  362. }
  363. return TRUE;
  364. }
  365. BOOL CPackages::SetRawXMLDocument( CString &strDoc )
  366. {
  367. Clear( );
  368. m_bIsOK = FALSE;
  369. if( m_xmlDocument.Initialize() )
  370. m_bIsOK = m_xmlDocument.SetRawDocument( strDoc );
  371. if( m_bIsOK )
  372. {
  373. m_bIsOK = ExtractFromXMLDoc( );
  374. }
  375. if( m_bIsOK )
  376. {
  377. m_bIsOK = AddSmartAdditional( );
  378. }
  379. return m_bIsOK;
  380. }
  381. BOOL CPackages::SetAttribute( CMarkup & markup )
  382. {
  383. CString strType = CXMLNode::getAttrValue( markup, szSettingType );
  384. if( 0 == strType.CompareNoCase(szSettingVersion) )
  385. m_strVersion = CXMLNode::getAttrValue( markup, szSettingValue );
  386. else if( 0 == strType.CompareNoCase(szSettingDataVersion) )
  387. m_nDataVersion = CXMLNode::getAttrValue_I( markup, szSettingValue );
  388. else if( 0 == strType.CompareNoCase(szSettingBasepath) )
  389. m_strBasePath = CXMLNode::getAttrValue( markup, szSettingValue );
  390. else if( 0 == strType.CompareNoCase(szSettingYearfmt) )
  391. m_strYearfmt = CXMLNode::getAttrValue( markup, szSettingValue );
  392. else if( 0 == strType.CompareNoCase(szSettingMonthfmt) )
  393. m_strMonthfmt = CXMLNode::getAttrValue( markup, szSettingValue );
  394. else if( 0 == strType.CompareNoCase(szSettingDayfmt) )
  395. m_strDayfmt = CXMLNode::getAttrValue( markup, szSettingValue );
  396. else if( 0 == strType.CompareNoCase(szSettingInfo) )
  397. m_strInfo = CXMLNode::getAttrValue( markup, szSettingValue );
  398. else if( 0 == strType.CompareNoCase(szSettingInfourl) )
  399. m_strInfourl = CXMLNode::getAttrValue( markup, szSettingValue );
  400. else if( 0 == strType.CompareNoCase(szSettingLatestver) )
  401. m_strLatestver = CXMLNode::getAttrValue( markup, szSettingValue );
  402. return TRUE;
  403. }
  404. BOOL CPackages::ExtractFromXMLDoc( )
  405. {
  406. CMarkup & markup = m_xmlDocument.Markup();
  407. // extract setting
  408. markup.ResetPos();
  409. if( !markup.FindElem(szMarkupStockana) )
  410. return FALSE;
  411. ASSERT( 0 == markup.GetTagName().Compare( szMarkupStockana ) );
  412. if( markup.FindChildElem(szMarkupSetting) )
  413. {
  414. markup.IntoElem();
  415. ASSERT( 0 == markup.GetTagName().Compare( szMarkupSetting ) );
  416. if( markup.FindChildElem( szMarkupElement ) )
  417. {
  418. do {
  419. markup.IntoElem();
  420. ASSERT( 0 == markup.GetTagName().Compare( szMarkupElement ) );
  421. if( !SetAttribute( markup ) )
  422. {
  423. m_xmlDocument.SetLastErrorMessage( szErrXMLServerSetting );
  424. return FALSE;
  425. }
  426. }while( markup.FindElem( szMarkupElement ) );
  427. }
  428. }
  429. // extract package
  430. markup.ResetPos();
  431. if( !markup.FindElem(szMarkupStockana) )
  432. return FALSE;
  433. ASSERT( 0 == markup.GetTagName().Compare( szMarkupStockana ) );
  434. if( markup.FindChildElem(szMarkupPackage) )
  435. {
  436. markup.IntoElem();
  437. ASSERT( 0 == markup.GetTagName().Compare( szMarkupPackage ) );
  438. if( markup.FindChildElem( szMarkupElement ) )
  439. {
  440. do {
  441. markup.IntoElem();
  442. ASSERT( 0 == markup.GetTagName().Compare( szMarkupElement ) );
  443. CPackage package;
  444. if( package.SetAttribute( markup ) )
  445. Add( package );
  446. } while( markup.FindElem( szMarkupElement ) );
  447. }
  448. }
  449. markup.ResetPos();
  450. return TRUE;
  451. /* OLD VERSION
  452. m_strVersion.Empty();
  453. m_nDataVersion = 0;
  454. m_strBasePath.Empty();
  455. SetSize( 0 );
  456. MSXML::IXMLDOMNodePtr pNodeRoot = m_xmlDocument.XMLDoc();
  457. try
  458. {
  459. // extract setting
  460. MSXML::IXMLDOMNodeListPtr pNodeList = pNodeRoot->selectNodes( szSettingElement );
  461. if( NULL != pNodeList )
  462. {
  463. for( int i=0; i<pNodeList->length; i++ )
  464. {
  465. MSXML::IXMLDOMNodePtr pNode = pNodeList->Getitem(i);
  466. if( !SetAttribute( pNode ) )
  467. {
  468. m_xmlDocument.SetLastErrorMessage( szErrXMLPackageSetting );
  469. return FALSE;
  470. }
  471. }
  472. }
  473. // extract package
  474. pNodeList = pNodeRoot->selectNodes( szPackageElement );
  475. if( NULL == pNodeList || 0 == pNodeList->length )
  476. {
  477. m_xmlDocument.SetLastErrorMessage( szErrXMLPackageData );
  478. return FALSE;
  479. }
  480. for( int i=0; i<pNodeList->length; i++ )
  481. {
  482. MSXML::IXMLDOMNodePtr pNode = pNodeList->Getitem(i);
  483. CPackage package;
  484. if( package.SetAttribute( pNode ) )
  485. Add( package );
  486. }
  487. }
  488. catch( _com_error e )
  489. {
  490. m_xmlDocument.SetLastErrorMessage( e.ErrorMessage() );
  491. return FALSE;
  492. }
  493. return TRUE;
  494. */
  495. }
  496. int SortPackage(const void *p1,const void *p2)
  497. {
  498. CPackage *pPackage1 = (CPackage *)p1;
  499. CPackage *pPackage2 = (CPackage *)p2;
  500. if( pPackage1 && pPackage2 && pPackage1->m_tmFrom < pPackage2->m_tmFrom )
  501. return -1;
  502. else if( pPackage1 && pPackage2 && pPackage1->m_tmFrom > pPackage2->m_tmFrom )
  503. return 1;
  504. return 0;
  505. }
  506. void CPackages::Sort( )
  507. {
  508. if( NULL != GetData() )
  509. qsort( GetData(), GetSize(), sizeof(CPackage), SortPackage );
  510. }
  511. void CPackages::AppendPackages( CPackages * psrc )
  512. {
  513. if( !psrc || psrc->GetSize() == 0 )
  514. return;
  515. int nOldSize = GetSize();
  516. SetSize( nOldSize + psrc->GetSize() );
  517. for( int i=0; i<psrc->GetSize(); i++ )
  518. {
  519. SetAt( nOldSize+i, psrc->GetAt(i) );
  520. }
  521. }
  522. BOOL CPackages::GetLatestTime( CSPTime &tm, int packagetype )
  523. {
  524. tm = CSPTime(NULL);
  525. BOOL bHas = FALSE;
  526. for( int i=0; i<GetSize(); i++ )
  527. {
  528. CPackage & pac = ElementAt(i);
  529. if( pac.m_nType == packagetype
  530. && tm < pac.m_tmTo )
  531. {
  532. tm = pac.m_tmTo;
  533. bHas = TRUE;
  534. }
  535. }
  536. if( !bHas )
  537. tm = CSPTime::GetCurrentTime();
  538. return TRUE;
  539. }
  540. BOOL CPackages::GetLastErrorMessage(LPTSTR lpszError, UINT nMaxError)
  541. {
  542. return m_xmlDocument.GetLastErrorMessage( lpszError, nMaxError );
  543. }
  544. //////////////////////////////////////////////////////////////////////////////////
  545. // class CDownloadServer
  546. CDownloadServer::CDownloadServer( const CDownloadServer &src )
  547. {
  548. *this = src;
  549. }
  550. CDownloadServer & CDownloadServer::operator = ( const CDownloadServer & src )
  551. {
  552. m_strAddress = src.m_strAddress;
  553. m_nPort = src.m_nPort;
  554. m_strDescript = src.m_strDescript;
  555. return *this;
  556. }
  557. BOOL CDownloadServer::SetAttribute( CMarkup & markup )
  558. {
  559. m_strAddress = CXMLNode::getAttrValue( markup, szServerAddress );
  560. m_nPort = CXMLNode::getAttrValue_I( markup, szServerPort );
  561. m_strDescript = CXMLNode::getAttrValue( markup, szServerDescript );
  562. #ifdef CLKLAN_ENGLISH_US
  563. if( !AfxIsEnglish( m_strDescript, m_strDescript.GetLength() ) )
  564. m_strDescript.Empty();
  565. #endif
  566. return TRUE;
  567. }
  568. BOOL CDownloadServer::FromString( CString string )
  569. {
  570. m_strAddress.Empty();
  571. m_nPort = INTERNET_DEFAULT_HTTP_PORT;
  572. m_strDescript.Empty();
  573. int nIndex = string.Find( ':' );
  574. if( -1 == nIndex )
  575. {
  576. m_strAddress = string;
  577. return m_strAddress.GetLength()>0;
  578. }
  579. m_strAddress = string.Left( nIndex );
  580. string = string.Mid( nIndex+1 );
  581. nIndex = string.Find( ':' );
  582. if( -1 == nIndex )
  583. {
  584. m_nPort = (INTERNET_PORT)atol(string);
  585. return m_strAddress.GetLength()>0;
  586. }
  587. m_nPort = (INTERNET_PORT)atol(string.Left(nIndex));
  588. m_strDescript = string.Mid(nIndex+1);
  589. return m_strAddress.GetLength()>0;
  590. }
  591. CString CDownloadServer::AsString( )
  592. {
  593. CString string;
  594. string.Format( "%s:%d:%s", m_strAddress, m_nPort, m_strDescript );
  595. return string;
  596. }
  597. BOOL AliasSetAttribute( CMarkup & markup, CAlias & alias )
  598. {
  599. alias.m_strName = CXMLNode::getAttrValue( markup, szAliasName );
  600. alias.m_strValue = CXMLNode::getAttrValue( markup, szAliasValue );
  601. return TRUE;
  602. }
  603. BOOL QuoteServerSetAttribute( CMarkup & markup, CQuoteServer & qs )
  604. {
  605. qs.m_strName = CXMLNode::getAttrValue( markup, szQuoteServerName );
  606. qs.m_strAddress = CXMLNode::getAttrValue( markup, szQuoteServerAddress );
  607. qs.m_nPort = CXMLNode::getAttrValue_I( markup, szQuoteServerPort );
  608. qs.m_strUser = CXMLNode::getAttrValue( markup, szQuoteServerUser );
  609. qs.m_strPasswd = CXMLNode::getAttrValue( markup, szQuoteServerPasswd );
  610. qs.m_bSavePasswd = TRUE;
  611. #ifdef CLKLAN_ENGLISH_US
  612. if( !AfxIsEnglish( qs.m_strName, qs.m_strName.GetLength() ) )
  613. qs.m_strName = qs.m_strAddress;
  614. #endif
  615. return TRUE;
  616. }
  617. //////////////////////////////////////////////////////////////////////////////////
  618. // class CServers
  619. CServers::CServers()
  620. {
  621. Clear( );
  622. }
  623. CServers::~CServers()
  624. {
  625. Clear();
  626. }
  627. void CServers::Clear( )
  628. {
  629. m_bIsOK = FALSE;
  630. m_xmlDocument.Release();
  631. m_strVersion.Empty();
  632. m_aDownloadServers.SetSize( 0 );
  633. m_aQuoteServers.SetSize( 0 );
  634. m_aAliases.SetSize( 0 );
  635. }
  636. BOOL CServers::IsOK( )
  637. {
  638. return m_bIsOK;
  639. }
  640. BOOL CServers::SetRawXMLDocument( CString &strDoc )
  641. {
  642. Clear( );
  643. m_bIsOK = FALSE;
  644. if( m_xmlDocument.Initialize() )
  645. m_bIsOK = m_xmlDocument.SetRawDocument( strDoc );
  646. if( m_bIsOK )
  647. {
  648. m_bIsOK = ExtractFromXMLDoc( );
  649. }
  650. return m_bIsOK;
  651. }
  652. BOOL CServers::SetAttribute( CMarkup & markup )
  653. {
  654. CString strType = CXMLNode::getAttrValue( markup, szSettingType );
  655. if( 0 == strType.CompareNoCase(szSettingVersion) )
  656. m_strVersion = CXMLNode::getAttrValue( markup, szSettingValue );
  657. return TRUE;
  658. }
  659. BOOL CServers::ExtractFromXMLDoc( )
  660. {
  661. CMarkup & markup = m_xmlDocument.Markup();
  662. // extract setting
  663. markup.ResetPos();
  664. if( !markup.FindElem(szMarkupStockana) )
  665. return FALSE;
  666. ASSERT( 0 == markup.GetTagName().Compare( szMarkupStockana ) );
  667. if( markup.FindChildElem(szMarkupSetting) )
  668. {
  669. markup.IntoElem();
  670. ASSERT( 0 == markup.GetTagName().Compare( szMarkupSetting ) );
  671. if( markup.FindChildElem( szMarkupElement ) )
  672. {
  673. do {
  674. markup.IntoElem();
  675. ASSERT( 0 == markup.GetTagName().Compare( szMarkupElement ) );
  676. if( !SetAttribute( markup ) )
  677. {
  678. m_xmlDocument.SetLastErrorMessage( szErrXMLServerSetting );
  679. return FALSE;
  680. }
  681. }while( markup.FindElem( szMarkupElement ) );
  682. }
  683. }
  684. // extract server
  685. markup.ResetPos();
  686. if( !markup.FindElem(szMarkupStockana) )
  687. return FALSE;
  688. ASSERT( 0 == markup.GetTagName().Compare( szMarkupStockana ) );
  689. if( markup.FindChildElem(szMarkupServer) )
  690. {
  691. markup.IntoElem();
  692. ASSERT( 0 == markup.GetTagName().Compare( szMarkupServer ) );
  693. if( markup.FindChildElem( szMarkupElement ) )
  694. {
  695. do {
  696. markup.IntoElem();
  697. ASSERT( 0 == markup.GetTagName().Compare( szMarkupElement ) );
  698. CDownloadServer server;
  699. if( server.SetAttribute( markup ) )
  700. m_aDownloadServers.Add( server );
  701. } while( markup.FindElem( szMarkupElement ) );
  702. }
  703. }
  704. // extract quote server
  705. markup.ResetPos();
  706. if( !markup.FindElem(szMarkupStockana) )
  707. return FALSE;
  708. ASSERT( 0 == markup.GetTagName().Compare( szMarkupStockana ) );
  709. if( markup.FindChildElem(szMarkupQuoteServer) )
  710. {
  711. markup.IntoElem();
  712. ASSERT( 0 == markup.GetTagName().Compare( szMarkupQuoteServer ) );
  713. if( markup.FindChildElem( szMarkupElement ) )
  714. {
  715. do {
  716. markup.IntoElem();
  717. ASSERT( 0 == markup.GetTagName().Compare( szMarkupElement ) );
  718. CQuoteServer server;
  719. if( QuoteServerSetAttribute( markup, server ) )
  720. m_aQuoteServers.Add( server );
  721. } while( markup.FindElem( szMarkupElement ) );
  722. }
  723. }
  724. // extract alias
  725. markup.ResetPos();
  726. if( !markup.FindElem(szMarkupStockana) )
  727. return FALSE;
  728. ASSERT( 0 == markup.GetTagName().Compare( szMarkupStockana ) );
  729. if( markup.FindChildElem(szMarkupAlias) )
  730. {
  731. markup.IntoElem();
  732. ASSERT( 0 == markup.GetTagName().Compare( szMarkupAlias ) );
  733. if( markup.FindChildElem( szMarkupElement ) )
  734. {
  735. do {
  736. markup.IntoElem();
  737. ASSERT( 0 == markup.GetTagName().Compare( szMarkupElement ) );
  738. CAlias alias;
  739. if( AliasSetAttribute( markup, alias ) )
  740. m_aAliases.Add( alias );
  741. } while( markup.FindElem( szMarkupElement ) );
  742. }
  743. }
  744. markup.ResetPos();
  745. return TRUE;
  746. /* OLD VERSION
  747. SetSize( 0 );
  748. m_strVersion.Empty();
  749. MSXML::IXMLDOMNodePtr pNodeRoot = m_xmlDocument.XMLDoc();
  750. try
  751. {
  752. // extract setting
  753. MSXML::IXMLDOMNodeListPtr pNodeList = pNodeRoot->selectNodes( szSettingElement );
  754. if( NULL != pNodeList )
  755. {
  756. for( int i=0; i<pNodeList->length; i++ )
  757. {
  758. MSXML::IXMLDOMNodePtr pNode = pNodeList->Getitem(i);
  759. if( !SetAttribute( pNode ) )
  760. {
  761. m_xmlDocument.SetLastErrorMessage( szErrXMLServerSetting );
  762. return FALSE;
  763. }
  764. }
  765. }
  766. // extract server
  767. pNodeList = pNodeRoot->selectNodes( szServerElement );
  768. if( NULL == pNodeList || 0 == pNodeList->length )
  769. {
  770. return TRUE;
  771. }
  772. for( int i=0; i<pNodeList->length; i++ )
  773. {
  774. MSXML::IXMLDOMNodePtr pNode = pNodeList->Getitem(i);
  775. CDownloadServer server;
  776. if( server.SetAttribute( pNode ) )
  777. m_aDownloadServers.Add( server );
  778. }
  779. }
  780. catch( _com_error e )
  781. {
  782. m_xmlDocument.SetLastErrorMessage( e.ErrorMessage() );
  783. return FALSE;
  784. }
  785. return TRUE;
  786. */
  787. }
  788. BOOL CServers::GetLastErrorMessage(LPTSTR lpszError, UINT nMaxError)
  789. {
  790. return m_xmlDocument.GetLastErrorMessage( lpszError, nMaxError );
  791. }
  792. BOOL CServers::SaveToProfile( )
  793. {
  794. CSPStringArray astrServers;
  795. for( int i=0; i<m_aDownloadServers.GetSize(); i++ )
  796. astrServers.Add( m_aDownloadServers.ElementAt(i).AsString() );
  797. AfxGetProfile().SetDownloadServers( astrServers );
  798. AfxGetProfile().StoreProfile();
  799. AfxGetQSProfile().AddQuoteServers( m_aQuoteServers );
  800. AfxGetQSProfile().StoreAliases( m_aAliases );
  801. AfxGetQSProfile().StoreProfile();
  802. return TRUE;
  803. }
  804. //////////////////////////////////////////////////////////////////////////////////
  805. // class CNetDatabase
  806. CNetDatabase::CNetDatabase( )
  807. {
  808. }
  809. CNetDatabase::~CNetDatabase( )
  810. {
  811. }
  812. BOOL CNetDatabase::SetServer( LPCTSTR lpszServer, INTERNET_PORT port )
  813. {
  814. if( !m_httpClient.SetServer( lpszServer, port ) )
  815. {
  816. SetLastError( ERR_NETDB_HTTPCLIENT );
  817. return FALSE;
  818. }
  819. return TRUE;
  820. }
  821. BOOL CNetDatabase::SetAccessType( int nAccessType, int nProxyType, LPCTSTR lpszProxyAddress, UINT nProxyPort,
  822. LPCSTR lpszProxyUser, LPCTSTR lpszProxyPasswd )
  823. {
  824. if( ! m_httpClient.SetAccessType( nAccessType, nProxyType, lpszProxyAddress, nProxyPort, lpszProxyUser, lpszProxyPasswd ) )
  825. {
  826. SetLastError( ERR_NETDB_HTTPCLIENT );
  827. return FALSE;
  828. }
  829. return TRUE;
  830. }
  831. BOOL CNetDatabase::Login( LPCTSTR lpszRegCode, LPCTSTR lpszUserName,
  832.   LPCTSTR lpszPasswd, LPCTSTR lpszVersion )
  833. {
  834. if( ! m_httpClient.Login( lpszRegCode, lpszUserName, lpszPasswd, lpszVersion ) )
  835. {
  836. SetLastError( ERR_NETDB_HTTPCLIENT );
  837. return FALSE;
  838. }
  839. return TRUE;
  840. }
  841. BOOL CNetDatabase::Logout( )
  842. {
  843. if( ! m_httpClient.Logout( ) )
  844. {
  845. SetLastError( ERR_NETDB_HTTPCLIENT );
  846. return FALSE;
  847. }
  848. return TRUE;
  849. }
  850. BOOL CNetDatabase::GetLastErrorMessage(LPTSTR lpszError, UINT nMaxError )
  851. {
  852. switch( GetLastError() )
  853. {
  854. case ERR_NETDB_HTTPCLIENT:
  855. return m_httpClient.GetLastErrorMessage( lpszError, nMaxError );
  856. case ERR_NETDB_PACKAGES:
  857. return m_packages.GetLastErrorMessage( lpszError, nMaxError );
  858. case ERR_NETDB_SERVERS:
  859. return m_servers.GetLastErrorMessage( lpszError, nMaxError );
  860. case ERR_NETDB_ZIPDLL:
  861. strncpy( lpszError, szErrZipDll, nMaxError );
  862. return strlen(lpszError)>0;
  863. case ERR_NETDB_ZIP:
  864. strncpy( lpszError, szErrZip, nMaxError );
  865. return strlen(lpszError)>0;
  866. default:
  867. return CStDatabase::GetLastErrorMessage( lpszError, nMaxError );
  868. }
  869. }
  870. CString CNetDatabase::GetProgressMessage(UINT nProgressCode)
  871. {
  872. CString string;
  873. switch( nProgressCode )
  874. {
  875. case PROG_HTTPCONNECTTING: string = szProgHttpConnectting; break;
  876. case PROG_REQUESTSENT: string = szProgRequestSent; break;
  877. case PROG_REDIRECTING: string = szProgRedirecting; break;
  878. case PROG_TRANSFERRING: string = szProgTransferring; break;
  879. case PROG_INSTALLPACKAGE: string = szProgInstallPackage; break;
  880. case PROG_EXTRACTZIPFILES: string = szProgExtractZipFiles; break;
  881. case PROG_ERRORPAC: string = szProgErrorPac; break;
  882. default:;
  883. }
  884. return string;
  885. }
  886. BOOL CNetDatabase::NetloadPackageInfo( PROGRESS_CALLBACK fnCallback, void *cookie )
  887. {
  888. CString strPackageInfo;
  889. if( !m_httpClient.LoadPackageInfo( strPackageInfo, fnCallback, cookie ) )
  890. {
  891. SetLastError( ERR_NETDB_HTTPCLIENT );
  892. return FALSE;
  893. }
  894. if( ! m_packages.SetRawXMLDocument( strPackageInfo ) )
  895. {
  896. SetLastError( ERR_NETDB_PACKAGES );
  897. return FALSE;
  898. }
  899. AfxGetProfile().SetNetInfo( m_packages.m_strInfo, m_packages.m_strInfourl );
  900. AfxGetProfile().SetLatestver( m_packages.m_strLatestver );
  901. return TRUE;
  902. }
  903. BOOL CNetDatabase::NetloadServerInfo( PROGRESS_CALLBACK fnCallback, void *cookie )
  904. {
  905. CString strServerInfo;
  906. if( !m_httpClient.LoadServerInfo( strServerInfo, fnCallback, cookie ) )
  907. {
  908. SetLastError( ERR_NETDB_HTTPCLIENT );
  909. return FALSE;
  910. }
  911. if( ! m_servers.SetRawXMLDocument( strServerInfo ) )
  912. {
  913. SetLastError( ERR_NETDB_SERVERS );
  914. return FALSE;
  915. }
  916. return TRUE;
  917. }
  918. int CNetDatabase::NetloadCodetbl( PROGRESS_CALLBACK fnCallback, void *cookie )
  919. {
  920. if( ! m_packages.IsOK() )
  921. return FALSE;
  922. CSPTime tmFrom(NULL);
  923. CSPTime tmTo = CSPTime::GetCurrentTime();
  924. return NetloadPackage( CPackage::packageCode, tmFrom, tmTo, fnCallback, cookie );
  925. }
  926. int CNetDatabase::NetloadDayKLine( LPCTSTR lpszStockCode, CSPTime *ptmFrom, CSPTime *ptmTo,
  927.    PROGRESS_CALLBACK fnCallback, void *cookie )
  928. {
  929. if( ! m_packages.IsOK() )
  930. return FALSE;
  931. CSPTime tmFrom(NULL), tmTo(NULL);
  932. if( NULL != ptmFrom )
  933. tmFrom = *ptmFrom;
  934. if( NULL != ptmTo )
  935. tmTo = *ptmTo;
  936. else
  937. GetLatestTimeNet( tmTo, CPackage::packageDay );
  938. return NetloadPackage( CPackage::packageDay, tmFrom, tmTo, fnCallback, cookie );
  939. }
  940. int CNetDatabase::Netload5MinKLine( LPCTSTR lpszStockCode, CSPTime *ptmFrom, CSPTime *ptmTo,
  941. PROGRESS_CALLBACK fnCallback, void *cookie )
  942. {
  943. if( ! m_packages.IsOK() )
  944. return FALSE;
  945. CSPTime tmFrom(NULL), tmTo(NULL);
  946. if( NULL != ptmFrom )
  947. tmFrom = *ptmFrom;
  948. if( NULL != ptmTo )
  949. tmTo = *ptmTo;
  950. else
  951. GetLatestTimeNet( tmTo, CPackage::packageMin5 );
  952. return NetloadPackage( CPackage::packageMin5, tmFrom, tmTo, fnCallback, cookie );
  953. }
  954. int CNetDatabase::NetloadDRData( LPCTSTR lpszStockCode, CSPTime *ptmFrom, CSPTime *ptmTo,
  955.  PROGRESS_CALLBACK fnCallback, void *cookie )
  956. {
  957. if( ! m_packages.IsOK() )
  958. return FALSE;
  959. CSPTime tmFrom(NULL), tmTo(NULL);
  960. if( NULL != ptmFrom )
  961. tmFrom = *ptmFrom;
  962. if( NULL != ptmTo )
  963. tmTo = *ptmTo;
  964. else
  965. GetLatestTimeNet( tmTo, CPackage::packageDR );
  966. return NetloadPackage( CPackage::packageDR, tmFrom, tmTo, fnCallback, cookie );
  967. }
  968. int CNetDatabase::NetloadBasetext( LPCTSTR lpszStockCode, CSPTime *ptmFrom, CSPTime *ptmTo,
  969.    PROGRESS_CALLBACK fnCallback, void *cookie )
  970. {
  971. if( ! m_packages.IsOK() )
  972. return FALSE;
  973. CSPTime tmFrom(NULL), tmTo(NULL);
  974. if( NULL != ptmFrom )
  975. tmFrom = *ptmFrom;
  976. else
  977. tmFrom = CSPTime(NULL);
  978. if( NULL != ptmTo )
  979. tmTo = *ptmTo;
  980. else
  981. GetLatestTimeNet( tmTo, CPackage::packageBasetext );
  982. return NetloadPackage( CPackage::packageBasetext, tmFrom, tmTo, fnCallback, cookie );
  983. }
  984. int CNetDatabase::NetloadBasetable( LPCTSTR lpszStockCode, CSPTime *ptmFrom, CSPTime *ptmTo,
  985.    PROGRESS_CALLBACK fnCallback, void *cookie )
  986. {
  987. if( ! m_packages.IsOK() )
  988. return FALSE;
  989. CSPTime tmFrom(NULL), tmTo(NULL);
  990. if( NULL != ptmFrom )
  991. tmFrom = *ptmFrom;
  992. else
  993. tmFrom = CSPTime(NULL);
  994. if( NULL != ptmTo )
  995. tmTo = *ptmTo;
  996. else
  997. GetLatestTimeNet( tmTo, CPackage::packageBasetable );
  998. return NetloadPackage( CPackage::packageBasetable, tmFrom, tmTo, fnCallback, cookie );
  999. }
  1000. struct progress_cookie_t {
  1001. DWORD nLenFinished;
  1002. DWORD nLenCur;
  1003. DWORD nLenTotal;
  1004. PROGRESS_CALLBACK fnCallbackSuper;
  1005. void * cookieSuper;
  1006. };
  1007. BOOL CALLBACK LocalProgressCallback(DWORD dwCode, DWORD dwProgress,
  1008. LPCTSTR lpszMsg, void *cookie)
  1009. {
  1010. struct progress_cookie_t *p = (struct progress_cookie_t *)cookie;
  1011. if( PROG_PROGRESS == dwCode )
  1012. {
  1013. DWORD dwLenCurFinished = DWORD( (double(dwProgress))*p->nLenCur / STKLIB_MAXF_PROGRESS );
  1014. if( dwLenCurFinished > p->nLenCur )
  1015. dwLenCurFinished = p->nLenCur;
  1016. DWORD dwTotalProgress = dwProgress;
  1017. if( p->nLenTotal > 0 )
  1018. dwTotalProgress = DWORD( STKLIB_MAXF_PROGRESS*(p->nLenFinished+dwLenCurFinished)/(p->nLenTotal) );
  1019. if( p->fnCallbackSuper )
  1020. return p->fnCallbackSuper( dwCode, dwTotalProgress, lpszMsg, p->cookieSuper );
  1021. return TRUE;
  1022. }
  1023. else
  1024. {
  1025. if( p->fnCallbackSuper )
  1026. return p->fnCallbackSuper( dwCode, dwProgress, lpszMsg, p->cookieSuper );
  1027. return TRUE;
  1028. }
  1029. }
  1030. int CNetDatabase::NetloadPackage( int nPackageType, CSPTime &tmFrom, CSPTime &tmTo,
  1031.   PROGRESS_CALLBACK fnCallback, void *cookie )
  1032. {
  1033. if( ! m_packages.IsOK() )
  1034. return FALSE;
  1035. m_packages.Sort( );
  1036. int nTotalLen = 0;
  1037. for( int i=0; i<m_packages.GetSize(); i++ )
  1038. {
  1039. CPackage & pac = m_packages.ElementAt(i);
  1040. if( pac.m_nType != nPackageType
  1041. || pac.m_tmTo < tmFrom
  1042. || pac.m_tmFrom > tmTo )
  1043. continue;
  1044. nTotalLen += pac.m_nLength;
  1045. }
  1046. struct progress_cookie_t cookieLocal;
  1047. cookieLocal.fnCallbackSuper = fnCallback;
  1048. cookieLocal.cookieSuper = cookie;
  1049. cookieLocal.nLenTotal = nTotalLen<<1;
  1050. cookieLocal.nLenFinished = 0;
  1051. for( i=0; i<m_packages.GetSize(); i++ )
  1052. {
  1053. CPackage pac = m_packages.ElementAt(i);
  1054. if( pac.m_nType != nPackageType
  1055. || pac.m_tmTo < tmFrom
  1056. || pac.m_tmFrom > tmTo )
  1057. continue;
  1058. cookieLocal.nLenCur = pac.m_nLength;
  1059. CFile file;
  1060. BOOL bOK = FALSE;
  1061. BOOL bExpand = FALSE;
  1062. CString sFileName;
  1063. if( GetTempFile( sFileName ) 
  1064. && file.Open( sFileName, CFile::modeCreate | CFile::modeReadWrite ) )
  1065. {
  1066. bOK = m_httpClient.LoadPackage( pac.GetURL( m_packages.m_strBasePath ), &file, LocalProgressCallback, &cookieLocal );
  1067. if( !bOK && pac.HasAlternateURL() )
  1068. {
  1069. file.Close();
  1070. if( file.Open( sFileName, CFile::modeCreate | CFile::modeReadWrite ) )
  1071. bOK = m_httpClient.LoadPackage( pac.GetAlternateURL(m_packages.m_strBasePath), &file, LocalProgressCallback, &cookieLocal );
  1072. }
  1073. if( !bOK && pac.HasExpandPackage( ) )
  1074. {
  1075. m_packages.AppendPackages( pac.GetExpandPackages() );
  1076. m_packages.ElementAt(i).DeleteExpandPackages();
  1077. bExpand = TRUE;
  1078. }
  1079. if( CFile::hFileNull != file.m_hFile )
  1080. file.Close();
  1081. m_packages.ElementAt(i).m_bDownloadOK = bOK;
  1082. m_packages.ElementAt(i).m_strLocalFilename = sFileName;
  1083. }
  1084. if( !bExpand )
  1085. cookieLocal.nLenFinished += pac.m_nLength;
  1086. }
  1087. int nCount = 0;
  1088. for( i=0; i<m_packages.GetSize(); i++ )
  1089. {
  1090. CPackage & pac = m_packages.ElementAt(i);
  1091. BOOL bOK = pac.m_bDownloadOK;
  1092. pac.m_bDownloadOK = FALSE;
  1093. if( bOK )
  1094. {
  1095. cookieLocal.nLenCur = pac.m_nLength;
  1096. bOK = InstallPackageEx( pac, pac.m_strLocalFilename, LocalProgressCallback, &cookieLocal );
  1097. if( !bOK && fnCallback )
  1098. {
  1099. CString str = pac.m_strDescript;
  1100. fnCallback( PROG_ERRORPAC, 0, str.GetBuffer(str.GetLength()+1), cookie );
  1101. str.ReleaseBuffer();
  1102. }
  1103. RemoveTempFile( pac.m_strLocalFilename );
  1104. LocalProgressCallback( PROG_PROGRESS, STKLIB_MAX_PROGRESS, NULL, &cookieLocal );
  1105. cookieLocal.nLenFinished += pac.m_nLength;
  1106. if( bOK )
  1107. nCount ++;
  1108. }
  1109. }
  1110. return nCount;
  1111. }
  1112. BOOL CNetDatabase::GetLatestTimeNet( CSPTime &tm, int packagetype )
  1113. {
  1114. return m_packages.GetLatestTime( tm, packagetype );
  1115. }
  1116. CServers & CNetDatabase::GetServers( )
  1117. {
  1118. return m_servers;
  1119. }
  1120. CPackages & CNetDatabase::GetPackages( )
  1121. {
  1122. return m_packages;
  1123. }
  1124. int CNetDatabase::GetMaxStockNumber( )
  1125. {
  1126. return CStDatabase::GetMaxStockNumber();
  1127. }
  1128. int CNetDatabase::LoadCodetable( CStockContainer & container )
  1129. {
  1130. return CStDatabase::LoadCodetable( container );
  1131. }
  1132. int CNetDatabase::LoadBaseText( CStock *pstock )
  1133. {
  1134. return CStDatabase::LoadBaseText( pstock );
  1135. }
  1136. int CNetDatabase::LoadKData( CStock *pstock, int period )
  1137. {
  1138. return CStDatabase::LoadKData( pstock, period );
  1139. }
  1140. int CNetDatabase::LoadDRData( CStock *pstock )
  1141. {
  1142. return CStDatabase::LoadDRData( pstock );
  1143. }
  1144. BOOL CNetDatabase::EmptyTempDirectory( LPCTSTR lpszPath )
  1145. {
  1146. CString strFinder;
  1147. if( NULL == lpszPath )
  1148. {
  1149. char szTempPath[MAX_PATH+1];
  1150. memset( szTempPath, 0, sizeof(szTempPath) );
  1151. if( GetSelfTempPath( szTempPath, MAX_PATH ) <= 0 )
  1152. return FALSE;
  1153. strFinder = szTempPath;
  1154. }
  1155. else
  1156. strFinder = lpszPath;
  1157. strFinder += "*";
  1158. CFileFind finder;
  1159. BOOL bWorking = finder.FindFile( strFinder );
  1160. while( bWorking )
  1161. {
  1162. bWorking = finder.FindNextFile();
  1163. DWORD attr = GetFileAttributes( finder.GetFilePath() );
  1164. if( 0xFFFFFFFF != attr && (attr & FILE_ATTRIBUTE_DIRECTORY) )
  1165. {
  1166. CString strName = finder.GetFileName();
  1167. if( 0 != strName.CompareNoCase(".") && 0 != strName.CompareNoCase("..") )
  1168. {
  1169. EmptyTempDirectory( finder.GetFilePath() + STRING_DIRSEP );
  1170. RemoveDirectory( finder.GetFilePath() );
  1171. }
  1172. }
  1173. else
  1174. {
  1175. DeleteFile( finder.GetFilePath() );
  1176. }
  1177. }
  1178. finder.Close();
  1179. return TRUE;
  1180. }
  1181. // protected method
  1182. BOOL CNetDatabase::GetTempFile( CString &rString )
  1183. {
  1184. char szTempPath[MAX_PATH+1];
  1185. memset( szTempPath, 0, sizeof(szTempPath) );
  1186. GetSelfTempPath( szTempPath, MAX_PATH );
  1187. if( 0 == strlen(szTempPath) )
  1188. GetTempPath( MAX_PATH, szTempPath );
  1189. if( 0 == strlen(szTempPath) )
  1190. return FALSE;
  1191. char szFile[MAX_PATH+1];
  1192. memset( szFile, 0, sizeof(szFile) );
  1193. if( 0!=GetTempFileName( szTempPath, "net", 0, szFile ) )
  1194. {
  1195. rString = szFile;
  1196. return TRUE;
  1197. }
  1198. return FALSE;
  1199. }
  1200. BOOL CNetDatabase::RemoveTempFile( CString sFileName )
  1201. {
  1202. return DeleteFile( sFileName );
  1203. }
  1204. BOOL CNetDatabase::OpenTempFile( CFile &file )
  1205. {
  1206. CString strFileName;
  1207. GetTempFile( strFileName );
  1208. BOOL bOpen = file.Open( strFileName, CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive );
  1209. if( !bOpen )
  1210. DeleteFile(strFileName);
  1211. return bOpen;
  1212. }
  1213. BOOL CNetDatabase::CloseAndRemoveTempFile( CFile &file )
  1214. {
  1215. if( CFile::hFileNull != file.m_hFile )
  1216. {
  1217. CString strFileName = file.GetFilePath( );
  1218. try{
  1219. file.Close();
  1220. }catch( CException * e ) { e->Delete(); }
  1221. return DeleteFile( strFileName );
  1222. }
  1223. return FALSE;
  1224. }
  1225. BOOL CNetDatabase::GetTempNewDirectory( CString &sTempNewDir )
  1226. {
  1227. char szTempPath[MAX_PATH+1];
  1228. memset( szTempPath, 0, sizeof(szTempPath) );
  1229. GetSelfTempPath( szTempPath, MAX_PATH );
  1230. if( 0 == strlen(szTempPath) )
  1231. GetTempPath( MAX_PATH, szTempPath );
  1232. if( 0 == strlen(szTempPath) )
  1233. return FALSE;
  1234. CString sDir = szTempPath;
  1235. sDir += "NFO";
  1236. srand( time(NULL) );
  1237. DWORD dw = rand() % 10000;
  1238. sTempNewDir.Format( "%s%.4d\", sDir, dw );
  1239. int nCount = 0;
  1240. while( 0 == access(sDir,0) )
  1241. {
  1242. nCount ++;
  1243. if( nCount > 1000 )
  1244. return FALSE;
  1245. dw ++;
  1246. sTempNewDir.Format( "%s%.4d\", sDir, dw );
  1247. }
  1248. return CreateDirectory( sTempNewDir, NULL );
  1249. }
  1250. BOOL CNetDatabase::RemoveTempNewDirectory( CString sTempNewDir )
  1251. {
  1252. CFileFind finder;
  1253. BOOL bWorking = finder.FindFile( sTempNewDir + "*.*" );
  1254. while( bWorking )
  1255. {
  1256. bWorking = finder.FindNextFile();
  1257. DeleteFile( finder.GetFilePath() );
  1258. }
  1259. finder.Close();
  1260. return RemoveDirectory(sTempNewDir);
  1261. }
  1262. int CNetDatabase::GetFileCount( const char * path, BOOL bRecurse )
  1263. {
  1264. if( NULL == path || strlen(path) == 0 )
  1265. return FALSE;
  1266. int nCount = 0;
  1267. CString strFinder = path;
  1268. if( strFinder.GetLength() > 0 &&
  1269. strFinder[strFinder.GetLength()-1] != '\' && strFinder[strFinder.GetLength()-1] != '/' )
  1270. strFinder += STRING_DIRSEP;
  1271. strFinder += "*";
  1272. CFileFind finder;
  1273. BOOL bWorking = finder.FindFile( strFinder );
  1274. while( bWorking )
  1275. {
  1276. bWorking = finder.FindNextFile();
  1277. DWORD attr = GetFileAttributes( finder.GetFilePath() );
  1278. if( 0xFFFFFFFF != attr && (attr & FILE_ATTRIBUTE_DIRECTORY) && bRecurse )
  1279. {
  1280. CString strName = finder.GetFileName();
  1281. if( 0 != strName.CompareNoCase(".") && 0 != strName.CompareNoCase("..") )
  1282. nCount += GetFileCount( finder.GetFilePath() + STRING_DIRSEP, bRecurse );
  1283. }
  1284. if( 0xFFFFFFFF != attr && !(attr & FILE_ATTRIBUTE_DIRECTORY) )
  1285. nCount ++;
  1286. }
  1287. finder.Close();
  1288. return nCount;
  1289. }
  1290. BOOL CNetDatabase::InstallPackageEx( CPackage &pac, const char *zipfilename,
  1291. PROGRESS_CALLBACK fnCallback, void *cookie )
  1292. {
  1293. if( !pac.m_bIsZipped )
  1294. {
  1295. if( fnCallback )
  1296. fnCallback( PROG_INSTALLPACKAGE, 0, NULL, cookie );
  1297. return InstallPackage( pac, zipfilename, fnCallback, cookie );
  1298. }
  1299. if( NULL == zipfilename || strlen(zipfilename) == 0 )
  1300. return FALSE;
  1301. CInfoZip InfoZip;
  1302. if (!InfoZip.InitializeUnzip())
  1303. {
  1304. SetLastError( ERR_NETDB_ZIPDLL );
  1305. return FALSE;
  1306. }
  1307. CString sTempNewDir;
  1308. if( !GetTempNewDirectory( sTempNewDir ) )
  1309. {
  1310. InfoZip.FinalizeUnzip();
  1311. return FALSE;
  1312. }
  1313. if( fnCallback )
  1314. fnCallback( PROG_EXTRACTZIPFILES, 0, NULL, cookie );
  1315. if (!InfoZip.ExtractFiles(zipfilename, sTempNewDir))
  1316. {
  1317. SetLastError( ERR_NETDB_ZIP );
  1318. InfoZip.FinalizeUnzip();
  1319. return FALSE;
  1320. }
  1321. if (!InfoZip.FinalizeUnzip())
  1322. {
  1323. SetLastError( ERR_NETDB_ZIPDLL );
  1324. }
  1325. if( fnCallback )
  1326. fnCallback( PROG_INSTALLPACKAGE, 0, NULL, cookie );
  1327. int nTotalCount = GetFileCount( sTempNewDir );
  1328. BOOL bRet = InstallPackagePath( pac, sTempNewDir, fnCallback, cookie, nTotalCount, 0 );
  1329. RemoveTempNewDirectory( sTempNewDir );
  1330. return bRet;
  1331. }
  1332. BOOL CNetDatabase::InstallPackagePath( CPackage &pac, const char *path,
  1333. PROGRESS_CALLBACK fnCallback, void *cookie,
  1334. int nTotalCount, int nFinishCount, BOOL bDeleteAfterInstall )
  1335. {
  1336. if( NULL == path || strlen(path) == 0 )
  1337. return FALSE;
  1338. CString strFinder = path;
  1339. if( strFinder[strFinder.GetLength()-1] != '\' && strFinder[strFinder.GetLength()-1] != '/' )
  1340. strFinder += STRING_DIRSEP;
  1341. strFinder += "*";
  1342. BOOL bRet = TRUE;
  1343. CFileFind finder;
  1344. BOOL bWorking = finder.FindFile( strFinder );
  1345. while( bWorking )
  1346. {
  1347. bWorking = finder.FindNextFile();
  1348. DWORD attr = GetFileAttributes( finder.GetFilePath() );
  1349. if( 0xFFFFFFFF != attr && (attr & FILE_ATTRIBUTE_DIRECTORY) )
  1350. {
  1351. CString strName = finder.GetFileName();
  1352. if( 0 != strName.CompareNoCase(".") && 0 != strName.CompareNoCase("..") )
  1353. {
  1354. bRet &= InstallPackagePath( pac, finder.GetFilePath() + STRING_DIRSEP,
  1355. fnCallback, cookie, nTotalCount, nFinishCount );
  1356. if( bDeleteAfterInstall )
  1357. RemoveDirectory( finder.GetFilePath() );
  1358. }
  1359. }
  1360. if( 0xFFFFFFFF != attr && !(attr & FILE_ATTRIBUTE_DIRECTORY) )
  1361. {
  1362. if( 1 == nTotalCount )
  1363. bRet &= InstallPackage( pac, finder.GetFilePath(), fnCallback, cookie );
  1364. else
  1365. bRet &= InstallPackage( pac, finder.GetFilePath(), fnCallback, cookie );
  1366. if( bDeleteAfterInstall )
  1367. DeleteFile( finder.GetFilePath() );
  1368. nFinishCount ++;
  1369. if( fnCallback && nTotalCount > 1 )
  1370. fnCallback( PROG_PROGRESS, DWORD(STKLIB_MAXF_PROGRESS*nFinishCount/nTotalCount), NULL, cookie );
  1371. }
  1372. }
  1373. finder.Close();
  1374. if( fnCallback )
  1375. fnCallback( PROG_PROGRESS, STKLIB_MAX_PROGRESS, NULL, cookie );
  1376. return bRet;
  1377. }
  1378. BOOL CNetDatabase::InstallPackage( CPackage &pac, const char *pacfile,
  1379.    PROGRESS_CALLBACK fnCallback, void *cookie )
  1380. {
  1381. CString strFilenameOrg;
  1382. if( pac.m_bIsZipped )
  1383. strFilenameOrg = pacfile;
  1384. else if( !pac.m_strURL.IsEmpty() )
  1385. strFilenameOrg = pac.m_strURL;
  1386. else
  1387. strFilenameOrg = pacfile;
  1388. int nIndex = strFilenameOrg.ReverseFind( '/' );
  1389. if( -1 != nIndex )
  1390. strFilenameOrg = strFilenameOrg.Mid( nIndex + 1 );
  1391. nIndex = strFilenameOrg.ReverseFind( '\' );
  1392. if( -1 != nIndex )
  1393. strFilenameOrg = strFilenameOrg.Mid( nIndex + 1 );
  1394. BOOL bOK = strFilenameOrg.GetLength() > 4;
  1395. if( bOK && CPackage::packageCode == pac.m_nType )
  1396. {
  1397. CString strDomainFile = AfxGetProfile().GetDomainFile();
  1398. int nIndex = strDomainFile.ReverseFind( '/' );
  1399. if( -1 != nIndex )
  1400. strDomainFile = strDomainFile.Mid( nIndex + 1 );
  1401. nIndex = strDomainFile.ReverseFind( '\' );
  1402. if( -1 != nIndex )
  1403. strDomainFile = strDomainFile.Mid( nIndex + 1 );
  1404. if( 0 == strFilenameOrg.CompareNoCase( strDomainFile ) ) // 板块数据
  1405. bOK = (InstallCodetblBlock( pacfile, strFilenameOrg ) >= 0 );
  1406. else if( 0 == strFilenameOrg.Right(4).CompareNoCase( ".blk" ) ) // 分析家板块
  1407. bOK = (InstallCodetblFxjBlock( pacfile, strFilenameOrg ) >= 0 );
  1408. else
  1409. bOK = (InstallCodetbl( pacfile, strFilenameOrg ) > 0 );
  1410. }
  1411. else if( bOK && CPackage::packageDay == pac.m_nType )
  1412. {
  1413. if( 0 == strFilenameOrg.Right(4).CompareNoCase( ".stk" ) ) // 通用格式
  1414. bOK = ( InstallKDataTy( pacfile, CKData::ktypeDay, fnCallback, cookie ) > 0 );
  1415. else if( 0 == strFilenameOrg.Right(4).CompareNoCase( ".dad" ) ) // 分析家格式
  1416. bOK = ( InstallKDataFxj( pacfile, CKData::ktypeDay, fnCallback, cookie ) > 0 );
  1417. else if( 0 == strFilenameOrg.Right(4).CompareNoCase( ".txt" ) ) // 说明文件
  1418. bOK = TRUE;
  1419. else
  1420. bOK = FALSE;
  1421. }
  1422. else if( bOK && CPackage::packageMin5 == pac.m_nType )
  1423. {
  1424. if( 0 == strFilenameOrg.Right(4).CompareNoCase( ".stk" ) ) // 通用格式
  1425. bOK = ( InstallKDataTy( pacfile, CKData::ktypeMin5, fnCallback, cookie ) > 0 );
  1426. else if( 0 == strFilenameOrg.Right(4).CompareNoCase( ".dad" ) ) // 分析家格式
  1427. bOK = ( InstallKDataFxj( pacfile, CKData::ktypeMin5, fnCallback, cookie ) > 0 );
  1428. else if( 0 == strFilenameOrg.Right(4).CompareNoCase( ".txt" ) ) // 说明文件
  1429. bOK = TRUE;
  1430. else
  1431. bOK = FALSE;
  1432. }
  1433. else if( bOK && CPackage::packageDR == pac.m_nType )
  1434. {
  1435. if( 0 == strFilenameOrg.Right(4).CompareNoCase( ".dat" ) ) // 普通格式
  1436. bOK = ( InstallDRDataClk( pacfile, strFilenameOrg ) > 0 );
  1437. else if( 0 == strFilenameOrg.Right(4).CompareNoCase( ".pwr" ) ) // 分析家除权格式
  1438. bOK = ( InstallDRDataFxj( pacfile ) > 0 );
  1439. else
  1440. bOK = FALSE;
  1441. }
  1442. else if( bOK && CPackage::packageBasetext == pac.m_nType )
  1443. {
  1444. if( 0 == strFilenameOrg.Right(4).CompareNoCase( ".txt" ) ) // 文本资料
  1445. bOK = ( InstallBaseText( pacfile, strFilenameOrg ) > 0 );
  1446. else
  1447. bOK = FALSE;
  1448. }
  1449. else if( bOK && CPackage::packageBasetable == pac.m_nType )
  1450. {
  1451. if( 0 == strFilenameOrg.Right(4).CompareNoCase( ".bst" ) ) // 财务格式
  1452. bOK = ( InstallBasetable( pacfile, strFilenameOrg ) > 0 );
  1453. else if( 0 == strFilenameOrg.Right(4).CompareNoCase( ".dbf" ) ) // 通达信财务格式
  1454. bOK = ( InstallBasetableTdx( pacfile ) > 0 );
  1455. else if( 0 == strFilenameOrg.Right(4).CompareNoCase( ".fin" ) ) // 分析家财务格式
  1456. bOK = ( InstallBasetableFxj( pacfile ) > 0 );
  1457. else
  1458. bOK = FALSE;
  1459. }
  1460. else
  1461. bOK = FALSE;
  1462. if( !bOK )
  1463. {
  1464. CFileStatus rStatus;
  1465. if( ! (CFile::GetStatus( pacfile, rStatus ) && rStatus.m_size > 0) )
  1466. bOK = TRUE;
  1467. }
  1468. if( !bOK && fnCallback )
  1469. {
  1470. CString string = pac.m_strDescript;
  1471. fnCallback( PROG_ERRORPAC, 0, string.GetBuffer(string.GetLength()+1), cookie );
  1472. string.ReleaseBuffer();
  1473. }
  1474. return bOK;
  1475. }