{\r
m_pThread = NULL;\r
m_bAltAbortPress=false;\r
+ m_bBufferAll=false;\r
}\r
\r
CProgressDlg::~CProgressDlg()\r
}\r
\r
//static function, Share with SyncDialog\r
-UINT CProgressDlg::RunCmdList(CWnd *pWnd,std::vector<CString> &cmdlist,bool bShowCommand,CString *pfilename,bool *bAbort)\r
+UINT CProgressDlg::RunCmdList(CWnd *pWnd,std::vector<CString> &cmdlist,bool bShowCommand,CString *pfilename,bool *bAbort,std::vector<TCHAR>*pdata)\r
{\r
UINT ret=0;\r
\r
\r
pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_START,0);\r
\r
+ if(pdata)\r
+ pdata->clear();\r
+ \r
for(int i=0;i<cmdlist.size();i++)\r
{\r
if(cmdlist[i].IsEmpty())\r
CString str;\r
str+= cmdlist[i]+_T("\n\n");\r
for(int j=0;j<str.GetLength();j++)\r
- pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,str[j]);\r
+ {\r
+ if(pdata)\r
+ pdata->push_back(str[j]);\r
+ else\r
+ pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,str[j]);\r
+ }\r
+ if(pdata)\r
+ pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,0);\r
}\r
\r
g_Git.RunAsync(cmdlist[i],&pi, &hRead,pfilename);\r
while(ReadFile(hRead,buffer,1,&readnumber,NULL))\r
{\r
buffer[readnumber]=0;\r
- pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,(TCHAR)buffer[0]);\r
+ \r
+ if(pdata)\r
+ {\r
+ pdata->push_back((TCHAR)buffer[0]);\r
+\r
+ if(buffer[0] == '\r' || buffer[0] == '\n')\r
+ pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,0);\r
+ }else\r
+ pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,buffer[0]);\r
}\r
\r
CloseHandle(pi.hThread);\r
else\r
pfilename=&m_LogFile; \r
\r
- m_GitStatus = RunCmdList(this,m_GitCmdList,m_bShowCommand,pfilename,&m_bAbort);;\r
+ m_GitStatus = RunCmdList(this,m_GitCmdList,m_bShowCommand,pfilename,&m_bAbort,&this->m_Databuf);;\r
return 0;\r
}\r
\r
{\r
if(wParam == MSG_PROGRESSDLG_START)\r
{\r
+ m_BufStart = 0 ;\r
m_Animate.Play(0,-1,-1);\r
this->DialogEnableWindow(IDOK,FALSE);\r
}\r
if(wParam == MSG_PROGRESSDLG_END || wParam == MSG_PROGRESSDLG_FAILED)\r
{\r
+ if(m_bBufferAll)\r
+ {\r
+ m_Databuf.push_back(0);\r
+ InsertCRLF();\r
+ m_Log.SetWindowText(&m_Databuf[0]);\r
+ }\r
+ m_BufStart=0;\r
+ this->m_Databuf.clear();\r
+\r
m_bDone = true;\r
m_Animate.Stop();\r
m_Progress.SetPos(100);\r
DialogEnableWindow(IDCANCEL, FALSE);\r
}\r
\r
- if(lParam != 0)\r
- ParserCmdOutput((TCHAR)lParam);\r
-\r
+ if(!m_bBufferAll)\r
+ {\r
+ if(lParam == 0)\r
+ {\r
+ for(int i=this->m_BufStart;i<this->m_Databuf.size();i++)\r
+ {\r
+ ParserCmdOutput(this->m_Databuf[m_BufStart]);\r
+ m_BufStart++;\r
+ }\r
+ }else\r
+ ParserCmdOutput((TCHAR)lParam);\r
+ }\r
return 0;\r
}\r
\r
}\r
void CProgressDlg::OnCancel()\r
{\r
+ m_bAbort = true;\r
if(m_bDone)\r
{\r
CResizableStandAloneDialog::OnCancel();\r
return;\r
}\r
+\r
+ if( g_Git.m_CurrentGitPi.hProcess )\r
+ {\r
+ if(::GenerateConsoleCtrlEvent(CTRL_C_EVENT,0))\r
+ {\r
+ ::WaitForSingleObject(g_Git.m_CurrentGitPi.hProcess ,10000);\r
+ }else\r
+ {\r
+ int error=::GetLastError();\r
+ }\r
+\r
+ HANDLE hProcessHandle = ::OpenProcess( PROCESS_TERMINATE, FALSE,g_Git.m_CurrentGitPi.dwProcessId);\r
+ if( hProcessHandle )\r
+ if(!::TerminateProcess(hProcessHandle,-1) )\r
+ {\r
+ int error =::GetLastError();\r
+ }\r
+ }\r
\r
- m_bAbort = true;\r
+ ::WaitForSingleObject(g_Git.m_CurrentGitPi.hProcess ,10000);\r
+ CResizableStandAloneDialog::OnCancel();\r
+\r
}\r
+\r
+void CProgressDlg::InsertCRLF()\r
+{\r
+ for(int i=0;i<m_Databuf.size();i++)\r
+ {\r
+ if(m_Databuf[i]==_T('\n'))\r
+ {\r
+ if(i==0 || m_Databuf[i-1]!= _T('\r'))\r
+ {\r
+ m_Databuf.insert(m_Databuf.begin()+i,_T('\r'));\r
+ i++;\r
+ }\r
+ }\r
+ }\r
+}
\ No newline at end of file