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
43
rosapps/packmgr/gui/en.rc
Normal file
|
@ -0,0 +1,43 @@
|
|||
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
|
||||
/* Dialogs */
|
||||
IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 180, 200
|
||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Options"
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
LTEXT "There are no options yet.", 0, 50, 95, 80, 8
|
||||
END
|
||||
|
||||
IDD_DOIT DIALOG DISCARDABLE 0, 0, 180, 100
|
||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Performing Operations"
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
|
||||
CTEXT "{Status}", IDC_TSTATUS, 0, 10, 180, 8
|
||||
|
||||
CONTROL "", IDC_STATUS1, "msctls_progress32", PBS_SMOOTH, 20, 25, 140, 15
|
||||
|
||||
CONTROL "", IDC_STATUS2, "msctls_progress32", PBS_SMOOTH, 20, 45, 140, 15
|
||||
|
||||
PUSHBUTTON "Abort", IDC_CANCEL, 65, 70, 50, 14, WS_DISABLED
|
||||
END
|
||||
|
||||
IDR_POPUP MENU DISCARDABLE
|
||||
BEGIN
|
||||
POPUP "PopUp", MENUBARBREAK
|
||||
BEGIN
|
||||
MENUITEM "No Action", 1, GRAYED
|
||||
MENUITEM "Install (recommended)", 2, GRAYED
|
||||
MENUITEM "Install from Source", 3, GRAYED
|
||||
MENUITEM "Update", 4, GRAYED
|
||||
MENUITEM "Unnstall", 5, GRAYED
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Options", 8
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "DoIt", 6
|
||||
END
|
||||
END
|
||||
|
24
rosapps/packmgr/gui/generic.rc
Normal 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"
|
||||
|
401
rosapps/packmgr/gui/main.cpp
Normal 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;
|
||||
}
|
62
rosapps/packmgr/gui/main.h
Normal 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},
|
||||
};
|
24
rosapps/packmgr/gui/makefile
Normal 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
|
18
rosapps/packmgr/gui/packmgr.rc
Normal 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 */
|
BIN
rosapps/packmgr/gui/res/blank.ico
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
rosapps/packmgr/gui/res/development.ico
Normal file
After Width: | Height: | Size: 4.6 KiB |
BIN
rosapps/packmgr/gui/res/games.ico
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
rosapps/packmgr/gui/res/graphics.ico
Normal file
After Width: | Height: | Size: 8.8 KiB |
BIN
rosapps/packmgr/gui/res/inet.ico
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
rosapps/packmgr/gui/res/install.ico
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
rosapps/packmgr/gui/res/installed.ico
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
rosapps/packmgr/gui/res/installsource.ico
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
rosapps/packmgr/gui/res/multimedia.ico
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
rosapps/packmgr/gui/res/office.ico
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
rosapps/packmgr/gui/res/others.ico
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
rosapps/packmgr/gui/res/packetmanager.ico
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
rosapps/packmgr/gui/res/toolbar.bmp
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
rosapps/packmgr/gui/res/tools.ico
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
rosapps/packmgr/gui/res/uninstall.ico
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
rosapps/packmgr/gui/res/update.ico
Normal file
After Width: | Height: | Size: 21 KiB |
14
rosapps/packmgr/gui/resource.h
Normal 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
|
@ -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.
|
||||
|
117
rosapps/packmgr/lib/download.cpp
Normal 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
|
@ -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 */
|
16
rosapps/packmgr/lib/error.h
Normal 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
101
rosapps/packmgr/lib/functions.cpp
Normal 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}
|
||||
};
|
98
rosapps/packmgr/lib/log.cpp
Normal 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
|
@ -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);
|
185
rosapps/packmgr/lib/main.cpp
Normal 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;
|
||||
}
|
||||
|
27
rosapps/packmgr/lib/makefile
Normal 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
|
191
rosapps/packmgr/lib/package.cpp
Normal 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;
|
||||
}
|
||||
|
13
rosapps/packmgr/lib/package.def
Normal file
|
@ -0,0 +1,13 @@
|
|||
LIBRARY package.dll
|
||||
|
||||
EXPORTS
|
||||
|
||||
PML_Abort
|
||||
PML_TransError
|
||||
PML_LoadTree
|
||||
PML_LoadPackage
|
||||
PML_SetAction
|
||||
PML_DoIt
|
||||
PML_CloseTree
|
||||
|
||||
; EOF
|
86
rosapps/packmgr/lib/package.hpp
Normal 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
|
15
rosapps/packmgr/lib/package.rc
Normal 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 */
|
278
rosapps/packmgr/lib/script.cpp
Normal file
|
@ -0,0 +1,278 @@
|
|||
////////////////////////////////////////////////////////
|
||||
//
|
||||
// script.cpp
|
||||
//
|
||||
// Implementaion of a basic basic :) interpreter
|
||||
//
|
||||
//
|
||||
// Maarten Bosma, 09.01.2004
|
||||
// maarten.paul@bosma.de
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "package.hpp"
|
||||
#include "script.h"
|
||||
#include "log.h"
|
||||
#include <fstream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
// just a few Helpers
|
||||
void Replace (string* Where, string Old, string New, int start = 0, int end = -1, int instring = 1);
|
||||
int FindCount (string What, string Where, int start = 0, int end = -1);
|
||||
int Find (string Where, string What, int start = 0, int end = -1, int instring = 1);
|
||||
|
||||
|
||||
// Loads script from file, checks if it's synaxially correct
|
||||
// and converts it into a easy to interprete one.
|
||||
int RPS_Load (SCRIPT** script, const char* path)
|
||||
{
|
||||
string source;
|
||||
|
||||
/* We have to do it that way (doublepointer) because MinGw
|
||||
calls "delete" at the end of function otherwise. */
|
||||
(*script) = new SCRIPT;
|
||||
|
||||
// Load file to string
|
||||
ifstream file(path, ios_base::in);
|
||||
if (!file.is_open())
|
||||
return ERR_FILE;
|
||||
|
||||
getline(file, source, '\0');
|
||||
|
||||
// make sure last char is a new line
|
||||
source += "\n";
|
||||
|
||||
// Are all subs and strings closed ?
|
||||
// FIXME: Just a quick hack sould be both checked line by line
|
||||
if(FindCount(source, "\"")%2) // if count is uneven not all strings are closed
|
||||
return ERR_SYNATX;
|
||||
|
||||
if(FindCount(source, "Sub ") != FindCount(source, "End Sub\n"))
|
||||
return ERR_SYNATX;
|
||||
|
||||
// Delete comments
|
||||
while (true)
|
||||
{
|
||||
int start = Find(source, "'");
|
||||
if(start == NOTFOUND)
|
||||
break;
|
||||
int end = Find(source, "\n", start);
|
||||
source.erase(start, end-start); // needs size not line
|
||||
}
|
||||
|
||||
// Converte the file into some thing easier to interprete
|
||||
Replace(&source, "(", " ");
|
||||
Replace(&source, ")", " ");
|
||||
Replace(&source, ";", " ");
|
||||
Replace(&source, ",", " ");
|
||||
Replace(&source, "\"", " \" ");
|
||||
Replace(&source, "\t", " ");
|
||||
|
||||
Replace(&source, " ", " ");
|
||||
Replace(&source, "\n ", "\n");
|
||||
Replace(&source, " \n", "\n");
|
||||
Replace(&source, "\n\n", "\n");
|
||||
|
||||
if(source[0]=='\n')
|
||||
source.erase(0,1);
|
||||
|
||||
// copy string into struct (line by line)
|
||||
UINT i, line=0;
|
||||
for (i=0; i < source.size(); i++)
|
||||
{
|
||||
// Make everything non capital letters
|
||||
if (source[i] >= 65 && source[i] <= 90) // ASCII-Code (A-Z 65-90)
|
||||
{
|
||||
source[i] += 32; // ASCII-Code (a-z 97-122)
|
||||
}
|
||||
|
||||
else if (source[i] == '\"')
|
||||
{
|
||||
while(source[++i]!='\"');
|
||||
}
|
||||
|
||||
else if (source[i] == '\n')
|
||||
{
|
||||
(*script)->code.push_back(source.substr(line, i-line));
|
||||
line = i+1;
|
||||
}
|
||||
}
|
||||
|
||||
// create a sub table (with name, beginnig and end of function)
|
||||
for (i=0; i < (*script)->code.size(); i++) // code.size() is the cout of lines
|
||||
{
|
||||
SUB sub;
|
||||
|
||||
if((*script)->code[i].substr(0,4) != "sub ")
|
||||
return ERR_SYNATX; // script has to start with sub
|
||||
|
||||
sub.name = (*script)->code[i].substr(4,((*script)->code[i].size()-4));
|
||||
sub.start = i+1;
|
||||
|
||||
while ((*script)->code[i] != "end sub")
|
||||
{
|
||||
i++;
|
||||
//if script does not end with "end sub" we got a problem
|
||||
if (i>(*script)->code.size())
|
||||
return ERR_SYNATX;
|
||||
}
|
||||
|
||||
sub.end = i;
|
||||
(*script)->subs.push_back(sub);
|
||||
}
|
||||
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
|
||||
// Executes a subroutine of the script
|
||||
int RPS_Execute (SCRIPT* script, const char* function)
|
||||
{
|
||||
char *argv[100];
|
||||
char *buffer;
|
||||
int a, b, c, nr = NOTFOUND, argc = 0;
|
||||
|
||||
// find the right fuction
|
||||
for(a=0; (UINT)a<script->subs.size(); a++)
|
||||
if(script->subs[a].name == function)
|
||||
nr = a;
|
||||
|
||||
// if there isn't a fuction with this name we can't do anything
|
||||
if(nr == NOTFOUND)
|
||||
return ERR_OK;
|
||||
|
||||
// call the function
|
||||
for (a=script->subs[nr].start; a<script->subs[nr].end; a++)
|
||||
{
|
||||
// create a temporarry buffer
|
||||
buffer = new char[script->code[a].size()];
|
||||
strcpy(buffer, script->code[a].c_str());
|
||||
|
||||
// make the fist argument the function's name
|
||||
argv[0] = &buffer[0];
|
||||
|
||||
int buffer_size = (int)strlen(buffer);
|
||||
for (b=0; b<buffer_size+1; b++)
|
||||
{
|
||||
// ignore chars in strings
|
||||
if(buffer[b]=='\"')
|
||||
{
|
||||
argv[argc] = &buffer[b+1];
|
||||
|
||||
while(buffer[++b]!='\"');
|
||||
|
||||
buffer[b] = '\0';
|
||||
}
|
||||
|
||||
// create a new argument
|
||||
else if(buffer[b]==' ')
|
||||
{
|
||||
argc++;
|
||||
argv[argc] = &buffer[b+1];
|
||||
buffer[b] = '\0';
|
||||
|
||||
// we don't want buffer overflows
|
||||
if(argc == 99)
|
||||
return ERR_GENERIC;
|
||||
|
||||
}
|
||||
|
||||
// call the function
|
||||
else if(buffer[b]=='\0')
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
// log the name
|
||||
Log("* excute command: ");
|
||||
for(c=0; c<argc+1; c++)
|
||||
{
|
||||
LogAdd(argv[c]);
|
||||
LogAdd(" ");
|
||||
}
|
||||
|
||||
for(c=0; c<FUNC_COUNT; c++)
|
||||
if(!strcmp(argv[0], FuncTable[c].name))
|
||||
error = FuncTable[c].function(argc, &argv[0]);
|
||||
|
||||
if(error)
|
||||
return error;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// start again with next line
|
||||
delete[] buffer;
|
||||
argc = 0;
|
||||
}
|
||||
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
// get a Constant or a variavle
|
||||
int RPS_getVar (const char* name)
|
||||
{
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
// Clears up Memory
|
||||
void RPS_Clear (SCRIPT* script)
|
||||
{
|
||||
if(script)
|
||||
delete script;
|
||||
}
|
||||
|
||||
/* Helper Functions */
|
||||
|
||||
// How often do we find a string inside another one
|
||||
int FindCount (string where, string what, int start, int end)
|
||||
{
|
||||
int counter = 0, pos;
|
||||
|
||||
while(true)
|
||||
{
|
||||
pos = (int)where.find (what, start);
|
||||
//could could not be found or is outside of search area
|
||||
if (pos == (int)string::npos || (end!=-1 && pos>end))
|
||||
break;
|
||||
start = pos+1;
|
||||
counter++;
|
||||
}
|
||||
|
||||
return counter;
|
||||
}
|
||||
|
||||
// Find (with only or not in Strings option)
|
||||
int Find (string where, string what, int start, int end, int instring)
|
||||
{
|
||||
int pos = (int)where.find (what, start);
|
||||
|
||||
//could could not be found or is outside of search area
|
||||
if (pos == (int)string::npos || (end!=-1 && pos>end))
|
||||
return -1;
|
||||
|
||||
// if the count of this quotes is eaven we are in string
|
||||
int isInString = FindCount(where, "\"", start, pos)%2;
|
||||
|
||||
// if so we go on searching
|
||||
if(isInString == instring)
|
||||
return Find (where, what, pos+1, end, instring);
|
||||
|
||||
return pos;
|
||||
|
||||
}
|
||||
|
||||
// Replace (using Find)
|
||||
void Replace (string* String, string Old, string New, int start, int end, int instring)
|
||||
{
|
||||
int pos = start;
|
||||
|
||||
while(true)
|
||||
{
|
||||
pos = Find(String->c_str(), Old, pos, end, instring);
|
||||
if (pos == -1)
|
||||
break;
|
||||
|
||||
String->replace (pos, Old.length(), New);
|
||||
}
|
||||
}
|
65
rosapps/packmgr/lib/script.h
Normal file
|
@ -0,0 +1,65 @@
|
|||
////////////////////////////////////////////////
|
||||
//
|
||||
// package.hpp
|
||||
// Header for the script stuff
|
||||
////////////////////////////////////////////////
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
/* Structs */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
string name;
|
||||
int start, end;
|
||||
|
||||
} SUB;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
vector<string> code;
|
||||
vector<SUB> subs;
|
||||
|
||||
} SCRIPT;
|
||||
|
||||
|
||||
/* Prototypes */
|
||||
|
||||
int RPS_Load (SCRIPT** script, const char* path);
|
||||
int RPS_Execute (SCRIPT* script, const char* function);
|
||||
int RPS_getVar (const char* name);
|
||||
void RPS_Clear (SCRIPT* script);
|
||||
|
||||
|
||||
/* Callbacks */
|
||||
|
||||
typedef int (*FUNC_PROC)(int, char**); // function callback
|
||||
|
||||
|
||||
/* Function table */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char* name;
|
||||
FUNC_PROC function;
|
||||
} FUNC_TABLE;
|
||||
|
||||
// very function is listed in there
|
||||
extern const FUNC_TABLE FuncTable[];
|
||||
|
||||
// count of functions
|
||||
#define FUNC_COUNT 3
|
||||
|
||||
|
||||
/* For the helper-funtions */
|
||||
|
||||
#define STR_NO 0x1;
|
||||
#define STR_ONLY 0x0;
|
||||
#define STR_YES 0x2;
|
||||
|
||||
// ^^ I would write down here that they
|
||||
// mean but I don't know anymore myself :O
|
112
rosapps/packmgr/lib/tree.cpp
Normal 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
|
@ -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
|
9
rosapps/packmgr/tree/abiword.inst.rps
Normal 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
|
7
rosapps/packmgr/tree/abiword.xml
Normal 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>
|
||||
|
7
rosapps/packmgr/tree/mozcontrol.xml
Normal 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>
|
||||
|
9
rosapps/packmgr/tree/mozillacontrol.inst.rps
Normal 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
|
69
rosapps/packmgr/tree/tree.xml
Normal 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>
|
||||
|