move back packmgr did move it by mistake
[reactos.git] / rosapps / packmgr / lib / main.cpp
diff --git a/rosapps/packmgr/lib/main.cpp b/rosapps/packmgr/lib/main.cpp
new file mode 100644 (file)
index 0000000..5d18cf6
--- /dev/null
@@ -0,0 +1,192 @@
+////////////////////////////////////////////////////////
+//
+// 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;
+}
+