ReactOS Package Manager

More information:
http://reactos.com/wiki/index.php/ReactOS_Package_Manager

* Maarten Bosma (Dr. Fred)
* Klemens Friedl (frik85)

svn path=/trunk/; revision=14481
This commit is contained in:
Klemens Friedl 2005-04-03 19:06:49 +00:00
parent f22d019858
commit be04afc103
46 changed files with 3135 additions and 0 deletions

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 "Unnstall", 5, GRAYED
MENUITEM SEPARATOR
MENUITEM "Options", 8
MENUITEM SEPARATOR
MENUITEM "DoIt", 6
END
END

View file

@ -0,0 +1,24 @@
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"

View file

@ -0,0 +1,401 @@
////////////////////////////////////////////////////////
//
// main.cpp
//
// Implementation of the Package Manager GUI
//
//
// Maarten Bosma, 09.01.2004
// maarten.paul@bosma.de
//
////////////////////////////////////////////////////////////////////
#include "main.h"
// Application's Entry Point
int WINAPI WinMain (HINSTANCE hinst, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASSEX wc = {0};
// 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.xml", AddItem);
if(error)
{
MessageBox(0,PML_TransError(error),0,0);
return 0;
}
// Read the help
Help();
// Start getting messages
while(GetMessage(&msg,NULL,0,0))
{
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)
{
string source;
ifstream file("help.txt", ios_base::in);
getline(file, source, '\0');
SetText(source.c_str());
}
// Create our Controls
void InitControls (HWND hwnd)
{
HINSTANCE hinst = GetModuleHandle(NULL);
// 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), 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_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
RegisterHotKey(hwnd, 1, MOD_CONTROL, VK_1);
RegisterHotKey(hwnd, 2, MOD_CONTROL, VK_2);
RegisterHotKey(hwnd, 3, MOD_CONTROL, VK_3);
RegisterHotKey(hwnd, 4, MOD_CONTROL, VK_4);
RegisterHotKey(hwnd, 0, MOD_CONTROL, VK_0);
}
// 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;
}
// 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 1;
}
// Set the text of the text box
int SetText (const char* text)
{
int i = 0;
string source = text;
// the windows does not need "\n"
// for new lines but "\r\n"
for(i=0; source[i]; i++)
if(source[i]=='\n' && source[i]!='\r')
source.insert (i++, "\r");
SetWindowTextA(hEdit, source.c_str());
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);
}
else if ((int)(((LPNMHDR)lParam)->code) == NM_RCLICK) // <= ahhh 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) == ERR_OK)
break;
MessageBeep(MB_ICONHAND);
}
// DoIt
else if(LOWORD(wParam)==6)
{
if(PML_DoIt(tree, SetStatus) == 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);
else
MessageBox(0,0,0,0);
}
break;
// prozess hotkeys
case WM_HOTKEY:
{
if(PML_SetAction(tree, selected, wParam, SetIcon) != 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)
{
// 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 very thing is done
if(status1==1000)
{
EndDialog(hStatus, TRUE);
MessageBox(0,PML_TransError(status2),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,62 @@
///////////////////////////////////////////////////
//
// main.h
// main.cpp's lumber room :)
///////////////////////////////////////////////////
#include <windows.h>
#include <ntos/keyboard.h>
#include <commctrl.h>
#include <iostream>
#include <fstream>
#include <package.hpp>
#include "resource.h"
/* Some Variables */
int selected, splitter_pos = 50;
pTree tree;
HMENU hPopup;
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);
/* Toolbar Releated */
#define TBSTYLE_FLAT 2048
// This is the struct where the toolbar is defined
TBBUTTON Buttons [] =
{
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, 0},
{0, 1, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON, 0L, 0}, // No Action
{1, 2, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON, 0L, 0}, // Install
{2, 3, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON, 0L, 0}, // Install from source
{3, 4, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON, 0L, 0}, // Update
{4, 5, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON, 0L, 0}, // Unistall
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, 0},
{5, 6, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, // DoIt (tm)
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, 0},
{6, 7, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, // Help
{7, 8, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, // Options
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, 0},
};

View file

@ -0,0 +1,24 @@
TARGET_NAME = packmgr
TARGET_TYPE = program
TARGET_APPTYPE = windows
PATH_TO_TOP = ../../../reactos
TARGET_SDKLIBS = kernel32.a user32.a package.a gdi32.a comctl32.a shell32.a
TARGET_GCCLIBS = stdc++ uuid
TARGET_OBJECTS = main.o
TARGET_CFLAGS = \
-D__USE_W32API -DWIN32 -D_ROS_ \
-D_WIN32_IE=0x0501 -D_WIN32_WINNT=0x0501 \
-DUNICODE -Wall -I../lib
TARGET_CPPFLAGS = $(TARGET_CFLAGS)
TARGET_RCFLAGS = -D__USE_W32API -DNDEBUG -DWIN32 -D_ROS_ -D__WINDRES__ -DUNICODE
include $(PATH_TO_TOP)/rules.mak
include $(TOOLS_PATH)/helper.mk
include $(TOOLS_PATH)/depend.mk

View file

@ -0,0 +1,18 @@
#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 "en.rc"
/* EOF */

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 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,14 @@
#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

9
rosapps/packmgr/help.txt Normal file
View file

@ -0,0 +1,9 @@
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.

View file

@ -0,0 +1,117 @@
////////////////////////////////////////////////////////
//
// 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 <wine/urlmon.h>
// Server there all the files lie
const char* tree_server = "http://svn.reactos.com/viewcvs/*checkout*/trunk/rosapps/packmgr/tree/";
HRESULT WINAPI URLDownloadToFileA(
LPUNKNOWN pCaller,
LPCSTR szURL,
LPCSTR szFileName,
DWORD dwReserved,
LPBINDSTATUSCALLBACK lpfnCB
);
// Download a file
char* PML_Download (const char* name, const char* local_name = "packmgr.txt", const char* server = tree_server, BOOL totemp = TRUE)
{
char url [MAX_PATH];
static char path [MAX_PATH];
// get temp dir
if(totemp)
GetTempPathA (200, path);
// create the local file name
if(local_name)
strcat(path, local_name);
else
strcat(path, "tmp.tmp");
// get the url
if(server) strcpy(url, server);
strcat(url, name);
// make sure there is no old file
DeleteFileA (path);
// download the file
if(URLDownloadToFileA (NULL, url, path, 0, NULL) != S_OK)
{
Log("! ERROR: Unable to download ");
LogAdd(url);
return NULL;
}
return path;
}
// Download and prozess a xml file
int PML_XmlDownload (const char* url, void* usrdata, XML_StartElementHandler start,
XML_EndElementHandler end, XML_CharacterDataHandler text)
{
char buffer[255];
int done = 0;
// logging
Log("* prozess the xml file: ");
LogAdd(url);
// download the file
char* filename = PML_Download(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");
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;
}

19
rosapps/packmgr/lib/en.rc Normal file
View file

@ -0,0 +1,19 @@
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)."
END
/* EOF */

View file

@ -0,0 +1,16 @@
// 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
// Script
#define ERR_SYNATX 0x011
#define ERR_CALL 0x012
#define ERR_PARAMETER 0x013
#define ERR_FILE 0x014
#define IDS_LOAD 0x254
#define NOTFOUND -1

1081
rosapps/packmgr/lib/expat.h Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,101 @@
////////////////////////////////////////////////////////
//
// script.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 (const char* name, const char* local_name, const char* server, BOOL totemp = TRUE);
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(argv[1], argv[2], argv[3]);
else if (argc==2)
result = PML_Download(argv[1], argv[2], NULL);
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}
};

