move back packmgr did move it by mistake
svn path=/trunk/; revision=22441
211
rosapps/packmgr/cmd-line/main.c
Normal file
|
@ -0,0 +1,211 @@
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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;
|
||||||
|
}
|
17
rosapps/packmgr/cmd-line/main.h
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
///////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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);
|
8
rosapps/packmgr/cmd-line/ros-get.rc
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
|
||||||
|
#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 */
|
12
rosapps/packmgr/cmd-line/rosget.xml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<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>
|
9
rosapps/packmgr/directory.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<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>
|
43
rosapps/packmgr/gui/cz.rc
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
|
||||||
|
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
|
||||||
|
|
43
rosapps/packmgr/gui/de.rc
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
|
||||||
|
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
|
||||||
|
|
43
rosapps/packmgr/gui/en.rc
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
|
||||||
|
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
|
||||||
|
|
43
rosapps/packmgr/gui/es.rc
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
|
||||||
|
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
|
||||||
|
|
46
rosapps/packmgr/gui/fr.rc
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* 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
|
34
rosapps/packmgr/gui/generic.rc
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
|
||||||
|
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
|
8
rosapps/packmgr/gui/help.txt
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
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.
|
453
rosapps/packmgr/gui/main.c
Normal file
|
@ -0,0 +1,453 @@
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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;
|
||||||
|
}
|
45
rosapps/packmgr/gui/main.h
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
///////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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 [];
|
||||||
|
|
22
rosapps/packmgr/gui/packmgr.rc
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
|
||||||
|
#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 */
|
16
rosapps/packmgr/gui/packmgr.xml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<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>
|
BIN
rosapps/packmgr/gui/res/blank.ico
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
rosapps/packmgr/gui/res/development.ico
Normal file
After Width: | Height: | Size: 4.6 KiB |
BIN
rosapps/packmgr/gui/res/games.ico
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
rosapps/packmgr/gui/res/graphics.ico
Normal file
After Width: | Height: | Size: 8.8 KiB |
BIN
rosapps/packmgr/gui/res/inet.ico
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
rosapps/packmgr/gui/res/install.ico
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
rosapps/packmgr/gui/res/installed.ico
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
rosapps/packmgr/gui/res/installsource.ico
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
rosapps/packmgr/gui/res/multimedia.ico
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
rosapps/packmgr/gui/res/office.ico
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
rosapps/packmgr/gui/res/others.ico
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
rosapps/packmgr/gui/res/packetmanager.ico
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
rosapps/packmgr/gui/res/toolbar.bmp
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
rosapps/packmgr/gui/res/tools.ico
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
rosapps/packmgr/gui/res/uninstall.ico
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
rosapps/packmgr/gui/res/update.ico
Normal file
After Width: | Height: | Size: 21 KiB |
15
rosapps/packmgr/gui/resource.h
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#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
|
25
rosapps/packmgr/lib/cz.rc
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
|
||||||
|
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 */
|
25
rosapps/packmgr/lib/de.rc
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
|
||||||
|
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 */
|
168
rosapps/packmgr/lib/download.cpp
Normal file
|
@ -0,0 +1,168 @@
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
|
25
rosapps/packmgr/lib/en.rc
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
|
||||||
|
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 */
|
20
rosapps/packmgr/lib/error.h
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
// 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
|
24
rosapps/packmgr/lib/es.rc
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
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 */
|
1081
rosapps/packmgr/lib/expat.h
Normal file
28
rosapps/packmgr/lib/fr.rc
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* 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 */
|
101
rosapps/packmgr/lib/functions.cpp
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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}
|
||||||
|
};
|
117
rosapps/packmgr/lib/log.cpp
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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);
|
||||||
|
}
|
21
rosapps/packmgr/lib/log.h
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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);
|
192
rosapps/packmgr/lib/main.cpp
Normal file
|
@ -0,0 +1,192 @@
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// main.cpp
|
||||||
|
//
|
||||||
|
// Doit stuff and
|
||||||
|
// everything that fits nowhere else.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Maarten Bosma, 09.01.2004
|
||||||
|
// maarten.paul@bosma.de
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include "package.hpp"
|
||||||
|
#include "log.h"
|
||||||
|
#include "script.h"
|
||||||
|
|
||||||
|
HANDLE hThread = NULL;
|
||||||
|
BOOL thread_abort = FALSE;
|
||||||
|
|
||||||
|
char* PML_Download (pTree, const char* url, const char* server = "tree", const char* filename = NULL);
|
||||||
|
|
||||||
|
|
||||||
|
// Abort other thread
|
||||||
|
extern "C" void PML_Abort (void)
|
||||||
|
{
|
||||||
|
thread_abort = TRUE;
|
||||||
|
|
||||||
|
if(hThread)
|
||||||
|
WaitForSingleObject(hThread, INFINITE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callback function of the "doit"-thread
|
||||||
|
DWORD WINAPI DoitThread (void* lpParam)
|
||||||
|
{
|
||||||
|
UINT i;
|
||||||
|
int ret = ERR_OK;
|
||||||
|
TREE* tree = (TREE*)lpParam;
|
||||||
|
vector<SCRIPT*> scripts;
|
||||||
|
|
||||||
|
/* Load the scripts */
|
||||||
|
|
||||||
|
tree->setStatus(0, 0, L"Downloading Install instructions ...");
|
||||||
|
|
||||||
|
for(i=0; i<tree->todo.size(); i++)
|
||||||
|
{
|
||||||
|
SCRIPT* script;
|
||||||
|
|
||||||
|
char* path = PML_Download(tree, tree->todo[i]);
|
||||||
|
|
||||||
|
if(RPS_Load(&script, path) == ERR_OK)
|
||||||
|
scripts.push_back(script);
|
||||||
|
else
|
||||||
|
ret = ERR_PACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Preinstall */
|
||||||
|
|
||||||
|
Log("* enter preinstall");
|
||||||
|
|
||||||
|
tree->setStatus(250, 0, L"Preinstall");
|
||||||
|
|
||||||
|
for(i=0; i<scripts.size(); i++)
|
||||||
|
{
|
||||||
|
if(RPS_Execute(scripts[i], "preinstall") != ERR_OK)
|
||||||
|
ret = ERR_PACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Install */
|
||||||
|
|
||||||
|
Log("* enter install");
|
||||||
|
|
||||||
|
tree->setStatus(500, 0, L"Install");
|
||||||
|
|
||||||
|
for(i=0; i<scripts.size(); i++)
|
||||||
|
{
|
||||||
|
if(RPS_Execute(scripts[i], "main") != ERR_OK)
|
||||||
|
ret = ERR_PACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Postinstall */
|
||||||
|
|
||||||
|
Log("* enter postinstall");
|
||||||
|
|
||||||
|
tree->setStatus(750, 0, L"Postinstall");
|
||||||
|
|
||||||
|
for(i=0; i<scripts.size(); i++)
|
||||||
|
{
|
||||||
|
if(RPS_Execute(scripts[i], "after") != ERR_OK)
|
||||||
|
ret = ERR_PACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finish */
|
||||||
|
|
||||||
|
for(i=0; i<tree->todo.size(); i++)
|
||||||
|
RPS_Clear(scripts[i]);
|
||||||
|
|
||||||
|
// clear the todo list
|
||||||
|
tree->todo.clear();
|
||||||
|
|
||||||
|
// set all actions to none
|
||||||
|
for(i=0; i<tree->packages.size(); i++)
|
||||||
|
PML_SetAction (tree, i, 0, tree->setIcon, NULL);
|
||||||
|
|
||||||
|
tree->setStatus(1000, ret, NULL);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do the actions the user wants us to do
|
||||||
|
extern "C" int PML_DoIt (TREE* tree, PML_SetStatus SetStatus, PML_Ask Ask)
|
||||||
|
{
|
||||||
|
DWORD dummy;
|
||||||
|
tree->setStatus = SetStatus;
|
||||||
|
|
||||||
|
if(!tree->todo.size())
|
||||||
|
return ERR_NOTODO;
|
||||||
|
|
||||||
|
//ask
|
||||||
|
WCHAR buffer [2000];
|
||||||
|
WCHAR errbuf [2000];
|
||||||
|
|
||||||
|
wsprintf(buffer, PML_TransError(ERR_READY, (WCHAR*)errbuf, sizeof(errbuf)/sizeof(WCHAR)), tree->todo.size());
|
||||||
|
|
||||||
|
if(!Ask(buffer))
|
||||||
|
return ERR_GENERIC;
|
||||||
|
|
||||||
|
|
||||||
|
hThread = CreateThread(NULL, 0, DoitThread, tree, 0, &dummy);
|
||||||
|
|
||||||
|
if(!hThread)
|
||||||
|
return ERR_GENERIC;
|
||||||
|
|
||||||
|
LogAdd("\n");
|
||||||
|
|
||||||
|
return ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Translates Errorcode into human language
|
||||||
|
extern "C" WCHAR* PML_TransError (int code, WCHAR *string, INT maxchar)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(!LoadString(GetModuleHandle(L"package"), code, string, maxchar))
|
||||||
|
return PML_TransError(ERR_GENERIC, string, maxchar);
|
||||||
|
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Free alloced memory
|
||||||
|
extern "C" void PML_CloseTree (TREE* tree)
|
||||||
|
{
|
||||||
|
UINT i;
|
||||||
|
|
||||||
|
LogAdd ("\n");
|
||||||
|
Log("* free alloced memory");
|
||||||
|
Log("* package manager will exit now. Bye!");
|
||||||
|
|
||||||
|
for(i=0; i<tree->packages.size(); i++)
|
||||||
|
{
|
||||||
|
if(tree->packages[i].path)
|
||||||
|
delete tree->packages[i].path;
|
||||||
|
|
||||||
|
if(tree->packages[i].name)
|
||||||
|
delete tree->packages[i].name;
|
||||||
|
|
||||||
|
if(tree->packages[i].description)
|
||||||
|
delete tree->packages[i].description;
|
||||||
|
|
||||||
|
tree->packages.clear();
|
||||||
|
|
||||||
|
if(tree->packages[i].files[0])
|
||||||
|
delete tree->packages[i].files[0];
|
||||||
|
|
||||||
|
if(tree->packages[i].files[1])
|
||||||
|
delete tree->packages[i].files[1];
|
||||||
|
|
||||||
|
if(tree->packages[i].files[2])
|
||||||
|
delete tree->packages[i].files[2];
|
||||||
|
|
||||||
|
if(tree->packages[i].files[3])
|
||||||
|
delete tree->packages[i].files[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
tree->descriptionPath.clear();
|
||||||
|
tree->todo.clear();
|
||||||
|
tree->packages.clear();
|
||||||
|
|
||||||
|
if(tree)
|
||||||
|
delete tree;
|
||||||
|
}
|
||||||
|
|
101
rosapps/packmgr/lib/options.cpp
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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);
|
||||||
|
}
|
3
rosapps/packmgr/lib/options.xml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
<options>
|
||||||
|
<source>http://svn.reactos.org/viewcvs/*checkout*/trunk/rosapps/packmgr/tree/</source>
|
||||||
|
</options>
|
288
rosapps/packmgr/lib/package.cpp
Normal file
|
@ -0,0 +1,288 @@
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
|
15
rosapps/packmgr/lib/package.def
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
LIBRARY package.dll
|
||||||
|
|
||||||
|
EXPORTS
|
||||||
|
|
||||||
|
PML_Abort
|
||||||
|
PML_TransError
|
||||||
|
PML_LoadTree
|
||||||
|
PML_FindItem
|
||||||
|
PML_LoadPackage
|
||||||
|
PML_GetDescription
|
||||||
|
PML_SetAction
|
||||||
|
PML_DoIt
|
||||||
|
PML_CloseTree
|
||||||
|
|
||||||
|
; EOF
|
47
rosapps/packmgr/lib/package.h
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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
|
92
rosapps/packmgr/lib/package.hpp
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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
|
19
rosapps/packmgr/lib/package.rc
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
|
||||||
|
#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 */
|
25
rosapps/packmgr/lib/package.xml
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
<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>
|
278
rosapps/packmgr/lib/script.cpp
Normal file
|
@ -0,0 +1,278 @@
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
|
}
|
65
rosapps/packmgr/lib/script.h
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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
|
126
rosapps/packmgr/lib/tree.cpp
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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();
|
||||||
|
}
|
||||||
|
|
9
rosapps/packmgr/tree/7zip.inst.rps
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
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
|
7
rosapps/packmgr/tree/7zip.xml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<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>
|
||||||
|
|
8
rosapps/packmgr/tree/abiword.inst.rps
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
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
|
7
rosapps/packmgr/tree/abiword.xml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<package>
|
||||||
|
<name>AbiWord</name>
|
||||||
|
<version>2.4.1</version>
|
||||||
|
<description>Word processor.</description>
|
||||||
|
<scripts inst="abiword.inst.rps"/>
|
||||||
|
</package>
|
||||||
|
|
9
rosapps/packmgr/tree/firefox.inst.rps
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
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
|
7
rosapps/packmgr/tree/firefox.xml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<package>
|
||||||
|
<name>Firefox</name>
|
||||||
|
<version>1.5</version>
|
||||||
|
<description>The famous OpenSource webbroswer.</description>
|
||||||
|
<scripts inst="firefox.inst.rps"/>
|
||||||
|
</package>
|
||||||
|
|
8
rosapps/packmgr/tree/irfanview.inst.rps
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
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
|
7
rosapps/packmgr/tree/irfanview.xml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<package>
|
||||||
|
<name>IrfanView</name>
|
||||||
|
<version>3.98</version>
|
||||||
|
<description>Viewer for all kinds of graphics.</description>
|
||||||
|
<scripts inst="irfanview.inst.rps"/>
|
||||||
|
</package>
|
||||||
|
|
2
rosapps/packmgr/tree/mplayer.inst.rps
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
' 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
|
13
rosapps/packmgr/tree/mplayer.xml
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<!--
|
||||||
|
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
rosapps/packmgr/tree/openoffice.inst.rps
Normal file
|
@ -0,0 +1 @@
|
||||||
|
' ToDo: Implment Zip unpacking
|
7
rosapps/packmgr/tree/openoffice.xml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<package>
|
||||||
|
<name>OpenOffice 1</name>
|
||||||
|
<version>1.1.5</version>
|
||||||
|
<description>OpenSource replacement for Microsoft Office.</description>
|
||||||
|
<scripts inst="openoffice.inst.rps"/>
|
||||||
|
</package>
|
||||||
|
|
4
rosapps/packmgr/tree/putty.inst.rps
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
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
|
7
rosapps/packmgr/tree/putty.xml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<package>
|
||||||
|
<name>Putty</name>
|
||||||
|
<version>beta 0.58</version>
|
||||||
|
<description>SSH and Telnet client.</description>
|
||||||
|
<scripts inst="putty.inst.rps"/>
|
||||||
|
</package>
|
||||||
|
|
8
rosapps/packmgr/tree/rosbe.inst.rps
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
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
|
7
rosapps/packmgr/tree/rosbe.xml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<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>
|
||||||
|
|
2
rosapps/packmgr/tree/tiny.inst.rps
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
' ToDo: Implement Unzipping
|
||||||
|
' http://www.ritlabs.com/download/tinyweb/tinyweb.zip
|
11
rosapps/packmgr/tree/tiny.xml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<!--
|
||||||
|
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>
|
||||||
|
|
27
rosapps/packmgr/tree/tree.xml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<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>
|
12
rosapps/packmgr/tree/tree_bare.xml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<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>
|
70
rosapps/packmgr/tree/tree_withsubs.xml
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
<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>
|
||||||
|
|
9
rosapps/packmgr/tree/tuxpaint.inst.rps
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
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
|
7
rosapps/packmgr/tree/tuxpaint.xml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<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>
|
||||||
|
|