-////////////////////////////////////////////////////////\r
-//\r
-// main.cpp\r
-// \r
-// Doit stuff and\r
-// everything that fits nowhere else.\r
-//\r
-//\r
-// Maarten Bosma, 09.01.2004\r
-// maarten.paul@bosma.de\r
-//\r
-////////////////////////////////////////////////////////////////////\r
-\r
-#include <windows.h>\r
-#include "package.hpp"\r
-#include "log.h"\r
-#include "script.h"\r
-\r
-HANDLE hThread = NULL;\r
-BOOL thread_abort = FALSE;\r
-\r
-char* PML_Download (pTree, const char* url, const char* server = "tree", const char* filename = NULL);\r
-\r
-\r
-// Abort other thread\r
-extern "C" void PML_Abort (void)\r
-{\r
- thread_abort = TRUE;\r
-\r
- if(hThread)\r
- WaitForSingleObject(hThread, INFINITE);\r
-}\r
-\r
-// Callback function of the "doit"-thread\r
-DWORD WINAPI DoitThread (void* lpParam) \r
-{ \r
- UINT i;\r
- int ret = ERR_OK;\r
- TREE* tree = (TREE*)lpParam;\r
- vector<SCRIPT*> scripts;\r
- \r
- /* Load the scripts */\r
-\r
- tree->setStatus(0, 0, L"Downloading Install instructions ...");\r
- \r
- for(i=0; i<tree->todo.size(); i++)\r
- {\r
- SCRIPT* script;\r
-\r
- char* path = PML_Download(tree, tree->todo[i]);\r
-\r
- if(RPS_Load(&script, path) == ERR_OK)\r
- scripts.push_back(script);\r
- else\r
- ret = ERR_PACK;\r
- }\r
-\r
- /* Preinstall */\r
-\r
- Log("* enter preinstall");\r
-\r
- tree->setStatus(250, 0, L"Preinstall");\r
- \r
- for(i=0; i<scripts.size(); i++)\r
- {\r
- if(RPS_Execute(scripts[i], "preinstall") != ERR_OK)\r
- ret = ERR_PACK;\r
- }\r
-\r
- /* Install */\r
-\r
- Log("* enter install");\r
-\r
- tree->setStatus(500, 0, L"Install");\r
-\r
- for(i=0; i<scripts.size(); i++)\r
- {\r
- if(RPS_Execute(scripts[i], "main") != ERR_OK)\r
- ret = ERR_PACK;\r
- }\r
-\r
- /* Postinstall */\r
-\r
- Log("* enter postinstall");\r
-\r
- tree->setStatus(750, 0, L"Postinstall");\r
-\r
- for(i=0; i<scripts.size(); i++)\r
- {\r
- if(RPS_Execute(scripts[i], "after") != ERR_OK)\r
- ret = ERR_PACK;\r
- }\r
-\r
- /* Finish */\r
-\r
- for(i=0; i<tree->todo.size(); i++)\r
- RPS_Clear(scripts[i]);\r
-\r
- // clear the todo list\r
- tree->todo.clear();\r
-\r
- // set all actions to none\r
- for(i=0; i<tree->packages.size(); i++)\r
- PML_SetAction (tree, i, 0, tree->setIcon, NULL);\r
-\r
- tree->setStatus(1000, ret, NULL);\r
-\r
- return 1; \r
-} \r
-\r
-// Do the actions the user wants us to do\r
-extern "C" int PML_DoIt (TREE* tree, PML_SetStatus SetStatus, PML_Ask Ask)\r
-{ \r
- DWORD dummy; \r
- tree->setStatus = SetStatus;\r
-\r
- if(!tree->todo.size())\r
- return ERR_NOTODO;\r
-\r
- //ask\r
- WCHAR buffer [2000];\r
- wsprintf(buffer, PML_TransError(ERR_READY), tree->todo.size());\r
-\r
- if(!Ask(buffer))\r
- return ERR_GENERIC;\r
- \r
-\r
- hThread = CreateThread(NULL, 0, DoitThread, tree, 0, &dummy);\r
-\r
- if(!hThread)\r
- return ERR_GENERIC;\r
- \r
- LogAdd("\n");\r
- \r
- return ERR_OK;\r
-}\r
-\r
-// Translates Errorcode into human language\r
-extern "C" WCHAR* PML_TransError (int code)\r
-{\r
- // I know we, got a memory leak here\r
- static WCHAR string [256];\r
-\r
- if(!LoadString(GetModuleHandle(L"package"), code, string, 256))\r
- return PML_TransError(ERR_GENERIC);\r
-\r
- return string;\r
-}\r
-\r
-// Free alloced memory\r
-extern "C" void PML_CloseTree (TREE* tree)\r
-{\r
- UINT i;\r
-\r
- LogAdd ("\n");\r
- Log("* free alloced memory");\r
- Log("* package manager will exit now. Bye!");\r
-\r
- for(i=0; i<tree->packages.size(); i++)\r
- {\r
- if(tree->packages[i].path)\r
- delete tree->packages[i].path;\r
-\r
- if(tree->packages[i].name)\r
- delete tree->packages[i].name;\r
-\r
- if(tree->packages[i].description)\r
- delete tree->packages[i].description;\r
-\r
- tree->packages.clear();\r
-\r
- if(tree->packages[i].files[0])\r
- delete tree->packages[i].files[0];\r
-\r
- if(tree->packages[i].files[1])\r
- delete tree->packages[i].files[1];\r
-\r
- if(tree->packages[i].files[2])\r
- delete tree->packages[i].files[2];\r
-\r
- if(tree->packages[i].files[3])\r
- delete tree->packages[i].files[3];\r
- }\r
-\r
- tree->descriptionPath.clear();\r
- tree->todo.clear();\r
- tree->packages.clear();\r
-\r
- if(tree)\r
- delete tree;\r
-}\r
-\r
+////////////////////////////////////////////////////////
+//
+// main.cpp
+//
+// Doit stuff and
+// everything that fits nowhere else.
+//
+//
+// Maarten Bosma, 09.01.2004
+// maarten.paul@bosma.de
+//
+////////////////////////////////////////////////////////////////////
+
+#include <windows.h>
+#include "package.hpp"
+#include "log.h"
+#include "script.h"
+
+HANDLE hThread = NULL;
+BOOL thread_abort = FALSE;
+
+char* PML_Download (pTree, const char* url, const char* server = "tree", const char* filename = NULL);
+
+
+// Abort other thread
+extern "C" void PML_Abort (void)
+{
+ thread_abort = TRUE;
+
+ if(hThread)
+ WaitForSingleObject(hThread, INFINITE);
+}
+
+// Callback function of the "doit"-thread
+DWORD WINAPI DoitThread (void* lpParam)
+{
+ UINT i;
+ int ret = ERR_OK;
+ TREE* tree = (TREE*)lpParam;
+ vector<SCRIPT*> scripts;
+
+ /* Load the scripts */
+
+ tree->setStatus(0, 0, L"Downloading Install instructions ...");
+
+ for(i=0; i<tree->todo.size(); i++)
+ {
+ SCRIPT* script;
+
+ char* path = PML_Download(tree, tree->todo[i]);
+
+ if(RPS_Load(&script, path) == ERR_OK)
+ scripts.push_back(script);
+ else
+ ret = ERR_PACK;
+ }
+
+ /* Preinstall */
+
+ Log("* enter preinstall");
+
+ tree->setStatus(250, 0, L"Preinstall");
+
+ for(i=0; i<scripts.size(); i++)
+ {
+ if(RPS_Execute(scripts[i], "preinstall") != ERR_OK)
+ ret = ERR_PACK;
+ }
+
+ /* Install */
+
+ Log("* enter install");
+
+ tree->setStatus(500, 0, L"Install");
+
+ for(i=0; i<scripts.size(); i++)
+ {
+ if(RPS_Execute(scripts[i], "main") != ERR_OK)
+ ret = ERR_PACK;
+ }
+
+ /* Postinstall */
+
+ Log("* enter postinstall");
+
+ tree->setStatus(750, 0, L"Postinstall");
+
+ for(i=0; i<scripts.size(); i++)
+ {
+ if(RPS_Execute(scripts[i], "after") != ERR_OK)
+ ret = ERR_PACK;
+ }
+
+ /* Finish */
+
+ for(i=0; i<tree->todo.size(); i++)
+ RPS_Clear(scripts[i]);
+
+ // clear the todo list
+ tree->todo.clear();
+
+ // set all actions to none
+ for(i=0; i<tree->packages.size(); i++)
+ PML_SetAction (tree, i, 0, tree->setIcon, NULL);
+
+ tree->setStatus(1000, ret, NULL);
+
+ return 1;
+}
+
+// Do the actions the user wants us to do
+extern "C" int PML_DoIt (TREE* tree, PML_SetStatus SetStatus, PML_Ask Ask)
+{
+ DWORD dummy;
+ tree->setStatus = SetStatus;
+
+ if(!tree->todo.size())
+ return ERR_NOTODO;
+
+ //ask
+ WCHAR buffer [2000];
+ WCHAR errbuf [2000];
+
+ wsprintf(buffer, PML_TransError(ERR_READY, (WCHAR*)errbuf, sizeof(errbuf)/sizeof(WCHAR)), tree->todo.size());
+
+ if(!Ask(buffer))
+ return ERR_GENERIC;
+
+
+ hThread = CreateThread(NULL, 0, DoitThread, tree, 0, &dummy);
+
+ if(!hThread)
+ return ERR_GENERIC;
+
+ LogAdd("\n");
+
+ return ERR_OK;
+}
+
+// Translates Errorcode into human language
+extern "C" WCHAR* PML_TransError (int code, WCHAR *string, INT maxchar)
+{
+
+ if(!LoadString(GetModuleHandle(L"package"), code, string, maxchar))
+ return PML_TransError(ERR_GENERIC, string, maxchar);
+
+ return string;
+}
+
+// Free alloced memory
+extern "C" void PML_CloseTree (TREE* tree)
+{
+ UINT i;
+
+ LogAdd ("\n");
+ Log("* free alloced memory");
+ Log("* package manager will exit now. Bye!");
+
+ for(i=0; i<tree->packages.size(); i++)
+ {
+ if(tree->packages[i].path)
+ delete tree->packages[i].path;
+
+ if(tree->packages[i].name)
+ delete tree->packages[i].name;
+
+ if(tree->packages[i].description)
+ delete tree->packages[i].description;
+
+ tree->packages.clear();
+
+ if(tree->packages[i].files[0])
+ delete tree->packages[i].files[0];
+
+ if(tree->packages[i].files[1])
+ delete tree->packages[i].files[1];
+
+ if(tree->packages[i].files[2])
+ delete tree->packages[i].files[2];
+
+ if(tree->packages[i].files[3])
+ delete tree->packages[i].files[3];
+ }
+
+ tree->descriptionPath.clear();
+ tree->todo.clear();
+ tree->packages.clear();
+
+ if(tree)
+ delete tree;
+}
+