View file

@ -0,0 +1,98 @@
////////////////////////////////////////////////////////
//
// 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;
// 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);
fputs("# ReactOS Package Manager - Log File\n#\n# WARNING: This is still pre-alpha software.\n# Date: ", file);
fputs(GTime, file);
fputs("\n#\n#", file);
fputs(version, file);
fputs("\n#", file);
fputs(versionos, file);
fputs("\n#\n", file);
}
else
file = fopen(LOGFILE, "a");
if (file == NULL) {
if (LogCreated)
LogCreated = false;
return;
}
else
{
// Save log entry (+ add time)
fputs("\n", file);
time_t now;
now = time(NULL);
strftime(GTime,sizeof GTime,"%I:%M:%S %p ",localtime(&now));
fputs(GTime, 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 "packmgr.log"
extern bool LogCreated;
void Log (const char *message);
void LogAdd (const char *message);

View file

@ -0,0 +1,185 @@
////////////////////////////////////////////////////////
//
// 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;
extern const char* tree_server;
char* PML_Download (const char* name, const char* local_name = "packmgr.txt", const char* server = tree_server, BOOL totemp = TRUE);
// 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->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);
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)
{
DWORD dummy;
tree->setStatus = SetStatus;
if(!tree->todo.size())
return ERR_NOTODO;
hThread = CreateThread(NULL, 0, DoitThread, tree, 0, &dummy);
if(!hThread)
return ERR_GENERIC;
LogAdd("\n");
return ERR_OK;
}
// Translates Errorcode into human language
extern "C" WCHAR* PML_TransError (int code)
{
// I know we, got a memory leak here
static WCHAR string [256];
if(!LoadString(GetModuleHandle(L"package"), code, string, 256))
return PML_TransError(ERR_GENERIC);
return string;
}
// Free alloced memory
extern "C" void PML_CloseTree (TREE* tree)
{
UINT i;
LogAdd ("\n");
Log("* free alloced memory");
Log("* package manager will exit now. Bye!");
for(i=0; i<tree->packages.size(); i++)
{
if(tree->packages[i].path)
delete tree->packages[i].path;
if(tree->packages[i].name)
delete tree->packages[i].name;
if(tree->packages[i].description)
delete tree->packages[i].description;
tree->packages.clear();
if(tree->packages[i].files[0])
delete tree->packages[i].files[0];
if(tree->packages[i].files[1])
delete tree->packages[i].files[1];
if(tree->packages[i].files[2])
delete tree->packages[i].files[2];
if(tree->packages[i].files[3])
delete tree->packages[i].files[3];
}
tree->descriptionPath.clear();
tree->todo.clear();
tree->packages.clear();
if(tree)
delete tree;
}

View file

@ -0,0 +1,27 @@
TARGET_TYPE = dynlink
TARGET_NAME = package
PATH_TO_TOP = ../../../reactos
TARGET_SDKLIBS = kernel32.a shell32.a user32.a package.a expat.a urlmon.a
TARGET_OBJECTS = main.o tree.o package.o download.o script.o functions.o log.o
TARGET_GCCLIBS = stdc++ uuid
TARGET_CFLAGS = \
-DUNICODE \
-Wall \
-Wno-error \
-D__USE_W32API \
-DWINVER=0x0600 \
-D_WIN32_WINNT=0x0501
TARGET_CPPFLAGS = $(TARGET_CFLAGS)
include $(PATH_TO_TOP)/rules.mak
include $(TOOLS_PATH)/helper.mk
include $(TOOLS_PATH)/depend.mk
# EOF

View file

@ -0,0 +1,191 @@
////////////////////////////////////////////////////////
//
// 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 (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;
}
}
// 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, PML_SetText SetText)
{
PACKAGE* pack = &tree->packages[id];
tree->setButton = 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 (pack->path, (void*)pack, pack_start, pack_end, pack_text);
pack->loaded = TRUE;
}
if(pack->description)
SetText(pack->description);
return ERR_OK;
}
// The user chooses a actions like Install
extern "C" int PML_SetAction (TREE* tree, int id, int action, PML_SetIcon SetIcon)
{
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);
// is the action possible ?
if(!pack->actions[action])
return ERR_GENERIC;
// is it already set
if(pack->action == action)
return ERR_OK;
// set the icon
if(!pack->icon)
SetIcon(id, 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
tree->setButton(1, 1);
//tree->setButton(action+1, 0);
pack->action = action;
// root notes (like network) return here
if(!pack->path)
return ret;
// load it if it's not loaded yet
if(!pack->loaded)
{
PML_XmlDownload (pack->path, (void*)pack, pack_start, pack_end, pack_text);
pack->loaded = TRUE;
}
// save the name of the corresponding script in a vector
tree->todo.push_back(pack->files[action-1]);
}
// undoing
else
{+
// set other things back
tree->setButton(1, 0);
//tree->setButton(pack->action+1, 1);
pack->action = 0;
// 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
return ERR_OK;
}
return ret;
}

