GetZZLCommander.cpp
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:10k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19. #include "stdafx.h"
  20. #include "GetZZLCommander.h"
  21. #include "GetZZLDisplayDlg.h"
  22. CGetZZLCommander::CGetZZLCommander() :miCount(0)
  23. {
  24. mhGetZZL = NULL;
  25. miStopFlag = 1;
  26. mlstSourceFile.clear();
  27. mbClose = FALSE;
  28. CreateDebugInfo();
  29. mbRunThread = FALSE;
  30. }
  31. CGetZZLCommander::~CGetZZLCommander()
  32. {
  33. if (NULL != mhGetZZL)
  34. {
  35. ::CloseGetZZL(mhGetZZL);
  36. mhGetZZL = NULL;
  37. }
  38. mhGetZZL = NULL;
  39. list<STRU_SOURCE_FILE>::iterator litSourceFile = mlstSourceFile.begin();
  40. while (litSourceFile != mlstSourceFile.end())
  41. {
  42. delete (*litSourceFile).mszSourceFile;
  43. (*litSourceFile).mszSourceFile = NULL;
  44. delete (*litSourceFile).mszSourceFileName;
  45. (*litSourceFile).mszSourceFileName = NULL;
  46. ++litSourceFile;
  47. }
  48. }
  49. //创建调试信息(日志)
  50. bool CGetZZLCommander::CreateDebugInfo()
  51. {
  52.     char strPath[255];
  53. char strLogFileName[255];
  54. //首先设置日志打印选项
  55. CDebugTrace::SetTraceLevel(6);
  56. CDebugTrace::SetTraceOptions(CDebugTrace::GetTraceOptions() 
  57. | CDebugTrace::Timestamp & ~CDebugTrace::LogLevel 
  58. & ~CDebugTrace::FileAndLine | CDebugTrace::AppendToFile
  59. & ~CDebugTrace::PrintToConsole);
  60. if (!GetModuleFileName(NULL,strPath, 255))
  61. {
  62. TRACE1("CMediaCenter::CreateDebugInfo:GetModuleFileName()函数返回失败!n");
  63. return false;
  64. }
  65. //从strPath中去掉文件名,从而取得可执行文件的路径;
  66. int nPosition = 0;
  67. nPosition = (int)(strrchr(strPath,'\') - strPath);
  68. strPath[nPosition+1] = '';
  69. //生成日志目录
  70. strcat(strPath, "日志文件\");
  71. if(TRUE != CreateDirectory(strPath, NULL))
  72. {
  73. int i = GetLastError();
  74. if (ERROR_ACCESS_DENIED != i && ERROR_ALREADY_EXISTS != i)
  75. {
  76. MessageBox(NULL, "创建文件夹失败", "错误", MB_OK|MB_ICONSTOP);
  77. }
  78. }
  79. //生成TRACE文件名
  80. SYSTEMTIME loSystemTime;
  81. GetLocalTime(&loSystemTime);
  82. sprintf(strLogFileName, "%sGetZZLDisplay%4d%02d%02d%s", strPath,loSystemTime.wYear,
  83. loSystemTime.wMonth,loSystemTime.wDay,".log");
  84. //sprintf(strLogFileName, "%sUTMedia%4d%02d%02d%s", strPath,loSystemTime.wYear,loSystemTime.wMonth,loSystemTime.wDay,".log");
  85. //strcat(strPath, "GetZZLDisplay.log");
  86. CDebugTrace::SetLogFileName(strLogFileName);
  87. TraceLog1("===============GetZZLDisplay%4d年%02d%月%02d日处理日志====================n",
  88. loSystemTime.wYear, loSystemTime.wMonth,loSystemTime.wDay);
  89. TraceLog1("===============北京高维视讯 ================================n");
  90. TraceLog1("===============作者: 谢洲为xiezhouwei@hotmail.com=====================n");
  91. return true;
  92. }
  93. void CGetZZLCommander::CreateInstance()
  94. {
  95. if (NULL == mhGetZZL)
  96. {
  97. mhGetZZL = CreateGetZZL();
  98. }
  99. }
  100. //获取源文件名
  101. BOOL CGetZZLCommander::SetSourceFile(CString& astrSourceFile,CString& astrSourceFileName)
  102. {
  103. astrSourceFileName.Trim();
  104. CAuto lock(&mocritsec);
  105. STRU_SOURCE_FILE lstruSourceFile = {0};
  106. lstruSourceFile.mszSourceFile = new char[MAX_PATH + 1];
  107. lstruSourceFile.mszSourceFileName = new char[MAX_PATH + 1];
  108. ZeroMemory(lstruSourceFile.mszSourceFile, sizeof(lstruSourceFile.mszSourceFile));
  109. ZeroMemory(lstruSourceFile.mszSourceFileName, sizeof(lstruSourceFile.mszSourceFileName));
  110. strncpy(lstruSourceFile.mszSourceFile, astrSourceFile, MAX_PATH);
  111. strncpy(lstruSourceFile.mszSourceFileName, astrSourceFileName, MAX_PATH);
  112. list<STRU_SOURCE_FILE>::iterator litSourceFile = mlstSourceFile.begin();
  113. while (litSourceFile != mlstSourceFile.end())
  114. {
  115. if (astrSourceFile == (*litSourceFile).mszSourceFile)
  116. {
  117. return FALSE;
  118. }
  119. ++litSourceFile;
  120. }
  121. mlstSourceFile.push_back(lstruSourceFile);
  122. TraceLog1("添加文件“%s”n", lstruSourceFile.mszSourceFileName);
  123. return TRUE;
  124. }
  125. void CGetZZLCommander::DelSourceFile(CString& astrSourceFileName)
  126. {
  127. CAuto lock(&mocritsec);
  128. list<STRU_SOURCE_FILE>::iterator litSourceFile = mlstSourceFile.begin();
  129. while (litSourceFile != mlstSourceFile.end())
  130. {
  131. if (astrSourceFileName == (*litSourceFile).mszSourceFileName)
  132. {
  133. TraceLog1("删除文件“%s”n", (*litSourceFile).mszSourceFileName);
  134. delete (*litSourceFile).mszSourceFile;
  135. (*litSourceFile).mszSourceFile = NULL;
  136. delete (*litSourceFile).mszSourceFileName;
  137. (*litSourceFile).mszSourceFileName = NULL;
  138. mlstSourceFile.erase(litSourceFile);
  139. break;
  140. }
  141. ++ litSourceFile;
  142. }
  143. }
  144. //设置回调
  145. int CGetZZLCommander::GetZZLState(void* apUserPara,int aiState)
  146. {
  147. CGetZZLCommander* lpGetZZLCommander = (CGetZZLCommander*)apUserPara;
  148. switch(aiState)
  149. {
  150. case 1:
  151. lpGetZZLCommander->miStopFlag = 1;
  152. //MessageBox(NULL, "已经停止", "通告",MB_OK);
  153. lpGetZZLCommander->Stop();
  154. break;
  155. case -1:
  156. lpGetZZLCommander->miStopFlag = -1;
  157. default:
  158. lpGetZZLCommander->miStopFlag = 0;
  159. }
  160. return 1;
  161. }
  162. //开始运行
  163. BOOL CGetZZLCommander::RunCommader(CWnd* apWnd)
  164. {
  165. ASSERT(apWnd);
  166. mpWnd = apWnd;
  167. BOOL lbIsSuccess = TRUE;
  168. if (0 == mlstSourceFile.size())
  169. {
  170. MessageBox(NULL, "用户没有添加任何文件,请重新开始","错误",MB_OK|MB_ICONSTOP);
  171. return FALSE;
  172. }
  173. if (''== (LPCTSTR)mstrBuffer[0])
  174. {
  175. MessageBox(NULL, "缓存路径不能为空","错误",MB_OK|MB_ICONSTOP);
  176. return FALSE;
  177. }
  178. if (TRUE == mbRunThread)
  179. {
  180. return lbIsSuccess;
  181. }
  182. mbRunThread = TRUE;
  183. DWORD dwThreadId = 0;
  184. HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ConvertZZL,this,0,&dwThreadId);
  185. if( hThread == NULL)
  186. {
  187. return FALSE;
  188. }
  189. mbRunThread = FALSE;
  190. return lbIsSuccess;
  191. }
  192. void CGetZZLCommander::ConvertZZL( CGetZZLCommander* pParam)
  193. {
  194. CGetZZLCommander* lpCommander = (CGetZZLCommander*) pParam;
  195. char lszInfo[1024] = {0};
  196. lpCommander->mocritsec.Enter();
  197. lpCommander->mbClose = FALSE;
  198. lpCommander->mocritsec.Leave();
  199. list<STRU_SOURCE_FILE>::iterator litSourceFile = lpCommander->mlstSourceFile.begin();
  200. int i = lpCommander->miCount;
  201. while (0 != i)
  202. {
  203. litSourceFile ++;
  204. i --;
  205. }
  206. int liError = 0;
  207. while (litSourceFile != lpCommander->mlstSourceFile.end())
  208. {
  209.     lpCommander->CreateInstance();
  210.     ASSERT(lpCommander->mhGetZZL);
  211.     SetStateProc(lpCommander->mhGetZZL, &GetZZLState, lpCommander);
  212. if (TRUE == lpCommander->mbClose)
  213. {
  214. break;
  215. }
  216. //CreateInstance();
  217. TraceLog1("开始处理%s文件n",(*litSourceFile).mszSourceFileName);
  218. if (NULL == (*litSourceFile).mszSourceFile || NULL == (*litSourceFile).mszSourceFileName)
  219. {
  220. MessageBox(NULL, "要转换的源文件或文件名读取错误", "错误", MB_OK|MB_ICONSTOP);
  221. TraceLog1("要转换的源文件或文件名读取错误n");
  222. TraceLog1("结束处理%s文件,该文件处理失败n",(*litSourceFile).mszSourceFileName);
  223. lpCommander->mbRunThread = FALSE;
  224. return ;
  225. }
  226. if (NULL == (LPCTSTR)lpCommander->mstrBuffer || TRUE == lpCommander->mstrBuffer.IsEmpty())
  227. {
  228. MessageBox(NULL, "保存路径出错,请设置保存路径", "错误", MB_OK|MB_ICONSTOP);
  229. TraceLog1("保存路径出错,请设置保存路径n");
  230. TraceLog1("结束处理%s文件,该文件处理失败n",(*litSourceFile).mszSourceFileName);
  231. lpCommander->mbRunThread = FALSE;
  232. return ;
  233. }
  234. ZeroMemory(&lszInfo,sizeof(lszInfo));
  235. sprintf(lszInfo,"共%d个文件n“%s” n正在转换......, 第%d个文件,已有%d个文件失败。", lpCommander->mlstSourceFile.size(), (*litSourceFile).mszSourceFileName, 1+i, liError);
  236. lpCommander->mpWnd->GetDlgItem(IDC_STATE_TEXT)->SetWindowText(lszInfo);
  237. if (TRUE == (*litSourceFile).mbFinished)
  238. {
  239. TraceLog1("文件“%s”已经被处理过了。如果还想重复处理,请重新打开本程序n", (*litSourceFile).mszSourceFileName);
  240. ++ litSourceFile;
  241. continue;
  242. }
  243. if (FALSE == SetFileName(lpCommander->mhGetZZL, (*litSourceFile).mszSourceFile, lpCommander->mstrBuffer,(*litSourceFile).mszSourceFileName))
  244. {
  245. if (litSourceFile != lpCommander->mlstSourceFile.end())
  246. {
  247. ++ liError;
  248. //::CloseGetZZL(lpCommander->mhGetZZL);
  249. //lpCommander->mhGetZZL = NULL;
  250. TraceLog1("结束处理%s文件,该文件处理失败,共%d个文件失败n",(*litSourceFile).mszSourceFileName, liError);
  251. (*litSourceFile).mbFinished = TRUE;
  252. ++ litSourceFile;
  253. continue;
  254. }
  255. lpCommander->mpWnd->GetDlgItem(IDC_BTN_ADD)->EnableWindow(TRUE);
  256. lpCommander->mpWnd->GetDlgItem(IDC_BTN_DEL)->EnableWindow(TRUE);
  257. lpCommander->mbRunThread = FALSE;
  258. return;
  259. }
  260. //lbIsSuccess = Run(mhGetZZL);
  261. Run(lpCommander->mhGetZZL);
  262. lpCommander->miStopFlag = 0;
  263. while(0 == lpCommander->miStopFlag && FALSE == lpCommander->mbClose) 
  264. {
  265. lpCommander->mpWnd->GetDlgItem(IDC_STATE_TEXT)->SetWindowText(lszInfo);
  266. Sleep(1000);
  267. }
  268. TraceLog1("结束处理%s文件。n",(*litSourceFile).mszSourceFileName, liError);
  269. if (FALSE == lpCommander->mbClose)
  270. {
  271. (*litSourceFile).mbFinished = TRUE;
  272. }
  273. //::CloseGetZZL(mhGetZZL);
  274. //mhGetZZL = NULL;
  275. ++ litSourceFile;
  276. ++ i;
  277.         if (NULL != lpCommander->mhGetZZL)
  278.     {
  279.     ::CloseGetZZL(lpCommander->mhGetZZL);
  280.     lpCommander->mhGetZZL = NULL;
  281.     }
  282. }
  283. char lstrtemp[MAX_PATH];
  284. if (FALSE == lpCommander->mbClose)
  285. {
  286. sprintf(lstrtemp, "转化结束,共%d个文件。", lpCommander->mlstSourceFile.size());
  287. lpCommander->miCount = 0;
  288. }
  289. else
  290. {
  291. strcpy(lstrtemp, "转化停止");
  292. }
  293. lpCommander->mpWnd->GetDlgItem(IDC_BTN_ADD)->EnableWindow(TRUE);
  294. lpCommander->mpWnd->GetDlgItem(IDC_BTN_DEL)->EnableWindow(TRUE);
  295. lpCommander->mpWnd->GetDlgItem(IDC_STATE_TEXT)->SetWindowText(NULL);
  296. MessageBox(NULL, lstrtemp,"ZZL转化Graph",MB_OK|MB_ICONINFORMATION);
  297. TraceLog1("%sn",lstrtemp);
  298. lpCommander->mbRunThread = FALSE;
  299. }
  300. void CGetZZLCommander::Stop()
  301. {
  302. if (NULL != mhGetZZL)
  303. {
  304. ::Stop(mhGetZZL);
  305. }
  306. }
  307. void CGetZZLCommander::SetClose()
  308. {
  309. CAuto lock(&mocritsec);
  310. mbClose = TRUE;
  311. }
  312. void CGetZZLCommander::SetBuffer(CString& astrBuffer)
  313. {
  314. mstrBuffer = astrBuffer;
  315. }