Moved remotely
svn path=/trunk/; revision=22439
|
@ -1,211 +0,0 @@
|
||||||
////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// main.cpp
|
|
||||||
//
|
|
||||||
// Implementation of a Commandlne Interface
|
|
||||||
// for the ReactOs Package Manager
|
|
||||||
//
|
|
||||||
// Maarten Bosma, 09.01.2004
|
|
||||||
// maarten.paul@bosma.de
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include "main.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
|
|
||||||
int main (int argc, char **argv)
|
|
||||||
{
|
|
||||||
wprintf(L"ReactOs PackageManager %d.%d.%d Commandline Interface \n\n", PACKMGR_VERSION_MAJOR, PACKMGR_VERSION_MINOR, PACKMGR_VERSION_PATCH_LEVEL);
|
|
||||||
Argv = argv; Argc = argc;
|
|
||||||
|
|
||||||
if(argc<2)
|
|
||||||
return Help();
|
|
||||||
|
|
||||||
// install a package
|
|
||||||
if (!strcmp(argv[1], "install"))
|
|
||||||
Install();
|
|
||||||
|
|
||||||
// install a package from source
|
|
||||||
else if (!strcmp(argv[1], "src-inst"))
|
|
||||||
{
|
|
||||||
wprintf(L"Sorry but I can't do that yet. \n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// update a package
|
|
||||||
else if (!strcmp(argv[1], "update"))
|
|
||||||
{
|
|
||||||
wprintf(L"Sorry but I can't do that yet. \n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// update everything
|
|
||||||
else if (!strcmp(argv[1], "dist-upgrade"))
|
|
||||||
{
|
|
||||||
wprintf(L"Sorry but I can't do that yet. \n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove a package
|
|
||||||
else if (!strcmp(argv[1], "remove"))
|
|
||||||
{
|
|
||||||
wprintf(L"Sorry but I can't do that yet. \n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// search for a package
|
|
||||||
else if (!strcmp(argv[1], "show"))
|
|
||||||
{
|
|
||||||
Show();
|
|
||||||
}
|
|
||||||
|
|
||||||
// search for a package
|
|
||||||
else if (!strcmp(argv[1], "search"))
|
|
||||||
{
|
|
||||||
wprintf(L"Sorry but I can't do that yet. \n");
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
Help();
|
|
||||||
|
|
||||||
//
|
|
||||||
wprintf(L"\n");
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Help (void)
|
|
||||||
{
|
|
||||||
wprintf(L"Usage: ros-get [command] \n\n");
|
|
||||||
|
|
||||||
wprintf(L"Possible commands: \n");
|
|
||||||
wprintf(L" install [package name] \t Installs a package \n\n");
|
|
||||||
wprintf(L" show [package name] \t\t Shows you detailed information about a package \n");
|
|
||||||
|
|
||||||
wprintf(L"Currently unimplemented commands: \n");
|
|
||||||
wprintf(L" src-install [package name] \t Installs a package from source code \n");
|
|
||||||
wprintf(L" update [package name] \t Updates a package \n");
|
|
||||||
wprintf(L" dist-update [package name] \t Updates a package \n");
|
|
||||||
wprintf(L" remove [package name] \t Uninstalls a package \n\n");
|
|
||||||
|
|
||||||
wprintf(L" search [search agrument] \t Finds a package \n");
|
|
||||||
wprintf(L" list \t\t\t\t Lists all installed programs \n");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Ask (const WCHAR* question)
|
|
||||||
{
|
|
||||||
// ask the user
|
|
||||||
wprintf(L"%s [y/n] ", question);
|
|
||||||
char answer = getchar();
|
|
||||||
|
|
||||||
// clear keybuffer
|
|
||||||
while(getchar()!='\n');
|
|
||||||
wprintf(L"\n");
|
|
||||||
|
|
||||||
// prozess answer
|
|
||||||
if (answer == 'y')
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
else if (answer == 'n')
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return Ask(question);
|
|
||||||
}
|
|
||||||
|
|
||||||
int SetStatus (int status1, int status2, WCHAR* text)
|
|
||||||
{
|
|
||||||
WCHAR errbuf[2000];
|
|
||||||
if(text)
|
|
||||||
wprintf(L"%s\n", text);
|
|
||||||
|
|
||||||
// If the Status is 1000 things are done
|
|
||||||
if(status1==1000)
|
|
||||||
{
|
|
||||||
wprintf(L"%s\n", PML_TransError(status2, errbuf, sizeof(errbuf)/sizeof(WCHAR)));
|
|
||||||
done = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Install (void)
|
|
||||||
{
|
|
||||||
pTree tree;
|
|
||||||
int i, error;
|
|
||||||
WCHAR errbuf[2000];
|
|
||||||
|
|
||||||
// load the tree
|
|
||||||
error = PML_LoadTree (&tree, "tree.xml", NULL);
|
|
||||||
if(error)
|
|
||||||
{
|
|
||||||
|
|
||||||
wprintf(PML_TransError(error, errbuf, sizeof(errbuf)/sizeof(WCHAR)));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// look up the item
|
|
||||||
for (i=2; i<Argc; i++)
|
|
||||||
{
|
|
||||||
int id = PML_FindItem(tree, Argv[i]);
|
|
||||||
|
|
||||||
if(id)
|
|
||||||
{
|
|
||||||
PML_LoadPackage(tree, id, NULL);
|
|
||||||
PML_SetAction(tree, id, 1, NULL, Ask);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
printf("Could not find the Package \"%s\"\n", Argv[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// do it
|
|
||||||
error = PML_DoIt (tree, SetStatus, Ask);
|
|
||||||
if(error)
|
|
||||||
{
|
|
||||||
|
|
||||||
wprintf(PML_TransError(error, errbuf, sizeof(errbuf)/sizeof(WCHAR)));
|
|
||||||
PML_CloseTree (tree);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// wait
|
|
||||||
while (!done)
|
|
||||||
Sleep(1000);
|
|
||||||
|
|
||||||
// clean up
|
|
||||||
PML_CloseTree (tree);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Show (void)
|
|
||||||
{
|
|
||||||
pTree tree;
|
|
||||||
int i, error;
|
|
||||||
WCHAR errbuf[2000];
|
|
||||||
|
|
||||||
// load the tree
|
|
||||||
error = PML_LoadTree (&tree, "tree_bare.xml", NULL);
|
|
||||||
if(error)
|
|
||||||
{
|
|
||||||
wprintf(PML_TransError(error, errbuf, sizeof(errbuf)/sizeof(WCHAR)));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// look up the item
|
|
||||||
for (i=2; i<Argc; i++)
|
|
||||||
{
|
|
||||||
int id = PML_FindItem(tree, Argv[i]);
|
|
||||||
|
|
||||||
if(id)
|
|
||||||
printf(PML_GetDescription(tree, id));
|
|
||||||
|
|
||||||
else
|
|
||||||
printf("Could not find the Package \"%s\"\n", Argv[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// clean up
|
|
||||||
PML_CloseTree (tree);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
///////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// main.h
|
|
||||||
// main.cpp's lumber room :)
|
|
||||||
///////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include <package.h>
|
|
||||||
|
|
||||||
int Argc;
|
|
||||||
char **Argv;
|
|
||||||
BOOL done = FALSE;
|
|
||||||
|
|
||||||
int Help (void);
|
|
||||||
int Install (void);
|
|
||||||
int Show (void);
|
|
||||||
|
|
||||||
int SetStatus (int status1, int status2, WCHAR* text);
|
|
|
@ -1,8 +0,0 @@
|
||||||
|
|
||||||
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Package Manager - Cmdline Interface\0"
|
|
||||||
#define REACTOS_STR_INTERNAL_NAME "ros-get\0"
|
|
||||||
#define REACTOS_STR_ORIGINAL_FILENAME "ros-get.exe\0"
|
|
||||||
|
|
||||||
#include <reactos/version.rc>
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,12 +0,0 @@
|
||||||
<module name="rosget" type="win32cui" installbase="system32" installname="rosget.exe">
|
|
||||||
<include base="package">.</include>
|
|
||||||
<define name="__USE_W32API" />
|
|
||||||
<define name="UNICODE" />
|
|
||||||
<define name="_WIN32_IE">0x0501</define>
|
|
||||||
<define name="_WIN32_WINNT">0x0501</define>
|
|
||||||
|
|
||||||
<library>kernel32</library>
|
|
||||||
<library>package</library>
|
|
||||||
<file>main.c</file>
|
|
||||||
<file>ros-get.rc</file>
|
|
||||||
</module>
|
|
|
@ -1,9 +0,0 @@
|
||||||
<directory name="cmd-line">
|
|
||||||
<xi:include href="cmd-line/rosget.xml" />
|
|
||||||
</directory>
|
|
||||||
<directory name="gui">
|
|
||||||
<xi:include href="gui/packmgr.xml" />
|
|
||||||
</directory>
|
|
||||||
<directory name="lib">
|
|
||||||
<xi:include href="lib/package.xml" />
|
|
||||||
</directory>
|
|
|
@ -1,43 +0,0 @@
|
||||||
|
|
||||||
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
|
|
||||||
|
|
||||||
/* Dialogs */
|
|
||||||
IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 180, 200
|
|
||||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
|
||||||
CAPTION "Nastavení"
|
|
||||||
FONT 8, "MS Sans Serif"
|
|
||||||
BEGIN
|
|
||||||
LTEXT "Zatím zde nejsou žádné možnosti.", 0, 50, 95, 80, 8
|
|
||||||
END
|
|
||||||
|
|
||||||
IDD_DOIT DIALOG DISCARDABLE 0, 0, 180, 100
|
|
||||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
|
||||||
CAPTION "Provádím operace"
|
|
||||||
FONT 8, "MS Sans Serif"
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
CTEXT "{Status}", IDC_TSTATUS, 0, 10, 180, 8
|
|
||||||
|
|
||||||
CONTROL "", IDC_STATUS1, "msctls_progress32", PBS_SMOOTH, 20, 25, 140, 15
|
|
||||||
|
|
||||||
CONTROL "", IDC_STATUS2, "msctls_progress32", PBS_SMOOTH, 20, 45, 140, 15
|
|
||||||
|
|
||||||
PUSHBUTTON "Zrušit", IDC_CANCEL, 65, 70, 50, 14, WS_DISABLED
|
|
||||||
END
|
|
||||||
|
|
||||||
IDR_POPUP MENU DISCARDABLE
|
|
||||||
BEGIN
|
|
||||||
POPUP "PopUp", MENUBARBREAK
|
|
||||||
BEGIN
|
|
||||||
MENUITEM "Žádná akce", 1, GRAYED
|
|
||||||
MENUITEM "Instalovat (doporuèeno)", 2, GRAYED
|
|
||||||
MENUITEM "Instalovat ze zdrojových kódù", 3, GRAYED
|
|
||||||
MENUITEM "Aktualizovat", 4, GRAYED
|
|
||||||
MENUITEM "Odinstalovat", 5, GRAYED
|
|
||||||
MENUITEM SEPARATOR
|
|
||||||
MENUITEM "Nastavení", 8
|
|
||||||
MENUITEM SEPARATOR
|
|
||||||
MENUITEM "Provést", 6
|
|
||||||
END
|
|
||||||
END
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
|
|
||||||
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
|
|
||||||
|
|
||||||
/* Dialogs */
|
|
||||||
IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 180, 200
|
|
||||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
|
||||||
CAPTION "Optionen"
|
|
||||||
FONT 8, "MS Sans Serif"
|
|
||||||
BEGIN
|
|
||||||
LTEXT "Leider gibt es noch keine Optionen.", 0, 50, 95, 80, 8
|
|
||||||
END
|
|
||||||
|
|
||||||
IDD_DOIT DIALOG DISCARDABLE 0, 0, 180, 100
|
|
||||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
|
||||||
CAPTION "Performing Operations"
|
|
||||||
FONT 8, "MS Sans Serif"
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
CTEXT "{Status}", IDC_TSTATUS, 0, 10, 180, 8
|
|
||||||
|
|
||||||
CONTROL "", IDC_STATUS1, "msctls_progress32", PBS_SMOOTH, 20, 25, 140, 15
|
|
||||||
|
|
||||||
CONTROL "", IDC_STATUS2, "msctls_progress32", PBS_SMOOTH, 20, 45, 140, 15
|
|
||||||
|
|
||||||
PUSHBUTTON "Abort", IDC_CANCEL, 65, 70, 50, 14, WS_DISABLED
|
|
||||||
END
|
|
||||||
|
|
||||||
IDR_POPUP MENU DISCARDABLE
|
|
||||||
BEGIN
|
|
||||||
POPUP "PopUp", MENUBARBREAK
|
|
||||||
BEGIN
|
|
||||||
MENUITEM "Keine Action", 1, GRAYED
|
|
||||||
MENUITEM "Intallieren (empfohlen)", 2, GRAYED
|
|
||||||
MENUITEM "Intallieren vom Quellcode", 3, GRAYED
|
|
||||||
MENUITEM "Aktualisieren", 4, GRAYED
|
|
||||||
MENUITEM "Deinstallieren", 5, GRAYED
|
|
||||||
MENUITEM SEPARATOR
|
|
||||||
MENUITEM "Optionen", 8
|
|
||||||
MENUITEM SEPARATOR
|
|
||||||
MENUITEM "DoIt", 6
|
|
||||||
END
|
|
||||||
END
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
|
|
||||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
|
||||||
|
|
||||||
/* Dialogs */
|
|
||||||
IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 180, 200
|
|
||||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
|
||||||
CAPTION "Options"
|
|
||||||
FONT 8, "MS Sans Serif"
|
|
||||||
BEGIN
|
|
||||||
LTEXT "There are no options yet.", 0, 50, 95, 80, 8
|
|
||||||
END
|
|
||||||
|
|
||||||
IDD_DOIT DIALOG DISCARDABLE 0, 0, 180, 100
|
|
||||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
|
||||||
CAPTION "Performing Operations"
|
|
||||||
FONT 8, "MS Sans Serif"
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
CTEXT "{Status}", IDC_TSTATUS, 0, 10, 180, 8
|
|
||||||
|
|
||||||
CONTROL "", IDC_STATUS1, "msctls_progress32", PBS_SMOOTH, 20, 25, 140, 15
|
|
||||||
|
|
||||||
CONTROL "", IDC_STATUS2, "msctls_progress32", PBS_SMOOTH, 20, 45, 140, 15
|
|
||||||
|
|
||||||
PUSHBUTTON "Abort", IDC_CANCEL, 65, 70, 50, 14, WS_DISABLED
|
|
||||||
END
|
|
||||||
|
|
||||||
IDR_POPUP MENU DISCARDABLE
|
|
||||||
BEGIN
|
|
||||||
POPUP "PopUp", MENUBARBREAK
|
|
||||||
BEGIN
|
|
||||||
MENUITEM "No Action", 1, GRAYED
|
|
||||||
MENUITEM "Install (recommended)", 2, GRAYED
|
|
||||||
MENUITEM "Install from Source", 3, GRAYED
|
|
||||||
MENUITEM "Update", 4, GRAYED
|
|
||||||
MENUITEM "Uninstall", 5, GRAYED
|
|
||||||
MENUITEM SEPARATOR
|
|
||||||
MENUITEM "Options", 8
|
|
||||||
MENUITEM SEPARATOR
|
|
||||||
MENUITEM "DoIt", 6
|
|
||||||
END
|
|
||||||
END
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
|
|
||||||
LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
|
|
||||||
|
|
||||||
/* Dialogs */
|
|
||||||
IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 180, 200
|
|
||||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
|
||||||
CAPTION "Opciones"
|
|
||||||
FONT 8, "MS Sans Serif"
|
|
||||||
BEGIN
|
|
||||||
LTEXT "Aún no hay opciones disponibles.", 0, 50, 95, 80, 8
|
|
||||||
END
|
|
||||||
|
|
||||||
IDD_DOIT DIALOG DISCARDABLE 0, 0, 180, 100
|
|
||||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
|
||||||
CAPTION "Realizando las operaciones"
|
|
||||||
FONT 8, "MS Sans Serif"
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
CTEXT "{Status}", IDC_TSTATUS, 0, 10, 180, 8
|
|
||||||
|
|
||||||
CONTROL "", IDC_STATUS1, "msctls_progress32", PBS_SMOOTH, 20, 25, 140, 15
|
|
||||||
|
|
||||||
CONTROL "", IDC_STATUS2, "msctls_progress32", PBS_SMOOTH, 20, 45, 140, 15
|
|
||||||
|
|
||||||
PUSHBUTTON "Abort", IDC_CANCEL, 65, 70, 50, 14, WS_DISABLED
|
|
||||||
END
|
|
||||||
|
|
||||||
IDR_POPUP MENU DISCARDABLE
|
|
||||||
BEGIN
|
|
||||||
POPUP "PopUp", MENUBARBREAK
|
|
||||||
BEGIN
|
|
||||||
MENUITEM "Ninguna acción", 1, GRAYED
|
|
||||||
MENUITEM "Instalar (recomendado)", 2, GRAYED
|
|
||||||
MENUITEM "Instalar desde el código fuente", 3, GRAYED
|
|
||||||
MENUITEM "Actualizar", 4, GRAYED
|
|
||||||
MENUITEM "Desinstalar", 5, GRAYED
|
|
||||||
MENUITEM SEPARATOR
|
|
||||||
MENUITEM "Opciones", 8
|
|
||||||
MENUITEM SEPARATOR
|
|
||||||
MENUITEM "¡Hazlo!", 6
|
|
||||||
END
|
|
||||||
END
|
|
||||||
|
|
|
@ -1,46 +0,0 @@
|
||||||
/*
|
|
||||||
* Translation made by Jerome Signouret, 2006.
|
|
||||||
*/
|
|
||||||
|
|
||||||
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
|
|
||||||
|
|
||||||
/* Dialogs */
|
|
||||||
IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 180, 200
|
|
||||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
|
||||||
CAPTION "Options"
|
|
||||||
FONT 8, "MS Sans Serif"
|
|
||||||
BEGIN
|
|
||||||
LTEXT "Il n'y a pas encore d'options.", 0, 50, 95, 80, 8
|
|
||||||
END
|
|
||||||
|
|
||||||
IDD_DOIT DIALOG DISCARDABLE 0, 0, 180, 100
|
|
||||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
|
||||||
CAPTION "Operation en cours"
|
|
||||||
FONT 8, "MS Sans Serif"
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
CTEXT "{Status}", IDC_TSTATUS, 0, 10, 180, 8
|
|
||||||
|
|
||||||
CONTROL "", IDC_STATUS1, "msctls_progress32", PBS_SMOOTH, 20, 25, 140, 15
|
|
||||||
|
|
||||||
CONTROL "", IDC_STATUS2, "msctls_progress32", PBS_SMOOTH, 20, 45, 140, 15
|
|
||||||
|
|
||||||
PUSHBUTTON "Abort", IDC_CANCEL, 65, 70, 50, 14, WS_DISABLED
|
|
||||||
END
|
|
||||||
|
|
||||||
IDR_POPUP MENU DISCARDABLE
|
|
||||||
BEGIN
|
|
||||||
POPUP "PopUp", MENUBARBREAK
|
|
||||||
BEGIN
|
|
||||||
MENUITEM "Pas d'action", 1, GRAYED
|
|
||||||
MENUITEM "Installer (conseillé)", 2, GRAYED
|
|
||||||
|
|
||||||
MENUITEM "Installer depuis les sources", 3, GRAYED
|
|
||||||
MENUITEM "Mise à jour", 4, GRAYED
|
|
||||||
MENUITEM "Désinstaller", 5, GRAYED
|
|
||||||
MENUITEM SEPARATOR
|
|
||||||
MENUITEM "Options", 8
|
|
||||||
MENUITEM SEPARATOR
|
|
||||||
MENUITEM "Action !", 6
|
|
||||||
END
|
|
||||||
END
|
|
|
@ -1,34 +0,0 @@
|
||||||
|
|
||||||
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
|
||||||
|
|
||||||
IDI_MAIN ICON DISCARDABLE "res/packetmanager.ico"
|
|
||||||
IDB_TOOLBAR BITMAP DISCARDABLE "res/toolbar.bmp"
|
|
||||||
|
|
||||||
/* TreeIcons - Categories */
|
|
||||||
1 ICON DISCARDABLE "res/blank.ico"
|
|
||||||
2 ICON DISCARDABLE "res/inet.ico"
|
|
||||||
3 ICON DISCARDABLE "res/office.ico"
|
|
||||||
4 ICON DISCARDABLE "res/graphics.ico"
|
|
||||||
5 ICON DISCARDABLE "res/multimedia.ico"
|
|
||||||
6 ICON DISCARDABLE "res/development.ico"
|
|
||||||
7 ICON DISCARDABLE "res/games.ico"
|
|
||||||
8 ICON DISCARDABLE "res/tools.ico"
|
|
||||||
9 ICON DISCARDABLE "res/others.ico"
|
|
||||||
10 ICON DISCARDABLE "res/installed.ico"
|
|
||||||
|
|
||||||
/* TreeIcons - Actions */
|
|
||||||
11 ICON DISCARDABLE "res/install.ico"
|
|
||||||
12 ICON DISCARDABLE "res/installsource.ico"
|
|
||||||
13 ICON DISCARDABLE "res/update.ico"
|
|
||||||
14 ICON DISCARDABLE "res/uninstall.ico"
|
|
||||||
|
|
||||||
/* HotKeys */
|
|
||||||
|
|
||||||
IDR_HOTKEYS ACCELERATORS DISCARDABLE
|
|
||||||
BEGIN
|
|
||||||
"1", 2, VIRTKEY, CONTROL
|
|
||||||
"2", 3, VIRTKEY, CONTROL
|
|
||||||
"3", 4, VIRTKEY, CONTROL
|
|
||||||
"4", 5, VIRTKEY, CONTROL
|
|
||||||
"0", 1, VIRTKEY, CONTROL
|
|
||||||
END
|
|
|
@ -1,8 +0,0 @@
|
||||||
Welcome to ReactOS's Package Manager !
|
|
||||||
|
|
||||||
WARNING: This is still pre-alfa software you can't do much with it yet.
|
|
||||||
|
|
||||||
This is the online help. You can show it at any time by clicking on the the Questionmark Icon above.
|
|
||||||
|
|
||||||
You can use this package manager like this: click on the
|
|
||||||
You can also use the Buttons [ctrl] + [0] to [4] to set the action.
|
|
|
@ -1,453 +0,0 @@
|
||||||
////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// main.cpp
|
|
||||||
//
|
|
||||||
// Implementation of the Package Manager GUI
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Maarten Bosma, 09.01.2004
|
|
||||||
// maarten.paul@bosma.de
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include "main.h"
|
|
||||||
|
|
||||||
// This is the struct where the toolbar is defined
|
|
||||||
const TBBUTTON Buttons [] =
|
|
||||||
{
|
|
||||||
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP},
|
|
||||||
|
|
||||||
{0, 1, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON}, // No Action
|
|
||||||
{1, 2, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON}, // Install
|
|
||||||
{2, 3, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON}, // Install from source
|
|
||||||
{3, 4, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON}, // Update
|
|
||||||
{4, 5, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON}, // Unistall
|
|
||||||
|
|
||||||
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP},
|
|
||||||
{5, 6, TBSTATE_ENABLED, TBSTYLE_BUTTON}, // DoIt (tm)
|
|
||||||
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP},
|
|
||||||
|
|
||||||
{6, 7, TBSTATE_ENABLED, TBSTYLE_BUTTON}, // Help
|
|
||||||
{7, 8, TBSTATE_ENABLED, TBSTYLE_BUTTON}, // Options
|
|
||||||
|
|
||||||
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP},
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Application's Entry Point
|
|
||||||
int WINAPI WinMain (HINSTANCE hinst, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
|
|
||||||
{
|
|
||||||
HWND hwnd;
|
|
||||||
MSG msg;
|
|
||||||
WNDCLASSEX wc = {0};
|
|
||||||
WCHAR errbuf[2000];
|
|
||||||
|
|
||||||
// Window creation
|
|
||||||
wc.cbSize = sizeof(WNDCLASSEX);
|
|
||||||
wc.lpszClassName = L"pgkmgr";
|
|
||||||
wc.style = CS_HREDRAW | CS_VREDRAW;
|
|
||||||
wc.lpfnWndProc = (WNDPROC)WndProc;
|
|
||||||
wc.hInstance = hinst;
|
|
||||||
wc.hIcon = LoadIcon(hinst, MAKEINTRESOURCE(IDI_MAIN));
|
|
||||||
wc.hbrBackground = (HBRUSH)(COLOR_SCROLLBAR);
|
|
||||||
|
|
||||||
RegisterClassEx(&wc);
|
|
||||||
|
|
||||||
hwnd = CreateWindow(L"pgkmgr",
|
|
||||||
L"ReactOS - Package Manager v0.3",
|
|
||||||
WS_OVERLAPPEDWINDOW,
|
|
||||||
CW_USEDEFAULT,
|
|
||||||
CW_USEDEFAULT,
|
|
||||||
500, 600,
|
|
||||||
NULL, NULL,
|
|
||||||
hinst,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
|
|
||||||
// Toolbar creation
|
|
||||||
InitCommonControls();
|
|
||||||
|
|
||||||
hTBar = CreateToolbarEx(hwnd, WS_CHILD|WS_VISIBLE|TBSTYLE_FLAT, 0, 8, hinst, IDB_TOOLBAR,
|
|
||||||
Buttons, sizeof(Buttons)/sizeof(TBBUTTON), TBSIZE, TBSIZE, TBSIZE, TBSIZE, sizeof(TBBUTTON));
|
|
||||||
|
|
||||||
// Show the windows
|
|
||||||
ShowWindow(hwnd, SW_SHOW);
|
|
||||||
UpdateWindow(hwnd);
|
|
||||||
|
|
||||||
// Load the tree
|
|
||||||
int error = PML_LoadTree(&tree, "tree_bare.xml", AddItem);
|
|
||||||
|
|
||||||
if(error)
|
|
||||||
{
|
|
||||||
MessageBox(0,PML_TransError(error, errbuf, sizeof(errbuf)/sizeof(WCHAR)),0,0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read the help
|
|
||||||
Help();
|
|
||||||
|
|
||||||
// Start getting messages
|
|
||||||
while(GetMessage(&msg,NULL,0,0))
|
|
||||||
{
|
|
||||||
if(!TranslateAccelerator(hwnd, hHotKeys, &msg))
|
|
||||||
{
|
|
||||||
TranslateMessage(&msg);
|
|
||||||
DispatchMessage(&msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close our handle
|
|
||||||
PML_CloseTree (tree);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a item to our tree
|
|
||||||
int AddItem (int id, const char* name, int parent, int icon)
|
|
||||||
{
|
|
||||||
TV_INSERTSTRUCT tvins;
|
|
||||||
|
|
||||||
tvins.item.lParam = (UINT)id;
|
|
||||||
tvins.item.mask = TVIF_TEXT|TVIF_PARAM;
|
|
||||||
tvins.item.pszText = (WCHAR*)name; //that is ok
|
|
||||||
tvins.item.cchTextMax = strlen(name);
|
|
||||||
tvins.hInsertAfter = TVI_LAST;
|
|
||||||
|
|
||||||
if(icon)
|
|
||||||
{
|
|
||||||
tvins.item.iImage = icon;
|
|
||||||
tvins.item.iSelectedImage = icon;
|
|
||||||
tvins.item.mask |= TVIF_IMAGE | TVIF_SELECTEDIMAGE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parent==0)
|
|
||||||
tvins.hParent = TVI_ROOT;
|
|
||||||
else
|
|
||||||
tvins.hParent = nodes[parent];
|
|
||||||
|
|
||||||
nodes[id] = (HTREEITEM)SendMessage(hTree, TVM_INSERTITEMA, 0, (LPARAM)&tvins);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load the Help from file and display it
|
|
||||||
void Help (void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char buffer [2000];
|
|
||||||
FILE* file = fopen ("help.txt", "r");
|
|
||||||
|
|
||||||
if(!file)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for(i=0; i<2000; i++)
|
|
||||||
{
|
|
||||||
buffer[i] = getc(file);
|
|
||||||
if(buffer[i]==EOF) break;
|
|
||||||
}
|
|
||||||
buffer[i] = 0;
|
|
||||||
|
|
||||||
SetText(buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create our Controls
|
|
||||||
void InitControls (HWND hwnd)
|
|
||||||
{
|
|
||||||
|
|
||||||
HINSTANCE hinst = GetModuleHandle(NULL);
|
|
||||||
WCHAR errbuf[2000];
|
|
||||||
|
|
||||||
// Create the controls
|
|
||||||
hTree = CreateWindowEx(0, WC_TREEVIEW, L"TreeView", WS_CHILD|WS_VISIBLE|WS_BORDER|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS,
|
|
||||||
0, 0, 0, 0, hwnd, NULL, hinst, NULL);
|
|
||||||
|
|
||||||
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, L"edit", PML_TransError(IDS_LOAD, errbuf, sizeof(errbuf)/sizeof(WCHAR)), WS_CHILD|WS_VISIBLE|ES_MULTILINE,
|
|
||||||
0, 0, 100, 100, hwnd, NULL, hinst, NULL);
|
|
||||||
|
|
||||||
hPopup = LoadMenu(hinst, MAKEINTRESOURCE(IDR_POPUP));
|
|
||||||
|
|
||||||
// Create Tree Icons
|
|
||||||
HIMAGELIST hIcon = ImageList_Create(16, 16, ILC_MASK|ILC_COLOR32, 1, 1);
|
|
||||||
SendMessage(hTree, TVM_SETIMAGELIST, TVSIL_NORMAL, (LPARAM)(HIMAGELIST)hIcon);
|
|
||||||
|
|
||||||
ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(1)));
|
|
||||||
ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(11)));
|
|
||||||
ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(12)));
|
|
||||||
ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(13)));
|
|
||||||
ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(14)));
|
|
||||||
|
|
||||||
ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(2)));
|
|
||||||
ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(3)));
|
|
||||||
ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(4)));
|
|
||||||
ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(5)));
|
|
||||||
ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(6)));
|
|
||||||
ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(7)));
|
|
||||||
ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(8)));
|
|
||||||
ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(9)));
|
|
||||||
ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(10)));
|
|
||||||
|
|
||||||
// Setup Hotkeys
|
|
||||||
hHotKeys = LoadAccelerators (hinst, MAKEINTRESOURCE(IDR_HOTKEYS));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the Icons
|
|
||||||
int SetIcon (int id, int icon)
|
|
||||||
{
|
|
||||||
TVITEMEX item;
|
|
||||||
|
|
||||||
item.hItem = nodes[id];
|
|
||||||
item.iImage = icon;
|
|
||||||
item.iSelectedImage = icon;
|
|
||||||
item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
|
|
||||||
|
|
||||||
TreeView_SetItem(hTree, &item);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the Icons
|
|
||||||
int Ask (const WCHAR* message)
|
|
||||||
{
|
|
||||||
int ans = MessageBox (0,message,0,MB_YESNO);
|
|
||||||
|
|
||||||
if(ans == IDYES)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// En- or Disable a Button inside of the toolbar and the Context Menu
|
|
||||||
int SetButton (DWORD id, BOOL state)
|
|
||||||
{
|
|
||||||
// Change the Toorbar Button
|
|
||||||
TBBUTTONINFO ti;
|
|
||||||
|
|
||||||
ti.cbSize = sizeof (ti);
|
|
||||||
ti.dwMask = TBIF_STATE;
|
|
||||||
|
|
||||||
if(state)
|
|
||||||
ti.fsState = TBSTATE_ENABLED;
|
|
||||||
else
|
|
||||||
ti.fsState = TBSTATE_INDETERMINATE;
|
|
||||||
|
|
||||||
SendMessage (hTBar, TB_SETBUTTONINFO, id, (LPARAM)&ti);
|
|
||||||
|
|
||||||
// Change the Context Menu item
|
|
||||||
MENUITEMINFO mi;
|
|
||||||
|
|
||||||
mi.cbSize = sizeof (mi);
|
|
||||||
mi.fMask = MIIM_STATE;
|
|
||||||
|
|
||||||
if(state)
|
|
||||||
mi.fState = MFS_ENABLED;
|
|
||||||
|
|
||||||
else
|
|
||||||
mi.fState = MFS_GRAYED;
|
|
||||||
|
|
||||||
SetMenuItemInfo(hPopup, id, FALSE, &mi);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the text of the text box
|
|
||||||
int SetText (const char* text)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
char buffer [2000];
|
|
||||||
|
|
||||||
if(!text)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
// the windows does not need "\n"
|
|
||||||
// for new lines but "\r\n"
|
|
||||||
for(i=0,j=0; text[i]; i++,j++)
|
|
||||||
{
|
|
||||||
buffer[j] = text[i];
|
|
||||||
if(buffer[j] == '\n')
|
|
||||||
{
|
|
||||||
buffer[j] = '\r';
|
|
||||||
buffer[++j] = '\n';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buffer[j] = 0;
|
|
||||||
|
|
||||||
SetWindowTextA(hEdit, buffer);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Windows Message Callback (this is where most things happen)
|
|
||||||
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
||||||
{
|
|
||||||
switch (message)
|
|
||||||
{
|
|
||||||
// at the very beginning ...
|
|
||||||
case WM_CREATE:
|
|
||||||
{
|
|
||||||
InitControls(hwnd);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// calculate the size of the controls
|
|
||||||
case WM_SIZE:
|
|
||||||
{
|
|
||||||
RECT rcl;
|
|
||||||
SendMessage(hTBar, TB_AUTOSIZE, 0L, 0L);
|
|
||||||
GetWindowRect(hTBar, &rcl);
|
|
||||||
|
|
||||||
int win_top = rcl.bottom - rcl.top;
|
|
||||||
int win_hight = HIWORD(lParam) - win_top;
|
|
||||||
|
|
||||||
MoveWindow(hTree, 0, win_top, LOWORD(lParam), splitter_pos*win_hight/100, TRUE);
|
|
||||||
MoveWindow(hEdit, 0, (splitter_pos*win_hight/100)+win_top, LOWORD(lParam), win_hight, TRUE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// for the treeview
|
|
||||||
case WM_NOTIFY:
|
|
||||||
{
|
|
||||||
if(((LPNMHDR)lParam)->code == TVN_SELCHANGED)
|
|
||||||
{
|
|
||||||
selected = ((LPNMTREEVIEW)lParam)->itemNew.lParam;
|
|
||||||
PML_LoadPackage (tree, selected, SetButton);
|
|
||||||
SetText(PML_GetDescription (tree, selected));
|
|
||||||
}
|
|
||||||
|
|
||||||
else if ((int)(((LPNMHDR)lParam)->code) == NM_RCLICK) // <= aarrggg LISP
|
|
||||||
{
|
|
||||||
// which item has been click on
|
|
||||||
HTREEITEM item = TreeView_GetDropHilight(hTree);
|
|
||||||
|
|
||||||
if(item != NULL)
|
|
||||||
{
|
|
||||||
// mark the one as seleacted
|
|
||||||
SendMessage (hTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)item);
|
|
||||||
TreeView_EnsureVisible (hTree, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
// create the context menu
|
|
||||||
if(selected != 0)
|
|
||||||
{
|
|
||||||
POINT pt;
|
|
||||||
GetCursorPos (&pt);
|
|
||||||
TrackPopupMenu (GetSubMenu(hPopup, 0), 0, (UINT)pt.x, (UINT)pt.y, 0, hwnd, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// for the toolbar
|
|
||||||
case WM_COMMAND:
|
|
||||||
{
|
|
||||||
// All Actions
|
|
||||||
if(LOWORD(wParam) <= 5 && LOWORD(wParam) >= 1)
|
|
||||||
{
|
|
||||||
if(selected)
|
|
||||||
if(PML_SetAction(tree, selected, LOWORD(wParam)-1, SetIcon, Ask) == ERR_OK)
|
|
||||||
break;
|
|
||||||
|
|
||||||
MessageBeep(MB_ICONHAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
// DoIt
|
|
||||||
else if(LOWORD(wParam)==6)
|
|
||||||
{
|
|
||||||
if(PML_DoIt(tree, SetStatus, Ask) == ERR_OK)
|
|
||||||
DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DOIT), hwnd, StatusProc);
|
|
||||||
else
|
|
||||||
MessageBeep(MB_ICONHAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Help
|
|
||||||
else if(LOWORD(wParam)==7)
|
|
||||||
Help();
|
|
||||||
|
|
||||||
// Options
|
|
||||||
else if(LOWORD(wParam)==8)
|
|
||||||
DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_OPTIONS), hwnd, OptionsProc);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// prozess hotkeys
|
|
||||||
case WM_HOTKEY:
|
|
||||||
{
|
|
||||||
if(PML_SetAction(tree, selected, wParam, SetIcon, Ask) != ERR_OK)
|
|
||||||
MessageBeep(MB_ICONHAND);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// ... at the very end
|
|
||||||
case WM_DESTROY:
|
|
||||||
{
|
|
||||||
PostQuitMessage(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return DefWindowProc (hwnd, message, wParam, lParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warning: This function is called from another thread
|
|
||||||
int SetStatus (int status1, int status2, WCHAR* text)
|
|
||||||
{
|
|
||||||
WCHAR errbuf[2000];
|
|
||||||
|
|
||||||
// Set the Rage to 1000
|
|
||||||
SendMessage(GetDlgItem(hStatus, IDC_STATUS1), PBM_SETRANGE32, 0, 1000);
|
|
||||||
SendMessage(GetDlgItem(hStatus, IDC_STATUS2), PBM_SETRANGE32, 0, 1000);
|
|
||||||
|
|
||||||
// The prozessbars and the text filds
|
|
||||||
if(text)
|
|
||||||
SetDlgItemText(hStatus, IDC_TSTATUS, text);
|
|
||||||
|
|
||||||
if(status1!=-1)
|
|
||||||
SendMessage(GetDlgItem(hStatus, IDC_STATUS1), PBM_SETPOS, status1, 0);
|
|
||||||
|
|
||||||
if(status2!=-1)
|
|
||||||
SendMessage(GetDlgItem(hStatus, IDC_STATUS2), PBM_SETPOS, status2, 0);
|
|
||||||
|
|
||||||
// If the Status is 1000 everything is done
|
|
||||||
if(status1==1000)
|
|
||||||
{
|
|
||||||
EndDialog(hStatus, TRUE);
|
|
||||||
MessageBox(0,PML_TransError(status2, errbuf, sizeof(errbuf)/sizeof(WCHAR)),0,0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Callback for the Status Dialog
|
|
||||||
INT_PTR CALLBACK StatusProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
||||||
{
|
|
||||||
switch (msg)
|
|
||||||
{
|
|
||||||
case WM_INITDIALOG:
|
|
||||||
{
|
|
||||||
hStatus = hwnd;
|
|
||||||
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case WM_COMMAND: // can only be the about button
|
|
||||||
case WM_CLOSE: // the close-window-[x]
|
|
||||||
{
|
|
||||||
PML_Abort();
|
|
||||||
EndDialog(hwnd, TRUE);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Callback for the Options Dialog
|
|
||||||
INT_PTR CALLBACK OptionsProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
||||||
{
|
|
||||||
switch (msg)
|
|
||||||
{
|
|
||||||
case WM_CLOSE:
|
|
||||||
EndDialog(hwnd, TRUE);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
///////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// main.h
|
|
||||||
// main.cpp's lumber room :)
|
|
||||||
///////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include <commctrl.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <package.h>
|
|
||||||
#include "resource.h"
|
|
||||||
|
|
||||||
/* Some Variables */
|
|
||||||
|
|
||||||
int selected, splitter_pos = 50;
|
|
||||||
|
|
||||||
pTree tree;
|
|
||||||
HMENU hPopup;
|
|
||||||
HACCEL hHotKeys;
|
|
||||||
HWND hTBar, hTree, hEdit, hStatus;
|
|
||||||
HTREEITEM nodes [MAXNODES];
|
|
||||||
|
|
||||||
/* Window Callbacks */
|
|
||||||
|
|
||||||
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
|
|
||||||
INT_PTR CALLBACK StatusProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
|
|
||||||
INT_PTR CALLBACK OptionsProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
|
|
||||||
|
|
||||||
/* Prototypes */
|
|
||||||
|
|
||||||
void Help (void);
|
|
||||||
|
|
||||||
int AddItem (int id, const char* name, int parent, int icon);
|
|
||||||
int SetText (const char* text);
|
|
||||||
int SetStatus (int status1, int status2, WCHAR* text);
|
|
||||||
int Ask (const WCHAR* message);
|
|
||||||
|
|
||||||
/* Toolbar Releated */
|
|
||||||
|
|
||||||
#define TBSTYLE_FLAT 2048
|
|
||||||
|
|
||||||
// This is the struct where the toolbar is defined
|
|
||||||
extern const TBBUTTON Buttons [];
|
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include "resource.h"
|
|
||||||
|
|
||||||
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Package Manager\0"
|
|
||||||
#define REACTOS_STR_INTERNAL_NAME "packmgr\0"
|
|
||||||
#define REACTOS_STR_ORIGINAL_FILENAME "packmgr.exe\0"
|
|
||||||
|
|
||||||
#include <reactos/version.rc>
|
|
||||||
|
|
||||||
/* For all langs */
|
|
||||||
#include "generic.rc"
|
|
||||||
|
|
||||||
/* Language specific */
|
|
||||||
|
|
||||||
#include "cz.rc"
|
|
||||||
#include "de.rc"
|
|
||||||
#include "en.rc"
|
|
||||||
#include "es.rc"
|
|
||||||
#include "fr.rc"
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,16 +0,0 @@
|
||||||
<module name="packmgr" type="win32gui" installbase="system32" installname="packmgr.exe">
|
|
||||||
<include base="package">.</include>
|
|
||||||
<include base="packmgr">.</include>
|
|
||||||
<define name="__USE_W32API" />
|
|
||||||
<define name="UNICODE" />
|
|
||||||
<define name="_WIN32_IE">0x0501</define>
|
|
||||||
<define name="_WIN32_WINNT">0x0501</define>
|
|
||||||
|
|
||||||
<library>kernel32</library>
|
|
||||||
<library>user32</library>
|
|
||||||
<library>comctl32</library>
|
|
||||||
<library>package</library>
|
|
||||||
|
|
||||||
<file>main.c</file>
|
|
||||||
<file>packmgr.rc</file>
|
|
||||||
</module>
|
|
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 9.1 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 21 KiB |
|
@ -1,15 +0,0 @@
|
||||||
#include "../lib/error.h"
|
|
||||||
|
|
||||||
#define IDI_MAIN 0
|
|
||||||
|
|
||||||
#define TBSIZE 32
|
|
||||||
#define IDB_TOOLBAR 0x102
|
|
||||||
#define IDD_OPTIONS 0x103
|
|
||||||
#define IDD_DOIT 0x104
|
|
||||||
#define IDR_POPUP 0x105
|
|
||||||
|
|
||||||
#define IDC_STATUS1 0x110
|
|
||||||
#define IDC_STATUS2 0x111
|
|
||||||
#define IDC_CANCEL 0x112
|
|
||||||
#define IDC_TSTATUS 0x113
|
|
||||||
#define IDR_HOTKEYS 0x114
|
|
|
@ -1,25 +0,0 @@
|
||||||
|
|
||||||
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
|
|
||||||
|
|
||||||
/* String Tables */
|
|
||||||
STRINGTABLE DISCARDABLE
|
|
||||||
BEGIN
|
|
||||||
IDS_LOAD "Nahrávám ..."
|
|
||||||
ERR_OK "Operace dokončena."
|
|
||||||
ERR_PACK "Všechny balíčky nemohly být nainstalovány.\n\nProsím podívejte se do logu pro detaily."
|
|
||||||
ERR_GENERIC "Nastala chyba. \nProsím podívejte se do logu pro detaily."
|
|
||||||
ERR_DOWNL "Vyžadovaný soubor nemohl být stažen!\nProsím podívejte se do logu pro detaily."
|
|
||||||
ERR_FILE "Nastala chyba během vykonávání skriptu.\nSoubor nelze otevřít."
|
|
||||||
|
|
||||||
ERR_SYNATX "Nastala chyba během vykonávání skriptu.\nChybná synatxe."
|
|
||||||
ERR_CALL "Nastala chyba během vykonávání skriptu.\nNelze najít funkci."
|
|
||||||
ERR_PARAMETER "Nastala chyba během vykonávání skriptu.\nNesprávný parametr(y)."
|
|
||||||
|
|
||||||
ERR_DEP1 "K nainstalování tohoto balíčku je třeba instalovat také tyto balíčky:\n\n"
|
|
||||||
ERR_DEP2 "\nChcete toto přidat ?"
|
|
||||||
ERR_READY "Zvolili jste si instalaci %d balíčkú. Aby jste je nainstalovali je třeba abyste přečetli a souhlasili s jejich licencemi. \n\nChcete nadále pokračovat ?"
|
|
||||||
END
|
|
||||||
|
|
||||||
123 RCDATA "options.xml"
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,25 +0,0 @@
|
||||||
|
|
||||||
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
|
|
||||||
|
|
||||||
/* String Tables */
|
|
||||||
STRINGTABLE DISCARDABLE
|
|
||||||
BEGIN
|
|
||||||
IDS_LOAD "Lade ..."
|
|
||||||
ERR_OK "Fertig."
|
|
||||||
ERR_PACK "Es konnten nicht alle Packages installiert werden.\n\nFür mehr Details schauen Sie bitte in ""logfile.html""."
|
|
||||||
ERR_GENERIC "Ein Fehler ist aufgetreten. \nnFür mehr Details schauen Sie bitte in ""logfile.html""."
|
|
||||||
ERR_DOWNL "Eine benötigte Datei konnte nicht runtergeladen werden!\nFür mehr Details schauen Sie bitte in ""logfile.html""."
|
|
||||||
ERR_FILE "Bei der Scriptausfürhung trat ein Fehler auf.\nDatei konnte nicht geöffnet werden."
|
|
||||||
|
|
||||||
ERR_SYNATX "Bei der Scriptausfürhung trat ein Fehler auf.\nSynatx-Fehler."
|
|
||||||
ERR_CALL "Bei der Scriptausfürhung trat ein Fehler auf.\nUnbekannte Funktion."
|
|
||||||
ERR_PARAMETER "Bei der Scriptausfürhung trat ein Fehler auf.\nUngültige(r) Parameter."
|
|
||||||
|
|
||||||
ERR_DEP1 "Um diese Package zu installieren müssen die ebenfall die folende/n Package/s installieren:\n\n"
|
|
||||||
ERR_DEP2 "\nMöchten sie fortfahren ?"
|
|
||||||
ERR_READY "Sie haben %d package/s ausgewählt. Um sie zu installieren müssen sie sich mit jeder einzellnen Lizenz einverstanden erklärt haben. \n\nMöchten sie forfahren ?"
|
|
||||||
END
|
|
||||||
|
|
||||||
123 RCDATA "options.xml"
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,168 +0,0 @@
|
||||||
////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// download.cpp
|
|
||||||
//
|
|
||||||
// Stuff related to downloading
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Maarten Bosma, 09.01.2004
|
|
||||||
// maarten.paul@bosma.de
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include "package.hpp"
|
|
||||||
#include "expat.h"
|
|
||||||
#include "log.h"
|
|
||||||
#include <urlmon.h>
|
|
||||||
|
|
||||||
HRESULT WINAPI URLDownloadToFileA(
|
|
||||||
LPUNKNOWN pCaller,
|
|
||||||
LPCSTR szURL,
|
|
||||||
LPCSTR szFileName,
|
|
||||||
DWORD dwReserved,
|
|
||||||
LPBINDSTATUSCALLBACK lpfnCB
|
|
||||||
);
|
|
||||||
|
|
||||||
int FindCount (string What, string Where, int start = 0, int end = -1);
|
|
||||||
|
|
||||||
|
|
||||||
// Download a file
|
|
||||||
char* PML_Download (pTree tree, const char* url, const char* server = "tree", const char* filename = "packmgr.xml")
|
|
||||||
{
|
|
||||||
UINT i;
|
|
||||||
static char downl [MAX_PATH]; // the full url
|
|
||||||
static char path [MAX_PATH]; // the full resulting Path
|
|
||||||
|
|
||||||
// It goes to the temp folder when no other path is entered (or even compleatly no filename)
|
|
||||||
// If server == "tree" it will be downloaded from the server speficied in option.xml
|
|
||||||
// File:// links are possible too
|
|
||||||
|
|
||||||
// get temp dir
|
|
||||||
if(!filename)
|
|
||||||
GetTempPathA (200, path);
|
|
||||||
|
|
||||||
else if(!strstr(filename, "\\"))
|
|
||||||
GetTempPathA (200, path);
|
|
||||||
|
|
||||||
else
|
|
||||||
strcpy(path, "");
|
|
||||||
|
|
||||||
|
|
||||||
// create the local file name
|
|
||||||
if(filename)
|
|
||||||
{
|
|
||||||
strcat(path, filename);
|
|
||||||
DeleteFileA (path);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
GetTempFileNameA (path, "pml", 1, path);
|
|
||||||
|
|
||||||
// get the url
|
|
||||||
if (!server)
|
|
||||||
strcpy(downl, "");
|
|
||||||
|
|
||||||
else if(!strcmp(server, "tree"))
|
|
||||||
{
|
|
||||||
char* ret;
|
|
||||||
for (i=0; i<tree->sources.size(); i++)
|
|
||||||
{
|
|
||||||
ret = PML_Download(tree, url, tree->sources[i], filename);
|
|
||||||
if(ret)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
strcpy(downl, server);
|
|
||||||
|
|
||||||
strcat(downl, url);
|
|
||||||
|
|
||||||
// is this a file link ?
|
|
||||||
if (strstr(downl, "file://") || strstr(downl, "File://"))
|
|
||||||
{
|
|
||||||
if(!filename)
|
|
||||||
{
|
|
||||||
return &downl[7];
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CopyFileA(filename, &downl[7], FALSE);
|
|
||||||
return (char*)filename;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// download the file
|
|
||||||
if(URLDownloadToFileA (NULL, downl, path, 0, NULL) != S_OK)
|
|
||||||
{
|
|
||||||
Log("! ERROR: Unable to download ");
|
|
||||||
LogAdd(downl);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Download and prozess a xml file
|
|
||||||
int PML_XmlDownload (pTree tree, const char* url, void* usrdata,
|
|
||||||
XML_StartElementHandler start, XML_EndElementHandler end, XML_CharacterDataHandler text)
|
|
||||||
{
|
|
||||||
int done = 0;
|
|
||||||
char buffer[255];
|
|
||||||
char* filename = 0;
|
|
||||||
|
|
||||||
// logging
|
|
||||||
Log("* prozess the xml file: ");
|
|
||||||
LogAdd(url);
|
|
||||||
|
|
||||||
// download the file
|
|
||||||
if(strstr(url, "file://"))
|
|
||||||
filename = PML_Download(tree, url, NULL, NULL);
|
|
||||||
|
|
||||||
else
|
|
||||||
filename = PML_Download(tree, url);
|
|
||||||
|
|
||||||
|
|
||||||
if(!filename)
|
|
||||||
{
|
|
||||||
Log("! ERROR: Could not download the xml file");
|
|
||||||
return ERR_DOWNL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// open the file
|
|
||||||
FILE* file = fopen(filename, "r");
|
|
||||||
if(!file)
|
|
||||||
{
|
|
||||||
Log("! ERROR: Could not open the xml file ");
|
|
||||||
LogAdd(filename);
|
|
||||||
return ERR_GENERIC;
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse the xml file
|
|
||||||
XML_Parser parser = XML_ParserCreate(NULL);
|
|
||||||
XML_SetUserData (parser, usrdata);
|
|
||||||
XML_SetElementHandler(parser, start, end);
|
|
||||||
XML_SetCharacterDataHandler(parser, text);
|
|
||||||
|
|
||||||
while (!done)
|
|
||||||
{
|
|
||||||
size_t len = fread (buffer, 1, sizeof(buffer), file);
|
|
||||||
done = len < sizeof(buffer);
|
|
||||||
|
|
||||||
buffer[len] = 0;
|
|
||||||
if(!XML_Parse(parser, buffer, len, done))
|
|
||||||
{
|
|
||||||
Log("! ERROR: Could not parse the xml file");
|
|
||||||
return ERR_GENERIC;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
XML_ParserFree(parser);
|
|
||||||
fclose(file);
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
|
|
||||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
|
||||||
|
|
||||||
/* String Tables */
|
|
||||||
STRINGTABLE DISCARDABLE
|
|
||||||
BEGIN
|
|
||||||
IDS_LOAD "Loading ..."
|
|
||||||
ERR_OK "Operation done."
|
|
||||||
ERR_PACK "Not all packages could be installed\n\nPlease have a look at the log file for details."
|
|
||||||
ERR_GENERIC "An error occured. \nFor more information please have a look at the log file."
|
|
||||||
ERR_DOWNL "A needed file could not be downloaded!\nFor more information please have a look at the log file."
|
|
||||||
ERR_FILE "Error while Script Execution.\nFile could not be opened."
|
|
||||||
|
|
||||||
ERR_SYNATX "Error while Script Execution.\nWrong Synatx."
|
|
||||||
ERR_CALL "Error while Script Execution.\nCould not find function."
|
|
||||||
ERR_PARAMETER "Error while Script Execution.\nWrong Parameter(s)."
|
|
||||||
|
|
||||||
ERR_DEP1 "To install this package you have to install the following package(s) as well:\n\n"
|
|
||||||
ERR_DEP2 "\nDo you want this ?"
|
|
||||||
ERR_READY "You choosen to install %d package(s). To install them you have to read and agree with each of thier licences. \n\nDo you want still want to ?"
|
|
||||||
END
|
|
||||||
|
|
||||||
123 RCDATA "options.xml"
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,20 +0,0 @@
|
||||||
// error.h
|
|
||||||
|
|
||||||
#define ERR_OK 0x000
|
|
||||||
#define ERR_GENERIC 0x001
|
|
||||||
#define ERR_DOWNL 0x002
|
|
||||||
#define ERR_NOTODO 0x003 // without text yet
|
|
||||||
#define ERR_PACK 0x004
|
|
||||||
|
|
||||||
#define ERR_DEP1 0x005
|
|
||||||
#define ERR_DEP2 0x006
|
|
||||||
#define ERR_READY 0x007
|
|
||||||
|
|
||||||
// Script
|
|
||||||
#define ERR_SYNATX 0x011
|
|
||||||
#define ERR_CALL 0x012
|
|
||||||
#define ERR_PARAMETER 0x013
|
|
||||||
#define ERR_FILE 0x014
|
|
||||||
|
|
||||||
#define IDS_LOAD 0x254
|
|
||||||
#define NOTFOUND -1
|
|
|
@ -1,24 +0,0 @@
|
||||||
LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
|
|
||||||
|
|
||||||
/* String Tables */
|
|
||||||
STRINGTABLE DISCARDABLE
|
|
||||||
BEGIN
|
|
||||||
IDS_LOAD "Cargando ..."
|
|
||||||
ERR_OK "Operación completada."
|
|
||||||
ERR_PACK "No todos los paquetes pudieron ser instalados\n\nPor favor, mira el archivo de log para más detalles."
|
|
||||||
ERR_GENERIC "Ocurrió un error. \nPor favor, mira el archivo de log para más detalles."
|
|
||||||
ERR_DOWNL "¡Un archivo necesario no pudo ser descargado!\nPor favor, mira el archivo de log para más detalles."
|
|
||||||
ERR_FILE "Error durante la ejecución del Script.\nEl archivo no pudo abrirse."
|
|
||||||
|
|
||||||
ERR_SYNATX "Error durante la ejecución del Script.\nSintaxis errónea."
|
|
||||||
ERR_CALL "Error durante la ejecución del Script.\nNo se pudo encontrar la función."
|
|
||||||
ERR_PARAMETER "Error durante la ejecución del Script.\nParametro(s) erróneo."
|
|
||||||
|
|
||||||
ERR_DEP1 "Para instalar este paquete debes instalar también los siguientes paquetes:\n\n"
|
|
||||||
ERR_DEP2 "\n¿Seguro que quieres ahcer eso?"
|
|
||||||
ERR_READY "Has seleccionado instalar %d paquete(s). Para instalarlos debes leer y estar deacuerdo con cada uno de sus licencias.\n\n ¿Sigues queriendo hacerlo?"
|
|
||||||
END
|
|
||||||
|
|
||||||
123 RCDATA "options.xml"
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,28 +0,0 @@
|
||||||
/*
|
|
||||||
* Translation made by Jerome Signouret, 2006.
|
|
||||||
*/
|
|
||||||
|
|
||||||
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
|
|
||||||
|
|
||||||
/* String Tables */
|
|
||||||
STRINGTABLE DISCARDABLE
|
|
||||||
BEGIN
|
|
||||||
IDS_LOAD "Chargement ..."
|
|
||||||
ERR_OK "Fini."
|
|
||||||
ERR_PACK "Tous les paquets ne peuvent etre installés\n\nVeuillez consulter le fichier journal pour les détails."
|
|
||||||
ERR_GENERIC "Une erreur s'est produite. \nVeuillez consulter le fichier journal pour les détails."
|
|
||||||
ERR_DOWNL "Un fichier requis ne peut etre téléchargé !\nVeuillez consulter le fichier journal pour les détails."
|
|
||||||
ERR_FILE "Erreur pendant l'éxécution du script.\nUn fichier n'a pu etre ouvert."
|
|
||||||
|
|
||||||
ERR_SYNATX "Erreur pendant l'éxécution du script.\nErreur de syntaxe."
|
|
||||||
ERR_CALL "Erreur pendant l'éxécution du script.\nUne fonction ne peut etre trouvée."
|
|
||||||
ERR_PARAMETER "Erreur pendant l'éxécution du script.\nParamètre(s) erroné(s)."
|
|
||||||
|
|
||||||
ERR_DEP1 "Pour installer ce paquet, il faut aussi installer les paquets suivants :\n\n"
|
|
||||||
ERR_DEP2 "\nVoulez-vous les installer ?"
|
|
||||||
ERR_READY "Vous avez choisi d'installer %d paquets. Pour les installer, vous devez lire et accepter les licences de chacun.\n\nVoulez-vous toujours continuer ?"
|
|
||||||
END
|
|
||||||
|
|
||||||
123 RCDATA "options.xml"
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,101 +0,0 @@
|
||||||
////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// functions.cpp
|
|
||||||
//
|
|
||||||
// Script Functions
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Klemens Friedl, 19.03.2005
|
|
||||||
// frik85@hotmail.com
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include "package.hpp"
|
|
||||||
#include "script.h"
|
|
||||||
#include "log.h"
|
|
||||||
|
|
||||||
extern const char* tree_server;
|
|
||||||
char* PML_Download (pTree, const char* url, const char* server, const char* filename);
|
|
||||||
|
|
||||||
|
|
||||||
int debuglog (int argc, char* argv[])
|
|
||||||
{
|
|
||||||
Log("! SCRIPT DEBUG: ");
|
|
||||||
LogAdd(argv[1]);
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int download (int argc, char* argv[])
|
|
||||||
{
|
|
||||||
char* result;
|
|
||||||
|
|
||||||
if (argc==3)
|
|
||||||
result = PML_Download(NULL, argv[1], argv[3], argv[2]);
|
|
||||||
|
|
||||||
else if (argc==2)
|
|
||||||
result = PML_Download(NULL, argv[1], NULL, argv[2]);
|
|
||||||
|
|
||||||
else
|
|
||||||
return ERR_GENERIC;
|
|
||||||
|
|
||||||
if(!result)
|
|
||||||
return ERR_GENERIC;
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int extract (int argc, char* argv[])
|
|
||||||
{
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int msgbox (int argc, char* argv[])
|
|
||||||
{
|
|
||||||
if (argc==1)
|
|
||||||
MessageBoxA(0,argv[1],0,0);
|
|
||||||
|
|
||||||
else if (argc==2)
|
|
||||||
MessageBoxA(0,argv[1],argv[2],0);
|
|
||||||
|
|
||||||
else
|
|
||||||
return ERR_GENERIC;
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int shell (int argc, char* argv[])
|
|
||||||
{
|
|
||||||
// Get the temp dir
|
|
||||||
char tmp [MAX_PATH];
|
|
||||||
GetTempPathA (MAX_PATH, tmp);
|
|
||||||
|
|
||||||
SHELLEXECUTEINFOA info = {0};
|
|
||||||
info.cbSize = sizeof(SHELLEXECUTEINFO);
|
|
||||||
info.fMask = SEE_MASK_NOCLOSEPROCESS;
|
|
||||||
info.lpVerb = "open";
|
|
||||||
info.lpFile = argv[1];
|
|
||||||
info.lpDirectory = tmp;
|
|
||||||
info.nShow = SW_SHOW;
|
|
||||||
|
|
||||||
if(argc >= 2)
|
|
||||||
info.lpParameters = "";
|
|
||||||
|
|
||||||
if(!ShellExecuteExA (&info))
|
|
||||||
return ERR_GENERIC;
|
|
||||||
|
|
||||||
WaitForSingleObject (info.hProcess, INFINITE);
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
const FUNC_TABLE FuncTable[] =
|
|
||||||
{
|
|
||||||
/* Name */ /* Function */
|
|
||||||
{"download", download},
|
|
||||||
{"extract", extract},
|
|
||||||
{"shell", shell},
|
|
||||||
{"msgbox", msgbox},
|
|
||||||
{"debug", debuglog}
|
|
||||||
};
|
|
|
@ -1,117 +0,0 @@
|
||||||
////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// log.cpp
|
|
||||||
//
|
|
||||||
// Script Functions
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Klemens Friedl, 19.03.2005
|
|
||||||
// frik85@hotmail.com
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#include "log.h"
|
|
||||||
#include "package.hpp" // for Package Manager version
|
|
||||||
#include <reactos/version.h> // ReactOS version: \reactos\include\reactos\version.h
|
|
||||||
|
|
||||||
bool LogCreated = false;
|
|
||||||
|
|
||||||
void Log (const char *message)
|
|
||||||
{
|
|
||||||
FILE *file;
|
|
||||||
char GTime[80];
|
|
||||||
char version[50];
|
|
||||||
char versionos[50];
|
|
||||||
|
|
||||||
if (!LogCreated)
|
|
||||||
{
|
|
||||||
file = fopen(LOGFILE, "w");
|
|
||||||
LogCreated = true;
|
|
||||||
|
|
||||||
//HTML Header
|
|
||||||
fputs("<html><head><title>Logfile</title></head><body>\n", file);
|
|
||||||
|
|
||||||
// date and time
|
|
||||||
time_t now;
|
|
||||||
now = time(NULL);
|
|
||||||
strftime(GTime,sizeof GTime,"%Y-%m-%d",localtime(&now));
|
|
||||||
|
|
||||||
// package manager version information
|
|
||||||
wsprintfA(version, " Package Manager %d.%d.%d",
|
|
||||||
PACKMGR_VERSION_MAJOR,
|
|
||||||
PACKMGR_VERSION_MINOR,
|
|
||||||
PACKMGR_VERSION_PATCH_LEVEL);
|
|
||||||
|
|
||||||
// operating system version information
|
|
||||||
wsprintfA(versionos, " ReactOS %d.%d.%d",
|
|
||||||
KERNEL_VERSION_MAJOR,
|
|
||||||
KERNEL_VERSION_MINOR,
|
|
||||||
KERNEL_VERSION_PATCH_LEVEL);
|
|
||||||
|
|
||||||
// write the head
|
|
||||||
fputs("<h2>ReactOS Package Manager - Log File</h2>\n", file);
|
|
||||||
//fputs("WARNING: This is still pre-alpha software.<br>\n", file);
|
|
||||||
|
|
||||||
fputs("Date: ", file);
|
|
||||||
fputs(GTime, file);
|
|
||||||
fputs("<br>\n", file);
|
|
||||||
|
|
||||||
fputs("Version: ", file);
|
|
||||||
fputs(version, file);
|
|
||||||
fputs("<br>\n", file);
|
|
||||||
|
|
||||||
fputs("OS: ", file);
|
|
||||||
fputs(versionos, file);
|
|
||||||
fputs("<br>\n", file);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
file = fopen(LOGFILE, "a");
|
|
||||||
|
|
||||||
if (file == NULL)
|
|
||||||
{
|
|
||||||
if (LogCreated)
|
|
||||||
LogCreated = false;
|
|
||||||
|
|
||||||
return Log(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Save log entry (+ add time)
|
|
||||||
fputs("<br>\n", file);
|
|
||||||
|
|
||||||
time_t now;
|
|
||||||
now = time(NULL);
|
|
||||||
strftime(GTime,sizeof GTime,"%I:%M:%S %p",localtime(&now));
|
|
||||||
|
|
||||||
fputs("<b>", file);
|
|
||||||
fputs(GTime, file);
|
|
||||||
fputs("</b> ", file);
|
|
||||||
|
|
||||||
fputs(message, file);
|
|
||||||
fclose(file);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file)
|
|
||||||
fclose(file);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LogAdd (const char *message)
|
|
||||||
{
|
|
||||||
FILE *file;
|
|
||||||
|
|
||||||
file = fopen(LOGFILE, "a");
|
|
||||||
|
|
||||||
// Save log entry
|
|
||||||
fputs(message, file);
|
|
||||||
fclose(file);
|
|
||||||
|
|
||||||
if (file)
|
|
||||||
fclose(file);
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// log.h
|
|
||||||
//
|
|
||||||
// Script Functions
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Klemens Friedl, 19.03.2005
|
|
||||||
// frik85@hotmail.com
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#define LOGFILE "logfile.html"
|
|
||||||
|
|
||||||
extern bool LogCreated;
|
|
||||||
|
|
||||||
void Log (const char *message);
|
|
||||||
void LogAdd (const char *message);
|
|
|
@ -1,192 +0,0 @@
|
||||||
////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,101 +0,0 @@
|
||||||
////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// options.cpp
|
|
||||||
//
|
|
||||||
// Settting and Loading Options
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Maarten Bosma, 09.01.2004
|
|
||||||
// maarten.paul@bosma.de
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include "package.hpp"
|
|
||||||
#include "log.h"
|
|
||||||
#include "expat.h"
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
|
|
||||||
int PML_XmlDownload (pTree tree, const char* url, void* usrdata,
|
|
||||||
XML_StartElementHandler start, XML_EndElementHandler end, XML_CharacterDataHandler text) ;
|
|
||||||
|
|
||||||
|
|
||||||
// expat callback for start of a "node" tag
|
|
||||||
void opt_start (void* usrdata, const char* tag, const char** arg)
|
|
||||||
{
|
|
||||||
TREE* tree = (TREE*)usrdata;
|
|
||||||
|
|
||||||
if (!strcmp(tag, "source"))
|
|
||||||
{
|
|
||||||
tree->sources.push_back((char*)NULL);
|
|
||||||
tree->field = &tree->sources.back();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// expat callback for end of a "node" tag
|
|
||||||
void opt_end (void* usrdata, const char* tag)
|
|
||||||
{
|
|
||||||
TREE* tree = (TREE*)usrdata;
|
|
||||||
|
|
||||||
tree->field = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// expat callback for end of a "node" tag
|
|
||||||
void opt_text (void* usrdata, const char* data, int len)
|
|
||||||
{
|
|
||||||
TREE* tree = (TREE*)usrdata;
|
|
||||||
|
|
||||||
if(!tree->field)
|
|
||||||
return;
|
|
||||||
|
|
||||||
*tree->field = new char[len+1];
|
|
||||||
strncpy(*tree->field, data, len);
|
|
||||||
(*tree->field)[len] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ! ! ! F I X M E ! ! ! //
|
|
||||||
/*
|
|
||||||
int CreateOptions (TREE* tree)
|
|
||||||
{
|
|
||||||
ofstream file ("options.xml");
|
|
||||||
|
|
||||||
Log("* Creating options.xml from Resources");
|
|
||||||
|
|
||||||
HRSRC hres = FindResource(GetModuleHandle(L"package"), MAKEINTRESOURCE(123), RT_RCDATA);
|
|
||||||
if (!hres)
|
|
||||||
{
|
|
||||||
Log("! ERROR: Could not load it !");
|
|
||||||
return ERR_GENERIC;
|
|
||||||
}
|
|
||||||
|
|
||||||
MessageBox(0,(WCHAR*)LockResource(LoadResource(NULL, hres)), 0, 0); // is empty
|
|
||||||
//file << (WCHAR*)LockResource(LoadResource(NULL, hres));
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
char* PML_Download (pTree, const char* url, const char* server, const char* filename);
|
|
||||||
|
|
||||||
int CreateOptions (TREE* tree)
|
|
||||||
{
|
|
||||||
Log("* Load options.xml from the Internet (Temporary Hack)");
|
|
||||||
|
|
||||||
CopyFileA( PML_Download(tree, "http://svn.reactos.org/viewcvs/*checkout*/trunk/rosapps/packmgr/lib/options.xml", NULL, "options.xml"), "options.xml", TRUE);
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int LoadOptions (TREE* tree)
|
|
||||||
{
|
|
||||||
int error;
|
|
||||||
|
|
||||||
error = PML_XmlDownload(tree, "file://options.xml", (void*)tree, opt_start, opt_end, opt_text);
|
|
||||||
if(!error)
|
|
||||||
return ERR_OK;
|
|
||||||
|
|
||||||
CreateOptions(tree);
|
|
||||||
return PML_XmlDownload(tree, "file://options.xml", (void*)tree, opt_start, opt_end, opt_text);
|
|
||||||
}
|
|
|
@ -1,3 +0,0 @@
|
||||||
<options>
|
|
||||||
<source>http://svn.reactos.org/viewcvs/*checkout*/trunk/rosapps/packmgr/tree/</source>
|
|
||||||
</options>
|
|
|
@ -1,288 +0,0 @@
|
||||||
////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// package.cpp
|
|
||||||
//
|
|
||||||
// package related functions
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Maarten Bosma, 09.01.2004
|
|
||||||
// maarten.paul@bosma.de
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include "package.hpp"
|
|
||||||
#include "expat.h"
|
|
||||||
#include "log.h"
|
|
||||||
|
|
||||||
int PML_XmlDownload (pTree, const char* url, void* usrdata, XML_StartElementHandler start,
|
|
||||||
XML_EndElementHandler end, XML_CharacterDataHandler text=0);
|
|
||||||
|
|
||||||
|
|
||||||
// expat callback for start of a package tag
|
|
||||||
void pack_start (void* usrdata, const char* tag, const char** arg)
|
|
||||||
{
|
|
||||||
int i, id;
|
|
||||||
PACKAGE* pack = (PACKAGE*)usrdata;
|
|
||||||
|
|
||||||
// if the tag is a script tag ...
|
|
||||||
if(!strcmp(tag, "scripts"))
|
|
||||||
{
|
|
||||||
// ... read the arguments
|
|
||||||
for (i=0; arg[i]; i+=2)
|
|
||||||
{
|
|
||||||
if(!strcmp(arg[i], "inst"))
|
|
||||||
id = 0;
|
|
||||||
|
|
||||||
else if(!strcmp(arg[i], "update"))
|
|
||||||
id = 1;
|
|
||||||
|
|
||||||
else if(!strcmp(arg[i], "uinst"))
|
|
||||||
id = 2;
|
|
||||||
|
|
||||||
else if(!strcmp(arg[i], "srcinst"))
|
|
||||||
id = 3;
|
|
||||||
|
|
||||||
else
|
|
||||||
continue;
|
|
||||||
|
|
||||||
pack->files[id] = new char [strlen(arg[i+1])+1];
|
|
||||||
strcpy(pack->files[id], arg[i+1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ... save the field
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(!strcmp(tag, "name"))
|
|
||||||
pack->field = &pack->name;
|
|
||||||
|
|
||||||
else if(!strcmp(tag, "description"))
|
|
||||||
pack->field = &pack->description;
|
|
||||||
|
|
||||||
else if (!strcmp(tag, "depent"))
|
|
||||||
{
|
|
||||||
pack->depencies.push_back((char*)NULL);
|
|
||||||
pack->field = &pack->depencies.back();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// expat callback for end of a package tag
|
|
||||||
void pack_end (void* usrdata, const char* tag)
|
|
||||||
{
|
|
||||||
PACKAGE* pack = (PACKAGE*)usrdata;
|
|
||||||
|
|
||||||
pack->field = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// expat callback for text
|
|
||||||
void pack_text (void* usrdata, const char* data, int len)
|
|
||||||
{
|
|
||||||
PACKAGE* pack = (PACKAGE*)usrdata;
|
|
||||||
|
|
||||||
if(!pack->field)
|
|
||||||
return;
|
|
||||||
|
|
||||||
*pack->field = new char[len+1];
|
|
||||||
strncpy(*pack->field, data, len);
|
|
||||||
(*pack->field)[len] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
// The user clicks on a package
|
|
||||||
extern "C" int PML_LoadPackage (TREE* tree, int id, PML_SetButton SetButton)
|
|
||||||
{
|
|
||||||
PACKAGE* pack = &tree->packages[id];
|
|
||||||
tree->setButton = SetButton;
|
|
||||||
|
|
||||||
if(SetButton)
|
|
||||||
{
|
|
||||||
SetButton(1, pack->action);
|
|
||||||
SetButton(2, pack->inst); // && pack->action != 0
|
|
||||||
SetButton(3, pack->src_inst);
|
|
||||||
SetButton(4, pack->update);
|
|
||||||
SetButton(5, pack->uninstall);
|
|
||||||
}
|
|
||||||
|
|
||||||
// root notes (like network) return here
|
|
||||||
if(!pack->path)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if(!pack->loaded)
|
|
||||||
{
|
|
||||||
PML_XmlDownload (tree, pack->path, (void*)pack, pack_start, pack_end, pack_text);
|
|
||||||
pack->loaded = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" int PML_FindItem (TREE* tree, const char* what)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
bool found;
|
|
||||||
|
|
||||||
// if we have children, same action for them
|
|
||||||
for (i=1; (UINT)i<tree->packages.size(); i++)
|
|
||||||
{
|
|
||||||
found = true;
|
|
||||||
|
|
||||||
for(j=0; (UINT)j<strlen(what); j++)
|
|
||||||
{
|
|
||||||
if(tolower(what[j]) != tolower(tree->packages[i].name[j]))
|
|
||||||
{
|
|
||||||
found = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(found)
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The user chooses a actions like Install
|
|
||||||
extern "C" int PML_SetAction (TREE* tree, int id, int action, PML_SetIcon SetIcon, PML_Ask Ask)
|
|
||||||
{
|
|
||||||
UINT i;
|
|
||||||
int ret = ERR_OK;
|
|
||||||
|
|
||||||
tree->setIcon = SetIcon;
|
|
||||||
PACKAGE* pack = &tree->packages[id];
|
|
||||||
|
|
||||||
// if we have children, same action for them
|
|
||||||
for (i=0; i<pack->children.size(); i++)
|
|
||||||
ret = ret || PML_SetAction(tree, pack->children[i], action, SetIcon, Ask);
|
|
||||||
|
|
||||||
// is the action possible ?
|
|
||||||
if(!pack->actions[action])
|
|
||||||
return ERR_GENERIC;
|
|
||||||
|
|
||||||
// is it already set
|
|
||||||
if(pack->action == action)
|
|
||||||
return ERR_OK;
|
|
||||||
|
|
||||||
//
|
|
||||||
if(pack->depencies.size() && action)
|
|
||||||
{
|
|
||||||
UINT count = pack->depencies.size();
|
|
||||||
WCHAR buffer[2000], buffer2[200], errbuf[2000];
|
|
||||||
PML_TransError(ERR_DEP1, (WCHAR*)buffer, sizeof(buffer)/sizeof(WCHAR));
|
|
||||||
|
|
||||||
for (i=0; i<pack->depencies.size(); i++)
|
|
||||||
{
|
|
||||||
int item = PML_FindItem(tree, pack->depencies[i]);
|
|
||||||
|
|
||||||
if(!item)
|
|
||||||
return ERR_GENERIC;
|
|
||||||
|
|
||||||
if(action == tree->packages[item].action)// || tree->packages[item].installed
|
|
||||||
{
|
|
||||||
count--;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
MultiByteToWideChar (CP_ACP, 0, pack->depencies[i], strlen(pack->depencies[i])+1, buffer2, 200);
|
|
||||||
wsprintf(buffer, L"%s - %s\n", buffer, buffer2);//
|
|
||||||
}
|
|
||||||
|
|
||||||
wcscat(buffer, PML_TransError(ERR_DEP2, (WCHAR*)errbuf, sizeof(errbuf)/sizeof(WCHAR)));
|
|
||||||
|
|
||||||
if(count)
|
|
||||||
{
|
|
||||||
if(!Ask(buffer))
|
|
||||||
return ERR_GENERIC;
|
|
||||||
|
|
||||||
for (i=0; i<pack->depencies.size(); i++)
|
|
||||||
{
|
|
||||||
int item = PML_FindItem(tree, pack->depencies[i]);
|
|
||||||
|
|
||||||
tree->packages[item].neededBy.push_back(id);
|
|
||||||
|
|
||||||
PML_SetAction(tree, item, action, SetIcon, Ask);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// load it if it's not loaded yet
|
|
||||||
else if (!pack->loaded && pack->path)
|
|
||||||
{
|
|
||||||
PML_XmlDownload (tree, pack->path, (void*)pack, pack_start, pack_end, pack_text);
|
|
||||||
pack->loaded = TRUE;
|
|
||||||
|
|
||||||
return PML_SetAction(tree, id, action, SetIcon, Ask);
|
|
||||||
}
|
|
||||||
|
|
||||||
// set the icon
|
|
||||||
if(SetIcon && !pack->icon)
|
|
||||||
SetIcon(id, action);
|
|
||||||
|
|
||||||
// set the button(s)
|
|
||||||
if(tree->setButton && action != 2)
|
|
||||||
{
|
|
||||||
tree->setButton(1, action);
|
|
||||||
//tree->setButton(pack->action+1, action);
|
|
||||||
}
|
|
||||||
|
|
||||||
// can't do src install yet
|
|
||||||
if(action == 2)
|
|
||||||
{
|
|
||||||
MessageBox(0, L"Sorry, but source install is not implemented yet.", 0,0);
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
// everything but undoing is done here
|
|
||||||
else if (action != 0)
|
|
||||||
{
|
|
||||||
// since we are setting a action we undo it again
|
|
||||||
if(tree->setButton)
|
|
||||||
tree->setButton(1, 1);
|
|
||||||
//tree->setButton(action+1, 0);
|
|
||||||
|
|
||||||
pack->action = action;
|
|
||||||
|
|
||||||
// root notes (like network) return here
|
|
||||||
if(!pack->path)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
// save the name of the corresponding script in a vector
|
|
||||||
tree->todo.push_back(pack->files[action-1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// undoing
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for(i=0; i<pack->neededBy.size(); i++)
|
|
||||||
{
|
|
||||||
if(tree->packages[pack->neededBy[i]].action)
|
|
||||||
{
|
|
||||||
SetIcon(id, pack->action);
|
|
||||||
return ERR_GENERIC;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// root notes (like network) return here
|
|
||||||
if(!pack->path || pack->action==0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
// erase from todo list
|
|
||||||
for(i=0; i<tree->todo.size(); i++)
|
|
||||||
if(!strcmp(tree->todo[i], pack->files[pack->action-1])) // look for right entry
|
|
||||||
tree->todo.erase(tree->todo.begin()+i); // delete it
|
|
||||||
|
|
||||||
// set action back
|
|
||||||
pack->action = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
extern "C" char* PML_GetDescription (TREE* tree, int id)
|
|
||||||
{
|
|
||||||
PML_LoadPackage(tree, id, NULL);
|
|
||||||
|
|
||||||
return tree->packages[id].description;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
LIBRARY package.dll
|
|
||||||
|
|
||||||
EXPORTS
|
|
||||||
|
|
||||||
PML_Abort
|
|
||||||
PML_TransError
|
|
||||||
PML_LoadTree
|
|
||||||
PML_FindItem
|
|
||||||
PML_LoadPackage
|
|
||||||
PML_GetDescription
|
|
||||||
PML_SetAction
|
|
||||||
PML_DoIt
|
|
||||||
PML_CloseTree
|
|
||||||
|
|
||||||
; EOF
|
|
|
@ -1,47 +0,0 @@
|
||||||
////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// package.hpp
|
|
||||||
// Package C++ Header
|
|
||||||
////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include "error.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Callbacks */
|
|
||||||
|
|
||||||
typedef int (*PML_AddItem) (int id, const char* name, int parent, int icon);
|
|
||||||
typedef int (*PML_SetStatus) (int status1, int status2, WCHAR* text);
|
|
||||||
typedef int (*PML_SetButton) (DWORD dwID, BOOL state);
|
|
||||||
typedef int (*PML_SetIcon) (int id, int icon);
|
|
||||||
typedef int (*PML_SetText) (const char* text);
|
|
||||||
typedef int (*PML_Ask) (const WCHAR* text);
|
|
||||||
|
|
||||||
|
|
||||||
/* Structs */
|
|
||||||
|
|
||||||
typedef void* pTree;
|
|
||||||
|
|
||||||
#define MAXNODES 10000
|
|
||||||
|
|
||||||
|
|
||||||
/* Prototypes */
|
|
||||||
|
|
||||||
void PML_Abort (void);
|
|
||||||
WCHAR* PML_TransError (int code, WCHAR* string, INT maxchar);
|
|
||||||
|
|
||||||
int PML_LoadTree (pTree*, char* url, PML_AddItem);
|
|
||||||
int PML_FindItem (pTree tree, const char* what);
|
|
||||||
int PML_LoadPackage (pTree, int id, PML_SetButton);
|
|
||||||
char* PML_GetDescription (pTree tree, int id);
|
|
||||||
int PML_SetAction (pTree, int package, int action, PML_SetIcon, PML_Ask);
|
|
||||||
int PML_DoIt (pTree, PML_SetStatus, PML_Ask);
|
|
||||||
|
|
||||||
void PML_CloseTree (pTree);
|
|
||||||
|
|
||||||
|
|
||||||
/* Version */
|
|
||||||
|
|
||||||
#define PACKMGR_VERSION_MAJOR 0
|
|
||||||
#define PACKMGR_VERSION_MINOR 3
|
|
||||||
#define PACKMGR_VERSION_PATCH_LEVEL 1
|
|
|
@ -1,92 +0,0 @@
|
||||||
////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// package.hpp
|
|
||||||
// Package C++ Header
|
|
||||||
////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include <vector>
|
|
||||||
#include "error.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
|
|
||||||
/* Callbacks */
|
|
||||||
|
|
||||||
typedef int (*PML_AddItem) (int id, const char* name, int parent, int icon);
|
|
||||||
typedef int (*PML_SetStatus) (int status1, int status2, WCHAR* text);
|
|
||||||
typedef int (*PML_SetButton) (DWORD dwID, BOOL state);
|
|
||||||
typedef int (*PML_SetIcon) (int id, int icon);
|
|
||||||
typedef int (*PML_SetText) (const char* text);
|
|
||||||
typedef int (*PML_Ask) (const WCHAR* text);
|
|
||||||
|
|
||||||
|
|
||||||
/* Structs */
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
char* path;
|
|
||||||
char* name;
|
|
||||||
char* description;
|
|
||||||
char** field;
|
|
||||||
|
|
||||||
BOOL icon;
|
|
||||||
BOOL loaded;
|
|
||||||
vector<int> neededBy;
|
|
||||||
vector<int> children;
|
|
||||||
vector<char*> depencies;
|
|
||||||
|
|
||||||
int action;
|
|
||||||
char* files [4];
|
|
||||||
|
|
||||||
union //which actions are possible
|
|
||||||
{
|
|
||||||
struct { BOOL none, inst, src_inst, update, uninstall; };
|
|
||||||
BOOL actions [4];
|
|
||||||
};
|
|
||||||
|
|
||||||
} PACKAGE;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
char** field;
|
|
||||||
|
|
||||||
vector<char*> todo;
|
|
||||||
vector<char*> sources;
|
|
||||||
vector<char*> descriptionPath;
|
|
||||||
vector<PACKAGE> packages;
|
|
||||||
|
|
||||||
PML_AddItem addItem;
|
|
||||||
PML_SetButton setButton;
|
|
||||||
PML_SetStatus setStatus;
|
|
||||||
PML_SetIcon setIcon;
|
|
||||||
PML_SetText setText;
|
|
||||||
|
|
||||||
} TREE, *pTree;
|
|
||||||
|
|
||||||
#define MAXNODES 10000
|
|
||||||
|
|
||||||
|
|
||||||
/* Prototypes */
|
|
||||||
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
void PML_Abort (void);
|
|
||||||
WCHAR* PML_TransError (int code, WCHAR* string, INT maxchar);
|
|
||||||
|
|
||||||
int PML_LoadTree (pTree*, char* url, PML_AddItem);
|
|
||||||
int PML_FindItem (TREE* tree, const char* what);
|
|
||||||
int PML_LoadPackage (pTree, int id, PML_SetButton);
|
|
||||||
char* PML_GetDescription (TREE* tree, int id);
|
|
||||||
int PML_SetAction (pTree, int package, int action, PML_SetIcon, PML_Ask);
|
|
||||||
int PML_DoIt (pTree, PML_SetStatus, PML_Ask);
|
|
||||||
|
|
||||||
void PML_CloseTree (pTree);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Version */
|
|
||||||
|
|
||||||
#define PACKMGR_VERSION_MAJOR 0
|
|
||||||
#define PACKMGR_VERSION_MINOR 3
|
|
||||||
#define PACKMGR_VERSION_PATCH_LEVEL 1
|
|
|
@ -1,19 +0,0 @@
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include "error.h"
|
|
||||||
|
|
||||||
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Package Manager\0"
|
|
||||||
#define REACTOS_STR_INTERNAL_NAME "package\0"
|
|
||||||
#define REACTOS_STR_ORIGINAL_FILENAME "package.dll\0"
|
|
||||||
|
|
||||||
#include <reactos/version.rc>
|
|
||||||
|
|
||||||
/* Language specific */
|
|
||||||
|
|
||||||
#include "cz.rc"
|
|
||||||
#include "de.rc"
|
|
||||||
#include "en.rc"
|
|
||||||
#include "es.rc"
|
|
||||||
#include "fr.rc"
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,25 +0,0 @@
|
||||||
<module name="package" type="win32dll" installbase="system32" installname="package.dll" allowwarnings="true">
|
|
||||||
<importlibrary definition="package.def" />
|
|
||||||
<include base="package">.</include>
|
|
||||||
|
|
||||||
<define name="UNICODE" />
|
|
||||||
<define name="__USE_W32API" />
|
|
||||||
<define name="_WIN32_IE">0x0501</define>
|
|
||||||
<define name="_WIN32_WINNT">0x0501</define>
|
|
||||||
|
|
||||||
<library>kernel32</library>
|
|
||||||
<library>gdi32</library>
|
|
||||||
<library>user32</library>
|
|
||||||
<library>expat</library>
|
|
||||||
<library>urlmon</library>
|
|
||||||
|
|
||||||
<file>download.cpp</file>
|
|
||||||
<file>functions.cpp</file>
|
|
||||||
<file>log.cpp</file>
|
|
||||||
<file>main.cpp</file>
|
|
||||||
<file>options.cpp</file>
|
|
||||||
<file>package.cpp</file>
|
|
||||||
<file>script.cpp</file>
|
|
||||||
<file>tree.cpp</file>
|
|
||||||
<file>package.rc</file>
|
|
||||||
</module>
|
|
|
@ -1,278 +0,0 @@
|
||||||
////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// script.cpp
|
|
||||||
//
|
|
||||||
// Implementaion of a basic basic :) interpreter
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Maarten Bosma, 09.01.2004
|
|
||||||
// maarten.paul@bosma.de
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include "package.hpp"
|
|
||||||
#include "script.h"
|
|
||||||
#include "log.h"
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
// just a few Helpers
|
|
||||||
void Replace (string* Where, string Old, string New, int start = 0, int end = -1, int instring = 1);
|
|
||||||
int FindCount (string What, string Where, int start = 0, int end = -1);
|
|
||||||
int Find (string Where, string What, int start = 0, int end = -1, int instring = 1);
|
|
||||||
|
|
||||||
|
|
||||||
// Loads script from file, checks if it's synaxially correct
|
|
||||||
// and converts it into a easy to interprete one.
|
|
||||||
int RPS_Load (SCRIPT** script, const char* path)
|
|
||||||
{
|
|
||||||
string source;
|
|
||||||
|
|
||||||
/* We have to do it that way (doublepointer) because MinGw
|
|
||||||
calls "delete" at the end of function otherwise. */
|
|
||||||
(*script) = new SCRIPT;
|
|
||||||
|
|
||||||
// Load file to string
|
|
||||||
ifstream file(path, ios_base::in);
|
|
||||||
if (!file.is_open())
|
|
||||||
return ERR_FILE;
|
|
||||||
|
|
||||||
getline(file, source, '\0');
|
|
||||||
|
|
||||||
// make sure last char is a new line
|
|
||||||
source += "\n";
|
|
||||||
|
|
||||||
// Are all subs and strings closed ?
|
|
||||||
// FIXME: Just a quick hack sould be both checked line by line
|
|
||||||
if(FindCount(source, "\"")%2) // if count is uneven not all strings are closed
|
|
||||||
return ERR_SYNATX;
|
|
||||||
|
|
||||||
if(FindCount(source, "Sub ") != FindCount(source, "End Sub\n"))
|
|
||||||
return ERR_SYNATX;
|
|
||||||
|
|
||||||
// Delete comments
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
int start = Find(source, "'");
|
|
||||||
if(start == NOTFOUND)
|
|
||||||
break;
|
|
||||||
int end = Find(source, "\n", start);
|
|
||||||
source.erase(start, end-start); // needs size not line
|
|
||||||
}
|
|
||||||
|
|
||||||
// Converte the file into some thing easier to interprete
|
|
||||||
Replace(&source, "(", " ");
|
|
||||||
Replace(&source, ")", " ");
|
|
||||||
Replace(&source, ";", " ");
|
|
||||||
Replace(&source, ",", " ");
|
|
||||||
Replace(&source, "\"", " \" ");
|
|
||||||
Replace(&source, "\t", " ");
|
|
||||||
|
|
||||||
Replace(&source, " ", " ");
|
|
||||||
Replace(&source, "\n ", "\n");
|
|
||||||
Replace(&source, " \n", "\n");
|
|
||||||
Replace(&source, "\n\n", "\n");
|
|
||||||
|
|
||||||
if(source[0]=='\n')
|
|
||||||
source.erase(0,1);
|
|
||||||
|
|
||||||
// copy string into struct (line by line)
|
|
||||||
UINT i, line=0;
|
|
||||||
for (i=0; i < source.size(); i++)
|
|
||||||
{
|
|
||||||
// Make everything non capital letters
|
|
||||||
if (source[i] >= 65 && source[i] <= 90) // ASCII-Code (A-Z 65-90)
|
|
||||||
{
|
|
||||||
source[i] += 32; // ASCII-Code (a-z 97-122)
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (source[i] == '\"')
|
|
||||||
{
|
|
||||||
while(source[++i]!='\"');
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (source[i] == '\n')
|
|
||||||
{
|
|
||||||
(*script)->code.push_back(source.substr(line, i-line));
|
|
||||||
line = i+1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// create a sub table (with name, beginnig and end of function)
|
|
||||||
for (i=0; i < (*script)->code.size(); i++) // code.size() is the cout of lines
|
|
||||||
{
|
|
||||||
SUB sub;
|
|
||||||
|
|
||||||
if((*script)->code[i].substr(0,4) != "sub ")
|
|
||||||
return ERR_SYNATX; // script has to start with sub
|
|
||||||
|
|
||||||
sub.name = (*script)->code[i].substr(4,((*script)->code[i].size()-4));
|
|
||||||
sub.start = i+1;
|
|
||||||
|
|
||||||
while ((*script)->code[i] != "end sub")
|
|
||||||
{
|
|
||||||
i++;
|
|
||||||
//if script does not end with "end sub" we got a problem
|
|
||||||
if (i>(*script)->code.size())
|
|
||||||
return ERR_SYNATX;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub.end = i;
|
|
||||||
(*script)->subs.push_back(sub);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Executes a subroutine of the script
|
|
||||||
int RPS_Execute (SCRIPT* script, const char* function)
|
|
||||||
{
|
|
||||||
char *argv[100];
|
|
||||||
char *buffer;
|
|
||||||
int a, b, c, nr = NOTFOUND, argc = 0;
|
|
||||||
|
|
||||||
// find the right fuction
|
|
||||||
for(a=0; (UINT)a<script->subs.size(); a++)
|
|
||||||
if(script->subs[a].name == function)
|
|
||||||
nr = a;
|
|
||||||
|
|
||||||
// if there isn't a fuction with this name we can't do anything
|
|
||||||
if(nr == NOTFOUND)
|
|
||||||
return ERR_OK;
|
|
||||||
|
|
||||||
// call the function
|
|
||||||
for (a=script->subs[nr].start; a<script->subs[nr].end; a++)
|
|
||||||
{
|
|
||||||
// create a temporarry buffer
|
|
||||||
buffer = new char[script->code[a].size()];
|
|
||||||
strcpy(buffer, script->code[a].c_str());
|
|
||||||
|
|
||||||
// make the fist argument the function's name
|
|
||||||
argv[0] = &buffer[0];
|
|
||||||
|
|
||||||
int buffer_size = (int)strlen(buffer);
|
|
||||||
for (b=0; b<buffer_size+1; b++)
|
|
||||||
{
|
|
||||||
// ignore chars in strings
|
|
||||||
if(buffer[b]=='\"')
|
|
||||||
{
|
|
||||||
argv[argc] = &buffer[b+1];
|
|
||||||
|
|
||||||
while(buffer[++b]!='\"');
|
|
||||||
|
|
||||||
buffer[b] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
// create a new argument
|
|
||||||
else if(buffer[b]==' ')
|
|
||||||
{
|
|
||||||
argc++;
|
|
||||||
argv[argc] = &buffer[b+1];
|
|
||||||
buffer[b] = '\0';
|
|
||||||
|
|
||||||
// we don't want buffer overflows
|
|
||||||
if(argc == 99)
|
|
||||||
return ERR_GENERIC;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// call the function
|
|
||||||
else if(buffer[b]=='\0')
|
|
||||||
{
|
|
||||||
int error = 0;
|
|
||||||
|
|
||||||
// log the name
|
|
||||||
Log("* excute command: ");
|
|
||||||
for(c=0; c<argc+1; c++)
|
|
||||||
{
|
|
||||||
LogAdd(argv[c]);
|
|
||||||
LogAdd(" ");
|
|
||||||
}
|
|
||||||
|
|
||||||
for(c=0; c<FUNC_COUNT; c++)
|
|
||||||
if(!strcmp(argv[0], FuncTable[c].name))
|
|
||||||
error = FuncTable[c].function(argc, &argv[0]);
|
|
||||||
|
|
||||||
if(error)
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// start again with next line
|
|
||||||
delete[] buffer;
|
|
||||||
argc = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get a Constant or a variavle
|
|
||||||
int RPS_getVar (const char* name)
|
|
||||||
{
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clears up Memory
|
|
||||||
void RPS_Clear (SCRIPT* script)
|
|
||||||
{
|
|
||||||
if(script)
|
|
||||||
delete script;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Helper Functions */
|
|
||||||
|
|
||||||
// How often do we find a string inside another one
|
|
||||||
int FindCount (string where, string what, int start, int end)
|
|
||||||
{
|
|
||||||
int counter = 0, pos;
|
|
||||||
|
|
||||||
while(true)
|
|
||||||
{
|
|
||||||
pos = (int)where.find (what, start);
|
|
||||||
//could could not be found or is outside of search area
|
|
||||||
if (pos == (int)string::npos || (end!=-1 && pos>end))
|
|
||||||
break;
|
|
||||||
start = pos+1;
|
|
||||||
counter++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return counter;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find (with only or not in Strings option)
|
|
||||||
int Find (string where, string what, int start, int end, int instring)
|
|
||||||
{
|
|
||||||
int pos = (int)where.find (what, start);
|
|
||||||
|
|
||||||
//could could not be found or is outside of search area
|
|
||||||
if (pos == (int)string::npos || (end!=-1 && pos>end))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
// if the count of this quotes is eaven we are in string
|
|
||||||
int isInString = FindCount(where, "\"", start, pos)%2;
|
|
||||||
|
|
||||||
// if so we go on searching
|
|
||||||
if(isInString == instring)
|
|
||||||
return Find (where, what, pos+1, end, instring);
|
|
||||||
|
|
||||||
return pos;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Replace (using Find)
|
|
||||||
void Replace (string* String, string Old, string New, int start, int end, int instring)
|
|
||||||
{
|
|
||||||
int pos = start;
|
|
||||||
|
|
||||||
while(true)
|
|
||||||
{
|
|
||||||
pos = Find(String->c_str(), Old, pos, end, instring);
|
|
||||||
if (pos == -1)
|
|
||||||
break;
|
|
||||||
|
|
||||||
String->replace (pos, Old.length(), New);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,65 +0,0 @@
|
||||||
////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// package.hpp
|
|
||||||
// Header for the script stuff
|
|
||||||
////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
|
|
||||||
/* Structs */
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
string name;
|
|
||||||
int start, end;
|
|
||||||
|
|
||||||
} SUB;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
vector<string> code;
|
|
||||||
vector<SUB> subs;
|
|
||||||
|
|
||||||
} SCRIPT;
|
|
||||||
|
|
||||||
|
|
||||||
/* Prototypes */
|
|
||||||
|
|
||||||
int RPS_Load (SCRIPT** script, const char* path);
|
|
||||||
int RPS_Execute (SCRIPT* script, const char* function);
|
|
||||||
int RPS_getVar (const char* name);
|
|
||||||
void RPS_Clear (SCRIPT* script);
|
|
||||||
|
|
||||||
|
|
||||||
/* Callbacks */
|
|
||||||
|
|
||||||
typedef int (*FUNC_PROC)(int, char**); // function callback
|
|
||||||
|
|
||||||
|
|
||||||
/* Function table */
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
char* name;
|
|
||||||
FUNC_PROC function;
|
|
||||||
} FUNC_TABLE;
|
|
||||||
|
|
||||||
// very function is listed in there
|
|
||||||
extern const FUNC_TABLE FuncTable[];
|
|
||||||
|
|
||||||
// count of functions
|
|
||||||
#define FUNC_COUNT 3
|
|
||||||
|
|
||||||
|
|
||||||
/* For the helper-funtions */
|
|
||||||
|
|
||||||
#define STR_NO 0x1;
|
|
||||||
#define STR_ONLY 0x0;
|
|
||||||
#define STR_YES 0x2;
|
|
||||||
|
|
||||||
// ^^ I would write down here that they
|
|
||||||
// mean but I don't know anymore myself :O
|
|
|
@ -1,126 +0,0 @@
|
||||||
////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// tree.cpp
|
|
||||||
//
|
|
||||||
// Loading of the package tree
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Maarten Bosma, 09.01.2004
|
|
||||||
// maarten.paul@bosma.de
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include "package.hpp"
|
|
||||||
#include "expat.h"
|
|
||||||
|
|
||||||
vector <int> parents;
|
|
||||||
|
|
||||||
int LoadOptions (TREE* tree);
|
|
||||||
|
|
||||||
void tree_end (void* tree, const char* tag);
|
|
||||||
void tree_start (void* usrdata, const char* tag, const char** arg);
|
|
||||||
|
|
||||||
int PML_XmlDownload (pTree tree, const char* file, void* usrdata, XML_StartElementHandler start,
|
|
||||||
XML_EndElementHandler end, XML_CharacterDataHandler text=0);
|
|
||||||
|
|
||||||
|
|
||||||
// Load the tree
|
|
||||||
extern "C" int PML_LoadTree (TREE** tree, char* url, PML_AddItem AddItem)
|
|
||||||
{
|
|
||||||
// get the memory
|
|
||||||
(*tree) = new TREE;
|
|
||||||
|
|
||||||
// set every to zero
|
|
||||||
memset((*tree), 0, sizeof((*tree)));
|
|
||||||
|
|
||||||
// set addItem callback
|
|
||||||
(*tree)->addItem = AddItem;
|
|
||||||
|
|
||||||
LoadOptions(*tree);
|
|
||||||
|
|
||||||
return PML_XmlDownload (*tree, url, (void*)(*tree), tree_start, tree_end);
|
|
||||||
}
|
|
||||||
|
|
||||||
// expat callback for start of a "node" tag
|
|
||||||
void tree_start (void* usrdata, const char* tag, const char** arg)
|
|
||||||
{
|
|
||||||
int i, icon = 0;
|
|
||||||
static int id = 1;
|
|
||||||
|
|
||||||
TREE* tree = (TREE*)usrdata;
|
|
||||||
|
|
||||||
// ignore if tag is the root tag ("tree")
|
|
||||||
if(!strcmp(tag, "tree"))
|
|
||||||
return;
|
|
||||||
|
|
||||||
// set the package memory
|
|
||||||
tree->packages.resize(id+1);
|
|
||||||
memset(&tree->packages[id], 0, sizeof(tree->packages[id]));
|
|
||||||
|
|
||||||
tree->packages[id].loaded = FALSE;
|
|
||||||
tree->packages[id].icon = FALSE;
|
|
||||||
tree->packages[id].none = TRUE;
|
|
||||||
tree->packages[id].path = NULL;
|
|
||||||
tree->packages[id].name = "\0";
|
|
||||||
|
|
||||||
// read the arguments
|
|
||||||
for (i=0; arg[i]; i+=2)
|
|
||||||
{
|
|
||||||
if(!strcmp(arg[i], "name"))
|
|
||||||
{
|
|
||||||
tree->packages[id].name = new char [strlen(arg[i+1])+1];
|
|
||||||
strcpy(tree->packages[id].name, arg[i+1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!strcmp(arg[i], "icon"))
|
|
||||||
{
|
|
||||||
icon = atoi(arg[i+1]);
|
|
||||||
tree->packages[id].icon = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!strcmp(arg[i], "file"))
|
|
||||||
{
|
|
||||||
tree->packages[id].path = new char [strlen(arg[i+1])+1];
|
|
||||||
strcpy(tree->packages[id].path, arg[i+1]);
|
|
||||||
|
|
||||||
if(strcmp(tag, "bin"))
|
|
||||||
tree->packages[id].inst = TRUE;
|
|
||||||
|
|
||||||
if(strcmp(tag, "src"))
|
|
||||||
tree->packages[id].src_inst = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tree->packages[id].name[0] == '\0') return;
|
|
||||||
|
|
||||||
// add it
|
|
||||||
if(!parents.size())
|
|
||||||
{
|
|
||||||
if(tree->addItem)
|
|
||||||
tree->addItem(id, tree->packages[id].name, 0, icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
// do some manipulation at the parent
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(tree->addItem)
|
|
||||||
tree->addItem(id, tree->packages[id].name, parents.back(), icon);
|
|
||||||
|
|
||||||
// list as child in the parent node
|
|
||||||
tree->packages[parents.back()].children.push_back(id);
|
|
||||||
|
|
||||||
// this is for the buttons
|
|
||||||
tree->packages[parents.back()].inst = tree->packages[parents.back()].inst || tree->packages[id].inst;
|
|
||||||
tree->packages[parents.back()].src_inst = tree->packages[parents.back()].src_inst || tree->packages[id].src_inst;
|
|
||||||
}
|
|
||||||
|
|
||||||
parents.push_back(id++);
|
|
||||||
}
|
|
||||||
|
|
||||||
// expat callback for end of a "node" tag
|
|
||||||
void tree_end (void* tree, const char* tag)
|
|
||||||
{
|
|
||||||
// delete last item
|
|
||||||
parents.pop_back();
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
Sub Main
|
|
||||||
' ToDo: Choose from different mirrors
|
|
||||||
download "http://ovh.dl.sourceforge.net/sourceforge/sevenzip/7z432.exe", "7z432.exe"
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Sub After
|
|
||||||
shell 7z432.exe
|
|
||||||
' ToDo: Delete 7z432.exe
|
|
||||||
End Sub
|
|
|
@ -1,7 +0,0 @@
|
||||||
<package>
|
|
||||||
<name>7Zip</name>
|
|
||||||
<version>4.32</version>
|
|
||||||
<description>Utility to create and open zip, tar, rar and other archive files.</description>
|
|
||||||
<scripts inst="7zip.inst.rps"/>
|
|
||||||
</package>
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
Sub Main
|
|
||||||
download "http://www.abiword.org/downloads/abiword/2.4.1/Windows/abiword-setup-2.4.1.exe", "abisetup.exe"
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Sub After
|
|
||||||
shell abisetup.exe
|
|
||||||
' ToDo: Delete abisetup.exe
|
|
||||||
End Sub
|
|
|
@ -1,7 +0,0 @@
|
||||||
<package>
|
|
||||||
<name>AbiWord</name>
|
|
||||||
<version>2.4.1</version>
|
|
||||||
<description>Word processor.</description>
|
|
||||||
<scripts inst="abiword.inst.rps"/>
|
|
||||||
</package>
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
Sub Main
|
|
||||||
' ToDo: Choose from different mirrors
|
|
||||||
download ("http://download.mozilla.org/?lang=de&product=firefox-1.5&os=win", "firefoxinstaller.exe")
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Sub After
|
|
||||||
shell "firefoxinstaller.exe"
|
|
||||||
' ToDo: Delete firefoxinstaller.exe
|
|
||||||
End Sub
|
|
|
@ -1,7 +0,0 @@
|
||||||
<package>
|
|
||||||
<name>Firefox</name>
|
|
||||||
<version>1.5</version>
|
|
||||||
<description>The famous OpenSource webbroswer.</description>
|
|
||||||
<scripts inst="firefox.inst.rps"/>
|
|
||||||
</package>
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
Sub Main
|
|
||||||
' ToDo: Choose from different mirrors
|
|
||||||
download ("http://www.aeicomputertech.com/_downloads/iview398.exe", "iview398.exe")
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Sub After
|
|
||||||
shell iview398.exe
|
|
||||||
End Sub
|
|
|
@ -1,7 +0,0 @@
|
||||||
<package>
|
|
||||||
<name>IrfanView</name>
|
|
||||||
<version>3.98</version>
|
|
||||||
<description>Viewer for all kinds of graphics.</description>
|
|
||||||
<scripts inst="irfanview.inst.rps"/>
|
|
||||||
</package>
|
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
' ToDo: Find the best from all the installers and frontends
|
|
||||||
' or add zip support for http://www1.mplayerhq.hu/MPlayer/releases/win32/old/MPlayer-mingw32-1.0pre7.zip
|
|
|
@ -1,13 +0,0 @@
|
||||||
<!--
|
|
||||||
ToDo:
|
|
||||||
Chhose the right one from all the installer and GUI fronend packages
|
|
||||||
or add zip support for the official distro
|
|
||||||
-->
|
|
||||||
|
|
||||||
<package>
|
|
||||||
<name>mPlayer</name>
|
|
||||||
<version>1.0 pre7</version>
|
|
||||||
<description>Commandline Media Player which works under ReactOs.</description>
|
|
||||||
<scripts inst="mplayer.inst.rps"/>
|
|
||||||
</package>
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
' ToDo: Implment Zip unpacking
|
|
|
@ -1,7 +0,0 @@
|
||||||
<package>
|
|
||||||
<name>OpenOffice 1</name>
|
|
||||||
<version>1.1.5</version>
|
|
||||||
<description>OpenSource replacement for Microsoft Office.</description>
|
|
||||||
<scripts inst="openoffice.inst.rps"/>
|
|
||||||
</package>
|
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
Sub Main
|
|
||||||
' ToDo: Download putty.exe in own dir
|
|
||||||
download ("http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe", "C:\Program Files\putty.exe")
|
|
||||||
End Sub
|
|
|
@ -1,7 +0,0 @@
|
||||||
<package>
|
|
||||||
<name>Putty</name>
|
|
||||||
<version>beta 0.58</version>
|
|
||||||
<description>SSH and Telnet client.</description>
|
|
||||||
<scripts inst="putty.inst.rps"/>
|
|
||||||
</package>
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
Sub Main
|
|
||||||
download ("http://blight.reactos.at/reactos-be/ReactOS%20Build%20Environment%200.1-3.4.2.exe", "rosbe01.exe")
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Sub After
|
|
||||||
shell rosbe01.exe
|
|
||||||
' ToDo: Delete rosbe01.exe
|
|
||||||
End Sub
|
|
|
@ -1,7 +0,0 @@
|
||||||
<package>
|
|
||||||
<name>Build Envirement</name>
|
|
||||||
<version>0.1</version>
|
|
||||||
<description>Allows you to build the ReactOS Source. For more instructions see our wiki.</description>
|
|
||||||
<scripts inst="rosbe.inst.rps"/>
|
|
||||||
</package>
|
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
' ToDo: Implement Unzipping
|
|
||||||
' http://www.ritlabs.com/download/tinyweb/tinyweb.zip
|
|
|
@ -1,11 +0,0 @@
|
||||||
<!--
|
|
||||||
ToDo:
|
|
||||||
Implement Unzipping
|
|
||||||
-->
|
|
||||||
<package>
|
|
||||||
<name>Ritlab Tiny Webserver</name>
|
|
||||||
<version>1.93</version>
|
|
||||||
<description>This is a simple webserver running under ReactOs.</description>
|
|
||||||
<scripts inst="tiny.inst.rps"/>
|
|
||||||
</package>
|
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
<tree>
|
|
||||||
<node name="Internet and Network" icon="5">
|
|
||||||
<node name="Firefox" file="firefox.xml"/>
|
|
||||||
<node name="Putty" file="putty.xml"/>
|
|
||||||
<!--<node name="Tiny Webserver" file="tiny.xml"/>--> <!-- Needs Zip support -->
|
|
||||||
</node>
|
|
||||||
<node name="Office" icon="6">
|
|
||||||
<node name="AbiWord" file="abiword.xml"/>
|
|
||||||
<!--<node name="OpenOffice 1" file="openoffice.xml"/>--> <!-- Needs Zip support -->
|
|
||||||
</node>
|
|
||||||
<node name="Graphics" icon="7">
|
|
||||||
<node name="IrfanView" file="irfanview.xml"/>
|
|
||||||
<node name="TuxPaint" file="tuxpaint.xml"/>
|
|
||||||
</node>
|
|
||||||
<node name="Multimedia" icon="8">
|
|
||||||
<!--<node name="mPlayer" file="mplayer.xml"/>--> <!-- ToDo: Choose a good one from all the installers and frondends -->
|
|
||||||
<node>
|
|
||||||
<node name="Development" icon="9">
|
|
||||||
<node name="Build Envirment" file="rosbe.xml"/>
|
|
||||||
</node>
|
|
||||||
<node name="Games and Fun" icon="10"/>
|
|
||||||
<node name="Tools" icon="11">
|
|
||||||
<node name="7Zip" file="7zip.xml"/>
|
|
||||||
</node>
|
|
||||||
<node name="Others" icon="12"/>
|
|
||||||
<node name="Installed Programms" icon="13"/>
|
|
||||||
</tree>
|
|
|
@ -1,12 +0,0 @@
|
||||||
<tree>
|
|
||||||
<node name="7Zip" file="7zip.xml"/>
|
|
||||||
<node name="AbiWord" file="abiword.xml"/>
|
|
||||||
<node name="Build Envirment" file="rosbe.xml"/>
|
|
||||||
<node name="Firefox" file="firefox.xml"/>
|
|
||||||
<node name="IrfanView" file="irfanview.xml"/>
|
|
||||||
<!--<node name="mPlayer" file="mplayer.xml"/>--> <!-- ToDo: Choose a good one from all the installers and frondends -->
|
|
||||||
<!--<node name="OpenOffice 1" file="openoffice.xml"/>--> <!-- Needs Zip support -->
|
|
||||||
<node name="Putty" file="putty.xml"/>
|
|
||||||
<node name="TuxPaint" file="tuxpaint.xml"/>
|
|
||||||
<!--<node name="Tiny Webserver" file="tiny.xml"/>--> <!-- Needs Zip support -->
|
|
||||||
</tree>
|
|
|
@ -1,70 +0,0 @@
|
||||||
<tree>
|
|
||||||
<node name="Warning: Not up to date"/>
|
|
||||||
<node name="Internet and Network" icon="5">
|
|
||||||
<node name="Browser" icon="5">
|
|
||||||
<node name="MozillaControl" file="mozcontrol.xml"/>
|
|
||||||
</node>
|
|
||||||
<node name="Email" icon="5"/>
|
|
||||||
<node name="Instant Messaging and IRC" icon="5">
|
|
||||||
<node name="VoIP" icon="5"/>
|
|
||||||
</node>
|
|
||||||
<node name="Filesharing" icon="5"/>
|
|
||||||
<node name="Remotecontrol" icon="5"/>
|
|
||||||
<node name="Server" icon="5">
|
|
||||||
<node name="File-Server" icon="5"/>
|
|
||||||
<node name="HTTP" icon="5"/>
|
|
||||||
<node name="IRC" icon="5"/>
|
|
||||||
<node name="FTP" icon="5"/>
|
|
||||||
</node>
|
|
||||||
<node name="Network monitoring" icon="5"/>
|
|
||||||
<node name="Security" icon="5"/>
|
|
||||||
<node name="Streaming" icon="5"/>
|
|
||||||
<node name="Other" icon="5"/>
|
|
||||||
</node>
|
|
||||||
<node name="Office" icon="6">
|
|
||||||
<node name="Writing" icon="6">
|
|
||||||
<node name="PDF" icon="6"/>
|
|
||||||
<node name="AbiWord" file="abiword.xml"/>
|
|
||||||
</node>
|
|
||||||
<node name="Dictionaries" icon="6"/>
|
|
||||||
</node>
|
|
||||||
<node name="Graphics" icon="7">
|
|
||||||
<node name="Vector" icon="7"/>
|
|
||||||
<node name="Pixel" icon="7"/>
|
|
||||||
<node name="3D" icon="7"/>
|
|
||||||
</node>
|
|
||||||
<node name="Multimedia" icon="8">
|
|
||||||
<node name="Codecs" icon="8"/>
|
|
||||||
<node name="Editors" icon="8"/>
|
|
||||||
<node name="Players" icon="8"/>
|
|
||||||
</node>
|
|
||||||
<node name="Development" icon="9">
|
|
||||||
<node name="IDE" icon="9"/>
|
|
||||||
<node name="Compiler" icon="9"/>
|
|
||||||
<node name="Version Control" icon="9"/>
|
|
||||||
<node name="Web" icon="9"/>
|
|
||||||
<node name="Other" icon="9"/>
|
|
||||||
</node>
|
|
||||||
<node name="Games and Fun" icon="10"/>
|
|
||||||
<node name="Tools" icon="11">
|
|
||||||
<node name="Compression" icon="11"/>
|
|
||||||
<node name="Backup" icon="11"/>
|
|
||||||
<node name="Burning" icon="11">
|
|
||||||
<node name="CD" icon="11"/>
|
|
||||||
<node name="DVD" icon="11"/>
|
|
||||||
</node>
|
|
||||||
</node>
|
|
||||||
<node name="Others" icon="12">
|
|
||||||
<node name="Desktop Environments and Shellreplacements" icon="12"/>
|
|
||||||
<node name="Desktop" icon="12"/>
|
|
||||||
<node name="Antivirus" icon="12"/>
|
|
||||||
<node name="Emulators" icon="12">
|
|
||||||
<node name="Computers" icon="12"/>
|
|
||||||
<node name="Systems" icon="12"/>
|
|
||||||
<node name="Games" icon="12"/>
|
|
||||||
</node>
|
|
||||||
<node name="Drivers" icon="12"/>
|
|
||||||
</node>
|
|
||||||
<node name="Installed Programms" icon="13"/>
|
|
||||||
</tree>
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
Sub Main
|
|
||||||
' ToDo: Pick a mirror
|
|
||||||
download ("http://switch.dl.sourceforge.net/sourceforge/tuxpaint/tuxpaint-0.9.15-2-win32-installer.exe", "tuxpaint-inst.exe")
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Sub After
|
|
||||||
shell tuxpaint-inst.exe
|
|
||||||
' ToDo: delete tuxpaint-inst.exe
|
|
||||||
End Sub
|
|
|
@ -1,7 +0,0 @@
|
||||||
<package>
|
|
||||||
<name>TuxPaint</name>
|
|
||||||
<version>0.9.15-2</version>
|
|
||||||
<description>An open source bitmap graphics editor geared towards young children.</description>
|
|
||||||
<scripts inst="tuxpaint.inst.rps"/>
|
|
||||||
</package>
|
|
||||||
|
|