CMD Enhancements:
[reactos.git] / rosapps / devutils / vmingw / process.h
1 /********************************************************************
2 * Module: process.h. This is part of Visual-MinGW.
3 *
4 * License: Visual-MinGW is covered by GNU General Public License,
5 * Copyright (C) 2001 Manu B.
6 * See license.htm for more details.
7 *
8 ********************************************************************/
9 #ifndef PROCESS_H
10 #define PROCESS_H
11 #include "winui.h"
12 #include "CList.h"
13
14
15 class CCommandDlg : public CDlgBase
16 {
17 public:
18 CCommandDlg();
19 ~CCommandDlg();
20
21 HWND Create(void);
22 LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam);
23 BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam);
24 BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl);
25 char cmdLine[1024];
26
27 protected:
28
29 private:
30 HWND hCmdLine;
31 };
32
33 /********************************************************
34 creationFlag truth table
35 -----------------------------------
36 8 4 2 1
37 ------------------
38 NO_PIPE 0 0 0 0
39 IN_PIPE 0 0 0 1
40 OUT_PIPE 0 0 1 0
41 ERR_PIPE 0 1 0 0
42 OUTERR_PIPE 1 0 1 0
43
44 *********************************************************/
45 #define NO_PIPE 0x0000
46 #define IN_PIPE 0x0001
47 #define OUT_PIPE 0x0002
48 #define ERR_PIPE 0x0004
49 #define OUTERR_PIPE 0x000A
50
51 #define STDOUT_NONE 0
52 #define STDOUT_FILE_APPEND 1
53 #define STDOUT_USER 2
54
55 class CTask : public CNode
56 {
57 public:
58 CTask();
59 ~CTask();
60
61 char cmdLine[MAX_PATH];
62 char szFileName[MAX_PATH];
63 WORD creationFlag;
64 WORD outputFlag;
65
66 protected:
67
68 private:
69
70 };
71
72 class CStack : public CList
73 {
74 public:
75 CStack();
76 ~CStack();
77
78 int Push(CTask * newTask);
79 CTask * Pop(void);
80 void Flush(void);
81
82 protected:
83
84 private:
85 CTask * retBuf;
86 void DetachCurrent(void);
87 };
88
89 class CPipes
90 {
91 public:
92 CPipes();
93 ~CPipes();
94
95 HANDLE hIn[2];
96 HANDLE hOut[2];
97 HANDLE hErr[2];
98
99 bool Create(WORD creationFlag, bool winNT);
100 bool CloseChildSide(void);
101 bool CloseParentSide(void);
102 protected:
103
104 private:
105 bool Close(int side);
106 };
107
108 class CProcess : public CStack
109 {
110 public:
111 CProcess();
112 ~CProcess();
113
114 bool CommandLine(char * cmdLine);
115 bool isRunning(void);
116 CTask * AddTask(char * cmdLine, WORD creationFlag, WORD outputFlag/* = STDOUT_NONE*/);
117 bool CmdCat(char * cmdLine);
118 void Run(void);
119 void Run_Thread_Internal(void);
120
121 CCommandDlg CommandDlg;
122 protected:
123
124 private:
125 PROCESS_INFORMATION pi;
126 bool Running;
127 DWORD exitCode;
128 CTask * currTask;
129 CPipes Pipes;
130 char * chr;
131 char inBuf[1024];
132 char outBuf[1024];
133 char errBuf[1024];
134
135 bool RunProcess(CTask * task);
136
137 void WriteStdIn(HANDLE hPipe, WORD creationFlag);
138 void ReadStdErr(HANDLE hPipe, WORD creationFlag);
139 long ReadStdOut(CTask * task, HANDLE hPipe);
140 int ReadOneChar(HANDLE hPipe, char * chrin);
141
142 bool WriteFileAppend(char * fileName, char * line, int len=-1);
143 bool OutputLine(WORD outputFlag, char * line, int len=-1);
144 };
145
146 #endif