MultiBranchInfo.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. #include "StdAfx.h"
  2. #include "my32.h"
  3. #pragma comment(lib,"my32.lib")
  4. #include "MultiBranchInfo.h"
  5. extern BYTE byShotVersion[6][10] =
  6. {
  7. { 6, 0, 148, 11, 205, 50, 4, 171, 32, 39 }, // 儿童座席版;
  8. { 6, 0, 4, 29, 24, 247, 189, 95, 83, 76 }, // 婚纱座席版;
  9. { 6, 0, 4, 187, 103, 10, 59, 169, 240, 220 }, // 儿童企业版;
  10. { 6, 0, 137, 160, 230, 173, 202, 2, 117, 142 }, // 婚纱企业版;
  11. { 6, 0, 194, 199, 210, 67, 185, 1, 138, 195 }, // 儿童全能版;
  12. { 6, 0, 188, 145, 100, 47, 154, 177, 34, 205 }, // 婚纱全能版;
  13. };
  14. // endof------------6版本加密狗信息----------------;
  15. // start---------------加密表达式加密后的数组----------------------;
  16. extern BYTE byCalExVersion[7][114] =
  17. {
  18. // 儿童座席版;
  19. { 109, 0, 90, 15, 108, 138, 37, 190, 82, 8, 20, 252, 32, 162, 7, 8, 254, 255, 56, 245, 194, 4, 46, 120, 49, 120, 156, 27, 17, 164, 217,
  20. 79, 167, 146, 197, 69, 55, 117, 197, 149, 42, 217, 151, 195, 254, 145, 187, 197, 232, 188, 114, 223, 40, 229, 151, 245, 116, 177, 141, 94, 134, 14,
  21. 13, 169, 165, 94, 5, 216, 235, 60, 176, 38, 174, 121, 187, 174, 16, 30, 17, 20, 246, 34, 20, 252, 32, 162, 7, 8, 254, 255, 56, 245, 194,
  22. 4, 46, 120, 49, 120, 156, 27, 17, 164, 217, 79, 167, 146, 143, 132, 219, 173, 211, 2, 99, 180 },
  23. // 婚纱座席版;
  24. { 109, 0, 128, 13, 164, 143, 252, 87, 30, 48, 20, 21, 145, 114, 160, 96, 49, 127, 181, 32, 144, 213, 109, 99, 142, 219, 71, 26, 22, 220, 177,
  25. 179, 191, 82, 138, 45, 173, 160, 9, 83, 162, 106, 182, 175, 47, 92, 214, 78, 93, 21, 202, 165, 167, 200, 198, 172, 218, 74, 236, 194, 194, 228,
  26. 40, 27, 95, 60, 160, 173, 66, 185, 178, 7, 159, 220, 58, 71, 140, 19, 20, 37, 66, 84, 20, 21, 145, 114, 160, 96, 49, 127, 181, 32, 144,
  27. 213, 109, 99, 142, 219, 71, 26, 22, 220, 177, 179, 191, 82, 232, 182, 45, 27, 13, 195, 225, 204 },
  28. // 儿童企业版;
  29. { 109, 0, 229, 36, 223, 222, 213, 46, 70, 55, 240, 207, 237, 75, 226, 68, 133, 100, 42, 119, 89, 131, 79, 104, 158, 17, 172, 239, 4, 158, 201,
  30. 51, 62, 51, 94, 232, 14, 124, 81, 64, 100, 141, 187, 85, 156, 59, 205, 116, 200, 24, 108, 218, 145, 22, 7, 36, 45, 7, 156, 255, 170, 130,
  31. 165, 140, 99, 216, 120, 72, 171, 196, 27, 49, 138, 199, 137, 246, 214, 247, 121, 114, 215, 199, 240, 207, 237, 75, 226, 68, 133, 100, 42, 119, 89,
  32. 131, 79, 104, 158, 17, 172, 239, 4, 158, 201, 51, 62, 51, 248, 214, 27, 254, 221, 208, 181, 209 },
  33. // 婚纱企业版;
  34. { 109, 0, 94, 220, 40, 182, 30, 120, 56, 193, 78, 101, 1, 144, 68, 206, 192, 52, 67, 9, 243, 20, 9, 195, 153, 15, 22, 217, 243, 79, 177,
  35. 22, 24, 171, 185, 157, 172, 67, 117, 124, 153, 165, 3, 41, 218, 47, 149, 150, 48, 152, 75, 250, 204, 253, 92, 53, 121, 147, 242, 140, 80, 66,
  36. 34, 194, 16, 109, 237, 17, 222, 161, 96, 8, 11, 194, 58, 45, 86, 15, 207, 121, 247, 104, 78, 101, 1, 144, 68, 206, 192, 52, 67, 9, 243,
  37. 20, 9, 195, 153, 15, 22, 217, 243, 79, 177, 22, 24, 171, 122, 243, 190, 146, 77, 222, 208, 129 },
  38. // 儿童全能版;
  39. { 109, 0, 26, 222, 0, 239, 199, 199, 188, 225, 180, 168, 178, 208, 21, 79, 62, 90, 51, 31, 88, 128, 180, 105, 53, 137, 230, 254, 244, 50, 195,
  40. 49, 167, 143, 168, 125, 130, 125, 8, 73, 224, 120, 80, 95, 178, 49, 44, 158, 38, 38, 247, 169, 62, 187, 119, 192, 77, 194, 118, 246, 133, 241,
  41. 157, 62, 144, 24, 94, 173, 49, 192, 46, 250, 249, 239, 82, 78, 135, 3, 86, 154, 8, 135, 180, 168, 178, 208, 21, 79, 62, 90, 51, 31, 88,
  42. 128, 180, 105, 53, 137, 230, 254, 244, 50, 195, 49, 167, 143, 241, 214, 38, 180, 198, 3, 158, 165 },
  43. // 婚纱全能版;
  44. { 109, 0, 139, 145, 163, 176, 66, 18, 207, 79, 172, 200, 12, 124, 89, 151, 248, 238, 26, 85, 137, 146, 119, 58, 76, 194, 151, 239, 204, 104, 18,
  45. 166, 208, 54, 37, 85, 3, 174, 28, 74, 154, 156, 120, 194, 8, 112, 79, 42, 27, 89, 81, 95, 238, 74, 59, 199, 160, 101, 117, 179, 51, 138,
  46. 70, 176, 239, 182, 160, 212, 11, 33, 224, 74, 155, 143, 216, 10, 220, 71, 8, 168, 18, 175, 172, 200, 12, 124, 89, 151, 248, 238, 26, 85, 137,
  47. 146, 119, 58, 76, 194, 151, 239, 204, 104, 18, 166, 208, 54, 114, 118, 181, 24, 252, 41, 246, 88 },
  48. };
  49. // endof---------------加密表达式加密后的数组----------------------;
  50. TCHAR CMultiBranchInfo::m_szOurBranchId[MAX_PATH] = {0};
  51. CMultiBranchInfo::CMultiBranchInfo(void)
  52. {
  53. m_pOurBranchInfo = NULL;
  54. //memset(m_szOurBranchId,0,sizeof(TCHAR)*MAX_PATH);
  55. }
  56. CMultiBranchInfo::~CMultiBranchInfo(void)
  57. {
  58. RemoveAllBranchInf();
  59. CBranchInfo::RemoveNetShareInfo();
  60. CBranchInfo::RemvoeCatalogInfo();
  61. }
  62. /************************************************************************/
  63. /*
  64. 函数:AddBranchInfo
  65. 描述:添加新的分店的数据库实例,并启动分店的工作者线程;
  66. 参数:
  67. IN: dwCatalogPort 数据库实例映射端口;
  68. IN: lpCatalogSource 数据库实例地址;
  69. IN: lpCatalogAccount 数据库实例登陆账号;
  70. IN: lpCatalogPsw 数据库实例登陆密码;
  71. IN: lpCatalogName 数据库名称;
  72. 返回:添加成功返回TRUE;
  73. 要求:
  74. 注意:若是本店,需要读取本店记录的Version表和NetShareInfo表记录的公共信息;
  75. 示例:
  76. */
  77. /************************************************************************/
  78. BOOL CMultiBranchInfo::AddBranchInfo(
  79. IN CONST DWORD &dwCatalogPort,
  80. IN LPCTSTR lpCatalogSource,
  81. IN LPCTSTR lpCatalogAccount,
  82. IN LPCTSTR lpCatalogPsw,
  83. IN LPCTSTR lpCatalogName)
  84. {
  85. TCHAR szConnectString[MAX_PATH] = _T("");
  86. if (dwCatalogPort)
  87. {
  88. _stprintf_s(szConnectString, _T("driver={SQL Server};Server=%s,%d;database=%s;uid=%s;pwd=%s"),
  89. lpCatalogSource, dwCatalogPort, lpCatalogName, lpCatalogAccount, lpCatalogPsw);
  90. }
  91. else
  92. {
  93. _stprintf_s(szConnectString, _T("driver={SQL Server};Server=%s;database=%s;uid=%s;pwd=%s"),
  94. lpCatalogSource, lpCatalogName, lpCatalogAccount, lpCatalogPsw);
  95. }
  96. if ( IsCatalogExists(szConnectString) )
  97. {
  98. OutputDebugString(_T("数据库实例已存在\n"));
  99. return FALSE;
  100. }
  101. CBranchInfo *pBranchInfo = new CBranchInfo;
  102. if ( pBranchInfo == NULL )
  103. {
  104. OutputDebugString(_T("内存不足创建对象\n"));
  105. return FALSE;
  106. }
  107. pBranchInfo->SetConn(szConnectString);
  108. if( !pBranchInfo->OpenCatalog() )
  109. {
  110. delete pBranchInfo;
  111. pBranchInfo = NULL;
  112. OutputDebugString(_T("打开数据库实例失败\n"));
  113. return FALSE;
  114. }
  115. pBranchInfo->GetTblBranchId();
  116. m_vtMultiBranchInfo.push_back(pBranchInfo);
  117. #if TEST_CREATE_DIRECTORY
  118. // 无加密狗时测试;
  119. if ( _tcscmp(m_szOurBranchId,_T("")) == 0 )
  120. {
  121. _stprintf_s(m_szOurBranchId,pBranchInfo->GetDoMain());
  122. }
  123. #endif
  124. if ( _tcscmp(pBranchInfo->GetDoMain(), m_szOurBranchId) == 0 )
  125. {
  126. // 本店,标识为本店;
  127. OutputDebugString(_T("该域名为本店域名\n"));
  128. pBranchInfo->SetOurFlag();
  129. pBranchInfo->GetTblVersion();
  130. pBranchInfo->GetTblCatalogInfo();
  131. pBranchInfo->GetTblNetShareInfo();
  132. m_pOurBranchInfo = pBranchInfo;
  133. // 本店对象开始工作;
  134. pBranchInfo->StartThread();
  135. }
  136. return TRUE;
  137. }
  138. /************************************************************************/
  139. /*
  140. 函数:IsBranchInfoExists
  141. 描述:判断分店数据库实例是否存在;
  142. 参数:
  143. IN: pBranchInfo 分店实例对象指针;
  144. 返回:存在返回TRUE,否则返回FALSE;
  145. 要求:
  146. 注意:
  147. 示例:
  148. */
  149. /************************************************************************/
  150. BOOL CMultiBranchInfo::IsBranchInfoExists(IN CONST CBranchInfo* pBranchInfo)
  151. {
  152. if ( pBranchInfo == NULL ) return FALSE;
  153. BOOL bExist = FALSE;
  154. for ( MULTBRANCH::const_iterator it = m_vtMultiBranchInfo.begin(); it != m_vtMultiBranchInfo.end(); it++)
  155. {
  156. if ( _tcscmp(pBranchInfo->GetDoMain(),(*it)->GetDoMain()) == 0 )
  157. {
  158. //return TRUE;
  159. bExist = TRUE;
  160. break;
  161. }
  162. }
  163. return bExist;
  164. }
  165. /************************************************************************/
  166. /*
  167. 函数:IsCatalogExists
  168. 描述:判断数据库实例连接是否存在;
  169. 参数:
  170. IN: lpConnectString 连接数据库实例的连接串;
  171. 返回:若该数据库实例连接存在返回TRUE,否则返回FALSE;
  172. 要求:
  173. 注意:
  174. */
  175. /************************************************************************/
  176. BOOL CMultiBranchInfo::IsCatalogExists(IN LPCTSTR lpConnectString)
  177. {
  178. BOOL bExists = FALSE;
  179. CBranchInfo *pBranchObj = NULL;
  180. for ( MULTBRANCH::iterator it = m_vtMultiBranchInfo.begin(); it != m_vtMultiBranchInfo.end();it++)
  181. {
  182. pBranchObj = *it;
  183. if ( _tcscmp(pBranchObj->GetConnectString(), lpConnectString) == 0 )
  184. {
  185. bExists = TRUE;
  186. break;
  187. }
  188. }
  189. return bExists;
  190. }
  191. /************************************************************************/
  192. /*
  193. 函数:FindPortEx
  194. 描述:查找域天加密狗中指定的信息;
  195. 参数:
  196. IN: start 查找的起始端口号;
  197. IN: InByte 加密的算法内容;
  198. IN: InLen InByte的长度;
  199. OUT: OutPath 返回域天加密狗所在的端口号;
  200. 返回:成功返回0;
  201. 要求:
  202. 注意:
  203. 示例:
  204. */
  205. /************************************************************************/
  206. INT CMultiBranchInfo::FindPortEx(IN int start, IN BYTE *InByte, IN int InLen, OUT char *OutPath)
  207. {
  208. int n;
  209. int ret;
  210. int D[8];
  211. double F[8];
  212. char s0[50] = "", s1[50] = "", s2[50] = "", s3[50] = "", s4[50] = "", s5[50] = "", s6[50] = "", s7[50] = "";
  213. //查找系统上所有的锁;
  214. for (n = 0; n < 256; n++)
  215. {
  216. ZeroMemory(OutPath, sizeof(MAX_PATH));
  217. ret = FindPort(n, OutPath);
  218. if (ret != 0 && n == 0)return -1053;//表示系统上没有任何智能锁;
  219. if (ret != 0)return ret;
  220. //使用该设备路径锁进行运算;
  221. ret = CalEx(InByte, InLen, &D[0], &D[1], &D[2], &D[3], &D[4], &D[5], &D[6], &D[7],
  222. &F[0], &F[1], &F[2], &F[3], &F[4], &F[5], &F[6], &F[7],
  223. s0, s1, s2, s3, s4, s5, s6, s7, OutPath, 20000);
  224. //如果正确,则返回该设备路径供以后使用;
  225. if (ret == -63)return ret;
  226. if ((ret == 0) && (D[0] == 123))return 0;
  227. }
  228. return -53;
  229. }
  230. /************************************************************************/
  231. /*
  232. 函数:GetOurBranchId
  233. 描述:获取域天加密狗内保存的分店域名值;
  234. 参数:
  235. 返回:
  236. 要求:
  237. 注意:
  238. 示例:
  239. */
  240. /************************************************************************/
  241. BOOL CMultiBranchInfo::GetOurBranchId()
  242. {
  243. int nIndex = 0;
  244. CHAR szUSBKeyPath[MAX_PATH] = "";
  245. for (; nIndex < 6; nIndex++)
  246. {
  247. if ( 0 == FindPortEx(0, byShotVersion[nIndex], 10, szUSBKeyPath) )
  248. break;
  249. }
  250. if (nIndex > 5)
  251. {
  252. OutputDebugString(_T("未找到加密狗!\n"));
  253. return FALSE;
  254. }
  255. // 再获取本机加密狗的s1位置字符串;
  256. INT nUnit[8] = {0};
  257. double fUnit[8] = {0.0};
  258. char cUnit[8][50] = {""};
  259. int nRet = CalEx(byCalExVersion[nIndex],114,
  260. &nUnit[0],&nUnit[1],&nUnit[2],&nUnit[3],&nUnit[4],&nUnit[5],&nUnit[6],&nUnit[7],
  261. &fUnit[0],&fUnit[1],&fUnit[2],&fUnit[3],&fUnit[4],&fUnit[5],&fUnit[6],&fUnit[7],
  262. cUnit[0],cUnit[1],cUnit[2],cUnit[3],cUnit[4],cUnit[5],cUnit[6],cUnit[7],
  263. szUSBKeyPath,200);
  264. if ( nRet != 0 && nRet != -43)
  265. {
  266. OutputDebugString(_T("加密狗信息无效!\n"));
  267. return FALSE;
  268. }
  269. USES_CONVERSION;
  270. _stprintf_s(m_szOurBranchId,_T("%s"),A2W(cUnit[1]));
  271. OutputDebugString(m_szOurBranchId);
  272. return TRUE;
  273. }
  274. /************************************************************************/
  275. /*
  276. 函数:RemoveAllBranchInf
  277. 描述:移除所有分店实例对象;
  278. 参数:
  279. 返回:
  280. 要求:
  281. 注意:
  282. 示例:
  283. */
  284. /************************************************************************/
  285. void CMultiBranchInfo::RemoveAllBranchInf()
  286. {
  287. CBranchInfo *pBranchInfo = NULL;
  288. for ( MULTBRANCH::iterator it = m_vtMultiBranchInfo.begin(); it != m_vtMultiBranchInfo.end();)
  289. {
  290. pBranchInfo = *it;
  291. it = m_vtMultiBranchInfo.erase(it);
  292. delete pBranchInfo;
  293. pBranchInfo = NULL;
  294. }
  295. }
  296. /************************************************************************/
  297. /*
  298. 函数:GetOurBranchObj
  299. 描述:获取本店的数据实例对象;
  300. 参数:
  301. 返回:返回本店实例对象;
  302. 要求:
  303. 注意:
  304. */
  305. /************************************************************************/
  306. CBranchInfo* CMultiBranchInfo::GetOurBranchObj()
  307. {
  308. if(m_pOurBranchInfo)
  309. return m_pOurBranchInfo;
  310. for(MULTBRANCH::iterator it = m_vtMultiBranchInfo.begin(); it != m_vtMultiBranchInfo.end(); it++)
  311. {
  312. if ( (*it)->GetOurFlag() )
  313. {
  314. m_pOurBranchInfo = *it;
  315. break;
  316. }
  317. }
  318. return m_pOurBranchInfo;
  319. }
  320. /************************************************************************/
  321. /*
  322. 函数:GetTbl_Version
  323. 描述:获取表Version的信息;
  324. 参数:
  325. OUT: AryOfValues 返回的数据集;
  326. 返回:成功获取且记录大于0返回TRUE;
  327. 要求:
  328. 注意:
  329. */
  330. /************************************************************************/
  331. BOOL CMultiBranchInfo::GetTblVersion(IN LPCTSTR lpBranchId, OUT CArray<CStringArray,CStringArray> &AryOfValues)
  332. {
  333. // 当参数为空或NULL时,返回本店域名;
  334. CBranchInfo *pBranchInfo = NULL;
  335. if (lpBranchId == NULL || _tcscmp(lpBranchId,_T("")) == 0 )
  336. {
  337. pBranchInfo = GetOurBranchObj();
  338. }
  339. else
  340. {
  341. pBranchInfo = GetBranchObj(lpBranchId);
  342. }
  343. if ( pBranchInfo == NULL )
  344. return FALSE;
  345. pBranchInfo->GetTblVersion();
  346. return TRUE;
  347. }
  348. /************************************************************************/
  349. /*
  350. 函数:GetBranchObj
  351. 描述:获取指定域名的分店数据库实例对象;
  352. 参数:
  353. OUT: lpBranchId 分店域名;
  354. 返回:返回分店实例对象;
  355. 要求:
  356. 注意:
  357. */
  358. /************************************************************************/
  359. CBranchInfo* CMultiBranchInfo::GetBranchObj(IN LPCTSTR lpBranchId)
  360. {
  361. // 当参数为空或NULL时,返回本店域名;
  362. if (lpBranchId == NULL || _tcscmp(lpBranchId,_T("")) == 0 )
  363. {
  364. return GetOurBranchObj();
  365. }
  366. CBranchInfo *pBranchObj = NULL;
  367. for(MULTBRANCH::iterator it = m_vtMultiBranchInfo.begin(); it != m_vtMultiBranchInfo.end(); it++)
  368. {
  369. if (_tcscmp((*it)->GetBranchId(),lpBranchId) == 0 )
  370. {
  371. pBranchObj = *it;
  372. break;
  373. }
  374. }
  375. return pBranchObj;
  376. }