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