OSDN Git Service

CGit::Run() overloaded with another function to make command output callback possible
authorJohan t Hart <johanthart@gmail.com>
Sun, 1 Feb 2009 22:47:05 +0000 (23:47 +0100)
committerFrank Li <lznuaa@gmail.com>
Sun, 8 Feb 2009 07:04:45 +0000 (15:04 +0800)
src/Git/Git.cpp
src/Git/Git.h

index 6b880c1..df2ce46 100644 (file)
@@ -106,6 +106,8 @@ static BOOL FindGitPath()
 \r
 \r
 #define MAX_DIRBUFFER 1000\r
+#define CALL_OUTPUT_READ_CHUNK_SIZE 1024\r
+\r
 CString CGit::ms_LastMsysGitDir;\r
 CGit g_Git;\r
 BOOL g_IsWingitDllload = TRUE;\r
@@ -279,20 +281,18 @@ BOOL CGit::IsInitRepos()
 \r
        return FALSE;\r
 }\r
-int CGit::Run(CString cmd,BYTE_VECTOR *vector)\r
+int CGit::Run(CGitCall* pcall)\r
 {\r
        PROCESS_INFORMATION pi;\r
        HANDLE hRead;\r
-       if(RunAsync(cmd,&pi,&hRead))\r
+       if(RunAsync(pcall->GetCmd(),&pi,&hRead))\r
                return GIT_ERROR_CREATE_PROCESS;\r
 \r
        DWORD readnumber;\r
-       BYTE data;\r
-       while(ReadFile(hRead,&data,1,&readnumber,NULL))\r
+       BYTE data[CALL_OUTPUT_READ_CHUNK_SIZE];\r
+       while(ReadFile(hRead,data,CALL_OUTPUT_READ_CHUNK_SIZE,&readnumber,NULL))\r
        {\r
-               //g_Buffer[readnumber]=0;\r
-               vector->push_back(data);\r
-//             StringAppend(output,g_Buffer,codes);\r
+               pcall->OnOutputData(data,readnumber);\r
        }\r
 \r
        \r
@@ -310,7 +310,25 @@ int CGit::Run(CString cmd,BYTE_VECTOR *vector)
 \r
        CloseHandle(hRead);\r
        return exitcode;\r
+}\r
+class CGitCall_ByteVector : public CGitCall\r
+{\r
+public:\r
+       CGitCall_ByteVector(CString cmd,BYTE_VECTOR* pvector):CGitCall(cmd),m_pvector(pvector){}\r
+       virtual bool OnOutputData(const BYTE* data, size_t size)\r
+       {\r
+               size_t oldsize=m_pvector->size();\r
+               m_pvector->resize(m_pvector->size()+size);\r
+               memcpy(&*(m_pvector->begin()+oldsize),data,size);\r
+               return false;\r
+       }\r
+       BYTE_VECTOR* m_pvector;\r
 \r
+};\r
+int CGit::Run(CString cmd,BYTE_VECTOR *vector)\r
+{\r
+       CGitCall_ByteVector call(cmd,vector);\r
+       return Run(&call);\r
 }\r
 int CGit::Run(CString cmd, CString* output,int code)\r
 {\r
index 97bf1b6..b527790 100644 (file)
@@ -4,6 +4,21 @@
 #include "GitStatus.h"\r
 #include "GitAdminDir.h"\r
 \r
+class CGitCall\r
+{\r
+public:\r
+       CGitCall(CString cmd):m_Cmd(cmd){}\r
+\r
+       CString                 GetCmd()const{return m_Cmd;}\r
+\r
+       //When this function returns 'true' the git command should be aborted.\r
+       //This behavior is not implemented yet.\r
+       virtual bool    OnOutputData(const BYTE* data, size_t size)=0;\r
+\r
+private:\r
+       CString m_Cmd;\r
+\r
+};\r
 \r
 class CGit\r
 {\r
@@ -19,6 +34,7 @@ public:
        \r
        int Run(CString cmd, CString* output,int code);\r
        int Run(CString cmd, BYTE_VECTOR *byte_array);\r
+       int Run(CGitCall* pcall);\r
 \r
        int RunAsync(CString cmd,PROCESS_INFORMATION *pi, HANDLE* hRead, CString *StdioFile=NULL);\r
        int RunLogFile(CString cmd, CString &filename);\r