--- /dev/null
+// ProgressDlg.cpp : implementation file\r
+//\r
+\r
+#include "stdafx.h"\r
+#include "TortoiseProc.h"\r
+#include "ProgressDlg.h"\r
+#include "Git.h"\r
+#include "atlconv.h"\r
+// CProgressDlg dialog\r
+\r
+IMPLEMENT_DYNAMIC(CProgressDlg, CResizableStandAloneDialog)\r
+\r
+CProgressDlg::CProgressDlg(CWnd* pParent /*=NULL*/)\r
+ : CResizableStandAloneDialog(CProgressDlg::IDD, pParent)\r
+{\r
+\r
+}\r
+\r
+CProgressDlg::~CProgressDlg()\r
+{\r
+ if(m_pThread != NULL)\r
+ {\r
+ delete m_pThread;\r
+ }\r
+}\r
+\r
+void CProgressDlg::DoDataExchange(CDataExchange* pDX)\r
+{\r
+ CDialog::DoDataExchange(pDX);\r
+ DDX_Control(pDX, IDC_CURRENT, this->m_CurrentWork);\r
+ DDX_Control(pDX, IDC_TITLE_ANIMATE, this->m_Animate);\r
+ DDX_Control(pDX, IDC_RUN_PROGRESS, this->m_Progress);\r
+ DDX_Control(pDX, IDC_LOG, this->m_Log);\r
+}\r
+\r
+\r
+BEGIN_MESSAGE_MAP(CProgressDlg, CResizableStandAloneDialog)\r
+END_MESSAGE_MAP()\r
+\r
+BOOL CProgressDlg::OnInitDialog()\r
+{\r
+ CResizableStandAloneDialog::OnInitDialog();\r
+\r
+ AddAnchor(IDC_TITLE_ANIMATE, TOP_LEFT, TOP_RIGHT);\r
+ AddAnchor(IDC_RUN_PROGRESS, TOP_LEFT,TOP_RIGHT);\r
+ AddAnchor(IDC_LOG, TOP_LEFT,BOTTOM_RIGHT);\r
+\r
+ AddAnchor(IDOK,BOTTOM_RIGHT);\r
+ AddAnchor(IDCANCEL,BOTTOM_RIGHT);\r
+\r
+ m_Animate.Open(IDR_DOWNLOAD);\r
+ \r
+ m_Log.SetWindowTextW(this->m_GitCmd+_T("\r\n\r\n"));\r
+ m_CurrentWork.SetWindowTextW(_T(""));\r
+\r
+ m_pThread = AfxBeginThread(ProgressThreadEntry, this, THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);\r
+ if (m_pThread==NULL)\r
+ {\r
+// ReportError(CString(MAKEINTRESOURCE(IDS_ERR_THREADSTARTFAILED)));\r
+ }\r
+ else\r
+ {\r
+ m_pThread->m_bAutoDelete = FALSE;\r
+ m_pThread->ResumeThread();\r
+ }\r
+ return TRUE;\r
+}\r
+\r
+UINT CProgressDlg::ProgressThreadEntry(LPVOID pVoid)\r
+{\r
+ return ((CProgressDlg*)pVoid)->ProgressThread();\r
+}\r
+\r
+UINT CProgressDlg::ProgressThread()\r
+{\r
+ PROCESS_INFORMATION pi;\r
+ HANDLE hRead;\r
+\r
+ m_Animate.Play(0,-1,-1);\r
+\r
+ g_Git.RunAsync(this->m_GitCmd,&pi, &hRead);\r
+ this->DialogEnableWindow(IDOK,FALSE);\r
+\r
+ DWORD readnumber;\r
+ char buffer[2];\r
+ CString output;\r
+ while(ReadFile(hRead,buffer,1,&readnumber,NULL))\r
+ {\r
+ buffer[readnumber]=0;\r
+ ParserCmdOutput((TCHAR)buffer[0]);\r
+ }\r
+\r
+ CloseHandle(pi.hThread);\r
+\r
+ WaitForSingleObject(pi.hProcess, INFINITE);\r
+ m_GitStatus =0;\r
+\r
+ if(!GetExitCodeProcess(pi.hProcess,&m_GitStatus))\r
+ {\r
+ return GIT_ERROR_GET_EXIT_CODE;\r
+ }\r
+\r
+ CloseHandle(pi.hProcess);\r
+\r
+ CloseHandle(hRead);\r
+\r
+ m_Progress.SetPos(100);\r
+ this->DialogEnableWindow(IDOK,TRUE);\r
+\r
+ m_Animate.Stop();\r
+ return 0;\r
+}\r
+\r
+int CProgressDlg::FindPercentage(CString &log)\r
+{\r
+ int s1=log.Find(_T('%'));\r
+ if(s1<0)\r
+ return -1;\r
+\r
+ int s2=s1-1;\r
+ for(int i=s1-1;i>=0;i--)\r
+ {\r
+ if(log[i]>=_T('0') && log[i]<=_T('9'))\r
+ s2=i;\r
+ else\r
+ break;\r
+ }\r
+ return _ttol(log.Mid(s2,s1-s2));\r
+}\r
+\r
+void CProgressDlg::ParserCmdOutput(TCHAR ch)\r
+{\r
+ TRACE(_T("%c"),ch);\r
+ if( ch == _T('\r') || ch == _T('\n'))\r
+ {\r
+ TRACE(_T("End Char %s \r\n"),ch==_T('\r')?_T("lf"):_T(""));\r
+ TRACE(_T("End Char %s \r\n"),ch==_T('\n')?_T("cr"):_T(""));\r
+\r
+ CString text;\r
+ m_Log.GetWindowTextW(text);\r
+ if(ch == _T('\r'))\r
+ {\r
+ RemoveLastLine(text);\r
+ }\r
+ text+=_T("\r\n")+m_LogText;\r
+ m_Log.SetWindowTextW(text);\r
+ \r
+ int s1=m_LogText.Find(_T(':'));\r
+ int s2=m_LogText.Find(_T('%'));\r
+ if(s1>0 && s2>0)\r
+ {\r
+ this->m_CurrentWork.SetWindowTextW(m_LogText.Left(s1));\r
+ int pos=FindPercentage(m_LogText);\r
+ TRACE(_T("Pos %d\r\n"),pos);\r
+ if(pos>0)\r
+ this->m_Progress.SetPos(pos);\r
+ }\r
+\r
+ m_LogText=_T("");\r
+\r
+ }else\r
+ {\r
+ m_LogText+=ch;\r
+ }\r
+\r
+}\r
+void CProgressDlg::RemoveLastLine(CString &str)\r
+{\r
+ int start;\r
+ start=str.ReverseFind(_T('\n'));\r
+ if(start>0);\r
+ str=str.Left(start);\r
+ return;\r
+}\r
+// CProgressDlg message handlers\r
--- /dev/null
+#pragma once\r
+\r
+#include "StandAloneDlg.h"\r
+\r
+// CProgressDlg dialog\r
+\r
+class CProgressDlg : public CResizableStandAloneDialog\r
+{\r
+ DECLARE_DYNAMIC(CProgressDlg)\r
+\r
+public:\r
+ CProgressDlg(CWnd* pParent = NULL); // standard constructor\r
+ virtual ~CProgressDlg();\r
+ virtual BOOL OnInitDialog();\r
+// Dialog Data\r
+ enum { IDD = IDD_GITPROGRESS };\r
+ CString m_GitCmd;\r
+ CProgressCtrl m_Progress;\r
+ \r
+ CEdit m_Log;\r
+ CAnimateCtrl m_Animate;\r
+ CStatic m_CurrentWork;\r
+ CWinThread* m_pThread; \r
+ volatile LONG m_bThreadRunning;\r
+ DWORD m_GitStatus;\r
+protected:\r
+ virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support\r
+ static UINT ProgressThreadEntry(LPVOID pVoid);\r
+ UINT ProgressThread();\r
+\r
+ void ParserCmdOutput(TCHAR ch);\r
+ int FindPercentage(CString &log);\r
+ void RemoveLastLine(CString &str);\r
+\r
+ CString m_LogText;\r
+ DECLARE_MESSAGE_MAP()\r
+};\r