1 // ProgressDlg.cpp : implementation file
\r
5 #include "TortoiseProc.h"
\r
6 #include "ProgressDlg.h"
\r
9 // CProgressDlg dialog
\r
11 IMPLEMENT_DYNAMIC(CProgressDlg, CResizableStandAloneDialog)
\r
13 CProgressDlg::CProgressDlg(CWnd* pParent /*=NULL*/)
\r
14 : CResizableStandAloneDialog(CProgressDlg::IDD, pParent)
\r
19 CProgressDlg::~CProgressDlg()
\r
21 if(m_pThread != NULL)
\r
27 void CProgressDlg::DoDataExchange(CDataExchange* pDX)
\r
29 CDialog::DoDataExchange(pDX);
\r
30 DDX_Control(pDX, IDC_CURRENT, this->m_CurrentWork);
\r
31 DDX_Control(pDX, IDC_TITLE_ANIMATE, this->m_Animate);
\r
32 DDX_Control(pDX, IDC_RUN_PROGRESS, this->m_Progress);
\r
33 DDX_Control(pDX, IDC_LOG, this->m_Log);
\r
37 BEGIN_MESSAGE_MAP(CProgressDlg, CResizableStandAloneDialog)
\r
40 BOOL CProgressDlg::OnInitDialog()
\r
42 CResizableStandAloneDialog::OnInitDialog();
\r
44 AddAnchor(IDC_TITLE_ANIMATE, TOP_LEFT, TOP_RIGHT);
\r
45 AddAnchor(IDC_RUN_PROGRESS, TOP_LEFT,TOP_RIGHT);
\r
46 AddAnchor(IDC_LOG, TOP_LEFT,BOTTOM_RIGHT);
\r
48 AddAnchor(IDOK,BOTTOM_RIGHT);
\r
49 AddAnchor(IDCANCEL,BOTTOM_RIGHT);
\r
51 m_Animate.Open(IDR_DOWNLOAD);
\r
53 m_Log.SetWindowTextW(this->m_GitCmd+_T("\r\n\r\n"));
\r
54 m_CurrentWork.SetWindowTextW(_T(""));
\r
56 m_pThread = AfxBeginThread(ProgressThreadEntry, this, THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
\r
57 if (m_pThread==NULL)
\r
59 // ReportError(CString(MAKEINTRESOURCE(IDS_ERR_THREADSTARTFAILED)));
\r
63 m_pThread->m_bAutoDelete = FALSE;
\r
64 m_pThread->ResumeThread();
\r
69 UINT CProgressDlg::ProgressThreadEntry(LPVOID pVoid)
\r
71 return ((CProgressDlg*)pVoid)->ProgressThread();
\r
74 UINT CProgressDlg::ProgressThread()
\r
76 PROCESS_INFORMATION pi;
\r
79 m_Animate.Play(0,-1,-1);
\r
81 g_Git.RunAsync(this->m_GitCmd,&pi, &hRead);
\r
82 this->DialogEnableWindow(IDOK,FALSE);
\r
87 while(ReadFile(hRead,buffer,1,&readnumber,NULL))
\r
89 buffer[readnumber]=0;
\r
90 ParserCmdOutput((TCHAR)buffer[0]);
\r
93 CloseHandle(pi.hThread);
\r
95 WaitForSingleObject(pi.hProcess, INFINITE);
\r
98 if(!GetExitCodeProcess(pi.hProcess,&m_GitStatus))
\r
100 return GIT_ERROR_GET_EXIT_CODE;
\r
103 CloseHandle(pi.hProcess);
\r
105 CloseHandle(hRead);
\r
107 m_Progress.SetPos(100);
\r
108 this->DialogEnableWindow(IDOK,TRUE);
\r
114 int CProgressDlg::FindPercentage(CString &log)
\r
116 int s1=log.Find(_T('%'));
\r
121 for(int i=s1-1;i>=0;i--)
\r
123 if(log[i]>=_T('0') && log[i]<=_T('9'))
\r
128 return _ttol(log.Mid(s2,s1-s2));
\r
131 void CProgressDlg::ParserCmdOutput(TCHAR ch)
\r
133 TRACE(_T("%c"),ch);
\r
134 if( ch == _T('\r') || ch == _T('\n'))
\r
136 TRACE(_T("End Char %s \r\n"),ch==_T('\r')?_T("lf"):_T(""));
\r
137 TRACE(_T("End Char %s \r\n"),ch==_T('\n')?_T("cr"):_T(""));
\r
140 m_Log.GetWindowTextW(text);
\r
143 RemoveLastLine(text);
\r
145 text+=_T("\r\n")+m_LogText;
\r
146 m_Log.SetWindowTextW(text);
\r
148 int s1=m_LogText.Find(_T(':'));
\r
149 int s2=m_LogText.Find(_T('%'));
\r
152 this->m_CurrentWork.SetWindowTextW(m_LogText.Left(s1));
\r
153 int pos=FindPercentage(m_LogText);
\r
154 TRACE(_T("Pos %d\r\n"),pos);
\r
156 this->m_Progress.SetPos(pos);
\r
167 void CProgressDlg::RemoveLastLine(CString &str)
\r
170 start=str.ReverseFind(_T('\n'));
\r
172 str=str.Left(start);
\r
175 // CProgressDlg message handlers
\r