View file

@ -0,0 +1,13 @@
LIBRARY package.dll
EXPORTS
PML_Abort
PML_TransError
PML_LoadTree
PML_LoadPackage
PML_SetAction
PML_DoIt
PML_CloseTree
; EOF

View file

@ -0,0 +1,86 @@
////////////////////////////////////////////////
//
// 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);
/* Structs */
typedef struct
{
char* path;
BOOL icon;
BOOL loaded;
vector<int> children;
char** field;
char* name;
char* description;
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* xmltree;
vector<char*> descriptionPath;
vector<char*> todo;
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);
int PML_LoadTree (pTree*, char* url, PML_AddItem);
int PML_LoadPackage (pTree, int id, PML_SetButton, PML_SetText);
int PML_SetAction (pTree, int package, int action, PML_SetIcon);
int PML_DoIt (pTree, PML_SetStatus);
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,15 @@
#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 "en.rc"
/* EOF */

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,112 @@
////////////////////////////////////////////////////////
//
// 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;
void tree_end (void* tree, const char* tag);
void tree_start (void* usrdata, const char* tag, const char** arg);
int PML_XmlDownload (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;
return PML_XmlDownload (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;
static int id = 1;
const char* name = "\0";
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;
// read the arguments
for (i=0; arg[i]; i+=2)
{
if(!strcmp(arg[i], "name"))
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])];
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(name[0]=='\0') return;
// add it
if(!parents.size())
tree->addItem(id, name, 0, icon);
else
{
tree->addItem(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();
}

14
rosapps/packmgr/makefile Normal file
View file

@ -0,0 +1,14 @@
all: lib gui
lib: dummy
$(MAKE) -C lib
gui: dummy
$(MAKE) -C gui
dummy:
clean:
$(MAKE) -C gui clean
$(MAKE) -C lib clean

View file

@ -0,0 +1,9 @@
'Install rutine for abiword
Sub Main
download ("http://www.abisource.com/downloads/abiword/2.2.5/Windows/abiword-setup-2.2.5.exe", "abisetup.exe")
End Sub
Sub After
shell abisetup.exe
End Sub

View file

@ -0,0 +1,7 @@
<package>
<name>AbiWord</name>
<description>Currently it's definitely the best word processor running under ReactOS.</description>
<scripts inst="abiword.inst.rps" srcinst="abiword.inst.rps"/>
</package>

View file

@ -0,0 +1,7 @@
<package>
<name>MozillaControl</name>
<description>Provide the Gekko Engine for ReactOS.</description>
<scripts inst="mozillacontrol.inst.rps" srcinst="mozillacontrol.inst.rps"/>
</package>

View file

@ -0,0 +1,9 @@
'Install rutine for Mozilla Control 1.6
Sub Main
download ("http://www.iol.ie/~locka/mozilla/MozillaControl16.exe", "mozillacontrol16.exe")
End Sub
Sub After
shell mozillacontrol16.exe
End Sub

View file

@ -0,0 +1,69 @@
<tree>
<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>