packmgr/lib/main.cpp
Maarten Bosma c883bfc05c PackageManager: Options.xml
svn path=/trunk/rosapps/packmgr/; revision=29
2005-04-20 19:01:30 +00:00

193 lines
3.7 KiB
C++

////////////////////////////////////////////////////////
//
// 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];
wsprintf(buffer, PML_TransError(ERR_READY), 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)
{
// I know we, got a memory leak here
static WCHAR string [256];
if(!LoadString(GetModuleHandle(L"package"), code, string, 256))
return PML_TransError(ERR_GENERIC);
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;
}