move back packmgr did move it by mistake

svn path=/trunk/; revision=22441
This commit is contained in:
Magnus Olsen 2006-06-20 21:12:15 +00:00
parent f9764bff93
commit 12a01a7706
79 changed files with 4203 additions and 0 deletions

View 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;
}

View 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);

View 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 */

View 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>

View 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
View 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
View 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
View 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
View 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
View 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

View 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

View 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
View 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;
}

View 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 [];

View 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 */

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View 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
View 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
View 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 */

View 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
View 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 */

View 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
View 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

File diff suppressed because it is too large Load diff

28
rosapps/packmgr/lib/fr.rc Normal file
View 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 */

View 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
View 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
View 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);

View 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;
}

View 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);
}

View file

@ -0,0 +1,3 @@
<options>
<source>http://svn.reactos.org/viewcvs/*checkout*/trunk/rosapps/packmgr/tree/</source>
</options>

View 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;
}

View 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

View 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

View 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

View 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 */

View 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>

View 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);
}
}

View 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

View 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();
}

View 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

View 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>

View 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

View file

@ -0,0 +1,7 @@
<package>
<name>AbiWord</name>
<version>2.4.1</version>
<description>Word processor.</description>
<scripts inst="abiword.inst.rps"/>
</package>

View 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

View 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>

View 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

View 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>

View 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

View 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>

View file

@ -0,0 +1 @@
' ToDo: Implment Zip unpacking

View 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>

View 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

View 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>

View 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

View 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>

View file

@ -0,0 +1,2 @@
' ToDo: Implement Unzipping
' http://www.ritlabs.com/download/tinyweb/tinyweb.zip

View 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>

View 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>

View 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>

View 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>

View 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

View 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>