ReactOS Package Manager
[reactos.git] / rosapps / packmgr / lib / main.cpp
1 ////////////////////////////////////////////////////////
2 //
3 // main.cpp
4 //
5 // Doit stuff and
6 // everything that fits nowhere else.
7 //
8 //
9 // Maarten Bosma, 09.01.2004
10 // maarten.paul@bosma.de
11 //
12 ////////////////////////////////////////////////////////////////////
13
14 #include <windows.h>
15 #include "package.hpp"
16 #include "log.h"
17 #include "script.h"
18
19 HANDLE hThread = NULL;
20 BOOL thread_abort = FALSE;
21
22 extern const char* tree_server;
23 char* PML_Download (const char* name, const char* local_name = "packmgr.txt", const char* server = tree_server, BOOL totemp = TRUE);
24
25
26 // Abort other thread
27 extern "C" void PML_Abort (void)
28 {
29 thread_abort = TRUE;
30
31 if(hThread)
32 WaitForSingleObject(hThread, INFINITE);
33 }
34
35 // Callback function of the "doit"-thread
36 DWORD WINAPI DoitThread (void* lpParam)
37 {
38 UINT i;
39 int ret = ERR_OK;
40 TREE* tree = (TREE*)lpParam;
41 vector<SCRIPT*> scripts;
42
43 /* Load the scripts */
44
45 tree->setStatus(0, 0, L"Downloading Install instructions ...");
46
47 for(i=0; i<tree->todo.size(); i++)
48 {
49 SCRIPT* script;
50
51 char* path = PML_Download(tree->todo[i]);
52
53 if(RPS_Load(&script, path) == ERR_OK)
54 scripts.push_back(script);
55 else
56 ret = ERR_PACK;
57 }
58
59 /* Preinstall */
60
61 Log("* enter preinstall");
62
63 tree->setStatus(250, 0, L"Preinstall");
64
65 for(i=0; i<scripts.size(); i++)
66 {
67 if(RPS_Execute(scripts[i], "preinstall") != ERR_OK)
68 ret = ERR_PACK;
69 }
70
71 /* Install */
72
73 Log("* enter install");
74
75 tree->setStatus(500, 0, L"Install");
76
77 for(i=0; i<scripts.size(); i++)
78 {
79 if(RPS_Execute(scripts[i], "main") != ERR_OK)
80 ret = ERR_PACK;
81 }
82
83 /* Postinstall */
84
85 Log("* enter postinstall");
86
87 tree->setStatus(750, 0, L"Postinstall");
88
89 for(i=0; i<scripts.size(); i++)
90 {
91 if(RPS_Execute(scripts[i], "after") != ERR_OK)
92 ret = ERR_PACK;
93 }
94
95 /* Finish */
96
97 for(i=0; i<tree->todo.size(); i++)
98 RPS_Clear(scripts[i]);
99
100 // clear the todo list
101 tree->todo.clear();
102
103 // set all actions to none
104 for(i=0; i<tree->packages.size(); i++)
105 PML_SetAction (tree, i, 0, tree->setIcon);
106
107 tree->setStatus(1000, ret, NULL);
108
109 return 1;
110 }
111
112 // Do the actions the user wants us to do
113 extern "C" int PML_DoIt (TREE* tree, PML_SetStatus SetStatus)
114 {
115 DWORD dummy;
116 tree->setStatus = SetStatus;
117
118 if(!tree->todo.size())
119 return ERR_NOTODO;
120
121 hThread = CreateThread(NULL, 0, DoitThread, tree, 0, &dummy);
122
123 if(!hThread)
124 return ERR_GENERIC;
125
126 LogAdd("\n");
127
128 return ERR_OK;
129 }
130
131 // Translates Errorcode into human language
132 extern "C" WCHAR* PML_TransError (int code)
133 {
134 // I know we, got a memory leak here
135 static WCHAR string [256];
136
137 if(!LoadString(GetModuleHandle(L"package"), code, string, 256))
138 return PML_TransError(ERR_GENERIC);
139
140 return string;
141 }
142
143 // Free alloced memory
144 extern "C" void PML_CloseTree (TREE* tree)
145 {
146 UINT i;
147
148 LogAdd ("\n");
149 Log("* free alloced memory");
150 Log("* package manager will exit now. Bye!");
151
152 for(i=0; i<tree->packages.size(); i++)
153 {
154 if(tree->packages[i].path)
155 delete tree->packages[i].path;
156
157 if(tree->packages[i].name)
158 delete tree->packages[i].name;
159
160 if(tree->packages[i].description)
161 delete tree->packages[i].description;
162
163 tree->packages.clear();
164
165 if(tree->packages[i].files[0])
166 delete tree->packages[i].files[0];
167
168 if(tree->packages[i].files[1])
169 delete tree->packages[i].files[1];
170
171 if(tree->packages[i].files[2])
172 delete tree->packages[i].files[2];
173
174 if(tree->packages[i].files[3])
175 delete tree->packages[i].files[3];
176 }
177
178 tree->descriptionPath.clear();
179 tree->todo.clear();
180 tree->packages.clear();
181
182 if(tree)
183 delete tree;
184 }
185