move some files into base/applications
svn path=/trunk/; revision=21018
723
reactos/base/applications/devmgr/devmgr.c
Normal file
|
@ -0,0 +1,723 @@
|
|||
/* Device manager
|
||||
* (C) 2005 - Hervé Poussineau (hpoussin@reactos.org)
|
||||
* GUI: Michael Fritscher (michael@fritscher.net)
|
||||
*
|
||||
*/
|
||||
|
||||
#define INITGUID
|
||||
#include <windows.h>
|
||||
#include <setupapi.h>
|
||||
#include <stdio.h>
|
||||
#include <tchar.h>
|
||||
#include <commctrl.h>
|
||||
#include <windows.h>
|
||||
#include <commctrl.h>
|
||||
#if defined (__GNUC__)
|
||||
#include <winioctl.h>
|
||||
#endif
|
||||
|
||||
/* FIXME: should be in cfgmgr32.h */
|
||||
typedef DWORD CONFIGRET;
|
||||
typedef DWORD DEVINST, *PDEVINST;
|
||||
#define CM_DRP_DEVICEDESC 0x00000001
|
||||
#define MAX_DEVICE_ID_LEN 200
|
||||
#define MAX_CLASS_NAME_LEN 32
|
||||
#define CR_SUCCESS 0x00000000
|
||||
#define CR_NO_SUCH_DEVINST 0x0000000D
|
||||
#define CR_NO_SUCH_VALUE 0x00000025
|
||||
#ifdef _UNICODE
|
||||
typedef WCHAR *DEVINSTID_W;
|
||||
CONFIGRET WINAPI CM_Get_DevNode_Registry_PropertyW(DEVINST, ULONG, PULONG, PVOID, PULONG, ULONG);
|
||||
CONFIGRET WINAPI CM_Locate_DevNodeW(PDEVINST, DEVINSTID_W, ULONG);
|
||||
#define CM_Get_DevNode_Registry_Property CM_Get_DevNode_Registry_PropertyW
|
||||
#define CM_Locate_DevNode CM_Locate_DevNodeW
|
||||
#else
|
||||
typedef CHAR *DEVINSTID_A;
|
||||
CONFIGRET WINAPI CM_Get_DevNode_Registry_PropertyA(DEVINST, ULONG, PULONG, PVOID, PULONG, ULONG);
|
||||
CONFIGRET WINAPI CM_Locate_DevNodeA(PDEVINST, DEVINSTID_A, ULONG);
|
||||
#define CM_Get_DevNode_Registry_Property CM_Get_DevNode_Registry_PropertyA
|
||||
#define CM_Locate_DevNode CM_Locate_DevNodeA
|
||||
#endif
|
||||
CONFIGRET WINAPI CM_Enumerate_Classes(ULONG, LPGUID, ULONG);
|
||||
CONFIGRET WINAPI CM_Get_Child(PDEVINST, DEVINST, ULONG);
|
||||
CONFIGRET WINAPI CM_Get_Sibling(PDEVINST, DEVINST, ULONG);
|
||||
/* end of cfgmgr32.h */
|
||||
|
||||
/**************************************************************************
|
||||
Function Prototypes
|
||||
**************************************************************************/
|
||||
|
||||
BOOL InitApplication(HINSTANCE);
|
||||
BOOL InitInstance(HINSTANCE, int);
|
||||
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
|
||||
void CreateListView(HINSTANCE, HWND);
|
||||
void ResizeListView(HWND);
|
||||
BOOL InitListView();
|
||||
void InsertIntoListView(int, LPTSTR, LPTSTR);
|
||||
|
||||
|
||||
LRESULT ListViewNotify(HWND, LPARAM);
|
||||
void SwitchView(HWND, DWORD);
|
||||
BOOL DoContextMenu(HWND, WPARAM, LPARAM);
|
||||
void UpdateMenu(HWND, HMENU);
|
||||
BOOL InsertListViewItems();
|
||||
void PositionHeader();
|
||||
|
||||
void CreateButtons();
|
||||
void ListByClass();
|
||||
|
||||
/**************************************************************************
|
||||
Global Variables
|
||||
**************************************************************************/
|
||||
|
||||
HINSTANCE g_hInst;
|
||||
TCHAR g_szClassName[] = TEXT("VListVwClass");
|
||||
HWND hWnd;
|
||||
HWND hwndListView;
|
||||
HWND hwndButtonListByClass;
|
||||
HWND hwndButtonListByConnection;
|
||||
HWND hwndButtonListByInterface;
|
||||
HWND hwndButtonExit;
|
||||
TCHAR temp [255];
|
||||
HDC hDC;
|
||||
TCHAR empty [255] = TEXT(" ");
|
||||
|
||||
void ListByClass()
|
||||
{
|
||||
GUID ClassGuid;
|
||||
TCHAR ClassDescription[MAX_PATH];
|
||||
TCHAR ClassName[MAX_CLASS_NAME_LEN];
|
||||
TCHAR PropertyBuffer[256];
|
||||
HKEY KeyClass;
|
||||
HDEVINFO hDevInfo;
|
||||
SP_DEVINFO_DATA DeviceInfoData;
|
||||
int i = 0, j;
|
||||
long Size;
|
||||
long rc;
|
||||
|
||||
SendMessage(hwndListView, WM_SETREDRAW, FALSE, 0);
|
||||
|
||||
ListView_DeleteAllItems(hwndListView);
|
||||
while (1)
|
||||
{
|
||||
CONFIGRET res;
|
||||
res = CM_Enumerate_Classes(i, &ClassGuid, 0);
|
||||
if (res == CR_NO_SUCH_VALUE)
|
||||
break;
|
||||
|
||||
i++;
|
||||
ClassName[0] = '\0';
|
||||
if (!SetupDiClassNameFromGuid(
|
||||
&ClassGuid,
|
||||
ClassName,
|
||||
sizeof(ClassName) / sizeof(ClassName[0]),
|
||||
NULL))
|
||||
{
|
||||
_tprintf(_T("SetupDiClassNameFromGuid() failed with status 0x%lx\n"), GetLastError());
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Get class description */
|
||||
KeyClass = SetupDiOpenClassRegKey(
|
||||
&ClassGuid,
|
||||
KEY_READ);
|
||||
if (KeyClass == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
_tprintf(_T("SetupDiOpenClassRegKey() failed with status 0x%lx\n"), GetLastError());
|
||||
continue;
|
||||
}
|
||||
Size = sizeof(ClassDescription);
|
||||
rc = RegQueryValue(KeyClass, NULL, ClassDescription, &Size);
|
||||
if (rc == ERROR_SUCCESS)
|
||||
{
|
||||
InsertIntoListView(i,ClassDescription,ClassName);
|
||||
TextOut(hDC, 200, 40, empty, strlen(empty));
|
||||
TextOut(hDC, 200, 40, ClassDescription, strlen(ClassDescription));
|
||||
_tprintf(_T("%d %s (%s)\n"), i, ClassName, ClassDescription);
|
||||
}
|
||||
else
|
||||
_tprintf(_T("RegQueryValue() failed with status 0x%lx\n"), rc);
|
||||
RegCloseKey(KeyClass);
|
||||
|
||||
/* Enumerate devices in the class */
|
||||
hDevInfo = SetupDiGetClassDevs(
|
||||
&ClassGuid,
|
||||
NULL, /* Enumerator */
|
||||
NULL, /* hWnd parent */
|
||||
DIGCF_PRESENT);
|
||||
if (hDevInfo == INVALID_HANDLE_VALUE)
|
||||
continue;
|
||||
|
||||
j = 0;
|
||||
while (1)
|
||||
{
|
||||
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
|
||||
if (!SetupDiEnumDeviceInfo(
|
||||
hDevInfo,
|
||||
j,
|
||||
&DeviceInfoData))
|
||||
{
|
||||
break;
|
||||
}
|
||||
j++;
|
||||
if (SetupDiGetDeviceRegistryProperty(
|
||||
hDevInfo,
|
||||
&DeviceInfoData,
|
||||
SPDRP_DEVICEDESC,
|
||||
NULL, /* Property reg data type */
|
||||
(PBYTE)PropertyBuffer,
|
||||
sizeof(PropertyBuffer),
|
||||
NULL) /* Required size */)
|
||||
{
|
||||
_tprintf(_T("- %s\n"), PropertyBuffer);
|
||||
InsertIntoListView(0,PropertyBuffer," ");
|
||||
}
|
||||
else if (SetupDiGetDeviceRegistryProperty(
|
||||
hDevInfo,
|
||||
&DeviceInfoData,
|
||||
SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,
|
||||
NULL, /* Property reg data type */
|
||||
(PBYTE)PropertyBuffer,
|
||||
sizeof(PropertyBuffer),
|
||||
NULL) /* Required size */)
|
||||
{
|
||||
_tprintf(_T("- %s\n"), PropertyBuffer);
|
||||
InsertIntoListView(0,PropertyBuffer," ");
|
||||
TextOut(hDC, 200, 40, empty, strlen(empty));
|
||||
TextOut(hDC, 200, 40, PropertyBuffer, strlen(PropertyBuffer));
|
||||
}
|
||||
else
|
||||
_tprintf(_T("SetupDiGetDeviceRegistryProperty() failed with status 0x%lx\n"), GetLastError());
|
||||
}
|
||||
SetupDiDestroyDeviceInfoList(hDevInfo);
|
||||
}
|
||||
SendMessage(hwndListView, WM_SETREDRAW, TRUE, 0);
|
||||
}
|
||||
|
||||
CONFIGRET GetDeviceName(DEVINST DevInst, LPTSTR Buffer, DWORD BufferLength)
|
||||
{
|
||||
ULONG BufferSize = BufferLength * sizeof(TCHAR);
|
||||
CONFIGRET cr;
|
||||
cr = CM_Get_DevNode_Registry_Property(DevInst, CM_DRP_DEVICEDESC, NULL, Buffer, &BufferSize, 0);
|
||||
if (cr != CR_SUCCESS)
|
||||
{
|
||||
_tprintf(_T("CM_Get_DevNode_Registry_Property() failed, cr= 0x%lx\n"), cr);
|
||||
}
|
||||
return cr;
|
||||
}
|
||||
|
||||
CONFIGRET ListSubNodes(DEVINST parent, DWORD Level)
|
||||
{
|
||||
CONFIGRET cr;
|
||||
DEVINST child;
|
||||
|
||||
cr = CM_Get_Child(&child, parent, 0);
|
||||
if (cr == CR_NO_SUCH_DEVINST)
|
||||
return CR_SUCCESS;
|
||||
else if (cr != CR_SUCCESS)
|
||||
{
|
||||
_tprintf(_T("CM_Get_Child() failed, cr= 0x%lx\n"), cr);
|
||||
return cr;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
#define DISPLAY_LENGTH (MAX_PATH + MAX_DEVICE_ID_LEN)
|
||||
DWORD DisplayLength = DISPLAY_LENGTH;
|
||||
TCHAR DisplayName[DISPLAY_LENGTH];
|
||||
ULONG i = Level;
|
||||
TCHAR LevelSpaces [ 255 ];
|
||||
cr = GetDeviceName(child, DisplayName, DisplayLength);
|
||||
LevelSpaces[0] = '\0';
|
||||
while (i-- != 0)
|
||||
{
|
||||
_tprintf(_T(" "));
|
||||
sprintf(LevelSpaces,"%s%s",LevelSpaces," ");
|
||||
}
|
||||
if (cr == CR_SUCCESS)
|
||||
{
|
||||
_tprintf(_T("%s\n"), DisplayName);
|
||||
sprintf(temp,"%s%s",LevelSpaces,DisplayName);
|
||||
InsertIntoListView(0,temp," ");
|
||||
TextOut(hDC, 200, 40, empty, strlen(empty));
|
||||
TextOut(hDC, 200, 40, DisplayName, strlen(DisplayName));
|
||||
}
|
||||
else
|
||||
{
|
||||
_tprintf(_T("(unknown device)\n"));
|
||||
sprintf(temp,"%s%s",LevelSpaces,"(unknown device)");
|
||||
InsertIntoListView(0,temp," ");
|
||||
TextOut(hDC, 200, 40, empty, strlen(empty));
|
||||
TextOut(hDC, 200, 40, "(unknown device)", strlen("(unknown device)"));
|
||||
}
|
||||
cr = ListSubNodes(child, Level + 1);
|
||||
if (cr != CR_SUCCESS)
|
||||
return cr;
|
||||
cr = CM_Get_Sibling(&child, child, 0);
|
||||
if (cr != CR_SUCCESS && cr != CR_NO_SUCH_DEVINST)
|
||||
{
|
||||
_tprintf(_T("CM_Get_Sibling() failed, cr= 0x%lx\n"), cr);
|
||||
return cr;
|
||||
}
|
||||
} while (cr == CR_SUCCESS);
|
||||
return CR_SUCCESS;
|
||||
}
|
||||
|
||||
int ListByConnection()
|
||||
{
|
||||
CONFIGRET cr;
|
||||
DEVINST root;
|
||||
ListView_DeleteAllItems(hwndListView);
|
||||
|
||||
cr = CM_Locate_DevNode(&root, NULL, 0);
|
||||
|
||||
if (cr != CR_SUCCESS)
|
||||
{
|
||||
_tprintf(_T("CM_Locate_DevNode() failed, cr= 0x%lx\n"), cr);
|
||||
return 1;
|
||||
}
|
||||
SendMessage(hwndListView, WM_SETREDRAW, FALSE, 0);
|
||||
cr = ListSubNodes(root, 0);
|
||||
SendMessage(hwndListView, WM_SETREDRAW, TRUE, 0);
|
||||
if (cr != CR_SUCCESS)
|
||||
return 2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ListByInterface(const GUID* guid)
|
||||
{
|
||||
HDEVINFO hDevInfo;
|
||||
CHAR Buffer[sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) + 0x100];
|
||||
PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData;
|
||||
DWORD i;
|
||||
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
|
||||
|
||||
ListView_DeleteAllItems(hwndListView);
|
||||
|
||||
DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)Buffer;
|
||||
DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
|
||||
|
||||
hDevInfo = SetupDiGetClassDevs(
|
||||
guid,
|
||||
NULL, /* Enumerator */
|
||||
NULL, /* hwndParent */
|
||||
DIGCF_DEVICEINTERFACE);
|
||||
if (hDevInfo == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
printf("SetupDiGetClassDevs() failed with status 0x%lx\n", GetLastError());
|
||||
return 1;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
|
||||
SendMessage(hwndListView, WM_SETREDRAW, FALSE, 0);
|
||||
while (TRUE)
|
||||
{
|
||||
if (!SetupDiEnumDeviceInterfaces(
|
||||
hDevInfo,
|
||||
NULL,
|
||||
guid,
|
||||
i,
|
||||
&DeviceInterfaceData))
|
||||
{
|
||||
if (GetLastError() != ERROR_NO_MORE_ITEMS)
|
||||
printf("SetupDiEnumDeviceInterfaces() failed with status 0x%lx\n", GetLastError());
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, DeviceInterfaceDetailData, sizeof(Buffer), NULL, NULL))
|
||||
{
|
||||
_tprintf(_T("- device %-2ld: %s\n"), i, DeviceInterfaceDetailData->DevicePath);
|
||||
TextOut(hDC, 200, 40, empty, strlen(empty));
|
||||
TextOut(hDC, 200, 40, DeviceInterfaceDetailData->DevicePath, strlen(DeviceInterfaceDetailData->DevicePath));
|
||||
InsertIntoListView(i,DeviceInterfaceDetailData->DevicePath," ");
|
||||
}
|
||||
else
|
||||
{
|
||||
_tprintf(_T("- device %ld\n"), i);
|
||||
InsertIntoListView(i," "," ");
|
||||
}
|
||||
|
||||
}
|
||||
SendMessage(hwndListView, WM_SETREDRAW, TRUE, 0);
|
||||
SetupDiDestroyDeviceInfoList(hDevInfo);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*int main(void)
|
||||
{
|
||||
ListByClass();
|
||||
ListByInterface(&GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR);
|
||||
ListByConnection();
|
||||
return 0;
|
||||
}*/
|
||||
|
||||
|
||||
|
||||
//GUI
|
||||
int WINAPI WinMain( HINSTANCE hInstance,
|
||||
HINSTANCE hPrevInstance,
|
||||
LPSTR lpCmdLine,
|
||||
int nCmdShow)
|
||||
{
|
||||
MSG msg;
|
||||
|
||||
g_hInst = hInstance;
|
||||
|
||||
if(!hPrevInstance)
|
||||
if(!InitApplication(hInstance))
|
||||
return FALSE;
|
||||
|
||||
//required to use the common controls
|
||||
InitCommonControls();
|
||||
|
||||
/* Perform initializations that apply to a specific instance */
|
||||
|
||||
if (!InitInstance(hInstance, nCmdShow))
|
||||
return FALSE;
|
||||
|
||||
/* Acquire and dispatch messages until a WM_QUIT uMessage is received. */
|
||||
|
||||
while(GetMessage( &msg, NULL, 0x00, 0x00))
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
return (int)msg.wParam;
|
||||
}
|
||||
|
||||
BOOL InitApplication(HINSTANCE hInstance)
|
||||
{
|
||||
WNDCLASSEX wcex;
|
||||
ATOM aReturn;
|
||||
|
||||
wcex.cbSize = sizeof(WNDCLASSEX);
|
||||
wcex.style = 0;
|
||||
wcex.lpfnWndProc = (WNDPROC)MainWndProc;
|
||||
wcex.cbClsExtra = 0;
|
||||
wcex.cbWndExtra = 0;
|
||||
wcex.hInstance = hInstance;
|
||||
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW );
|
||||
wcex.lpszMenuName = 0;
|
||||
wcex.lpszClassName = g_szClassName;
|
||||
wcex.hIcon = 0;
|
||||
wcex.hIconSm = 0;
|
||||
|
||||
aReturn = RegisterClassEx(&wcex);
|
||||
|
||||
if(0 == aReturn)
|
||||
{
|
||||
WNDCLASS wc;
|
||||
|
||||
wc.style = 0;
|
||||
wc.lpfnWndProc = (WNDPROC)MainWndProc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = 0;
|
||||
wc.hInstance = hInstance;
|
||||
wc.hIcon = 0;
|
||||
wc.hCursor = 0;
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);
|
||||
wc.lpszMenuName = 0;
|
||||
wc.lpszClassName = g_szClassName;
|
||||
|
||||
aReturn = RegisterClass(&wc);
|
||||
}
|
||||
|
||||
return aReturn;
|
||||
}
|
||||
|
||||
BOOL InitInstance( HINSTANCE hInstance,
|
||||
int nCmdShow)
|
||||
{
|
||||
HWND hWnd;
|
||||
TCHAR szTitle[MAX_PATH] = TEXT("Device viewer");
|
||||
|
||||
g_hInst = hInstance;
|
||||
|
||||
/* Create a main window for this application instance. */
|
||||
hWnd = CreateWindowEx( 0,
|
||||
g_szClassName,
|
||||
szTitle,
|
||||
WS_OVERLAPPEDWINDOW,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
NULL,
|
||||
NULL,
|
||||
hInstance,
|
||||
NULL);
|
||||
|
||||
/* If window could not be created, return "failure" */
|
||||
|
||||
if (!hWnd)
|
||||
return FALSE;
|
||||
|
||||
/* Make the window visible; update its client area; and return "success" */
|
||||
|
||||
ShowWindow(hWnd, nCmdShow);
|
||||
UpdateWindow(hWnd);
|
||||
hDC = GetDC(hWnd);
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
LRESULT CALLBACK MainWndProc( HWND hWnd,
|
||||
UINT uMessage,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam)
|
||||
{
|
||||
|
||||
|
||||
switch (uMessage)
|
||||
{
|
||||
case WM_CREATE:
|
||||
// create the TreeView control
|
||||
CreateListView(g_hInst, hWnd);
|
||||
|
||||
//initialize the TreeView control
|
||||
InitListView();
|
||||
|
||||
CreateButtons(g_hInst, hWnd);
|
||||
TextOut(hDC, 200, 40, empty, strlen(empty));
|
||||
break;
|
||||
|
||||
|
||||
case WM_SIZE:
|
||||
ResizeListView(hWnd);
|
||||
break;
|
||||
case WM_DESTROY:
|
||||
ReleaseDC(hWnd, hDC);
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
case WM_COMMAND:
|
||||
if (HIWORD(wParam) == BN_CLICKED &&
|
||||
(HWND) lParam == hwndButtonListByClass)
|
||||
{
|
||||
ListByClass();
|
||||
}
|
||||
if (HIWORD(wParam) == BN_CLICKED &&
|
||||
(HWND) lParam == hwndButtonListByConnection)
|
||||
{
|
||||
ListByConnection();
|
||||
}
|
||||
if (HIWORD(wParam) == BN_CLICKED &&
|
||||
(HWND) lParam == hwndButtonListByInterface)
|
||||
{
|
||||
ListByInterface(&GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR);
|
||||
}
|
||||
if (HIWORD(wParam) == BN_CLICKED &&
|
||||
(HWND) lParam == hwndButtonExit)
|
||||
{
|
||||
/* Close the window. */
|
||||
DestroyWindow (hWnd);
|
||||
} return 0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return DefWindowProc(hWnd, uMessage, wParam, lParam);
|
||||
}
|
||||
|
||||
void CreateListView(HINSTANCE hInstance, HWND hwndParent)
|
||||
{
|
||||
DWORD dwStyle;
|
||||
|
||||
dwStyle = WS_TABSTOP |
|
||||
WS_CHILD |
|
||||
WS_BORDER |
|
||||
WS_VISIBLE |
|
||||
LVS_AUTOARRANGE |
|
||||
LVS_REPORT ;//|
|
||||
//LVS_OWNERDATA;
|
||||
|
||||
hwndListView = CreateWindowEx( WS_EX_CLIENTEDGE, // ex style
|
||||
WC_LISTVIEW, // class name - defined in commctrl.h
|
||||
TEXT(""), // dummy text
|
||||
dwStyle, // style
|
||||
0, // x position
|
||||
0, // y position
|
||||
0, // width
|
||||
0, // height
|
||||
hwndParent, // parent
|
||||
0,//(HMENU)ID_LISTVIEW, // ID
|
||||
g_hInst, // instance
|
||||
NULL); // no extra data
|
||||
|
||||
|
||||
ResizeListView(hwndParent);
|
||||
}
|
||||
|
||||
void ResizeListView(HWND hwndParent)
|
||||
{
|
||||
RECT rc;
|
||||
|
||||
GetClientRect(hwndParent, &rc);
|
||||
|
||||
MoveWindow( hwndListView,
|
||||
rc.left,
|
||||
rc.top+60,
|
||||
rc.right - rc.left,
|
||||
rc.bottom - rc.top-60,
|
||||
TRUE);
|
||||
}
|
||||
|
||||
void PositionHeader()
|
||||
{
|
||||
HWND hwndHeader = GetWindow(hwndListView, GW_CHILD);
|
||||
DWORD dwStyle = GetWindowLong(hwndListView, GWL_STYLE);
|
||||
|
||||
/*To ensure that the first item will be visible, create the control without
|
||||
the LVS_NOSCROLL style and then add it here*/
|
||||
dwStyle |= LVS_NOSCROLL;
|
||||
SetWindowLong(hwndListView, GWL_STYLE, dwStyle);
|
||||
|
||||
//only do this if we are in report view and were able to get the header hWnd
|
||||
if(((dwStyle & LVS_TYPEMASK) == LVS_REPORT) && hwndHeader)
|
||||
{
|
||||
RECT rc;
|
||||
HD_LAYOUT hdLayout;
|
||||
WINDOWPOS wpos;
|
||||
|
||||
GetClientRect(hwndListView, &rc);
|
||||
hdLayout.prc = &rc;
|
||||
hdLayout.pwpos = &wpos;
|
||||
|
||||
Header_Layout(hwndHeader, &hdLayout);
|
||||
|
||||
SetWindowPos( hwndHeader,
|
||||
wpos.hwndInsertAfter,
|
||||
wpos.x,
|
||||
wpos.y,
|
||||
wpos.cx,
|
||||
wpos.cy,
|
||||
wpos.flags | SWP_SHOWWINDOW);
|
||||
|
||||
ListView_EnsureVisible(hwndListView, 0, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
BOOL InitListView()
|
||||
{
|
||||
LV_COLUMN lvColumn;
|
||||
int i;
|
||||
TCHAR szString[3][20] = {TEXT("#"), TEXT("Name"), TEXT("Intern name")};
|
||||
|
||||
//empty the list
|
||||
ListView_DeleteAllItems(hwndListView);
|
||||
|
||||
//initialize the columns
|
||||
lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
||||
lvColumn.fmt = LVCFMT_LEFT;
|
||||
i=0;
|
||||
lvColumn.cx = 20;
|
||||
lvColumn.pszText = szString[i];
|
||||
ListView_InsertColumn(hwndListView, i, &lvColumn);
|
||||
i=1;
|
||||
lvColumn.cx = 400;
|
||||
lvColumn.pszText = szString[i];
|
||||
ListView_InsertColumn(hwndListView, i, &lvColumn);
|
||||
i=2;
|
||||
lvColumn.cx = 150;
|
||||
lvColumn.pszText = szString[i];
|
||||
ListView_InsertColumn(hwndListView, i, &lvColumn);
|
||||
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
typedef struct tagLINE_INFO
|
||||
{
|
||||
DWORD dwValType;
|
||||
LPTSTR name;
|
||||
void* val;
|
||||
size_t val_len;
|
||||
} LINE_INFO, *PLINE_INFO;
|
||||
|
||||
void InsertIntoListView(int typ, LPTSTR name, LPTSTR intern_name)
|
||||
{
|
||||
//MessageBox(hWnd, "You just pressed Ctrl+a", "Hotkey", MB_OK | MB_ICONINFORMATION);
|
||||
TCHAR temp[ 255 ];
|
||||
//LINE_INFO* linfo;
|
||||
LVITEM item;
|
||||
int index;
|
||||
//linfo->name = Name;
|
||||
item.mask = LVIF_TEXT;
|
||||
item.iItem = 9999;
|
||||
item.iSubItem = 0;
|
||||
item.state = 0;
|
||||
//item.statemask = 0;
|
||||
item.pszText=malloc(10);
|
||||
if (typ>=1)
|
||||
{
|
||||
sprintf(temp,"%i",typ);
|
||||
item.pszText = temp;
|
||||
}
|
||||
else
|
||||
item.pszText = "";
|
||||
item.cchTextMax = _tcslen(item.pszText);
|
||||
if (item.cchTextMax == 0)
|
||||
item.pszText = LPSTR_TEXTCALLBACK;
|
||||
item.iImage = 0;
|
||||
//item.iIdent = 0;
|
||||
//item.iGroupId = 0;
|
||||
//item.cColumns = 0 ;
|
||||
//item.puColumns = 0;
|
||||
//item.lParam = (LPARAM)linfo;
|
||||
index = ListView_InsertItem(hwndListView, &item);
|
||||
ListView_SetItemText(hwndListView, index, 1, name);
|
||||
ListView_SetItemText(hwndListView, index, 2, intern_name);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CreateButtons(HINSTANCE hInstance, HWND hwndParent)
|
||||
{
|
||||
|
||||
hwndButtonListByClass = CreateWindowEx (
|
||||
0,
|
||||
"button", /* Builtin button class */
|
||||
"List by Class",
|
||||
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
|
||||
0, 0, 190, 30,
|
||||
hwndParent, /* Parent is this window. */
|
||||
0, /* Control ID: 1 */
|
||||
g_hInst,
|
||||
NULL
|
||||
);
|
||||
hwndButtonListByConnection = CreateWindowEx (
|
||||
0,
|
||||
"button", /* Builtin button class */
|
||||
"List by Connection",
|
||||
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
|
||||
200, 0, 190, 30,
|
||||
hwndParent, /* Parent is this window. */
|
||||
0, /* Control ID: 1 */
|
||||
g_hInst,
|
||||
NULL
|
||||
);
|
||||
hwndButtonListByInterface = CreateWindowEx (
|
||||
0,
|
||||
"button", /* Builtin button class */
|
||||
"List by Interface",
|
||||
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
|
||||
400, 0, 190, 30,
|
||||
hwndParent, /* Parent is this window. */
|
||||
0, /* Control ID: 1 */
|
||||
g_hInst,
|
||||
NULL
|
||||
);
|
||||
hwndButtonExit = CreateWindowEx (
|
||||
0,
|
||||
"button", /* Builtin button class */
|
||||
"Exit",
|
||||
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
|
||||
0, 30, 190, 30,
|
||||
hwndParent, /* Parent is this window. */
|
||||
0, /* Control ID: 1 */
|
||||
g_hInst,
|
||||
NULL
|
||||
);
|
||||
}
|
6
reactos/base/applications/devmgr/devmgr.rc
Normal file
|
@ -0,0 +1,6 @@
|
|||
/* $Id$ */
|
||||
|
||||
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS W32 Device Manager Utility\0"
|
||||
#define REACTOS_STR_INTERNAL_NAME "devmgr\0"
|
||||
#define REACTOS_STR_ORIGINAL_FILENAME "devmgr.exe\0"
|
||||
#include <reactos/version.rc>
|
12
reactos/base/applications/devmgr/devmgrapp.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<module name="devmgrapp" type="win32cui" installbase="system32" installname="devmgr.exe">
|
||||
<define name="__USE_W32API" />
|
||||
<define name="DEFINE_GUID" />
|
||||
<library>ntdll</library>
|
||||
<library>setupapi</library>
|
||||
<library>gdi32</library>
|
||||
<library>kernel32</library>
|
||||
<library>user32</library>
|
||||
<library>comctl32</library>
|
||||
<file>devmgr.c</file>
|
||||
<efile>devmgr.rc</efile>
|
||||
</module>
|
44
reactos/base/applications/getfirefox/De.rc
Normal file
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* PROJECT: ReactOS utilities
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: apps/utils/getfirefox/En.rc
|
||||
* PURPOSE: English resources
|
||||
* COPYRIGHT: Copyright 2004 Mike McCormack for CodeWeavers
|
||||
* Copyright 2005 Ge van Geldorp (gvg@reactos.org)
|
||||
*/
|
||||
/*
|
||||
* Based on Wine dlls/shdocvw/En.rc
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT
|
||||
|
||||
IDD_GETFIREFOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76
|
||||
STYLE DS_MODALFRAME | DS_CENTER | WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Lade Firefox herunter"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
{
|
||||
CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER|PBS_SMOOTH,10,10,200,12
|
||||
LTEXT "", IDC_STATUS, 10, 30, 200, 10, SS_CENTER
|
||||
CHECKBOX "Entferne ""Get Firefox"" nach Fertigstellung aus dem Startmenü", IDC_REMOVE,
|
||||
10, 44, 200, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
|
||||
PUSHBUTTON "Cancel", IDCANCEL, 85, 58, 50, 15, WS_GROUP | WS_TABSTOP
|
||||
}
|
||||
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
IDS_START_MENU_NAME "Get Firefox"
|
||||
END
|
44
reactos/base/applications/getfirefox/En.rc
Normal file
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* PROJECT: ReactOS utilities
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: apps/utils/getfirefox/En.rc
|
||||
* PURPOSE: English resources
|
||||
* COPYRIGHT: Copyright 2004 Mike McCormack for CodeWeavers
|
||||
* Copyright 2005 Ge van Geldorp (gvg@reactos.org)
|
||||
*/
|
||||
/*
|
||||
* Based on Wine dlls/shdocvw/En.rc
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
|
||||
|
||||
IDD_GETFIREFOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76
|
||||
STYLE DS_MODALFRAME | DS_CENTER | WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Downloading Firefox"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
{
|
||||
CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER|PBS_SMOOTH,10,10,200,12
|
||||
LTEXT "", IDC_STATUS, 10, 30, 200, 10, SS_CENTER
|
||||
CHECKBOX "Remove ""Get Firefox"" from Start Menu when done", IDC_REMOVE,
|
||||
10, 44, 200, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
|
||||
PUSHBUTTON "Cancel", IDCANCEL, 85, 58, 50, 15, WS_GROUP | WS_TABSTOP
|
||||
}
|
||||
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
IDS_START_MENU_NAME "Get Firefox"
|
||||
END
|
45
reactos/base/applications/getfirefox/Fr.rc
Normal file
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* PROJECT: ReactOS utilities
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: apps/utils/getfirefox/En.rc
|
||||
* PURPOSE: French resources
|
||||
* COPYRIGHT: Copyright 2004 Mike McCormack for CodeWeavers
|
||||
* Copyright 2005 Ge van Geldorp (gvg@reactos.org)
|
||||
* Copyright 2005 G. Maton (mustang9@gmail.com) - French translation
|
||||
*/
|
||||
/*
|
||||
* Based on Wine dlls/shdocvw/En.rc
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
|
||||
|
||||
IDD_GETFIREFOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76
|
||||
STYLE DS_MODALFRAME | DS_CENTER | WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Téléchargement de Firefox"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
{
|
||||
CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER|PBS_SMOOTH,10,10,200,12
|
||||
LTEXT "", IDC_STATUS, 10, 30, 200, 10, SS_CENTER
|
||||
CHECKBOX "Supprimer ""Obtenir Firefox"" du Menu démarrer une fois terminé", IDC_REMOVE,
|
||||
10, 44, 200, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
|
||||
PUSHBUTTON "Annuler", IDCANCEL, 85, 58, 50, 15, WS_GROUP | WS_TABSTOP
|
||||
}
|
||||
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
IDS_START_MENU_NAME "Obtenir Firefox"
|
||||
END
|
45
reactos/base/applications/getfirefox/Hu.rc
Normal file
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* PROJECT: ReactOS utilities
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: apps/utils/getfirefox/En.rc
|
||||
* PURPOSE: English resources
|
||||
* COPYRIGHT: Copyright 2004 Mike McCormack for CodeWeavers
|
||||
* Copyright 2005 Ge van Geldorp (gvg@reactos.org)
|
||||
* Copyright 2005 Robert Horvath (talley@cubeclub.hu) - Hungarian translation
|
||||
*/
|
||||
/*
|
||||
* Based on Wine dlls/shdocvw/En.rc
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
LANGUAGE LANG_HUNGARIAN, SUBLANG_NEUTRAL
|
||||
|
||||
IDD_GETFIREFOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76
|
||||
STYLE DS_MODALFRAME | DS_CENTER | WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "A Firefox letöltése"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
{
|
||||
CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER|PBS_SMOOTH,10,10,200,12
|
||||
LTEXT "", IDC_STATUS, 10, 30, 200, 10, SS_CENTER
|
||||
CHECKBOX "A ""Szerezd meg a Firefoxot"" elvátolítása a Start Menübõl befejezés után", IDC_REMOVE,
|
||||
10, 44, 200, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
|
||||
PUSHBUTTON "Mégse", IDCANCEL, 85, 58, 50, 15, WS_GROUP | WS_TABSTOP
|
||||
}
|
||||
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
IDS_START_MENU_NAME "Szerezd meg Firefoxot"
|
||||
END
|
BIN
reactos/base/applications/getfirefox/firefox.ico
Executable file
After Width: | Height: | Size: 22 KiB |
383
reactos/base/applications/getfirefox/getfirefox.c
Normal file
|
@ -0,0 +1,383 @@
|
|||
/*
|
||||
* PROJECT: ReactOS utilities
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: apps/utils/getfirefox/getfirefox.c
|
||||
* PURPOSE: Main program
|
||||
* COPYRIGHT: Copyright 2001 John R. Sheets (for CodeWeavers)
|
||||
* Copyright 2004 Mike McCormack (for CodeWeavers)
|
||||
* Copyright 2005 Ge van Geldorp (gvg@reactos.org)
|
||||
*/
|
||||
/*
|
||||
* Based on Wine dlls/shdocvw/shdocvw_main.c
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
#include <precomp.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
#define DOWNLOAD_URL L"http://links.reactos.org/getfirefox"
|
||||
|
||||
typedef struct _IBindStatusCallbackImpl
|
||||
{
|
||||
const IBindStatusCallbackVtbl *vtbl;
|
||||
LONG ref;
|
||||
HWND hDialog;
|
||||
BOOL *pbCancelled;
|
||||
} IBindStatusCallbackImpl;
|
||||
|
||||
static HRESULT WINAPI
|
||||
dlQueryInterface(IBindStatusCallback* This, REFIID riid, void** ppvObject)
|
||||
{
|
||||
if (NULL == ppvObject)
|
||||
{
|
||||
return E_POINTER;
|
||||
}
|
||||
|
||||
if (IsEqualIID(riid, &IID_IUnknown) ||
|
||||
IsEqualIID(riid, &IID_IBindStatusCallback))
|
||||
{
|
||||
IBindStatusCallback_AddRef( This );
|
||||
*ppvObject = This;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
static ULONG WINAPI
|
||||
dlAddRef(IBindStatusCallback* iface)
|
||||
{
|
||||
IBindStatusCallbackImpl *This = (IBindStatusCallbackImpl *) iface;
|
||||
|
||||
return InterlockedIncrement(&This->ref);
|
||||
}
|
||||
|
||||
static ULONG WINAPI
|
||||
dlRelease(IBindStatusCallback* iface)
|
||||
{
|
||||
IBindStatusCallbackImpl *This = (IBindStatusCallbackImpl *) iface;
|
||||
DWORD ref = InterlockedDecrement(&This->ref);
|
||||
|
||||
if( !ref )
|
||||
{
|
||||
DestroyWindow( This->hDialog );
|
||||
HeapFree(GetProcessHeap(), 0, This);
|
||||
}
|
||||
|
||||
return ref;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
dlOnStartBinding(IBindStatusCallback* iface, DWORD dwReserved, IBinding* pib)
|
||||
{
|
||||
DPRINT1("OnStartBinding not implemented\n");
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
dlGetPriority(IBindStatusCallback* iface, LONG* pnPriority)
|
||||
{
|
||||
DPRINT1("GetPriority not implemented\n");
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
dlOnLowResource( IBindStatusCallback* iface, DWORD reserved)
|
||||
{
|
||||
DPRINT1("OnLowResource not implemented\n");
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
dlOnProgress(IBindStatusCallback* iface, ULONG ulProgress,
|
||||
ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
|
||||
{
|
||||
IBindStatusCallbackImpl *This = (IBindStatusCallbackImpl *) iface;
|
||||
HWND Item;
|
||||
LONG r;
|
||||
WCHAR OldText[100];
|
||||
|
||||
Item = GetDlgItem(This->hDialog, IDC_PROGRESS);
|
||||
if (NULL != Item && 0 != ulProgressMax)
|
||||
{
|
||||
SendMessageW(Item, PBM_SETPOS, (ulProgress * 100) / ulProgressMax, 0);
|
||||
}
|
||||
|
||||
Item = GetDlgItem(This->hDialog, IDC_STATUS);
|
||||
if (NULL != Item)
|
||||
{
|
||||
SendMessageW(Item, WM_GETTEXT, sizeof(OldText) / sizeof(OldText[0]),
|
||||
(LPARAM) OldText);
|
||||
if (sizeof(OldText) / sizeof(OldText[0]) - 1 <= wcslen(OldText) ||
|
||||
0 != wcscmp(OldText, szStatusText))
|
||||
{
|
||||
SendMessageW(Item, WM_SETTEXT, 0, (LPARAM) szStatusText);
|
||||
}
|
||||
}
|
||||
|
||||
SetLastError(0);
|
||||
r = GetWindowLongPtrW(This->hDialog, GWLP_USERDATA);
|
||||
if (0 != r || 0 != GetLastError())
|
||||
{
|
||||
*This->pbCancelled = TRUE;
|
||||
DPRINT("Cancelled\n");
|
||||
return E_ABORT;
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
dlOnStopBinding(IBindStatusCallback* iface, HRESULT hresult, LPCWSTR szError)
|
||||
{
|
||||
DPRINT1("OnStopBinding not implemented\n");
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
dlGetBindInfo(IBindStatusCallback* iface, DWORD* grfBINDF, BINDINFO* pbindinfo)
|
||||
{
|
||||
DPRINT1("GetBindInfo not implemented\n");
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
dlOnDataAvailable(IBindStatusCallback* iface, DWORD grfBSCF,
|
||||
DWORD dwSize, FORMATETC* pformatetc, STGMEDIUM* pstgmed)
|
||||
{
|
||||
DPRINT1("OnDataAvailable implemented\n");
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
dlOnObjectAvailable(IBindStatusCallback* iface, REFIID riid, IUnknown* punk)
|
||||
{
|
||||
DPRINT1("OnObjectAvailable implemented\n");
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static const IBindStatusCallbackVtbl dlVtbl =
|
||||
{
|
||||
dlQueryInterface,
|
||||
dlAddRef,
|
||||
dlRelease,
|
||||
dlOnStartBinding,
|
||||
dlGetPriority,
|
||||
dlOnLowResource,
|
||||
dlOnProgress,
|
||||
dlOnStopBinding,
|
||||
dlGetBindInfo,
|
||||
dlOnDataAvailable,
|
||||
dlOnObjectAvailable
|
||||
};
|
||||
|
||||
static IBindStatusCallback*
|
||||
CreateDl(HWND Dlg, BOOL *pbCancelled)
|
||||
{
|
||||
IBindStatusCallbackImpl *This;
|
||||
|
||||
This = HeapAlloc(GetProcessHeap(), 0, sizeof(IBindStatusCallbackImpl));
|
||||
This->vtbl = &dlVtbl;
|
||||
This->ref = 1;
|
||||
This->hDialog = Dlg;
|
||||
This->pbCancelled = pbCancelled;
|
||||
|
||||
return (IBindStatusCallback*) This;
|
||||
}
|
||||
|
||||
static BOOL
|
||||
GetShortcutName(LPWSTR ShortcutName)
|
||||
{
|
||||
if (! SHGetSpecialFolderPathW(0, ShortcutName, CSIDL_PROGRAMS, FALSE))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
if (NULL == PathAddBackslashW(ShortcutName))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
if (0 == LoadStringW(GetModuleHandle(NULL), IDS_START_MENU_NAME,
|
||||
ShortcutName + wcslen(ShortcutName),
|
||||
MAX_PATH - wcslen(ShortcutName)))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
if (MAX_PATH - 5 < wcslen(ShortcutName))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
wcscat(ShortcutName, L".lnk");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static DWORD WINAPI
|
||||
ThreadFunc(LPVOID Context)
|
||||
{
|
||||
static const WCHAR szUrl[] = DOWNLOAD_URL;
|
||||
IBindStatusCallback *dl;
|
||||
WCHAR path[MAX_PATH], ShortcutName[MAX_PATH];
|
||||
LPWSTR p;
|
||||
STARTUPINFOW si;
|
||||
PROCESS_INFORMATION pi;
|
||||
HWND Dlg = (HWND) Context;
|
||||
DWORD r;
|
||||
BOOL bCancelled = FALSE;
|
||||
BOOL bTempfile = FALSE;
|
||||
|
||||
/* built the path for the download */
|
||||
p = wcsrchr(szUrl, L'/');
|
||||
if (NULL == p)
|
||||
{
|
||||
goto end;
|
||||
}
|
||||
if (! GetTempPathW(MAX_PATH, path))
|
||||
{
|
||||
goto end;
|
||||
}
|
||||
wcscat(path, p + 1);
|
||||
|
||||
/* download it */
|
||||
bTempfile = TRUE;
|
||||
dl = CreateDl(Context, &bCancelled);
|
||||
r = URLDownloadToFileW(NULL, szUrl, path, 0, dl);
|
||||
if (NULL != dl)
|
||||
{
|
||||
IBindStatusCallback_Release(dl);
|
||||
}
|
||||
if (S_OK != r || bCancelled )
|
||||
{
|
||||
goto end;
|
||||
}
|
||||
ShowWindow(Dlg, SW_HIDE);
|
||||
|
||||
/* run it */
|
||||
memset(&si, 0, sizeof(si));
|
||||
si.cb = sizeof(si);
|
||||
r = CreateProcessW(path, NULL, NULL, NULL, 0, 0, NULL, NULL, &si, &pi);
|
||||
if (0 == r)
|
||||
{
|
||||
goto end;
|
||||
}
|
||||
CloseHandle(pi.hThread);
|
||||
WaitForSingleObject(pi.hProcess, INFINITE);
|
||||
CloseHandle(pi.hProcess);
|
||||
|
||||
if (BST_CHECKED == SendMessageW(GetDlgItem(Dlg, IDC_REMOVE), BM_GETCHECK,
|
||||
0, 0) &&
|
||||
GetShortcutName(ShortcutName))
|
||||
{
|
||||
DeleteFileW(ShortcutName);
|
||||
}
|
||||
|
||||
end:
|
||||
if (bTempfile)
|
||||
{
|
||||
DeleteFileW(path);
|
||||
}
|
||||
EndDialog(Dlg, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static INT_PTR CALLBACK
|
||||
dlProc(HWND Dlg, UINT Msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
HANDLE Thread;
|
||||
DWORD ThreadId;
|
||||
HWND Item;
|
||||
HICON Icon;
|
||||
WCHAR ShortcutName[MAX_PATH];
|
||||
|
||||
switch (Msg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
Icon = LoadIconW((HINSTANCE) GetWindowLongPtr(Dlg, GWLP_HINSTANCE),
|
||||
MAKEINTRESOURCEW(IDI_ICON_MAIN));
|
||||
if (NULL != Icon)
|
||||
{
|
||||
SendMessageW(Dlg, WM_SETICON, ICON_BIG, (LPARAM) Icon);
|
||||
SendMessageW(Dlg, WM_SETICON, ICON_SMALL, (LPARAM) Icon);
|
||||
}
|
||||
SetWindowLongPtrW(Dlg, GWLP_USERDATA, 0);
|
||||
Item = GetDlgItem(Dlg, IDC_PROGRESS);
|
||||
if (NULL != Item)
|
||||
{
|
||||
SendMessageW(Item, PBM_SETRANGE, 0, MAKELPARAM(0,100));
|
||||
SendMessageW(Item, PBM_SETPOS, 0, 0);
|
||||
}
|
||||
Item = GetDlgItem(Dlg, IDC_REMOVE);
|
||||
if (NULL != Item)
|
||||
{
|
||||
if (GetShortcutName(ShortcutName) &&
|
||||
INVALID_FILE_ATTRIBUTES != GetFileAttributesW(ShortcutName))
|
||||
{
|
||||
SendMessageW(Item, BM_SETCHECK, BST_CHECKED, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
SendMessageW(Item, BM_SETCHECK, BST_UNCHECKED, 0);
|
||||
ShowWindow(Item, SW_HIDE);
|
||||
}
|
||||
}
|
||||
Thread = CreateThread(NULL, 0, ThreadFunc, Dlg, 0, &ThreadId);
|
||||
if (NULL == Thread)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
CloseHandle(Thread);
|
||||
return TRUE;
|
||||
|
||||
case WM_COMMAND:
|
||||
if (wParam == IDCANCEL)
|
||||
{
|
||||
SetWindowLongPtrW(Dlg, GWLP_USERDATA, 1);
|
||||
PostMessage(Dlg, WM_CLOSE, 0, 0);
|
||||
}
|
||||
return FALSE;
|
||||
|
||||
case WM_CLOSE:
|
||||
EndDialog(Dlg, 0);
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* Main program
|
||||
*/
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
InitCommonControls();
|
||||
|
||||
DialogBoxW(GetModuleHandle(NULL), MAKEINTRESOURCEW(IDD_GETFIREFOX), 0,
|
||||
dlProc);
|
||||
|
||||
return 0;
|
||||
}
|
28
reactos/base/applications/getfirefox/getfirefox.rc
Normal file
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* PROJECT: ReactOS utilities
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: apps/utils/getfirefox/getfirefox.rc
|
||||
* PURPOSE: Language-independent resources
|
||||
* COPYRIGHT: Copyright 2005 Ge van Geldorp (gvg@reactos.org)
|
||||
*/
|
||||
|
||||
#include <windows.h>
|
||||
#include "resource.h"
|
||||
|
||||
#define REACTOS_STR_FILE_DESCRIPTION "Firefox downloader\0"
|
||||
#define REACTOS_STR_INTERNAL_NAME "getfirefox\0"
|
||||
#define REACTOS_STR_ORIGINAL_FILENAME "getfirefox.exe\0"
|
||||
#include <reactos/version.rc>
|
||||
|
||||
/*
|
||||
* Note: this icon is the "default logo" referenced here:
|
||||
* http://www.mozilla.org/foundation/trademarks/faq.html (under "What are the
|
||||
* Mozilla Trademarks and Logos?"). Don't use the official Firefox logo as it
|
||||
* is trademarked.
|
||||
*/
|
||||
1 ICON "firefox.ico"
|
||||
|
||||
#include "De.rc"
|
||||
#include "En.rc"
|
||||
#include "Fr.rc"
|
||||
#include "Hu.rc"
|
17
reactos/base/applications/getfirefox/getfirefox.xml
Normal file
|
@ -0,0 +1,17 @@
|
|||
<module name="getfirefox" type="win32gui" installbase="system32" installname="getfirefox.exe">
|
||||
<include base="getfirefox">.</include>
|
||||
<define name="UNICODE" />
|
||||
<define name="_UNICODE" />
|
||||
<define name="__USE_W32API" />
|
||||
<define name="WINVER">0x0501</define>
|
||||
<define name="_WIN32_IE>0x0600</define>
|
||||
<library>comctl32</library>
|
||||
<library>ntdll</library>
|
||||
<library>shell32</library>
|
||||
<library>shlwapi</library>
|
||||
<library>urlmon</library>
|
||||
<library>uuid</library>
|
||||
<pch>precomp.h</pch>
|
||||
<file>getfirefox.c</file>
|
||||
<file>getfirefox.rc</file>
|
||||
</module>
|
19
reactos/base/applications/getfirefox/precomp.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* PROJECT: ReactOS utilities
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: apps/utils/getfirefox/precomp.h
|
||||
* PURPOSE: Precompiled header file
|
||||
* COPYRIGHT: Copyright 2005 Ge van Geldorp (gvg@reactos.org)
|
||||
*/
|
||||
|
||||
#define COBJMACROS
|
||||
#define NTOS_MODE_USER
|
||||
#define WIN32_NO_STATUS
|
||||
#include <windows.h>
|
||||
#include <ndk/ntndk.h>
|
||||
#include <commctrl.h>
|
||||
#include <shlobj.h>
|
||||
#include <shlwapi.h>
|
||||
#include <urlmon.h>
|
||||
|
||||
#include "resource.h"
|
17
reactos/base/applications/getfirefox/resource.h
Normal file
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
* PROJECT: ReactOS utilities
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: apps/utils/getfirefox/resource.h
|
||||
* PURPOSE: Resource constants
|
||||
* COPYRIGHT: Copyright 2005 Ge van Geldorp (gvg@reactos.org)
|
||||
*/
|
||||
|
||||
#define IDI_ICON_MAIN 1
|
||||
|
||||
#define IDD_GETFIREFOX 100
|
||||
|
||||
#define IDC_PROGRESS 1000
|
||||
#define IDC_STATUS 1001
|
||||
#define IDC_REMOVE 1002
|
||||
|
||||
#define IDS_START_MENU_NAME 1100
|
58
reactos/base/applications/hostname/hostname.c
Normal file
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* ReactOS Win32 Applications
|
||||
* Copyright (C) 2005 ReactOS Team
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id$
|
||||
*
|
||||
* COPYRIGHT : See COPYING in the top level directory
|
||||
* PROJECT : ReactOS/Win32 get host name
|
||||
* FILE : subsys/system/hostname/hostname.c
|
||||
* PROGRAMMER: Emanuele Aliberti (ea@reactos.com)
|
||||
*/
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
int main (int argc, char ** argv)
|
||||
{
|
||||
if (1 == argc)
|
||||
{
|
||||
TCHAR ComputerName [MAX_COMPUTERNAME_LENGTH + 1];
|
||||
DWORD ComputerNameSize = sizeof ComputerName / sizeof ComputerName[0];
|
||||
|
||||
ZeroMemory (ComputerName, sizeof ComputerName );
|
||||
if (GetComputerName(ComputerName, & ComputerNameSize))
|
||||
{
|
||||
printf ("%s\n", ComputerName);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
fprintf (stderr, "%s: Win32 error %ld.\n",
|
||||
argv[0], GetLastError());
|
||||
return EXIT_FAILURE;
|
||||
}else{
|
||||
if (0 == strcmp(argv[1],"-s"))
|
||||
{
|
||||
fprintf(stderr,"%s: -s not supported.\n",argv[0]);
|
||||
return EXIT_FAILURE;
|
||||
}else{
|
||||
printf("Print the current host's name.\n\nhostname\n");
|
||||
}
|
||||
}
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
/* EOF */
|
4
reactos/base/applications/hostname/hostname.rc
Normal file
|
@ -0,0 +1,4 @@
|
|||
#define REACTOS_STR_FILE_DESCRIPTION "Win32 Get local host name\0"
|
||||
#define REACTOS_STR_INTERNAL_NAME "hostname\0"
|
||||
#define REACTOS_STR_ORIGINAL_FILENAME "hostname.exe\0"
|
||||
#include <reactos/version.rc>
|
7
reactos/base/applications/hostname/hostname.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<module name="hostname" type="win32cui" installbase="system32" installname="hostname.exe" allowwarnings="true">
|
||||
<define name="__USE_W32API" />
|
||||
<library>kernel32</library>
|
||||
<file>hostname.c</file>
|
||||
<file>hostname.rc</file>
|
||||
</module>
|
||||
|
148
reactos/base/applications/ibrowser/De.rc
Normal file
|
@ -0,0 +1,148 @@
|
|||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "ibrowser_intres.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include <windows.h>
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// German (Germany) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"ibrowser_intres.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include <windows.h>\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#ifndef _ROS_\r\n"
|
||||
"LANGUAGE LANG_GERMAN, SUBLANG_GERMAN\r\n"
|
||||
"STRINGTABLE DISCARDABLE \r\n"
|
||||
"BEGIN\r\n"
|
||||
"#ifdef UNICODE\r\n"
|
||||
"IDS_IBROWSER_VERSION_STR ""ROS IBrowser%0s""\r\n"
|
||||
"#else\r\n"
|
||||
"IDS_IBROWSER_VERSION_STR ""ROS IBrowser Ansi%0s""\r\n"
|
||||
"#endif\r\n"
|
||||
"END\r\n"
|
||||
"#endif\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Menu
|
||||
//
|
||||
|
||||
IDM_SDIFRAME MENU PRELOAD DISCARDABLE
|
||||
BEGIN
|
||||
POPUP "&Datei"
|
||||
BEGIN
|
||||
MENUITEM "&Beenden", ID_FILE_EXIT
|
||||
END
|
||||
POPUP "&Ansicht"
|
||||
BEGIN
|
||||
MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR
|
||||
MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR, GRAYED
|
||||
MENUITEM "&Status Bar", ID_VIEW_STATUSBAR
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Aktualisieren\tF5", ID_REFRESH
|
||||
MENUITEM "&Vollbild\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
|
||||
END
|
||||
POPUP "&Hilfe"
|
||||
BEGIN
|
||||
MENUITEM "IBrowser &FAQ...", ID_IBROWSER_FAQ
|
||||
MENUITEM "&About IBrowser...", ID_ABOUT_IBROWSER
|
||||
MENUITEM "About &OS...", ID_ABOUT_WINDOWS
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
IDD_ABOUT_IBROWSER DIALOG DISCARDABLE 0, 0, 199, 106
|
||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "About ReactOS Web Browser"
|
||||
FONT 10, "MS Sans Serif"
|
||||
BEGIN
|
||||
LTEXT "ReactOS Web Browser",IDC_ROS_IBROWSER,91,13,104,11
|
||||
LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8
|
||||
LTEXT "(c) 2005 Martin Fuchs",IDC_STATIC,91,42,104,8
|
||||
LTEXT "",IDC_WIN_VERSION,91,58,98,22
|
||||
LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129,
|
||||
8
|
||||
CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP,
|
||||
154,90,38,12
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// String Table
|
||||
//
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_TITLE "Reactos Internet Web Browser"
|
||||
IDS_EMPTY "(Empty)"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_ABOUT_IBROWSER "&Über..."
|
||||
END
|
||||
|
||||
#endif // German (Germany) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
#ifndef _ROS_
|
||||
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
#ifdef UNICODE
|
||||
IDS_IBROWSER_VERSION_STR "ROS IBrowser%0s"
|
||||
#else
|
||||
IDS_IBROWSER_VERSION_STR "ROS IBrowser Ansi%0s"
|
||||
#endif
|
||||
END
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
161
reactos/base/applications/ibrowser/En.rc
Normal file
|
@ -0,0 +1,161 @@
|
|||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "ibrowser_intres.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include <windows.h>
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// German (Germany) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"ibrowser_intres.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include <windows.h>\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#ifndef _ROS_\r\n"
|
||||
"LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r\n"
|
||||
"STRINGTABLE DISCARDABLE \r\n"
|
||||
"BEGIN\r\n"
|
||||
"#ifdef UNICODE\r\n"
|
||||
"IDS_IBROWSER_VERSION_STR ""ROS IBrowser%0s""\r\n"
|
||||
"#else\r\n"
|
||||
"IDS_IBROWSER_VERSION_STR ""ROS IBrowser Ansi%0s""\r\n"
|
||||
"#endif\r\n"
|
||||
"END\r\n"
|
||||
"#endif\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
#endif // German (Germany) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Menu
|
||||
//
|
||||
|
||||
IDM_SDIFRAME MENU PRELOAD DISCARDABLE
|
||||
BEGIN
|
||||
POPUP "&File"
|
||||
BEGIN
|
||||
MENUITEM "&Open", ID_FILE_OPEN
|
||||
MENUITEM "E&xit", ID_FILE_EXIT
|
||||
END
|
||||
POPUP "&View"
|
||||
BEGIN
|
||||
MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR
|
||||
MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR, GRAYED
|
||||
MENUITEM "&Status Bar", ID_VIEW_STATUSBAR
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Refresh\tF5", ID_REFRESH
|
||||
MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
|
||||
END
|
||||
POPUP "&Help"
|
||||
BEGIN
|
||||
MENUITEM "IBrowser &FAQ...", ID_IBROWSER_FAQ
|
||||
MENUITEM "&About IBrowser...", ID_ABOUT_IBROWSER
|
||||
MENUITEM "About &OS...", ID_ABOUT_WINDOWS
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
IDD_ABOUT_IBROWSER DIALOG DISCARDABLE 0, 0, 199, 106
|
||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "About ReactOS Web Browser"
|
||||
FONT 10, "MS Sans Serif"
|
||||
BEGIN
|
||||
LTEXT "ReactOS Web Browser",IDC_ROS_IBROWSER,91,13,104,11
|
||||
LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8
|
||||
LTEXT "(c) 2005 Martin Fuchs",IDC_STATIC,91,42,104,8
|
||||
LTEXT "",IDC_WIN_VERSION,91,58,98,22
|
||||
LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129,
|
||||
8
|
||||
CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP,
|
||||
154,90,38,12
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// String Table
|
||||
//
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_TITLE "Reactos Internet Web Browser"
|
||||
IDS_EMPTY "(Empty)"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_ABOUT_IBROWSER "&About..."
|
||||
END
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
#ifndef _ROS_
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
#ifdef UNICODE
|
||||
IDS_IBROWSER_VERSION_STR "ROS IBrowser%0s"
|
||||
#else
|
||||
IDS_IBROWSER_VERSION_STR "ROS IBrowser Ansi%0s"
|
||||
#endif
|
||||
END
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
122
reactos/base/applications/ibrowser/Es.rc
Normal file
|
@ -0,0 +1,122 @@
|
|||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "ibrowser_intres.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include <windows.h>
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// German (Germany) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"ibrowser_intres.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include <windows.h>\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#ifndef _ROS_\r\n"
|
||||
"LANGUAGE LANG_SPANISH, SUBLANG_SPANISH\r\n"
|
||||
"STRINGTABLE DISCARDABLE \r\n"
|
||||
"BEGIN\r\n"
|
||||
"#ifdef UNICODE\r\n"
|
||||
"IDS_IBROWSER_VERSION_STR ""Nevegador de Web ReactOS%0s""\r\n"
|
||||
"#else\r\n"
|
||||
"IDS_IBROWSER_VERSION_STR ""Nevegador de Web ReactOS Ansi%0s""\r\n"
|
||||
"#endif\r\n"
|
||||
"END\r\n"
|
||||
"#endif\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
#endif // German (Germany) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Spanish (Castilian) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ESP)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_SPANISH, SUBLANG_SPANISH
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Menu
|
||||
//
|
||||
|
||||
IDM_SDIFRAME MENU PRELOAD DISCARDABLE
|
||||
BEGIN
|
||||
POPUP "&Archivo"
|
||||
BEGIN
|
||||
MENUITEM "S&alir", ID_FILE_EXIT
|
||||
END
|
||||
POPUP "&Ver"
|
||||
BEGIN
|
||||
MENUITEM "&Barra de Herramientas", ID_VIEW_TOOL_BAR
|
||||
MENUITEM "Barra &Lateral", ID_VIEW_SIDE_BAR, GRAYED
|
||||
MENUITEM "Barra de &Estado", ID_VIEW_STATUSBAR
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Actualizar\tF5", ID_REFRESH
|
||||
MENUITEM "P&antalla Completa\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
|
||||
END
|
||||
POPUP "&Ayuda"
|
||||
BEGIN
|
||||
MENUITEM "IBrowser &FAQ...", ID_IBROWSER_FAQ
|
||||
MENUITEM "&Acerca de IBrowser...", ID_ABOUT_IBROWSER
|
||||
MENUITEM "Acerca de &OS...", ID_ABOUT_WINDOWS
|
||||
END
|
||||
END
|
||||
|
||||
#endif // Spanish (Castilian) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
#ifndef _ROS_
|
||||
LANGUAGE LANG_SPANISH, SUBLANG_SPANISH
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
#ifdef UNICODE
|
||||
IDS_IBROWSER_VERSION_STR "Nevegador de Web ReactOS%0s"
|
||||
#else
|
||||
IDS_IBROWSER_VERSION_STR "Nevegador de Web ReactOS Ansi%0s"
|
||||
#endif
|
||||
END
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
151
reactos/base/applications/ibrowser/Fr.rc
Normal file
|
@ -0,0 +1,151 @@
|
|||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "ibrowser_intres.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include <windows.h>
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// German (Germany) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"ibrowser_intres.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include <windows.h>\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
#endif // German (Germany) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// French (France) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_FRENCH, SUBLANG_FRENCH
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#ifndef _ROS_\r\n"
|
||||
"LANGUAGE LANG_FRENCH, SUBLANG_FRENCH\r\n"
|
||||
"STRINGTABLE DISCARDABLE \r\n"
|
||||
"BEGIN\r\n"
|
||||
"#ifdef UNICODE\r\n"
|
||||
"IDS_IBROWSER_VERSION_STR ""Navigateur Internet de ReactOS%0s""\r\n"
|
||||
"#else\r\n"
|
||||
"IDS_IBROWSER_VERSION_STR ""Navigateur Internet de ReactOS Ansi%0s""\r\n"
|
||||
"#endif\r\n"
|
||||
"END\r\n"
|
||||
"#endif\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Menu
|
||||
//
|
||||
|
||||
IDM_SDIFRAME MENU PRELOAD DISCARDABLE
|
||||
BEGIN
|
||||
POPUP "&Fichier"
|
||||
BEGIN
|
||||
MENUITEM "&Ouvrir", ID_FILE_OPEN
|
||||
MENUITEM "&Quitter", ID_FILE_EXIT
|
||||
END
|
||||
POPUP "&Affichage"
|
||||
BEGIN
|
||||
MENUITEM "Barre d'ou&tils", ID_VIEW_TOOL_BAR
|
||||
MENUITEM "Pann&eau lat?al", ID_VIEW_SIDE_BAR, GRAYED
|
||||
MENUITEM "&Barre d'?at", ID_VIEW_STATUSBAR
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Actualise&r", ID_REFRESH
|
||||
MENUITEM "&Plein ?ran", ID_VIEW_FULLSCREEN
|
||||
END
|
||||
POPUP "&Aide"
|
||||
BEGIN
|
||||
MENUITEM "&Rubriques d'aide de iBrowser", ID_IBROWSER_FAQ
|
||||
MENUITEM "? propos de iBrowser...", ID_ABOUT_IBROWSER
|
||||
MENUITEM "? propos de ReactOS...", ID_ABOUT_WINDOWS
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// String Table
|
||||
//
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_TITLE "Navigateur internet de Reactos"
|
||||
IDS_EMPTY "(Vide)"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_ABOUT_IBROWSER "? propos de iBrowser..."
|
||||
END
|
||||
|
||||
#endif // French (France) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
#ifndef _ROS_
|
||||
LANGUAGE LANG_FRENCH, SUBLANG_FRENCH
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
#ifdef UNICODE
|
||||
IDS_IBROWSER_VERSION_STR "Navigateur Internet de ReactOS%0s"
|
||||
#else
|
||||
IDS_IBROWSER_VERSION_STR "Navigateur Internet de ReactOS Ansi%0s"
|
||||
#endif
|
||||
END
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
81
reactos/base/applications/ibrowser/Hu.rc
Normal file
|
@ -0,0 +1,81 @@
|
|||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "ibrowser_intres.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include <windows.h>
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// German (Germany) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"ibrowser_intres.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include <windows.h>\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#ifndef _ROS_\r\n"
|
||||
"LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT\r\n"
|
||||
"STRINGTABLE DISCARDABLE \r\n"
|
||||
"BEGIN\r\n"
|
||||
"#ifdef UNICODE\r\n"
|
||||
"IDS_IBROWSER_VERSION_STR ""A ReactOS %s webböngészõ%0s""\r\n"
|
||||
"#else\r\n"
|
||||
"IDS_IBROWSER_VERSION_STR ""A ReactOS %s webböngészõ Ansi%0s""\r\n"
|
||||
"#endif\r\n"
|
||||
"END\r\n"
|
||||
"#endif\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
#endif // German (Germany) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
#ifndef _ROS_
|
||||
LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
#ifdef UNICODE
|
||||
IDS_IBROWSER_VERSION_STR "A ReactOS %s webböngészõ%0s"
|
||||
#else
|
||||
IDS_IBROWSER_VERSION_STR "A ReactOS %s webböngészõ Ansi%0s"
|
||||
#endif
|
||||
END
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
140
reactos/base/applications/ibrowser/Ja.rc
Normal file
|
@ -0,0 +1,140 @@
|
|||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "ibrowser_intres.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include <windows.h>
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Japanese resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
|
||||
#pragma code_page(932)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Menu
|
||||
//
|
||||
|
||||
IDM_SDIFRAME MENU PRELOAD DISCARDABLE
|
||||
BEGIN
|
||||
POPUP "ファイル(&F)"
|
||||
BEGIN
|
||||
MENUITEM "開く(&O)", ID_FILE_OPEN
|
||||
MENUITEM "終了(&X)", ID_FILE_EXIT
|
||||
END
|
||||
POPUP "表\示(&V)"
|
||||
BEGIN
|
||||
MENUITEM "ツール バー(&T)", ID_VIEW_TOOL_BAR
|
||||
MENUITEM "サイド バー(&I)", ID_VIEW_SIDE_BAR, GRAYED
|
||||
MENUITEM "ステータス バー(&S)", ID_VIEW_STATUSBAR
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "最新の情報に更新(&R)\tF5", ID_REFRESH
|
||||
MENUITEM "全画面表\示(&I)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
|
||||
END
|
||||
POPUP "ヘルプ(&H)"
|
||||
BEGIN
|
||||
MENUITEM "IBrowser FAQ (&F)...", ID_IBROWSER_FAQ
|
||||
MENUITEM "IBrowser について(&A)...", ID_ABOUT_IBROWSER
|
||||
MENUITEM "OS について(&O)...", ID_ABOUT_WINDOWS
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// String Table
|
||||
//
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_TITLE "Reactos Internet Web Browser"
|
||||
IDS_EMPTY "(Empty)"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_ABOUT_IBROWSER "バージョン情報(&A)..."
|
||||
END
|
||||
|
||||
#endif // Japanese resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// German (Germany) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"ibrowser_intres.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include <windows.h>\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#ifndef _ROS_\r\n"
|
||||
"LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT\r\n"
|
||||
"STRINGTABLE DISCARDABLE \r\n"
|
||||
"BEGIN\r\n"
|
||||
"#ifdef UNICODE\r\n"
|
||||
"IDS_IBROWSER_VERSION_STR ""ROS IBrowser%0s""\r\n"
|
||||
"#else\r\n"
|
||||
"IDS_IBROWSER_VERSION_STR ""ROS IBrowser Ansi%0s""\r\n"
|
||||
"#endif\r\n"
|
||||
"END\r\n"
|
||||
"#endif\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
#endif // German (Germany) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
#ifndef _ROS_
|
||||
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
#ifdef UNICODE
|
||||
IDS_IBROWSER_VERSION_STR "ROS IBrowser%0s"
|
||||
#else
|
||||
IDS_IBROWSER_VERSION_STR "ROS IBrowser Ansi%0s"
|
||||
#endif
|
||||
END
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
67
reactos/base/applications/ibrowser/Makefile.MinGW
Normal file
|
@ -0,0 +1,67 @@
|
|||
#
|
||||
# ROS Internet Web Browser
|
||||
#
|
||||
# Makefile.MinGW
|
||||
#
|
||||
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
LINK = g++
|
||||
|
||||
CFLAGS = -DWIN32 -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -fexceptions -Wall -Wno-unused-value -I. -I$(EXPAT_INC)
|
||||
RCFLAGS = -DWIN32 -D__WINDRES__
|
||||
LFLAGS = -Wl,--subsystem,windows
|
||||
|
||||
ifdef DEBUG
|
||||
CFLAGS += -D_DEBUG -g
|
||||
RCFLAGS += -D_DEBUG
|
||||
LFLAGS += -g
|
||||
else
|
||||
CFLAGS += -DNDEBUG -Os
|
||||
RCFLAGS += -DNDEBUG
|
||||
LFLAGS += -s
|
||||
endif
|
||||
|
||||
ifndef UNICODE
|
||||
UNICODE = 1
|
||||
endif
|
||||
|
||||
ifeq ($(UNICODE),1)
|
||||
CFLAGS += -DUNICODE
|
||||
# LFLAGS+= -Wl,--entry,_wWinMain@16
|
||||
RCFLAGS += -DUNICODE
|
||||
endif
|
||||
|
||||
CXXFLAGS = $(CFLAGS)
|
||||
|
||||
EXEC_SUFFIX = .exe
|
||||
RES_SUFFIX = .coff
|
||||
|
||||
VPATH = utility
|
||||
|
||||
PROGRAM = ibrowser
|
||||
|
||||
TARGET = $(PROGRAM)$(EXEC_SUFFIX)
|
||||
|
||||
OBJECTS = \
|
||||
utility.o \
|
||||
window.o \
|
||||
ibrowser.o \
|
||||
webchild.o \
|
||||
mainframe.o \
|
||||
favorites.o \
|
||||
xmlstorage.o
|
||||
|
||||
LIBS = gdi32 comctl32 shell32 ole32 uuid oleaut32
|
||||
|
||||
all: $(TARGET)
|
||||
|
||||
$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) libexpat.dll
|
||||
$(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS))
|
||||
|
||||
ibrowser$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico
|
||||
windres $(RCFLAGS) -o $@ $(PROGRAM)_intres.rc
|
||||
|
||||
clean:
|
||||
rm -f $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) \
|
||||
desktop/*.o dialogs/*.o shell/*.o taskbar/*.o utility/*.o
|
72
reactos/base/applications/ibrowser/Makefile.PCH
Normal file
|
@ -0,0 +1,72 @@
|
|||
#
|
||||
# ROS Internet Web Browser
|
||||
#
|
||||
# Makefile.PCH
|
||||
#
|
||||
# MinGW Makefile with precompiled header support
|
||||
#
|
||||
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
LINK = g++
|
||||
|
||||
CFLAGS = -DWIN32 -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -fexceptions -Wall -Wno-unused-value -I. -I$(EXPAT_INC)
|
||||
RCFLAGS = -DWIN32 -D__WINDRES__
|
||||
LFLAGS = -Wl,--subsystem,windows
|
||||
|
||||
ifdef DEBUG
|
||||
CFLAGS += -D_DEBUG -g
|
||||
RCFLAGS += -D_DEBUG
|
||||
LFLAGS += -g
|
||||
else
|
||||
CFLAGS += -DNDEBUG -Os -march=pentium4
|
||||
RCFLAGS += -DNDEBUG
|
||||
LFLAGS += -s
|
||||
endif
|
||||
|
||||
ifndef UNICODE
|
||||
UNICODE = 1
|
||||
endif
|
||||
|
||||
ifeq ($(UNICODE),1)
|
||||
CFLAGS += -DUNICODE
|
||||
# LFLAGS+= -Wl,--entry,_wWinMain@16
|
||||
RCFLAGS += -DUNICODE
|
||||
endif
|
||||
|
||||
CXXFLAGS = $(CFLAGS)
|
||||
|
||||
EXEC_SUFFIX = .exe
|
||||
RES_SUFFIX = .coff
|
||||
|
||||
VPATH = utility
|
||||
|
||||
PROGRAM = ibrowser
|
||||
|
||||
TARGET = $(PROGRAM)$(EXEC_SUFFIX)
|
||||
|
||||
OBJECTS = \
|
||||
utility.o \
|
||||
window.o \
|
||||
ibrowser.o \
|
||||
webchild.o \
|
||||
mainframe.o \
|
||||
favorites.o \
|
||||
xmlstorage.o
|
||||
|
||||
LIBS = gdi32 comctl32 shell32 ole32 oleaut32 uuid
|
||||
|
||||
all: precomp.h.gch $(TARGET)
|
||||
|
||||
precomp.h.gch: *.h utility/*.h
|
||||
$(CXX) $(CFLAGS) precomp.h
|
||||
|
||||
$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) libexpat.dll
|
||||
$(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS))
|
||||
|
||||
ibrowser$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico
|
||||
windres $(RCFLAGS) -o $@ $(PROGRAM)_intres.rc
|
||||
|
||||
clean:
|
||||
rm -f $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) precomp.h.gch \
|
||||
utility/*.o
|
122
reactos/base/applications/ibrowser/Ro.rc
Normal file
|
@ -0,0 +1,122 @@
|
|||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "ibrowser_intres.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include <windows.h>
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Neutral (Default) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEUD)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_NEUTRAL, SUBLANG_DEFAULT
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Menu
|
||||
//
|
||||
|
||||
IDM_SDIFRAME MENU PRELOAD DISCARDABLE
|
||||
BEGIN
|
||||
POPUP "&Fisier"
|
||||
BEGIN
|
||||
MENUITEM "&Iesire", ID_FILE_EXIT
|
||||
END
|
||||
POPUP "&Prezentare"
|
||||
BEGIN
|
||||
MENUITEM "&Bara cu instrumente", ID_VIEW_TOOL_BAR
|
||||
MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR, GRAYED
|
||||
MENUITEM "&Bara de stare", ID_VIEW_STATUSBAR
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Resetare\tF5", ID_REFRESH
|
||||
MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
|
||||
END
|
||||
POPUP "&Ajutor"
|
||||
BEGIN
|
||||
MENUITEM "IBrowser &FAQ...", ID_IBROWSER_FAQ
|
||||
MENUITEM "&Despre IBrowser...", ID_ABOUT_IBROWSER
|
||||
MENUITEM "Despre &OS...", ID_ABOUT_WINDOWS
|
||||
END
|
||||
END
|
||||
|
||||
#endif // Neutral (Default) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// German (Germany) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"ibrowser_intres.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include <windows.h>\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#ifndef _ROS_\r\n"
|
||||
"LANGUAGE LANG_ROMANIAN, SUBLANG_DEFAULT\r\n"
|
||||
"STRINGTABLE DISCARDABLE \r\n"
|
||||
"BEGIN\r\n"
|
||||
"#ifdef UNICODE\r\n"
|
||||
"IDS_IBROWSER_VERSION_STR ""ROS IBrowser%0s""\r\n"
|
||||
"#else\r\n"
|
||||
"IDS_IBROWSER_VERSION_STR ""ROS IBrowser Ansi%0s""\r\n"
|
||||
"#endif\r\n"
|
||||
"END\r\n"
|
||||
"#endif\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
#endif // German (Germany) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
#ifndef _ROS_
|
||||
LANGUAGE LANG_ROMANIAN, SUBLANG_DEFAULT
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
#ifdef UNICODE
|
||||
IDS_IBROWSER_VERSION_STR "ROS IBrowser%0s"
|
||||
#else
|
||||
IDS_IBROWSER_VERSION_STR "ROS IBrowser Ansi%0s"
|
||||
#endif
|
||||
END
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
140
reactos/base/applications/ibrowser/Sv.rc
Normal file
|
@ -0,0 +1,140 @@
|
|||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "ibrowser_intres.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include <windows.h>
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// German (Germany) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"ibrowser_intres.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include <windows.h>\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#ifndef _ROS_\r\n"
|
||||
"LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT\r\n"
|
||||
"STRINGTABLE DISCARDABLE \r\n"
|
||||
"BEGIN\r\n"
|
||||
"#ifdef UNICODE\r\n"
|
||||
"IDS_IBROWSER_VERSION_STR ""ROS IBrowser%0s""\r\n"
|
||||
"#else\r\n"
|
||||
"IDS_IBROWSER_VERSION_STR ""ROS IBrowser Ansi%0s""\r\n"
|
||||
"#endif\r\n"
|
||||
"END\r\n"
|
||||
"#endif\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
#endif // German (Germany) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Swedish resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_SVE)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Menu
|
||||
//
|
||||
|
||||
IDM_SDIFRAME MENU PRELOAD DISCARDABLE
|
||||
BEGIN
|
||||
POPUP "&Arkiv"
|
||||
BEGIN
|
||||
MENUITEM "&Öppna", ID_FILE_OPEN
|
||||
MENUITEM "&Avsluta", ID_FILE_EXIT
|
||||
END
|
||||
POPUP "&Visa"
|
||||
BEGIN
|
||||
MENUITEM "&Verktygsfält", ID_VIEW_TOOL_BAR
|
||||
MENUITEM "S&idfält", ID_VIEW_SIDE_BAR, GRAYED
|
||||
MENUITEM "&Statusfält", ID_VIEW_STATUSBAR
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Uppdatera\tF5", ID_REFRESH
|
||||
MENUITEM "&Fullskärm\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
|
||||
END
|
||||
POPUP "&Hjälp"
|
||||
BEGIN
|
||||
MENUITEM "IBrowser &FAQ...", ID_IBROWSER_FAQ
|
||||
MENUITEM "Om &IBrowser...", ID_ABOUT_IBROWSER
|
||||
MENUITEM "Om &operativsystemet...", ID_ABOUT_WINDOWS
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// String Table
|
||||
//
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_TITLE "ReactOS webbläsare"
|
||||
IDS_EMPTY "(Tom)"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_ABOUT_IBROWSER "&Om..."
|
||||
END
|
||||
|
||||
#endif // Swedish resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
#ifndef _ROS_
|
||||
LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
#ifdef UNICODE
|
||||
IDS_IBROWSER_VERSION_STR "ROS IBrowser%0s"
|
||||
#else
|
||||
IDS_IBROWSER_VERSION_STR "ROS IBrowser Ansi%0s"
|
||||
#endif
|
||||
END
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
22
reactos/base/applications/ibrowser/expat.license
Normal file
|
@ -0,0 +1,22 @@
|
|||
Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
|
||||
and Clark Cooper
|
||||
Copyright (c) 2001, 2002, 2003 Expat maintainers.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
496
reactos/base/applications/ibrowser/favorites.cpp
Normal file
|
@ -0,0 +1,496 @@
|
|||
/*
|
||||
* Copyright 2004 Martin Fuchs
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
//
|
||||
// Explorer and Desktop clone
|
||||
//
|
||||
// favorites.cpp
|
||||
//
|
||||
// Martin Fuchs, 04.04.2004
|
||||
//
|
||||
|
||||
|
||||
#include <precomp.h>
|
||||
|
||||
|
||||
String DecodeURLString(const char* s)
|
||||
{
|
||||
TCHAR buffer[BUFFER_LEN];
|
||||
LPTSTR o = buffer;
|
||||
|
||||
for(const char* p=s; *p; ++p)
|
||||
if (*p == '%') {
|
||||
if (!strncmp(p+1, "20", 2)) {
|
||||
*o++ = ' ';
|
||||
p += 2;
|
||||
} else
|
||||
*o++ = *p;
|
||||
} else
|
||||
*o++ = *p;
|
||||
|
||||
return String(buffer, o-buffer);
|
||||
}
|
||||
|
||||
|
||||
/// read .URL file
|
||||
bool Bookmark::read_url(LPCTSTR path)
|
||||
{
|
||||
char line[BUFFER_LEN];
|
||||
|
||||
tifstream in(path);
|
||||
|
||||
while(in.good()) {
|
||||
in.getline(line, BUFFER_LEN);
|
||||
|
||||
const char* p = line;
|
||||
while(isspace(*p))
|
||||
++p;
|
||||
|
||||
const char* keyword = p;
|
||||
const char* eq = strchr(p, '=');
|
||||
|
||||
if (eq) {
|
||||
const char* cont = eq + 1;
|
||||
while(isspace(*cont))
|
||||
++cont;
|
||||
|
||||
if (!strnicmp(keyword, "URL", 3))
|
||||
_url = DecodeURLString(cont);
|
||||
else if (!strnicmp(keyword, "IconFile", 8))
|
||||
_icon_path = DecodeURLString(cont);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// convert XBEL bookmark node
|
||||
bool Bookmark::read(const_XMLPos& pos)
|
||||
{
|
||||
_url = pos.get("href").c_str();
|
||||
|
||||
if (pos.go_down("title")) {
|
||||
_name = pos->get_content();
|
||||
pos.back();
|
||||
}
|
||||
|
||||
if (pos.go_down("desc")) {
|
||||
_description = pos->get_content();
|
||||
pos.back();
|
||||
}
|
||||
|
||||
if (pos.go_down("info")) {
|
||||
const_XMLChildrenFilter metadata(pos, "metadata");
|
||||
|
||||
for(const_XMLChildrenFilter::const_iterator it=metadata.begin(); it!=metadata.end(); ++it) {
|
||||
const XMLNode& node = **it;
|
||||
const_XMLPos sub_pos(&node);
|
||||
|
||||
if (node.get("owner") == "ros-explorer") {
|
||||
if (sub_pos.go_down("icon")) {
|
||||
_icon_path = sub_pos.get("path").c_str();
|
||||
_icon_idx = XS_toi(sub_pos.get("index"));
|
||||
|
||||
sub_pos.back(); // </icon>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pos.back(); // </metadata>
|
||||
pos.back(); // </info>
|
||||
}
|
||||
|
||||
return !_url.empty(); // _url is mandatory.
|
||||
}
|
||||
|
||||
/// write XBEL bookmark node
|
||||
void Bookmark::write(XMLPos& pos) const
|
||||
{
|
||||
pos.create("bookmark");
|
||||
|
||||
pos["href"] = _url.c_str();
|
||||
|
||||
if (!_name.empty()) {
|
||||
pos.create("title");
|
||||
pos->set_content(_name);
|
||||
pos.back();
|
||||
}
|
||||
|
||||
if (!_description.empty()) {
|
||||
pos.create("desc");
|
||||
pos->set_content(_description);
|
||||
pos.back();
|
||||
}
|
||||
|
||||
if (!_icon_path.empty()) {
|
||||
pos.create("info");
|
||||
pos.create("metadata");
|
||||
pos["owner"] = "ros-explorer";
|
||||
pos.create("icon");
|
||||
pos["path"] = _icon_path.c_str();
|
||||
pos["index"].printf(XS_TEXT("%d"), _icon_idx);
|
||||
pos.back(); // </icon>
|
||||
pos.back(); // </metadata>
|
||||
pos.back(); // </info>
|
||||
}
|
||||
|
||||
pos.back();
|
||||
}
|
||||
|
||||
|
||||
/// read bookmark folder from XBEL formated XML tree
|
||||
void BookmarkFolder::read(const_XMLPos& pos)
|
||||
{
|
||||
if (pos.go_down("title")) {
|
||||
_name = pos->get_content();
|
||||
pos.back();
|
||||
}
|
||||
|
||||
if (pos.go_down("desc")) {
|
||||
_description = pos->get_content();
|
||||
pos.back();
|
||||
}
|
||||
|
||||
_bookmarks.read(pos);
|
||||
}
|
||||
|
||||
/// write bookmark folder content from XBEL formated XML tree
|
||||
void BookmarkFolder::write(XMLPos& pos) const
|
||||
{
|
||||
pos.create("folder");
|
||||
|
||||
if (!_name.empty()) {
|
||||
pos.create("title");
|
||||
pos->set_content(_name);
|
||||
pos.back();
|
||||
}
|
||||
|
||||
if (!_description.empty()) {
|
||||
pos.create("desc");
|
||||
pos->set_content(_description);
|
||||
pos.back();
|
||||
}
|
||||
|
||||
_bookmarks.write(pos);
|
||||
}
|
||||
|
||||
|
||||
BookmarkNode::BookmarkNode()
|
||||
: _type(BMNT_NONE)
|
||||
{
|
||||
_pbookmark = NULL;
|
||||
}
|
||||
|
||||
BookmarkNode::BookmarkNode(const Bookmark& bm)
|
||||
: _type(BMNT_BOOKMARK)
|
||||
{
|
||||
_pbookmark = new Bookmark(bm);
|
||||
}
|
||||
|
||||
BookmarkNode::BookmarkNode(const BookmarkFolder& bmf)
|
||||
: _type(BMNT_FOLDER)
|
||||
{
|
||||
_pfolder = new BookmarkFolder(bmf);
|
||||
}
|
||||
|
||||
BookmarkNode::BookmarkNode(const BookmarkNode& other)
|
||||
: _type(other._type)
|
||||
{
|
||||
if (other._type == BMNT_BOOKMARK)
|
||||
_pbookmark = new Bookmark(*other._pbookmark);
|
||||
else if (other._type == BMNT_FOLDER)
|
||||
_pfolder = new BookmarkFolder(*other._pfolder);
|
||||
else
|
||||
_pbookmark = NULL;
|
||||
}
|
||||
|
||||
BookmarkNode::~BookmarkNode()
|
||||
{
|
||||
if (_type == BMNT_BOOKMARK)
|
||||
delete _pbookmark;
|
||||
else if (_type == BMNT_FOLDER)
|
||||
delete _pfolder;
|
||||
}
|
||||
|
||||
BookmarkNode& BookmarkNode::operator=(const Bookmark& bm)
|
||||
{
|
||||
clear();
|
||||
|
||||
_pbookmark = new Bookmark(bm);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
BookmarkNode& BookmarkNode::operator=(const BookmarkFolder& bmf)
|
||||
{
|
||||
clear();
|
||||
|
||||
_pfolder = new BookmarkFolder(bmf);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
BookmarkNode& BookmarkNode::operator=(const BookmarkNode& other)
|
||||
{
|
||||
clear();
|
||||
|
||||
_type = other._type;
|
||||
|
||||
if (other._type == BMNT_BOOKMARK)
|
||||
_pbookmark = new Bookmark(*other._pbookmark);
|
||||
else if (other._type == BMNT_FOLDER)
|
||||
_pfolder = new BookmarkFolder(*other._pfolder);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
void BookmarkNode::clear()
|
||||
{
|
||||
if (_type == BMNT_BOOKMARK) {
|
||||
delete _pbookmark;
|
||||
_pbookmark = NULL;
|
||||
}
|
||||
else if (_type == BMNT_FOLDER) {
|
||||
delete _pfolder;
|
||||
_pfolder = NULL;
|
||||
}
|
||||
|
||||
_type = BMNT_NONE;
|
||||
}
|
||||
|
||||
|
||||
/// read bookmark list from XBEL formated XML tree
|
||||
void BookmarkList::read(const_XMLPos& pos)
|
||||
{
|
||||
const XMLNode::Children& children = pos->get_children();
|
||||
|
||||
for(XMLNode::Children::const_iterator it=children.begin(); it!=children.end(); ++it) {
|
||||
const XMLNode& node = **it;
|
||||
const_XMLPos sub_pos(&node);
|
||||
|
||||
if (node == "folder") {
|
||||
BookmarkFolder folder;
|
||||
|
||||
folder.read(sub_pos);
|
||||
|
||||
push_back(folder);
|
||||
} else if (node == "bookmark") {
|
||||
Bookmark bookmark;
|
||||
|
||||
if (bookmark.read(sub_pos))
|
||||
push_back(bookmark);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// write bookmark list into XBEL formated XML tree
|
||||
void BookmarkList::write(XMLPos& pos) const
|
||||
{
|
||||
for(const_iterator it=begin(); it!=end(); ++it) {
|
||||
const BookmarkNode& node = *it;
|
||||
|
||||
if (node._type == BookmarkNode::BMNT_FOLDER) {
|
||||
const BookmarkFolder& folder = *node._pfolder;
|
||||
|
||||
folder.write(pos);
|
||||
|
||||
pos.back();
|
||||
} else if (node._type == BookmarkNode::BMNT_BOOKMARK) {
|
||||
const Bookmark& bookmark = *node._pbookmark;
|
||||
|
||||
if (!bookmark._url.empty())
|
||||
bookmark.write(pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// fill treeview control with bookmark tree content
|
||||
void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST himagelist, HDC hdc_wnd) const
|
||||
{
|
||||
TV_INSERTSTRUCT tvi;
|
||||
|
||||
tvi.hParent = parent;
|
||||
tvi.hInsertAfter = TVI_LAST;
|
||||
|
||||
TV_ITEM& tv = tvi.item;
|
||||
tv.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM;
|
||||
|
||||
for(const_iterator it=begin(); it!=end(); ++it) {
|
||||
const BookmarkNode& node = *it;
|
||||
|
||||
tv.lParam = (LPARAM)&node;
|
||||
|
||||
if (node._type == BookmarkNode::BMNT_FOLDER) {
|
||||
const BookmarkFolder& folder = *node._pfolder;
|
||||
|
||||
tv.pszText = (LPTSTR)folder._name.c_str();
|
||||
tv.iImage = 3; // folder
|
||||
tv.iSelectedImage = 4; // open folder
|
||||
HTREEITEM hitem = TreeView_InsertItem(hwnd, &tvi);
|
||||
|
||||
folder._bookmarks.fill_tree(hwnd, hitem, himagelist, hdc_wnd);
|
||||
} else if (node._type == BookmarkNode::BMNT_BOOKMARK) {
|
||||
const Bookmark& bookmark = *node._pbookmark;
|
||||
|
||||
tv.pszText = (LPTSTR)bookmark._name.c_str();
|
||||
tv.iImage = 1; // bookmark
|
||||
tv.iSelectedImage = 2; // selected bookmark
|
||||
|
||||
if (!bookmark._icon_path.empty()) {
|
||||
const Icon& icon = g_icon_cache.extract(bookmark._icon_path, bookmark._icon_idx);
|
||||
|
||||
if ((ICON_ID)icon != ICID_NONE)
|
||||
tv.iImage = tv.iSelectedImage = icon.add_to_imagelist(himagelist, hdc_wnd);
|
||||
}
|
||||
|
||||
(void)TreeView_InsertItem(hwnd, &tvi);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*@@
|
||||
|
||||
/// import Internet Explorer bookmarks from Favorites folder into bookmark list
|
||||
void BookmarkList::import_IE_favorites(ShellDirectory& dir, HWND hwnd)
|
||||
{
|
||||
TCHAR path[MAX_PATH], ext[_MAX_EXT];
|
||||
|
||||
dir.smart_scan(SORT_NAME, SCAN_FILESYSTEM);
|
||||
|
||||
for(Entry*entry=dir._down; entry; entry=entry->_next) {
|
||||
if (entry->_shell_attribs & SFGAO_HIDDEN) // ignore files like "desktop.ini"
|
||||
continue;
|
||||
|
||||
String name;
|
||||
|
||||
if (entry->_etype == ET_SHELL)
|
||||
name = dir._folder.get_name(static_cast<ShellEntry*>(entry)->_pidl);
|
||||
else
|
||||
name = entry->_display_name;
|
||||
|
||||
if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
||||
BookmarkFolder new_folder;
|
||||
|
||||
new_folder._name = DecodeXMLString(name);
|
||||
|
||||
if (entry->_etype == ET_SHELL) {
|
||||
ShellDirectory new_dir(dir._folder, static_cast<ShellEntry*>(entry)->_pidl, hwnd);
|
||||
new_folder._bookmarks.import_IE_favorites(new_dir, hwnd);
|
||||
} else {
|
||||
entry->get_path(path);
|
||||
ShellDirectory new_dir(GetDesktopFolder(), path, hwnd);
|
||||
new_folder._bookmarks.import_IE_favorites(new_dir, hwnd);
|
||||
}
|
||||
|
||||
push_back(new_folder);
|
||||
} else {
|
||||
Bookmark bookmark;
|
||||
|
||||
bookmark._name = DecodeXMLString(name);
|
||||
|
||||
entry->get_path(path);
|
||||
_tsplitpath(path, NULL, NULL, NULL, ext);
|
||||
|
||||
if (!_tcsicmp(ext, TEXT(".url"))) {
|
||||
bookmark.read_url(path);
|
||||
push_back(bookmark);
|
||||
} else {
|
||||
///@todo read shell links
|
||||
//assert(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/// read XBEL bookmark file
|
||||
bool Favorites::read(LPCTSTR path)
|
||||
{
|
||||
XMLDoc xbel;
|
||||
|
||||
if (!xbel.read(path))
|
||||
if (xbel._last_error == XML_ERROR_NO_ELEMENTS)
|
||||
return false;
|
||||
else
|
||||
MessageBox(0/*@@g_Globals._hwndDesktop*/, String(xbel._last_error_msg.c_str()),
|
||||
TEXT("ROS Explorer - reading bookmark file"), MB_OK);
|
||||
|
||||
const_XMLPos pos(&xbel);
|
||||
|
||||
if (!pos.go_down("xbel"))
|
||||
return false;
|
||||
|
||||
super::read(pos);
|
||||
|
||||
pos.back();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// write XBEL bookmark file
|
||||
void Favorites::write(LPCTSTR path) const
|
||||
{
|
||||
XMLDoc xbel;
|
||||
|
||||
XMLPos pos(&xbel);
|
||||
pos.create("xbel");
|
||||
super::write(pos);
|
||||
pos.back();
|
||||
|
||||
xbel._header._doctype = "<!DOCTYPE xbel"
|
||||
" PUBLIC \"+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML\"\n"
|
||||
" \"http://www.python.org/topics/xml/dtds/xbel-1.0.dtd\">";
|
||||
|
||||
xbel.write(path);
|
||||
}
|
||||
|
||||
|
||||
/*@@
|
||||
|
||||
/// import Internet Explorer bookmarks from Favorites folder
|
||||
bool Favorites::import_IE_favorites(HWND hwnd)
|
||||
{
|
||||
WaitCursor wait;
|
||||
|
||||
StartMenuShellDirs dirs;
|
||||
|
||||
try {
|
||||
dirs.push_back(ShellDirectory(GetDesktopFolder(), SpecialFolderPath(CSIDL_COMMON_FAVORITES, hwnd), hwnd));
|
||||
dirs.push_back(ShellDirectory(GetDesktopFolder(), SpecialFolderPath(CSIDL_FAVORITES, hwnd), hwnd));
|
||||
} catch(COMException&) {
|
||||
}
|
||||
|
||||
for(StartMenuShellDirs::iterator it=dirs.begin(); it!=dirs.end(); ++it) {
|
||||
StartMenuDirectory& smd = *it;
|
||||
ShellDirectory& dir = smd._dir;
|
||||
|
||||
try {
|
||||
super::import_IE_favorites(dir, hwnd);
|
||||
} catch(COMException&) {
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
*/
|
104
reactos/base/applications/ibrowser/favorites.h
Normal file
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
* Copyright 2004 Martin Fuchs
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
//
|
||||
// Explorer and Desktop clone
|
||||
//
|
||||
// favorites.h
|
||||
//
|
||||
// Martin Fuchs, 04.04.2004
|
||||
//
|
||||
|
||||
|
||||
extern String DecodeURLString(const char* s);
|
||||
|
||||
|
||||
struct Bookmark
|
||||
{
|
||||
Bookmark() : _icon_idx(0) {}
|
||||
|
||||
String _name;
|
||||
String _description;
|
||||
String _url;
|
||||
String _icon_path;
|
||||
int _icon_idx;
|
||||
|
||||
bool read_url(LPCTSTR path);
|
||||
bool read(const_XMLPos& pos);
|
||||
void write(XMLPos& pos) const;
|
||||
};
|
||||
|
||||
struct BookmarkFolder;
|
||||
|
||||
struct BookmarkNode
|
||||
{
|
||||
BookmarkNode();
|
||||
BookmarkNode(const Bookmark& bm);
|
||||
BookmarkNode(const BookmarkFolder& bmf);
|
||||
BookmarkNode(const BookmarkNode& other);
|
||||
|
||||
~BookmarkNode();
|
||||
|
||||
BookmarkNode& operator=(const Bookmark& bm);
|
||||
BookmarkNode& operator=(const BookmarkFolder& bmf);
|
||||
BookmarkNode& operator=(const BookmarkNode& other);
|
||||
|
||||
void clear();
|
||||
|
||||
enum BOOKMARKNODE_TYPE {
|
||||
BMNT_NONE, BMNT_BOOKMARK, BMNT_FOLDER
|
||||
};
|
||||
|
||||
BOOKMARKNODE_TYPE _type;
|
||||
|
||||
union {
|
||||
Bookmark* _pbookmark;
|
||||
BookmarkFolder* _pfolder;
|
||||
};
|
||||
};
|
||||
|
||||
struct BookmarkList : public list<BookmarkNode>
|
||||
{
|
||||
void import_IE_favorites(struct ShellDirectory& dir, HWND hwnd);
|
||||
|
||||
void read(const_XMLPos& pos);
|
||||
void write(XMLPos& pos) const;
|
||||
|
||||
void fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST, HDC hdc_wnd) const;
|
||||
};
|
||||
|
||||
struct BookmarkFolder
|
||||
{
|
||||
String _name;
|
||||
String _description;
|
||||
BookmarkList _bookmarks;
|
||||
|
||||
void read(const_XMLPos& pos);
|
||||
void write(XMLPos& pos) const;
|
||||
};
|
||||
|
||||
struct Favorites : public BookmarkList
|
||||
{
|
||||
typedef BookmarkList super;
|
||||
|
||||
bool read(LPCTSTR path);
|
||||
void write(LPCTSTR path) const;
|
||||
|
||||
bool import_IE_favorites(HWND hwnd);
|
||||
};
|
550
reactos/base/applications/ibrowser/ibrowser.cpp
Normal file
|
@ -0,0 +1,550 @@
|
|||
/*
|
||||
* Copyright 2005 Martin Fuchs
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
//
|
||||
// ROS Internet Web Browser
|
||||
//
|
||||
// ibrowser.cpp
|
||||
//
|
||||
// Martin Fuchs, 24.01.2005
|
||||
//
|
||||
|
||||
|
||||
#include <precomp.h>
|
||||
|
||||
#include "ibrowser_intres.h"
|
||||
|
||||
#include <locale.h> // for setlocale()
|
||||
|
||||
#ifndef __WINE__
|
||||
#include <io.h> // for dup2()
|
||||
#include <fcntl.h> // for _O_RDONLY
|
||||
#endif
|
||||
|
||||
|
||||
// globals
|
||||
|
||||
HINSTANCE g_hInstance;
|
||||
IconCache g_icon_cache;
|
||||
ATOM g_hframeClass;
|
||||
|
||||
|
||||
/*@@
|
||||
void ExplorerGlobals::read_persistent()
|
||||
{
|
||||
// read configuration file
|
||||
_cfg_dir.printf(TEXT("%s\\ReactOS"), (LPCTSTR)SpecialFolderFSPath(CSIDL_APPDATA,0));
|
||||
_cfg_path.printf(TEXT("%s\\ros-ibrowser-cfg.xml"), _cfg_dir.c_str());
|
||||
|
||||
if (!_cfg.read(_cfg_path)) {
|
||||
if (_cfg._last_error != XML_ERROR_NO_ELEMENTS)
|
||||
MessageBox(g_Globals._hwndDesktop, String(_cfg._last_error_msg.c_str()),
|
||||
TEXT("ROS Explorer - reading user settings"), MB_OK);
|
||||
|
||||
_cfg.read(TEXT("ibrowser-cfg-template.xml"));
|
||||
}
|
||||
|
||||
// read bookmarks
|
||||
_favorites_path.printf(TEXT("%s\\ros-ibrowser-bookmarks.xml"), _cfg_dir.c_str());
|
||||
|
||||
if (!_favorites.read(_favorites_path)) {
|
||||
_favorites.import_IE_favorites(0);
|
||||
_favorites.write(_favorites_path);
|
||||
}
|
||||
}
|
||||
|
||||
void ExplorerGlobals::write_persistent()
|
||||
{
|
||||
// write configuration file
|
||||
RecursiveCreateDirectory(_cfg_dir);
|
||||
|
||||
_cfg.write(_cfg_path);
|
||||
_favorites.write(_favorites_path);
|
||||
}
|
||||
|
||||
|
||||
XMLPos ExplorerGlobals::get_cfg()
|
||||
{
|
||||
XMLPos cfg_pos(&_cfg);
|
||||
|
||||
cfg_pos.smart_create("ibrowser-cfg");
|
||||
|
||||
return cfg_pos;
|
||||
}
|
||||
|
||||
XMLPos ExplorerGlobals::get_cfg(const char* path)
|
||||
{
|
||||
XMLPos cfg_pos(&_cfg);
|
||||
|
||||
cfg_pos.smart_create("ibrowser-cfg");
|
||||
cfg_pos.create_relative(path);
|
||||
|
||||
return cfg_pos;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
Icon::Icon()
|
||||
: _id(ICID_UNKNOWN),
|
||||
_itype(IT_STATIC),
|
||||
_hicon(0)
|
||||
{
|
||||
}
|
||||
|
||||
Icon::Icon(ICON_ID id, UINT nid)
|
||||
: _id(id),
|
||||
_itype(IT_STATIC),
|
||||
_hicon(SmallIcon(nid))
|
||||
{
|
||||
}
|
||||
|
||||
Icon::Icon(ICON_TYPE itype, int id, HICON hIcon)
|
||||
: _id((ICON_ID)id),
|
||||
_itype(itype),
|
||||
_hicon(hIcon)
|
||||
{
|
||||
}
|
||||
|
||||
Icon::Icon(ICON_TYPE itype, int id, int sys_idx)
|
||||
: _id((ICON_ID)id),
|
||||
_itype(itype),
|
||||
_sys_idx(sys_idx)
|
||||
{
|
||||
}
|
||||
|
||||
void Icon::draw(HDC hdc, int x, int y, int cx, int cy, COLORREF bk_color, HBRUSH bk_brush) const
|
||||
{
|
||||
if (_itype == IT_SYSCACHE)
|
||||
ImageList_DrawEx(g_icon_cache.get_sys_imagelist(), _sys_idx, hdc, x, y, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL);
|
||||
else
|
||||
DrawIconEx(hdc, x, y, _hicon, cx, cy, 0, bk_brush, DI_NORMAL);
|
||||
}
|
||||
|
||||
HBITMAP Icon::create_bitmap(COLORREF bk_color, HBRUSH hbrBkgnd, HDC hdc_wnd) const
|
||||
{
|
||||
if (_itype == IT_SYSCACHE) {
|
||||
HIMAGELIST himl = g_icon_cache.get_sys_imagelist();
|
||||
|
||||
int cx, cy;
|
||||
ImageList_GetIconSize(himl, &cx, &cy);
|
||||
|
||||
HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy);
|
||||
HDC hdc = CreateCompatibleDC(hdc_wnd);
|
||||
HBITMAP hbmp_old = SelectBitmap(hdc, hbmp);
|
||||
ImageList_DrawEx(himl, _sys_idx, hdc, 0, 0, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL);
|
||||
SelectBitmap(hdc, hbmp_old);
|
||||
DeleteDC(hdc);
|
||||
|
||||
return hbmp;
|
||||
} else
|
||||
return create_bitmap_from_icon(_hicon, hbrBkgnd, hdc_wnd);
|
||||
}
|
||||
|
||||
|
||||
int Icon::add_to_imagelist(HIMAGELIST himl, HDC hdc_wnd, COLORREF bk_color, HBRUSH bk_brush) const
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (_itype == IT_SYSCACHE) {
|
||||
HIMAGELIST himl = g_icon_cache.get_sys_imagelist();
|
||||
|
||||
int cx, cy;
|
||||
ImageList_GetIconSize(himl, &cx, &cy);
|
||||
|
||||
HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy);
|
||||
HDC hdc = CreateCompatibleDC(hdc_wnd);
|
||||
HBITMAP hbmp_old = SelectBitmap(hdc, hbmp);
|
||||
ImageList_DrawEx(himl, _sys_idx, hdc, 0, 0, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL);
|
||||
SelectBitmap(hdc, hbmp_old);
|
||||
DeleteDC(hdc);
|
||||
|
||||
ret = ImageList_Add(himl, hbmp, 0);
|
||||
|
||||
DeleteObject(hbmp);
|
||||
} else
|
||||
ret = ImageList_AddAlphaIcon(himl, _hicon, bk_brush, hdc_wnd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd)
|
||||
{
|
||||
int cx = GetSystemMetrics(SM_CXSMICON);
|
||||
int cy = GetSystemMetrics(SM_CYSMICON);
|
||||
HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy);
|
||||
|
||||
MemCanvas canvas;
|
||||
BitmapSelection sel(canvas, hbmp);
|
||||
|
||||
RECT rect = {0, 0, cx, cy};
|
||||
FillRect(canvas, &rect, hbrush_bkgnd);
|
||||
|
||||
DrawIconEx(canvas, 0, 0, hIcon, cx, cy, 0, hbrush_bkgnd, DI_NORMAL);
|
||||
|
||||
return hbmp;
|
||||
}
|
||||
|
||||
int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd)
|
||||
{
|
||||
HBITMAP hbmp = create_bitmap_from_icon(hIcon, hbrush_bkgnd, hdc_wnd);
|
||||
|
||||
int ret = ImageList_Add(himl, hbmp, 0);
|
||||
|
||||
DeleteObject(hbmp);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int IconCache::s_next_id = ICID_DYNAMIC;
|
||||
|
||||
|
||||
void IconCache::init()
|
||||
{
|
||||
_icons[ICID_NONE] = Icon(IT_STATIC, ICID_NONE, (HICON)0);
|
||||
|
||||
_icons[ICID_IBROWSER] = Icon(ICID_IBROWSER, IDI_IBROWSER);
|
||||
_icons[ICID_BOOKMARK] = Icon(ICID_BOOKMARK, IDI_DOT_TRANS);
|
||||
}
|
||||
|
||||
|
||||
const Icon& IconCache::extract(const String& path)
|
||||
{
|
||||
PathMap::iterator found = _pathMap.find(path);
|
||||
|
||||
if (found != _pathMap.end())
|
||||
return _icons[found->second];
|
||||
|
||||
SHFILEINFO sfi;
|
||||
|
||||
#if 1 // use system image list
|
||||
HIMAGELIST himlSys = (HIMAGELIST) SHGetFileInfo(path, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX|SHGFI_SMALLICON);
|
||||
|
||||
if (himlSys) {
|
||||
_himlSys = himlSys;
|
||||
|
||||
const Icon& icon = add(sfi.iIcon/*, IT_SYSCACHE*/);
|
||||
#else
|
||||
if (SHGetFileInfo(path, 0, &sfi, sizeof(sfi), SHGFI_ICON|SHGFI_SMALLICON)) {
|
||||
const Icon& icon = add(sfi.hIcon, IT_CACHED);
|
||||
#endif
|
||||
|
||||
///@todo limit cache size
|
||||
_pathMap[path] = icon;
|
||||
|
||||
return icon;
|
||||
} else
|
||||
return _icons[ICID_NONE];
|
||||
}
|
||||
|
||||
const Icon& IconCache::extract(LPCTSTR path, int idx)
|
||||
{
|
||||
CachePair key(path, idx);
|
||||
|
||||
#ifndef __WINE__ ///@todo _tcslwr() for Wine
|
||||
_tcslwr((LPTSTR)key.first.c_str());
|
||||
#endif
|
||||
|
||||
PathIdxMap::iterator found = _pathIdxMap.find(key);
|
||||
|
||||
if (found != _pathIdxMap.end())
|
||||
return _icons[found->second];
|
||||
|
||||
HICON hIcon;
|
||||
|
||||
if ((int)ExtractIconEx(path, idx, NULL, &hIcon, 1) > 0) {
|
||||
const Icon& icon = add(hIcon, IT_CACHED);
|
||||
|
||||
_pathIdxMap[key] = icon;
|
||||
|
||||
return icon;
|
||||
} else {
|
||||
|
||||
///@todo retreive "http://.../favicon.ico" format icons
|
||||
|
||||
return _icons[ICID_NONE];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const Icon& IconCache::add(HICON hIcon, ICON_TYPE type)
|
||||
{
|
||||
int id = ++s_next_id;
|
||||
|
||||
return _icons[id] = Icon(type, id, hIcon);
|
||||
}
|
||||
|
||||
const Icon& IconCache::add(int sys_idx/*, ICON_TYPE type=IT_SYSCACHE*/)
|
||||
{
|
||||
int id = ++s_next_id;
|
||||
|
||||
return _icons[id] = SysCacheIcon(id, sys_idx);
|
||||
}
|
||||
|
||||
const Icon& IconCache::get_icon(int id)
|
||||
{
|
||||
return _icons[id];
|
||||
}
|
||||
|
||||
void IconCache::free_icon(int icon_id)
|
||||
{
|
||||
IconMap::iterator found = _icons.find(icon_id);
|
||||
|
||||
if (found != _icons.end()) {
|
||||
Icon& icon = found->second;
|
||||
|
||||
if (icon.destroy())
|
||||
_icons.erase(found);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ResString::ResString(UINT nid)
|
||||
{
|
||||
TCHAR buffer[BUFFER_LEN];
|
||||
|
||||
int len = LoadString(g_hInstance, nid, buffer, sizeof(buffer)/sizeof(TCHAR));
|
||||
|
||||
super::assign(buffer, len);
|
||||
}
|
||||
|
||||
|
||||
ResIcon::ResIcon(UINT nid)
|
||||
{
|
||||
_hicon = LoadIcon(g_hInstance, MAKEINTRESOURCE(nid));
|
||||
}
|
||||
|
||||
SmallIcon::SmallIcon(UINT nid)
|
||||
{
|
||||
_hicon = (HICON)LoadImage(g_hInstance, MAKEINTRESOURCE(nid), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED);
|
||||
}
|
||||
|
||||
ResIconEx::ResIconEx(UINT nid, int w, int h)
|
||||
{
|
||||
_hicon = (HICON)LoadImage(g_hInstance, MAKEINTRESOURCE(nid), IMAGE_ICON, w, h, LR_SHARED);
|
||||
}
|
||||
|
||||
|
||||
void SetWindowIcon(HWND hwnd, UINT nid)
|
||||
{
|
||||
HICON hIcon = ResIcon(nid);
|
||||
(void)Window_SetIcon(hwnd, ICON_BIG, hIcon);
|
||||
|
||||
HICON hIconSmall = SmallIcon(nid);
|
||||
(void)Window_SetIcon(hwnd, ICON_SMALL, hIconSmall);
|
||||
}
|
||||
|
||||
|
||||
ResBitmap::ResBitmap(UINT nid)
|
||||
{
|
||||
_hBmp = LoadBitmap(g_hInstance, MAKEINTRESOURCE(nid));
|
||||
}
|
||||
|
||||
|
||||
void ibrowser_show_frame(int cmdshow, LPTSTR lpCmdLine)
|
||||
{
|
||||
MainFrameBase::Create(lpCmdLine, cmdshow);
|
||||
}
|
||||
|
||||
|
||||
PopupMenu::PopupMenu(UINT nid)
|
||||
{
|
||||
HMENU hMenu = LoadMenu(g_hInstance, MAKEINTRESOURCE(nid));
|
||||
_hmenu = GetSubMenu(hMenu, 0);
|
||||
}
|
||||
|
||||
|
||||
/// "About" Dialog
|
||||
struct ExplorerAboutDlg : public
|
||||
CtlColorParent<
|
||||
OwnerDrawParent<Dialog>
|
||||
>
|
||||
{
|
||||
typedef CtlColorParent<
|
||||
OwnerDrawParent<Dialog>
|
||||
> super;
|
||||
|
||||
ExplorerAboutDlg(HWND hwnd)
|
||||
: super(hwnd)
|
||||
{
|
||||
SetWindowIcon(hwnd, IDI_REACTOS);
|
||||
|
||||
new FlatButton(hwnd, IDOK);
|
||||
|
||||
_hfont = CreateFont(20, 0, 0, 0, FW_BOLD, TRUE, 0, 0, 0, 0, 0, 0, 0, TEXT("Sans Serif"));
|
||||
new ColorStatic(hwnd, IDC_ROS_IBROWSER, RGB(32,32,128), 0, _hfont);
|
||||
|
||||
new HyperlinkCtrl(hwnd, IDC_WWW);
|
||||
|
||||
FmtString ver_txt(ResString(IDS_IBROWSER_VERSION_STR), (LPCTSTR)ResString(IDS_VERSION_STR));
|
||||
SetWindowText(GetDlgItem(hwnd, IDC_VERSION_TXT), ver_txt);
|
||||
|
||||
/*@@
|
||||
HWND hwnd_winver = GetDlgItem(hwnd, IDC_WIN_VERSION);
|
||||
SetWindowText(hwnd_winver, get_windows_version_str());
|
||||
SetWindowFont(hwnd_winver, GetStockFont(DEFAULT_GUI_FONT), FALSE);
|
||||
*/
|
||||
|
||||
CenterWindow(hwnd);
|
||||
}
|
||||
|
||||
~ExplorerAboutDlg()
|
||||
{
|
||||
DeleteObject(_hfont);
|
||||
}
|
||||
|
||||
protected:
|
||||
HFONT _hfont;
|
||||
};
|
||||
|
||||
void ibrowser_about(HWND hwndParent)
|
||||
{
|
||||
Dialog::DoModal(IDD_ABOUT_IBROWSER, WINDOW_CREATOR(ExplorerAboutDlg), hwndParent);
|
||||
}
|
||||
void ibrowser_open(HWND hwndParent)
|
||||
{
|
||||
HMODULE hShell32;
|
||||
RUNFILEDLG RunFileDlg;
|
||||
OSVERSIONINFO versionInfo;
|
||||
WCHAR wTitle[40];
|
||||
WCHAR wText[256];
|
||||
char szTitle[40] = "Open";
|
||||
char szText[256] = "Type the Internet Address of a document or folder and IBrowser will open it for you.";
|
||||
|
||||
hShell32 = LoadLibrary(_T("SHELL32.DLL"));
|
||||
RunFileDlg = (RUNFILEDLG)(FARPROC)GetProcAddress(hShell32, (char*)((long)0x3D));
|
||||
|
||||
/* Show "Run..." dialog */
|
||||
if (RunFileDlg)
|
||||
{
|
||||
versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
||||
GetVersionEx(&versionInfo);
|
||||
|
||||
if (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
|
||||
{
|
||||
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szTitle, -1, wTitle, 40);
|
||||
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szText, -1, wText, 256);
|
||||
RunFileDlg(hwndParent, 0, NULL, (LPCSTR)wTitle, (LPCSTR)wText, RFF_CALCDIRECTORY);
|
||||
}
|
||||
else
|
||||
RunFileDlg(hwndParent, 0, NULL, szTitle, szText, RFF_CALCDIRECTORY);
|
||||
}
|
||||
|
||||
FreeLibrary(hShell32);
|
||||
}
|
||||
|
||||
static void InitInstance(HINSTANCE hInstance)
|
||||
{
|
||||
CONTEXT("InitInstance");
|
||||
|
||||
// register frame window class
|
||||
g_hframeClass = IconWindowClass(CLASSNAME_FRAME,IDI_IBROWSER);
|
||||
|
||||
// register child window class
|
||||
WindowClass(CLASSNAME_CHILDWND, CS_CLASSDC|CS_VREDRAW).Register();
|
||||
}
|
||||
|
||||
|
||||
int ibrowser_main(HINSTANCE hInstance, LPTSTR lpCmdLine, int cmdshow)
|
||||
{
|
||||
CONTEXT("ibrowser_main");
|
||||
|
||||
// initialize Common Controls library
|
||||
CommonControlInit usingCmnCtrl;
|
||||
|
||||
try {
|
||||
InitInstance(hInstance);
|
||||
} catch(COMException& e) {
|
||||
HandleException(e, GetDesktopWindow());
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (cmdshow != SW_HIDE) {
|
||||
/* // don't maximize if being called from the ROS desktop
|
||||
if (cmdshow == SW_SHOWNORMAL)
|
||||
///@todo read window placement from registry
|
||||
cmdshow = SW_MAXIMIZE;
|
||||
*/
|
||||
|
||||
ibrowser_show_frame(cmdshow, lpCmdLine);
|
||||
}
|
||||
|
||||
return Window::MessageLoop();
|
||||
}
|
||||
|
||||
|
||||
// MinGW does not provide a Unicode startup routine, so we have to implement an own.
|
||||
#if defined(__MINGW32__) && defined(UNICODE)
|
||||
|
||||
#define _tWinMain wWinMain
|
||||
int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int);
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
CONTEXT("main");
|
||||
|
||||
STARTUPINFO startupinfo;
|
||||
int nShowCmd = SW_SHOWNORMAL;
|
||||
|
||||
GetStartupInfo(&startupinfo);
|
||||
|
||||
if (startupinfo.dwFlags & STARTF_USESHOWWINDOW)
|
||||
nShowCmd = startupinfo.wShowWindow;
|
||||
|
||||
LPWSTR cmdline = GetCommandLineW();
|
||||
|
||||
while(*cmdline && !_istspace(*cmdline))
|
||||
++cmdline;
|
||||
|
||||
while(_istspace(*cmdline))
|
||||
++cmdline;
|
||||
|
||||
return wWinMain(GetModuleHandle(NULL), 0, cmdline, nShowCmd);
|
||||
}
|
||||
|
||||
#endif // __MINGW && UNICODE
|
||||
|
||||
|
||||
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd)
|
||||
{
|
||||
CONTEXT("WinMain()");
|
||||
|
||||
g_hInstance = hInstance;
|
||||
|
||||
// initialize COM and OLE before creating the desktop window
|
||||
OleInit usingCOM;
|
||||
|
||||
// init common controls library
|
||||
CommonControlInit usingCmnCtrl;
|
||||
|
||||
//@@ g_Globals.read_persistent();
|
||||
|
||||
/**TODO fix command line handling */
|
||||
if (*lpCmdLine=='"' && lpCmdLine[_tcslen(lpCmdLine)-1]=='"') {
|
||||
++lpCmdLine;
|
||||
lpCmdLine[_tcslen(lpCmdLine)-1] = '\0';
|
||||
}
|
||||
|
||||
int ret = ibrowser_main(hInstance, lpCmdLine, nShowCmd);
|
||||
|
||||
// write configuration file
|
||||
//@@ g_Globals.write_persistent();
|
||||
|
||||
return ret;
|
||||
}
|
346
reactos/base/applications/ibrowser/ibrowser.dsp
Normal file
|
@ -0,0 +1,346 @@
|
|||
# Microsoft Developer Studio Project File - Name="ibrowser" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103
|
||||
|
||||
CFG=IBROWSER - WIN32 DEBUG
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "ibrowser.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "ibrowser.mak" CFG="IBROWSER - WIN32 DEBUG"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "ibrowser - Win32 Release" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "ibrowser - Win32 Debug" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "ibrowser - Win32 Debug Release" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "ibrowser - Win32 Unicode Release" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "ibrowser - Win32 Unicode Debug" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "ibrowser - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W3 /GR /GX /O1 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c
|
||||
# ADD BASE RSC /l 0x407 /d "NDEBUG"
|
||||
# ADD RSC /l 0x407 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 gdi32.lib comctl32.lib shell32.lib ole32.lib /nologo /subsystem:windows /machine:I386 /libpath:"Release"
|
||||
# SUBTRACT LINK32 /pdb:none
|
||||
|
||||
!ELSEIF "$(CFG)" == "ibrowser - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /GZ /c
|
||||
# ADD BASE RSC /l 0x407 /d "_DEBUG"
|
||||
# ADD RSC /l 0x407 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib gdi32.lib comctl32.lib shell32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"Debug"
|
||||
# SUBTRACT LINK32 /pdb:none
|
||||
|
||||
!ELSEIF "$(CFG)" == "ibrowser - Win32 Debug Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "DRelease"
|
||||
# PROP BASE Intermediate_Dir "DRelease"
|
||||
# PROP BASE Ignore_Export_Lib 0
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "DRelease"
|
||||
# PROP Intermediate_Dir "DRelease"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_ROS_" /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W3 /GR /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /c
|
||||
# ADD BASE RSC /l 0x407 /d "NDEBUG"
|
||||
# ADD RSC /l 0x407 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 gdi32.lib comctl32.lib shell32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386
|
||||
# SUBTRACT LINK32 /pdb:none
|
||||
|
||||
!ELSEIF "$(CFG)" == "ibrowser - Win32 Unicode Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "URelease"
|
||||
# PROP BASE Intermediate_Dir "URelease"
|
||||
# PROP BASE Ignore_Export_Lib 0
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "URelease"
|
||||
# PROP Intermediate_Dir "URelease"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c
|
||||
# ADD BASE RSC /l 0x407 /d "NDEBUG"
|
||||
# ADD RSC /l 0x407 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 gdi32.lib comctl32.lib shell32.lib ole32.lib /nologo /subsystem:windows /machine:I386 /libpath:"Release"
|
||||
# SUBTRACT LINK32 /pdb:none
|
||||
|
||||
!ELSEIF "$(CFG)" == "ibrowser - Win32 Unicode Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "UDebug"
|
||||
# PROP BASE Intermediate_Dir "UDebug"
|
||||
# PROP BASE Ignore_Export_Lib 0
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "UDebug"
|
||||
# PROP Intermediate_Dir "UDebug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /FR /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /GZ /c
|
||||
# ADD BASE RSC /l 0x407 /d "_DEBUG"
|
||||
# ADD RSC /l 0x407 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 gdi32.lib comctl32.lib shell32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"Debug"
|
||||
# SUBTRACT LINK32 /pdb:none
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "ibrowser - Win32 Release"
|
||||
# Name "ibrowser - Win32 Debug"
|
||||
# Name "ibrowser - Win32 Debug Release"
|
||||
# Name "ibrowser - Win32 Unicode Release"
|
||||
# Name "ibrowser - Win32 Unicode Debug"
|
||||
# Begin Group "utility"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\utility\comutil.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\utility\utility.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\utility\utility.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\utility\window.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\utility\window.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\utility\xmlstorage.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\utility\xmlstorage.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "resources"
|
||||
|
||||
# PROP Default_Filter "bmp,ico"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\De.rc
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\res\dot.ico
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\res\dot_red.ico
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\res\dot_trans.ico
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\En.rc
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Es.rc
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\res\favorites.ico
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Fr.rc
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Hu.rc
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\res\ibrowser.ico
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ibrowser.rc
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ibrowser_intres.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ibrowser_intres.rc
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\res\iexplore.ico
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Ja.rc
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\res\network.ico
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\res\reactos.ico
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Ro.rc
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Sv.rc
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\res\toolbar.bmp
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "main"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\favorites.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\favorites.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ibrowser.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ibrowser.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\mainframe.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\mainframe.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\precomp.cpp
|
||||
# ADD CPP /Yc"precomp.h"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\precomp.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\webchild.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\webchild.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\readme.txt
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
41
reactos/base/applications/ibrowser/ibrowser.dsw
Normal file
|
@ -0,0 +1,41 @@
|
|||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "ibrowser"=.\ibrowser.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "make_ibrowser"=.\make_ibrowser.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
231
reactos/base/applications/ibrowser/ibrowser.h
Normal file
|
@ -0,0 +1,231 @@
|
|||
/*
|
||||
* Copyright 2005 Martin Fuchs
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
//
|
||||
// ROS Internet Web Browser
|
||||
//
|
||||
// ibrowser.h
|
||||
//
|
||||
// Martin Fuchs, 25.01.2005
|
||||
//
|
||||
|
||||
|
||||
#include "utility/window.h"
|
||||
|
||||
|
||||
#define IDW_STATUSBAR 0x100
|
||||
#define IDW_TOOLBAR 0x101
|
||||
#define IDW_EXTRABAR 0x102
|
||||
#define IDW_ADDRESSBAR 0x104
|
||||
#define IDW_SIDEBAR 0x106
|
||||
#define IDW_FIRST_CHILD 0xC000 /*0x200*/
|
||||
|
||||
|
||||
#define PM_GET_FILEWND_PTR (WM_APP+0x05)
|
||||
#define PM_GET_SHELLBROWSER_PTR (WM_APP+0x06)
|
||||
|
||||
#define PM_GET_CONTROLWINDOW (WM_APP+0x16)
|
||||
|
||||
#define PM_RESIZE_CHILDREN (WM_APP+0x17)
|
||||
#define PM_GET_WIDTH (WM_APP+0x18)
|
||||
|
||||
#define PM_REFRESH (WM_APP+0x1B)
|
||||
#define PM_REFRESH_CONFIG (WM_APP+0x1C)
|
||||
|
||||
|
||||
#define CLASSNAME_FRAME TEXT("IBrowserFrameWClass")
|
||||
|
||||
#define CLASSNAME_CHILDWND TEXT("IBrowserChildWClass")
|
||||
|
||||
|
||||
#include "mainframe.h"
|
||||
|
||||
|
||||
/// convenient loading of string resources
|
||||
struct ResString : public String
|
||||
{
|
||||
ResString(UINT nid);
|
||||
};
|
||||
|
||||
/// convenient loading of standard (32x32) icon resources
|
||||
struct ResIcon
|
||||
{
|
||||
ResIcon(UINT nid);
|
||||
|
||||
operator HICON() const {return _hicon;}
|
||||
|
||||
protected:
|
||||
HICON _hicon;
|
||||
};
|
||||
|
||||
/// convenient loading of small (16x16) icon resources
|
||||
struct SmallIcon
|
||||
{
|
||||
SmallIcon(UINT nid);
|
||||
|
||||
operator HICON() const {return _hicon;}
|
||||
|
||||
protected:
|
||||
HICON _hicon;
|
||||
};
|
||||
|
||||
/// convenient loading of icon resources with specified sizes
|
||||
struct ResIconEx
|
||||
{
|
||||
ResIconEx(UINT nid, int w, int h);
|
||||
|
||||
operator HICON() const {return _hicon;}
|
||||
|
||||
protected:
|
||||
HICON _hicon;
|
||||
};
|
||||
|
||||
/// set big and small icons out of the resources for a window
|
||||
extern void SetWindowIcon(HWND hwnd, UINT nid);
|
||||
|
||||
/// convenient loading of bitmap resources
|
||||
struct ResBitmap
|
||||
{
|
||||
ResBitmap(UINT nid);
|
||||
~ResBitmap() {DeleteObject(_hBmp);}
|
||||
|
||||
operator HBITMAP() const {return _hBmp;}
|
||||
|
||||
protected:
|
||||
HBITMAP _hBmp;
|
||||
};
|
||||
|
||||
|
||||
enum ICON_TYPE {
|
||||
IT_STATIC,
|
||||
IT_CACHED,
|
||||
IT_DYNAMIC,
|
||||
IT_SYSCACHE
|
||||
};
|
||||
|
||||
enum ICON_ID {
|
||||
ICID_UNKNOWN,
|
||||
ICID_NONE,
|
||||
|
||||
ICID_IBROWSER,
|
||||
ICID_BOOKMARK,
|
||||
|
||||
ICID_DYNAMIC
|
||||
};
|
||||
|
||||
struct Icon {
|
||||
Icon();
|
||||
Icon(ICON_ID id, UINT nid);
|
||||
Icon(ICON_TYPE itype, int id, HICON hIcon);
|
||||
Icon(ICON_TYPE itype, int id, int sys_idx);
|
||||
|
||||
operator ICON_ID() const {return _id;}
|
||||
|
||||
void draw(HDC hdc, int x, int y, int cx, int cy, COLORREF bk_color, HBRUSH bk_brush) const;
|
||||
HBITMAP create_bitmap(COLORREF bk_color, HBRUSH hbrBkgnd, HDC hdc_wnd) const;
|
||||
int add_to_imagelist(HIMAGELIST himl, HDC hdc_wnd, COLORREF bk_color=GetSysColor(COLOR_WINDOW), HBRUSH bk_brush=GetSysColorBrush(COLOR_WINDOW)) const;
|
||||
|
||||
int get_sysiml_idx() const {return _itype==IT_SYSCACHE? _sys_idx: -1;}
|
||||
|
||||
bool destroy() {if (_itype == IT_DYNAMIC) {DestroyIcon(_hicon); return true;} else return false;}
|
||||
|
||||
protected:
|
||||
ICON_ID _id;
|
||||
ICON_TYPE _itype;
|
||||
HICON _hicon;
|
||||
int _sys_idx;
|
||||
};
|
||||
|
||||
struct SysCacheIcon : public Icon {
|
||||
SysCacheIcon(int id, int sys_idx)
|
||||
: Icon(IT_SYSCACHE, id, sys_idx) {}
|
||||
};
|
||||
|
||||
struct IconCache {
|
||||
IconCache() : _himlSys(0) {}
|
||||
|
||||
void init();
|
||||
|
||||
const Icon& extract(const String& path);
|
||||
const Icon& extract(LPCTSTR path, int idx);
|
||||
const Icon& extract(IExtractIcon* pExtract, LPCTSTR path, int idx);
|
||||
|
||||
const Icon& add(HICON hIcon, ICON_TYPE type=IT_DYNAMIC);
|
||||
const Icon& add(int sys_idx/*, ICON_TYPE type=IT_SYSCACHE*/);
|
||||
|
||||
const Icon& get_icon(int icon_id);
|
||||
HIMAGELIST get_sys_imagelist() const {return _himlSys;}
|
||||
|
||||
void free_icon(int icon_id);
|
||||
|
||||
protected:
|
||||
static int s_next_id;
|
||||
|
||||
typedef map<int, Icon> IconMap;
|
||||
IconMap _icons;
|
||||
|
||||
typedef map<String, ICON_ID> PathMap;
|
||||
PathMap _pathMap;
|
||||
|
||||
typedef pair<String, int> CachePair;
|
||||
typedef map<CachePair, ICON_ID> PathIdxMap;
|
||||
PathIdxMap _pathIdxMap;
|
||||
|
||||
HIMAGELIST _himlSys;
|
||||
};
|
||||
|
||||
|
||||
/// create a bitmap from an icon
|
||||
extern HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd);
|
||||
|
||||
/// add icon with alpha channel to imagelist using the specified background color
|
||||
extern int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd);
|
||||
|
||||
|
||||
#include "utility/xmlstorage.h"
|
||||
|
||||
using namespace XMLStorage;
|
||||
|
||||
#include "favorites.h"
|
||||
|
||||
|
||||
// globals
|
||||
extern HINSTANCE g_hInstance;
|
||||
extern IconCache g_icon_cache;
|
||||
extern ATOM g_hframeClass;
|
||||
|
||||
|
||||
// display explorer "About" dialog
|
||||
extern void ibrowser_about(HWND hwndParent);
|
||||
|
||||
// display explorer "open" dialog
|
||||
extern void ibrowser_open(HWND hwndParent);
|
||||
|
||||
// declare shell32's "Run..." dialog export function
|
||||
typedef void (WINAPI* RUNFILEDLG)(HWND hwndOwner, HICON hIcon, LPCSTR lpstrDirectory, LPCSTR lpstrTitle, LPCSTR lpstrDescription, UINT uFlags);
|
||||
|
||||
//
|
||||
// Flags for RunFileDlg
|
||||
//
|
||||
|
||||
#define RFF_NOBROWSE 0x01 // Removes the browse button.
|
||||
#define RFF_NODEFAULT 0x02 // No default item selected.
|
||||
#define RFF_CALCDIRECTORY 0x04 // Calculates the working directory from the file name.
|
||||
#define RFF_NOLABEL 0x08 // Removes the edit box label.
|
||||
#define RFF_NOSEPARATEMEM 0x20 // Removes the Separate Memory Space check box (Windows NT only).
|
13
reactos/base/applications/ibrowser/ibrowser.rc
Normal file
|
@ -0,0 +1,13 @@
|
|||
#include <windows.h>
|
||||
|
||||
#include "ibrowser_intres.rc"
|
||||
|
||||
#define REACTOS_STR_FILE_DESCRIPTION "ROS Internet Web Browser\0"
|
||||
#define REACTOS_STR_INTERNAL_NAME "ibrowser\0"
|
||||
#define REACTOS_STR_ORIGINAL_FILENAME "ibrowser.exe\0"
|
||||
#include <reactos/version.rc>
|
||||
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
|
||||
#define IDS_VERSION_STR 5000
|
||||
#define IDS_IBROWSER_VERSION_STR 5001
|
31
reactos/base/applications/ibrowser/ibrowser.xml
Normal file
|
@ -0,0 +1,31 @@
|
|||
<module name="ibrowser" type="win32gui" installbase="system32" installname="ibrowser.exe" allowwarnings ="true">
|
||||
<linkerflag>-fexceptions</linkerflag>
|
||||
<include base="ibrowser">.</include>
|
||||
<include base="ReactOS">include/expat</include>
|
||||
<define name="__USE_W32API" />
|
||||
<define name="UNICODE" />
|
||||
<define name="WIN32" />
|
||||
<define name="_ROS_" />
|
||||
<define name="_WIN32_IE">0x0600</define>
|
||||
<define name="_WIN32_WINNT">0x0501</define>
|
||||
<define name="WINVER">0x0500</define>
|
||||
<library>uuid</library>
|
||||
<library>kernel32</library>
|
||||
<library>gdi32</library>
|
||||
<library>comctl32</library>
|
||||
<library>ole32</library>
|
||||
<library>oleaut32</library>
|
||||
<library>shell32</library>
|
||||
<library>expat</library>
|
||||
<pch>precomp.h</pch>
|
||||
<directory name="utility">
|
||||
<file>utility.cpp</file>
|
||||
<file>window.cpp</file>
|
||||
<file>xmlstorage.cpp</file>
|
||||
</directory>
|
||||
<file>ibrowser.cpp</file>
|
||||
<file>favorites.cpp</file>
|
||||
<file>mainframe.cpp</file>
|
||||
<file>webchild.cpp</file>
|
||||
<file>ibrowser.rc</file>
|
||||
</module>
|
52
reactos/base/applications/ibrowser/ibrowser_intres.h
Normal file
|
@ -0,0 +1,52 @@
|
|||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by ibrowser_intres.rc
|
||||
//
|
||||
#define IDS_TITLE 1
|
||||
#define IDS_EMPTY 13
|
||||
#define IDS_ABOUT_IBROWSER 27
|
||||
#define IDI_REACTOS 100
|
||||
#define IDB_TOOLBAR 103
|
||||
#define IDA_IBROWSER 104
|
||||
#define IDM_SDIFRAME 113
|
||||
#define IDD_ABOUT_IBROWSER 135
|
||||
#define IDI_FAVORITES 140
|
||||
#define IDI_DOT 163
|
||||
#define IDI_DOT_TRANS 164
|
||||
#define IDI_DOT_RED 165
|
||||
#define IDI_IBROWSER 169
|
||||
#define ID_VIEW_STATUSBAR 503
|
||||
#define ID_VIEW_TOOL_BAR 508
|
||||
#define ID_VIEW_SIDE_BAR 510
|
||||
#define IDC_ROS_IBROWSER 1000
|
||||
#define IDC_WWW 1012
|
||||
#define IDC_VERSION_TXT 1029
|
||||
#define IDC_WIN_VERSION 1030
|
||||
#define ID_REFRESH 1704
|
||||
#define IDS_VERSION_STR 5000
|
||||
#define IDS_IBROWSER_VERSION_STR 5001
|
||||
#define ID_IBROWSER_FAQ 10002
|
||||
#define ID_VIEW_FULLSCREEN 0x8004
|
||||
#define ID_ABOUT_WINDOWS 40002
|
||||
#define ID_ABOUT_IBROWSER 40003
|
||||
#define ID_GO_BACK 40005
|
||||
#define ID_GO_FORWARD 40006
|
||||
#define ID_GO_HOME 40007
|
||||
#define ID_GO_SEARCH 40008
|
||||
#define ID_GO_UP 40009
|
||||
#define ID_STOP 40010
|
||||
#define ID_FILE_OPEN 0xE140
|
||||
#define ID_FILE_EXIT 0xE141
|
||||
#define ID_HELP 0xE146
|
||||
#define IDC_STATIC -1
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 170
|
||||
#define _APS_NEXT_COMMAND_VALUE 40024
|
||||
#define _APS_NEXT_CONTROL_VALUE 1033
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
107
reactos/base/applications/ibrowser/ibrowser_intres.rc
Normal file
|
@ -0,0 +1,107 @@
|
|||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "ibrowser_intres.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include <windows.h>
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Neutral resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Bitmap
|
||||
//
|
||||
|
||||
IDB_TOOLBAR BITMAP DISCARDABLE "res/toolbar.bmp"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Accelerator
|
||||
//
|
||||
|
||||
IDA_IBROWSER ACCELERATORS DISCARDABLE
|
||||
BEGIN
|
||||
"X", ID_FILE_EXIT, VIRTKEY, ALT, NOINVERT
|
||||
"S", ID_VIEW_FULLSCREEN, VIRTKEY, SHIFT, CONTROL,
|
||||
NOINVERT
|
||||
END
|
||||
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"ibrowser_intres.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include <windows.h>\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include ""En.rc""\r\n"
|
||||
"#include ""Es.rc""\r\n"
|
||||
"#include ""Fr.rc""\r\n"
|
||||
"#include ""Sv.rc""\r\n"
|
||||
"#include ""Hu.rc""\r\n"
|
||||
"#include ""Ro.rc""\r\n"
|
||||
"#include ""Ja.rc""\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
//
|
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon
|
||||
// remains consistent on all systems.
|
||||
IDI_REACTOS ICON DISCARDABLE "res/reactos.ico"
|
||||
IDI_FAVORITES ICON DISCARDABLE "res/favorites.ico"
|
||||
IDI_DOT ICON DISCARDABLE "res/dot.ico"
|
||||
IDI_DOT_TRANS ICON DISCARDABLE "res/dot_trans.ico"
|
||||
IDI_DOT_RED ICON DISCARDABLE "res/dot_red.ico"
|
||||
IDI_IBROWSER ICON DISCARDABLE "res/ibrowser.ico"
|
||||
#endif // Neutral resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
#include "En.rc"
|
||||
#include "Es.rc"
|
||||
#include "Fr.rc"
|
||||
#include "Sv.rc"
|
||||
#include "Hu.rc"
|
||||
#include "Ro.rc"
|
||||
#include "Ja.rc"
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
791
reactos/base/applications/ibrowser/mainframe.cpp
Normal file
|
@ -0,0 +1,791 @@
|
|||
/*
|
||||
* Copyright 2005 Martin Fuchs
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
//
|
||||
// ROS Internet Web Browser
|
||||
//
|
||||
// mainframe.cpp
|
||||
//
|
||||
// Martin Fuchs, 25.01.2005
|
||||
//
|
||||
|
||||
|
||||
#include <precomp.h>
|
||||
|
||||
/* We can't include webchild.h here - otherwise MinGW produces errors like: "multiple definition of `QACONTAINERFLAGS'"
|
||||
#include "webchild.h"
|
||||
*/
|
||||
extern HWND create_webchildwindow(const WebChildWndInfo& info);
|
||||
|
||||
#include "ibrowser_intres.h"
|
||||
|
||||
|
||||
HWND MainFrameBase::Create(LPCTSTR url, UINT cmdshow)
|
||||
{
|
||||
HWND hMainFrame;
|
||||
|
||||
hMainFrame = MainFrame::Create();
|
||||
//@@hMainFrame = MainFrame::Create(url);
|
||||
|
||||
if (hMainFrame) {
|
||||
if (url) {
|
||||
static String sPath = url; // copy url to avoid accessing freed memory
|
||||
url = sPath;
|
||||
}
|
||||
|
||||
ShowWindow(hMainFrame, cmdshow);
|
||||
UpdateWindow(hMainFrame);
|
||||
|
||||
// Open the first child window after initializing the application
|
||||
PostMessage(hMainFrame, PM_OPEN_WINDOW, 0, (LPARAM)url);
|
||||
}
|
||||
|
||||
return hMainFrame;
|
||||
}
|
||||
|
||||
|
||||
MainFrameBase::MainFrameBase(HWND hwnd)
|
||||
: super(hwnd),
|
||||
_himl(ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_MASK|ILC_COLOR24, 2, 0))
|
||||
{
|
||||
_hMenuFrame = GetMenu(hwnd);
|
||||
_hMenuWindow = GetSubMenu(_hMenuFrame, GetMenuItemCount(_hMenuFrame)-3);
|
||||
|
||||
_menu_info._hMenuView = GetSubMenu(_hMenuFrame, 1);
|
||||
|
||||
_hAccel = LoadAccelerators(g_hInstance, MAKEINTRESOURCE(IDA_IBROWSER));
|
||||
|
||||
|
||||
TBBUTTON toolbarBtns[] = {
|
||||
#ifdef _NO_REBAR
|
||||
{0, 0, 0, BTNS_SEP, {0, 0}, 0, 0},
|
||||
#endif
|
||||
{7, ID_GO_BACK, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
|
||||
{8, ID_GO_FORWARD, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
|
||||
{9, ID_GO_UP, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
|
||||
{10, ID_GO_HOME, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
|
||||
{11, ID_GO_SEARCH, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
|
||||
{12, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
|
||||
{13, ID_STOP, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}
|
||||
};
|
||||
|
||||
_htoolbar = CreateToolbarEx(hwnd,
|
||||
#ifndef _NO_REBAR
|
||||
CCS_NOPARENTALIGN|CCS_NORESIZE|
|
||||
#endif
|
||||
WS_CHILD|WS_VISIBLE, IDW_TOOLBAR, 2, g_hInstance, IDB_TOOLBAR,
|
||||
toolbarBtns, sizeof(toolbarBtns)/sizeof(TBBUTTON),
|
||||
16, 15, 16, 15, sizeof(TBBUTTON));
|
||||
|
||||
CheckMenuItem(_menu_info._hMenuView, ID_VIEW_TOOL_BAR, MF_BYCOMMAND|MF_CHECKED);
|
||||
|
||||
|
||||
// address bar
|
||||
WindowCanvas canvas(hwnd);
|
||||
RECT rect = {0, 0, 0, 0};
|
||||
DrawText(canvas, TEXT("My"), -1, &rect, DT_SINGLELINE|DT_NOPREFIX|DT_CALCRECT);
|
||||
HFONT hfont = GetStockFont(DEFAULT_GUI_FONT);
|
||||
|
||||
_haddressedit = CreateWindow(TEXT("EDIT"), NULL, WS_CHILD|WS_VISIBLE|WS_BORDER, 0, 0, 0, rect.bottom,
|
||||
hwnd, (HMENU)IDW_ADDRESSBAR, g_hInstance, 0);
|
||||
SetWindowFont(_haddressedit, hfont, FALSE);
|
||||
new EditController(_haddressedit);
|
||||
|
||||
/* CreateStatusWindow does not accept WS_BORDER
|
||||
_hstatusbar = CreateWindowEx(WS_EX_NOPARENTNOTIFY, STATUSCLASSNAME, 0,
|
||||
WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_BORDER|CCS_NODIVIDER, 0,0,0,0,
|
||||
hwnd, (HMENU)IDW_STATUSBAR, g_hInstance, 0);*/
|
||||
|
||||
_hstatusbar = CreateStatusWindow(WS_CHILD|WS_VISIBLE, 0, hwnd, IDW_STATUSBAR);
|
||||
CheckMenuItem(_menu_info._hMenuView, ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED);
|
||||
|
||||
_hsidebar = CreateWindowEx(WS_EX_STATICEDGE, WC_TREEVIEW, TEXT("Sidebar"),
|
||||
WS_CHILD|WS_TABSTOP|WS_BORDER|/*WS_VISIBLE|*/WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_SHOWSELALWAYS|TVS_INFOTIP,
|
||||
-1, -1, 200, 0, _hwnd, (HMENU)IDW_SIDEBAR, g_hInstance, 0);
|
||||
|
||||
(void)TreeView_SetImageList(_hsidebar, _himl, TVSIL_NORMAL);
|
||||
|
||||
CheckMenuItem(_menu_info._hMenuView, ID_VIEW_SIDE_BAR, MF_BYCOMMAND|MF_UNCHECKED/*MF_CHECKED*/);
|
||||
|
||||
|
||||
// create rebar window to manage toolbar and address bar
|
||||
#ifndef _NO_REBAR
|
||||
_hwndrebar = CreateWindowEx(WS_EX_TOOLWINDOW, REBARCLASSNAME, NULL,
|
||||
WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|
|
||||
RBS_VARHEIGHT|RBS_AUTOSIZE|RBS_DBLCLKTOGGLE|
|
||||
CCS_NODIVIDER|CCS_NOPARENTALIGN,
|
||||
0, 0, 0, 0, _hwnd, 0, g_hInstance, 0);
|
||||
|
||||
int btn_hgt = HIWORD(SendMessage(_htoolbar, TB_GETBUTTONSIZE, 0, 0));
|
||||
|
||||
REBARBANDINFO rbBand;
|
||||
|
||||
rbBand.cbSize = sizeof(REBARBANDINFO);
|
||||
rbBand.fMask = RBBIM_TEXT|RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE;
|
||||
#ifndef RBBS_HIDETITLE // missing in MinGW headers as of 25.02.2004
|
||||
#define RBBS_HIDETITLE 0x400
|
||||
#endif
|
||||
rbBand.fStyle = RBBS_CHILDEDGE|RBBS_GRIPPERALWAYS|RBBS_HIDETITLE;
|
||||
|
||||
rbBand.cxMinChild = 0;
|
||||
rbBand.cyMinChild = 0;
|
||||
rbBand.cyChild = 0;
|
||||
rbBand.cyMaxChild = 0;
|
||||
rbBand.cyIntegral = btn_hgt;
|
||||
|
||||
rbBand.lpText = TEXT("Toolbar");
|
||||
rbBand.hwndChild = _htoolbar;
|
||||
rbBand.cxMinChild = 0;
|
||||
rbBand.cyMinChild = btn_hgt + 4;
|
||||
rbBand.cx = 182;
|
||||
SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
|
||||
|
||||
rbBand.lpText = TEXT("Address");
|
||||
rbBand.hwndChild = _haddressedit;
|
||||
rbBand.cxMinChild = 0;
|
||||
rbBand.cyMinChild = btn_hgt - 2;
|
||||
rbBand.cx = 284;
|
||||
SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
MainFrameBase::~MainFrameBase()
|
||||
{
|
||||
ImageList_Destroy(_himl);
|
||||
|
||||
//@@if (g_Globals._hMainWnd == _hwnd)
|
||||
PostQuitMessage(0);
|
||||
}
|
||||
|
||||
|
||||
LRESULT MainFrameBase::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
LRESULT res;
|
||||
|
||||
if (ProcessMessage(nmsg, wparam, lparam, &res))
|
||||
return res;
|
||||
else
|
||||
return super::WndProc(nmsg, wparam, lparam);
|
||||
}
|
||||
|
||||
bool MainFrameBase::ProcessMessage(UINT nmsg, WPARAM wparam, LPARAM lparam, LRESULT* pres)
|
||||
{
|
||||
switch(nmsg) {
|
||||
case PM_TRANSLATE_MSG:
|
||||
*pres = TranslateMsg((MSG*)lparam);
|
||||
return true;
|
||||
|
||||
case WM_SHOWWINDOW:
|
||||
if (wparam) // trigger child resizing after window creation - now we can succesfully call IsWindowVisible()
|
||||
resize_frame_client();
|
||||
return false; // goto def;
|
||||
|
||||
case WM_CLOSE:
|
||||
DestroyWindow(_hwnd);
|
||||
//@@ g_Globals._hMainWnd = 0;
|
||||
break;
|
||||
|
||||
case WM_DESTROY:
|
||||
break;
|
||||
|
||||
case WM_SIZE:
|
||||
resize_frame(LOWORD(lparam), HIWORD(lparam));
|
||||
break; // do not pass message to DefFrameProc
|
||||
|
||||
case WM_GETMINMAXINFO: {
|
||||
LPMINMAXINFO lpmmi = (LPMINMAXINFO)lparam;
|
||||
|
||||
lpmmi->ptMaxTrackSize.x <<= 1;/*2*GetSystemMetrics(SM_CXSCREEN) / SM_CXVIRTUALSCREEN */
|
||||
lpmmi->ptMaxTrackSize.y <<= 1;/*2*GetSystemMetrics(SM_CYSCREEN) / SM_CYVIRTUALSCREEN */
|
||||
break;}
|
||||
|
||||
case PM_FRM_CALC_CLIENT:
|
||||
frame_get_clientspace((PRECT)lparam);
|
||||
*pres = TRUE;
|
||||
return true;
|
||||
|
||||
case PM_FRM_GET_MENUINFO:
|
||||
*pres = (LPARAM)&_menu_info;
|
||||
return true;
|
||||
|
||||
case PM_GET_CONTROLWINDOW:
|
||||
if (wparam == FCW_STATUS) {
|
||||
*pres = (LRESULT)(HWND)_hstatusbar;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case PM_SETSTATUSTEXT:
|
||||
SendMessage(_hstatusbar, SB_SETTEXT, wparam, lparam);
|
||||
break;
|
||||
|
||||
case PM_URL_CHANGED:
|
||||
SetWindowText(_haddressedit, (LPCTSTR)lparam);
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
*pres = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
BOOL MainFrameBase::TranslateMsg(MSG* pmsg)
|
||||
{
|
||||
if (TranslateAccelerator(_hwnd, _hAccel, pmsg))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
int MainFrameBase::Command(int id, int code)
|
||||
{
|
||||
CONTEXT("MainFrameBase::Command()");
|
||||
|
||||
switch(id) {
|
||||
case ID_FILE_OPEN:
|
||||
ibrowser_open(_hwnd);
|
||||
break;
|
||||
|
||||
case ID_FILE_EXIT:
|
||||
SendMessage(_hwnd, WM_CLOSE, 0, 0);
|
||||
break;
|
||||
|
||||
case ID_VIEW_TOOL_BAR:
|
||||
toggle_child(_hwnd, id, _htoolbar, 0);
|
||||
break;
|
||||
|
||||
case ID_VIEW_STATUSBAR:
|
||||
toggle_child(_hwnd, id, _hstatusbar);
|
||||
break;
|
||||
|
||||
case ID_VIEW_SIDE_BAR:
|
||||
// lazy initialization
|
||||
if (!TreeView_GetCount(_hsidebar))
|
||||
FillBookmarks();
|
||||
|
||||
toggle_child(_hwnd, id, _hsidebar);
|
||||
break;
|
||||
|
||||
case ID_HELP:
|
||||
WinHelp(_hwnd, TEXT("ibrowser")/*file ibrowser.hlp*/, HELP_INDEX, 0);
|
||||
break;
|
||||
|
||||
case ID_VIEW_FULLSCREEN:
|
||||
CheckMenuItem(_menu_info._hMenuView, id, toggle_fullscreen()?MF_CHECKED:0);
|
||||
break;
|
||||
|
||||
case ID_ABOUT_WINDOWS:
|
||||
ShellAbout(_hwnd, ResString(IDS_TITLE), NULL, 0);
|
||||
break;
|
||||
|
||||
case ID_ABOUT_IBROWSER:
|
||||
ibrowser_about(_hwnd);
|
||||
break;
|
||||
|
||||
case ID_IBROWSER_FAQ:
|
||||
launch_file(_hwnd, TEXT("http://www.sky.franken.de/explorer/"), SW_SHOW);
|
||||
break;
|
||||
|
||||
case IDW_ADDRESSBAR:
|
||||
if (code == 1) {
|
||||
TCHAR url[BUFFER_LEN];
|
||||
|
||||
if (GetWindowText(_haddressedit, url, BUFFER_LEN))
|
||||
go_to(url, false);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return 1; // no command handlers in Window::Command()
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int MainFrameBase::Notify(int id, NMHDR* pnmh)
|
||||
{
|
||||
switch(pnmh->code) {
|
||||
// resize children windows when the rebar size changes
|
||||
case RBN_AUTOSIZE:
|
||||
resize_frame_client();
|
||||
break;
|
||||
|
||||
case TVN_GETINFOTIP: {
|
||||
NMTVGETINFOTIP* pnmgit = (NMTVGETINFOTIP*)pnmh;
|
||||
|
||||
if (pnmgit->lParam) {
|
||||
const BookmarkNode& node = *(BookmarkNode*)pnmgit->lParam;
|
||||
|
||||
if (node._type == BookmarkNode::BMNT_FOLDER) {
|
||||
// display tooltips for bookmark folders
|
||||
if (!node._pfolder->_description.empty())
|
||||
lstrcpyn(pnmgit->pszText, node._pfolder->_description.c_str(), pnmgit->cchTextMax);
|
||||
} else if (node._type == BookmarkNode::BMNT_BOOKMARK) {
|
||||
// display tooltips for bookmark folders
|
||||
String txt = node._pbookmark->_description;
|
||||
|
||||
if (!node._pbookmark->_url.empty()) {
|
||||
if (!txt.empty())
|
||||
txt += TEXT(" - ");
|
||||
|
||||
txt += node._pbookmark->_url;
|
||||
}
|
||||
|
||||
lstrcpyn(pnmgit->pszText, txt.c_str(), pnmgit->cchTextMax);
|
||||
}
|
||||
}
|
||||
break;}
|
||||
|
||||
case NM_DBLCLK: {
|
||||
HTREEITEM hitem = TreeView_GetSelection(_hsidebar);
|
||||
LPARAM lparam = TreeView_GetItemData(_hsidebar, hitem);
|
||||
|
||||
if (lparam) {
|
||||
const BookmarkNode& node = *(BookmarkNode*)lparam;
|
||||
|
||||
if (node._type == BookmarkNode::BMNT_BOOKMARK) {
|
||||
bool new_window = GetAsyncKeyState(VK_SHIFT)<0;
|
||||
|
||||
go_to(node._pbookmark->_url, new_window);
|
||||
}
|
||||
}
|
||||
break;}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void MainFrameBase::resize_frame(int cx, int cy)
|
||||
{
|
||||
if (cy <= 0)
|
||||
return; // avoid resizing children when receiving RBN_AUTOSIZE while getting minimized
|
||||
|
||||
RECT rect = {0, 0, cx, cy};
|
||||
|
||||
if (_hwndrebar) {
|
||||
int height = ClientRect(_hwndrebar).bottom;
|
||||
MoveWindow(_hwndrebar, rect.left, rect.top, rect.right-rect.left, height, TRUE);
|
||||
rect.top += height;
|
||||
} else {
|
||||
if (IsWindowVisible(_htoolbar)) {
|
||||
SendMessage(_htoolbar, WM_SIZE, 0, 0);
|
||||
WindowRect rt(_htoolbar);
|
||||
rect.top = rt.bottom;
|
||||
// rect.bottom -= rt.bottom;
|
||||
}
|
||||
}
|
||||
|
||||
if (IsWindowVisible(_hstatusbar)) {
|
||||
int parts[] = {300, 500};
|
||||
|
||||
SendMessage(_hstatusbar, WM_SIZE, 0, 0);
|
||||
SendMessage(_hstatusbar, SB_SETPARTS, 2, (LPARAM)&parts);
|
||||
ClientRect rt(_hstatusbar);
|
||||
rect.bottom -= rt.bottom;
|
||||
}
|
||||
|
||||
if (IsWindowVisible(_hsidebar)) {
|
||||
WindowRect rt(_hsidebar);
|
||||
rect.left += rt.right-rt.left;
|
||||
|
||||
SetWindowPos(_hsidebar, 0, -1, rect.top-1, rt.right-rt.left, rect.bottom-rect.top+1, SWP_NOACTIVATE|SWP_NOZORDER);
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrameBase::resize_frame_client()
|
||||
{
|
||||
ClientRect rect(_hwnd);
|
||||
|
||||
resize_frame(rect.right, rect.bottom);
|
||||
}
|
||||
|
||||
void MainFrameBase::frame_get_clientspace(PRECT prect)
|
||||
{
|
||||
if (!IsIconic(_hwnd))
|
||||
GetClientRect(_hwnd, prect);
|
||||
else {
|
||||
WINDOWPLACEMENT wp;
|
||||
|
||||
GetWindowPlacement(_hwnd, &wp);
|
||||
|
||||
prect->left = prect->top = 0;
|
||||
prect->right = wp.rcNormalPosition.right-wp.rcNormalPosition.left-
|
||||
2*(GetSystemMetrics(SM_CXSIZEFRAME)+GetSystemMetrics(SM_CXEDGE));
|
||||
prect->bottom = wp.rcNormalPosition.bottom-wp.rcNormalPosition.top-
|
||||
2*(GetSystemMetrics(SM_CYSIZEFRAME)+GetSystemMetrics(SM_CYEDGE))-
|
||||
GetSystemMetrics(SM_CYCAPTION)-GetSystemMetrics(SM_CYMENUSIZE);
|
||||
}
|
||||
|
||||
if (IsWindowVisible(_htoolbar)) {
|
||||
ClientRect rt(_htoolbar);
|
||||
prect->top += rt.bottom+2;
|
||||
}
|
||||
|
||||
if (IsWindowVisible(_hstatusbar)) {
|
||||
ClientRect rt(_hstatusbar);
|
||||
prect->bottom -= rt.bottom;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL MainFrameBase::toggle_fullscreen()
|
||||
{
|
||||
RECT rt;
|
||||
|
||||
if ((_fullscreen._mode=!_fullscreen._mode)) {
|
||||
GetWindowRect(_hwnd, &_fullscreen._orgPos);
|
||||
_fullscreen._wasZoomed = IsZoomed(_hwnd);
|
||||
|
||||
Frame_CalcFrameClient(_hwnd, &rt);
|
||||
ClientToScreen(_hwnd, (LPPOINT)&rt.left);
|
||||
ClientToScreen(_hwnd, (LPPOINT)&rt.right);
|
||||
|
||||
rt.left = _fullscreen._orgPos.left-rt.left;
|
||||
rt.top = _fullscreen._orgPos.top-rt.top;
|
||||
rt.right = GetSystemMetrics(SM_CXSCREEN)+_fullscreen._orgPos.right-rt.right;
|
||||
rt.bottom = GetSystemMetrics(SM_CYSCREEN)+_fullscreen._orgPos.bottom-rt.bottom;
|
||||
|
||||
MoveWindow(_hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE);
|
||||
} else {
|
||||
MoveWindow(_hwnd, _fullscreen._orgPos.left, _fullscreen._orgPos.top,
|
||||
_fullscreen._orgPos.right-_fullscreen._orgPos.left,
|
||||
_fullscreen._orgPos.bottom-_fullscreen._orgPos.top, TRUE);
|
||||
|
||||
if (_fullscreen._wasZoomed)
|
||||
ShowWindow(_hwnd, WS_MAXIMIZE);
|
||||
}
|
||||
|
||||
return _fullscreen._mode;
|
||||
}
|
||||
|
||||
void MainFrameBase::fullscreen_move()
|
||||
{
|
||||
RECT rt, pos;
|
||||
GetWindowRect(_hwnd, &pos);
|
||||
|
||||
Frame_CalcFrameClient(_hwnd, &rt);
|
||||
ClientToScreen(_hwnd, (LPPOINT)&rt.left);
|
||||
ClientToScreen(_hwnd, (LPPOINT)&rt.right);
|
||||
|
||||
rt.left = pos.left-rt.left;
|
||||
rt.top = pos.top-rt.top;
|
||||
rt.right = GetSystemMetrics(SM_CXSCREEN)+pos.right-rt.right;
|
||||
rt.bottom = GetSystemMetrics(SM_CYSCREEN)+pos.bottom-rt.bottom;
|
||||
|
||||
MoveWindow(_hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE);
|
||||
}
|
||||
|
||||
|
||||
void MainFrameBase::toggle_child(HWND hwnd, UINT cmd, HWND hchild, int band_idx)
|
||||
{
|
||||
BOOL vis = IsWindowVisible(hchild);
|
||||
|
||||
CheckMenuItem(_menu_info._hMenuView, cmd, vis?MF_BYCOMMAND:MF_BYCOMMAND|MF_CHECKED);
|
||||
|
||||
if (band_idx != -1)
|
||||
SendMessage(_hwndrebar, RB_SHOWBAND, band_idx, !vis);
|
||||
else
|
||||
ShowWindow(hchild, vis? SW_HIDE: SW_SHOW);
|
||||
|
||||
if (_fullscreen._mode)
|
||||
fullscreen_move();
|
||||
|
||||
resize_frame_client();
|
||||
}
|
||||
|
||||
void MainFrameBase::FillBookmarks()
|
||||
{
|
||||
/*@@
|
||||
HiddenWindow hide(_hsidebar);
|
||||
WindowCanvas canvas(_hwnd);
|
||||
|
||||
TreeView_DeleteAllItems(_hsidebar);
|
||||
|
||||
g_icon_cache.get_icon(ICID_FAVORITES).add_to_imagelist(_himl, canvas);
|
||||
g_icon_cache.get_icon(ICID_BOOKMARK).add_to_imagelist(_himl, canvas);
|
||||
ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), GetStockBrush(WHITE_BRUSH), canvas);
|
||||
g_icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas);
|
||||
g_icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas);
|
||||
|
||||
TV_INSERTSTRUCT tvi;
|
||||
|
||||
tvi.hParent = TVI_ROOT;
|
||||
tvi.hInsertAfter = TVI_LAST;
|
||||
tvi.item.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
|
||||
ResString sFavorites(IDS_FAVORITES);
|
||||
tvi.item.pszText = (LPTSTR)sFavorites.c_str();
|
||||
tvi.item.iSelectedImage = tvi.item.iImage = 0;
|
||||
|
||||
HTREEITEM hitem_bookmarks = TreeView_InsertItem(_hsidebar, &tvi);
|
||||
|
||||
g_Globals._favorites.fill_tree(_hsidebar, hitem_bookmarks, _himl, canvas);
|
||||
|
||||
TreeView_Expand(_hsidebar, hitem_bookmarks, TVE_EXPAND);
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
MainFrame::MainFrame(HWND hwnd)
|
||||
: super(hwnd)
|
||||
{
|
||||
_split_pos = DEFAULT_SPLIT_POS;
|
||||
_last_split = DEFAULT_SPLIT_POS;
|
||||
}
|
||||
|
||||
HWND MainFrame::Create()
|
||||
{
|
||||
HMENU hMenuFrame = LoadMenu(g_hInstance, MAKEINTRESOURCE(IDM_SDIFRAME));
|
||||
|
||||
return Window::Create(WINDOW_CREATOR(MainFrame), 0,
|
||||
(LPCTSTR)(int)g_hframeClass, ResString(IDS_TITLE), WS_OVERLAPPEDWINDOW,
|
||||
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
|
||||
0/*hwndDesktop*/, hMenuFrame);
|
||||
}
|
||||
|
||||
/*@@
|
||||
HWND MainFrame::Create(LPCTSTR url)
|
||||
{
|
||||
HWND hFrame = Create();
|
||||
if (!hFrame)
|
||||
return 0;
|
||||
|
||||
ShowWindow(hFrame, SW_SHOW);
|
||||
|
||||
MainFrame* pFrame = GET_WINDOW(MainFrame, hFrame);
|
||||
|
||||
if (pFrame)
|
||||
pFrame->set_url(url);
|
||||
|
||||
return hFrame;
|
||||
}
|
||||
*/
|
||||
|
||||
LRESULT MainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
switch(nmsg) {
|
||||
case WM_SIZE:
|
||||
resize_frame(LOWORD(lparam), HIWORD(lparam));
|
||||
break;
|
||||
|
||||
case WM_PAINT: {
|
||||
PaintCanvas canvas(_hwnd);
|
||||
|
||||
if (_left_hwnd && _right_hwnd) {
|
||||
ClientRect rt(_hwnd);
|
||||
rt.left = _split_pos-SPLIT_WIDTH/2;
|
||||
rt.right = _split_pos+SPLIT_WIDTH/2+1;
|
||||
|
||||
if (_right_hwnd) {
|
||||
WindowRect right_rect(_right_hwnd);
|
||||
ScreenToClient(_hwnd, &right_rect);
|
||||
rt.top = right_rect.top;
|
||||
rt.bottom = right_rect.bottom;
|
||||
}
|
||||
|
||||
HBRUSH lastBrush = SelectBrush(canvas, GetStockBrush(COLOR_SPLITBAR));
|
||||
Rectangle(canvas, rt.left, rt.top-1, rt.right, rt.bottom+1);
|
||||
SelectObject(canvas, lastBrush);
|
||||
}
|
||||
break;}
|
||||
|
||||
case WM_SETCURSOR:
|
||||
if (LOWORD(lparam) == HTCLIENT) {
|
||||
POINT pt;
|
||||
GetCursorPos(&pt);
|
||||
ScreenToClient(_hwnd, &pt);
|
||||
|
||||
if (pt.x>=_split_pos-SPLIT_WIDTH/2 && pt.x<_split_pos+SPLIT_WIDTH/2+1) {
|
||||
SetCursor(LoadCursor(0, IDC_SIZEWE));
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
goto def;
|
||||
|
||||
case WM_LBUTTONDOWN: {
|
||||
int x = GET_X_LPARAM(lparam);
|
||||
|
||||
ClientRect rt(_hwnd);
|
||||
|
||||
if (x>=_split_pos-SPLIT_WIDTH/2 && x<_split_pos+SPLIT_WIDTH/2+1) {
|
||||
_last_split = _split_pos;
|
||||
SetCapture(_hwnd);
|
||||
}
|
||||
|
||||
break;}
|
||||
|
||||
case WM_LBUTTONUP:
|
||||
if (GetCapture() == _hwnd)
|
||||
ReleaseCapture();
|
||||
break;
|
||||
|
||||
case WM_KEYDOWN:
|
||||
if (wparam == VK_ESCAPE)
|
||||
if (GetCapture() == _hwnd) {
|
||||
_split_pos = _last_split;
|
||||
resize_children();
|
||||
_last_split = -1;
|
||||
ReleaseCapture();
|
||||
SetCursor(LoadCursor(0, IDC_ARROW));
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_MOUSEMOVE:
|
||||
if (GetCapture() == _hwnd) {
|
||||
int x = LOWORD(lparam);
|
||||
|
||||
ClientRect rt(_hwnd);
|
||||
|
||||
if (x>=0 && x<rt.right) {
|
||||
_split_pos = x;
|
||||
resize_children();
|
||||
rt.left = x-SPLIT_WIDTH/2;
|
||||
rt.right = x+SPLIT_WIDTH/2+1;
|
||||
InvalidateRect(_hwnd, &rt, FALSE);
|
||||
UpdateWindow(_left_hwnd);
|
||||
UpdateWindow(_hwnd);
|
||||
UpdateWindow(_right_hwnd);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PM_OPEN_WINDOW: {CONTEXT("MainFrame PM_OPEN_WINDOW");
|
||||
LPCTSTR url = (LPCTSTR)lparam;
|
||||
|
||||
if (!url || !*url)
|
||||
#ifdef _DEBUG
|
||||
url = TEXT("http://localhost");
|
||||
#else
|
||||
url = TEXT("about:blank");
|
||||
#endif
|
||||
|
||||
if (!_right_hwnd) {
|
||||
_right_hwnd = create_webchildwindow(WebChildWndInfo(_hwnd, url));
|
||||
resize_children();
|
||||
} else
|
||||
set_url(url);
|
||||
return TRUE;} // success
|
||||
|
||||
default: def:
|
||||
return super::WndProc(nmsg, wparam, lparam);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int MainFrame::Command(int id, int code)
|
||||
{
|
||||
if (_right_hwnd)
|
||||
if (SendMessage(_right_hwnd, PM_DISPATCH_COMMAND, MAKELONG(id,code), 0))
|
||||
return 0;
|
||||
|
||||
return super::Command(id, code);
|
||||
}
|
||||
|
||||
void MainFrame::resize_frame(int cx, int cy)
|
||||
{
|
||||
if (cy <= 0)
|
||||
return; // avoid resizing children when receiving RBN_AUTOSIZE while getting minimized
|
||||
|
||||
RECT rect = {0, 0, cx, cy};
|
||||
|
||||
if (_hwndrebar) {
|
||||
int height = ClientRect(_hwndrebar).bottom;
|
||||
MoveWindow(_hwndrebar, rect.left, rect.top, rect.right-rect.left, height, TRUE);
|
||||
rect.top += height;
|
||||
} else {
|
||||
if (IsWindowVisible(_htoolbar)) {
|
||||
SendMessage(_htoolbar, WM_SIZE, 0, 0);
|
||||
WindowRect rt(_htoolbar);
|
||||
rect.top = rt.bottom;
|
||||
// rect.bottom -= rt.bottom;
|
||||
}
|
||||
}
|
||||
|
||||
if (IsWindowVisible(_hstatusbar)) {
|
||||
int parts[] = {300, 500};
|
||||
|
||||
SendMessage(_hstatusbar, WM_SIZE, 0, 0);
|
||||
SendMessage(_hstatusbar, SB_SETPARTS, 2, (LPARAM)&parts);
|
||||
ClientRect rt(_hstatusbar);
|
||||
rect.bottom -= rt.bottom;
|
||||
}
|
||||
|
||||
if (IsWindowVisible(_hsidebar)) {
|
||||
WindowRect rt(_hsidebar);
|
||||
rect.left += rt.right-rt.left;
|
||||
|
||||
SetWindowPos(_hsidebar, 0, -1, rect.top-1, rt.right-rt.left, rect.bottom-rect.top+1, SWP_NOACTIVATE|SWP_NOZORDER);
|
||||
}
|
||||
|
||||
_clnt_rect = rect;
|
||||
|
||||
resize_children();
|
||||
}
|
||||
|
||||
void MainFrame::resize_children()
|
||||
{
|
||||
HDWP hdwp = BeginDeferWindowPos(2);
|
||||
|
||||
int cx = _clnt_rect.left;
|
||||
|
||||
if (_left_hwnd) {
|
||||
cx = _split_pos + SPLIT_WIDTH/2;
|
||||
|
||||
hdwp = DeferWindowPos(hdwp, _left_hwnd, 0, _clnt_rect.left, _clnt_rect.top, _split_pos-SPLIT_WIDTH/2-_clnt_rect.left, _clnt_rect.bottom-_clnt_rect.top, SWP_NOZORDER|SWP_NOACTIVATE);
|
||||
} else {
|
||||
//_split_pos = 0;
|
||||
cx = 0;
|
||||
}
|
||||
|
||||
if (_right_hwnd)
|
||||
hdwp = DeferWindowPos(hdwp, _right_hwnd, 0, _clnt_rect.left+cx, _clnt_rect.top, _clnt_rect.right-cx, _clnt_rect.bottom-_clnt_rect.top, SWP_NOZORDER|SWP_NOACTIVATE);
|
||||
|
||||
EndDeferWindowPos(hdwp);
|
||||
}
|
||||
|
||||
void MainFrame::update_clnt_rect()
|
||||
{
|
||||
ClientRect rect(_hwnd);
|
||||
|
||||
resize_frame(rect.right, rect.bottom);
|
||||
}
|
||||
|
||||
void MainFrame::set_url(LPCTSTR url)
|
||||
{
|
||||
if (_url != url) {
|
||||
_url = url;
|
||||
|
||||
SetWindowText(_haddressedit, url); //SendMessage(_hwndFrame, PM_URL_CHANGED, 0, (LPARAM)url);
|
||||
}
|
||||
}
|
||||
|
||||
bool MainFrame::go_to(LPCTSTR url, bool new_window)
|
||||
{
|
||||
if (_right_hwnd) {
|
||||
SendMessage(_right_hwnd, PM_JUMP_TO_URL, 0, (LPARAM)url);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
125
reactos/base/applications/ibrowser/mainframe.h
Normal file
|
@ -0,0 +1,125 @@
|
|||
/*
|
||||
* Copyright 2005 Martin Fuchs
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
//
|
||||
// ROS Internet Web Browser
|
||||
//
|
||||
// mainframe.h
|
||||
//
|
||||
// Martin Fuchs, 25.01.2005
|
||||
//
|
||||
|
||||
|
||||
#define PM_OPEN_WINDOW (WM_APP+0x07)
|
||||
|
||||
|
||||
/// Explorer frame window base class
|
||||
struct MainFrameBase : public PreTranslateWindow
|
||||
{
|
||||
typedef PreTranslateWindow super;
|
||||
|
||||
MainFrameBase(HWND hwnd);
|
||||
~MainFrameBase();
|
||||
|
||||
static HWND Create(LPCTSTR url, UINT cmdshow=SW_SHOWNORMAL);
|
||||
|
||||
WindowHandle _hwndrebar;
|
||||
|
||||
WindowHandle _htoolbar;
|
||||
WindowHandle _hstatusbar;
|
||||
|
||||
WindowHandle _haddressedit;
|
||||
|
||||
WindowHandle _hsidebar;
|
||||
HIMAGELIST _himl;
|
||||
|
||||
HMENU _hMenuFrame;
|
||||
HMENU _hMenuWindow;
|
||||
|
||||
MenuInfo _menu_info;
|
||||
|
||||
protected:
|
||||
FullScreenParameters _fullscreen;
|
||||
|
||||
HACCEL _hAccel;
|
||||
|
||||
LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
|
||||
bool ProcessMessage(UINT nmsg, WPARAM wparam, LPARAM lparam, LRESULT* pres);
|
||||
int Command(int id, int code);
|
||||
int Notify(int id, NMHDR* pnmh);
|
||||
|
||||
virtual BOOL TranslateMsg(MSG* pmsg);
|
||||
|
||||
void toggle_child(HWND hwnd, UINT cmd, HWND hchild, int band_idx=-1);
|
||||
|
||||
void resize_frame_client();
|
||||
virtual void resize_frame(int cx, int cy);
|
||||
virtual void frame_get_clientspace(PRECT prect);
|
||||
|
||||
BOOL toggle_fullscreen();
|
||||
void fullscreen_move();
|
||||
|
||||
void FillBookmarks();
|
||||
virtual bool go_to(LPCTSTR url, bool new_window) {return false;}
|
||||
};
|
||||
|
||||
|
||||
struct MainFrame : public MainFrameBase
|
||||
{
|
||||
typedef MainFrameBase super;
|
||||
|
||||
MainFrame(HWND hwnd);
|
||||
|
||||
static HWND Create();
|
||||
//@@static HWND Create(LPCTSTR url);
|
||||
|
||||
protected:
|
||||
WindowHandle _left_hwnd;
|
||||
WindowHandle _right_hwnd;
|
||||
|
||||
int _split_pos;
|
||||
int _last_split;
|
||||
RECT _clnt_rect;
|
||||
|
||||
String _url;
|
||||
|
||||
LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
|
||||
int Command(int id, int code);
|
||||
|
||||
void resize_frame(int cx, int cy);
|
||||
void resize_children();
|
||||
void update_clnt_rect();
|
||||
|
||||
void set_url(LPCTSTR url);
|
||||
|
||||
virtual bool go_to(LPCTSTR url, bool new_window);
|
||||
};
|
||||
|
||||
|
||||
struct WebChildWndInfo : public ChildWndInfo
|
||||
{
|
||||
WebChildWndInfo(HWND hwndFrame, LPCTSTR url)
|
||||
: ChildWndInfo(hwndFrame),
|
||||
_url(url)
|
||||
{
|
||||
}
|
||||
|
||||
String _url;
|
||||
};
|
||||
|
172
reactos/base/applications/ibrowser/make_ibrowser.dsp
Normal file
|
@ -0,0 +1,172 @@
|
|||
# Microsoft Developer Studio Project File - Name="make_ibrowser" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) External Target" 0x0106
|
||||
|
||||
CFG=make_ibrowser - Win32 bjam
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "make_ibrowser.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "make_ibrowser.mak" CFG="make_ibrowser - Win32 bjam"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "make_ibrowser - Win32 Release" (based on "Win32 (x86) External Target")
|
||||
!MESSAGE "make_ibrowser - Win32 Debug" (based on "Win32 (x86) External Target")
|
||||
!MESSAGE "make_ibrowser - Win32 Unicode Debug" (based on "Win32 (x86) External Target")
|
||||
!MESSAGE "make_ibrowser - Win32 Unicode Release" (based on "Win32 (x86) External Target")
|
||||
!MESSAGE "make_ibrowser - Win32 bjam" (based on "Win32 (x86) External Target")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
|
||||
!IF "$(CFG)" == "make_ibrowser - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Cmd_Line "NMAKE /f make_ibrowser.mak"
|
||||
# PROP BASE Rebuild_Opt "/a"
|
||||
# PROP BASE Target_File "make_ibrowser.exe"
|
||||
# PROP BASE Bsc_Name "make_ibrowser.bsc"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.PCH UNICODE=0"
|
||||
# PROP Rebuild_Opt "clean all"
|
||||
# PROP Target_File "ibrowser.exe"
|
||||
# PROP Bsc_Name ""
|
||||
# PROP Target_Dir ""
|
||||
|
||||
!ELSEIF "$(CFG)" == "make_ibrowser - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Cmd_Line "NMAKE /f make_ibrowser.mak"
|
||||
# PROP BASE Rebuild_Opt "/a"
|
||||
# PROP BASE Target_File "make_ibrowser.exe"
|
||||
# PROP BASE Bsc_Name "make_ibrowser.bsc"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.PCH UNICODE=0 DEBUG=1"
|
||||
# PROP Rebuild_Opt "clean all"
|
||||
# PROP Target_File "ibrowser.exe"
|
||||
# PROP Bsc_Name "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=0 DEBUG=1"
|
||||
# PROP Target_Dir ""
|
||||
|
||||
!ELSEIF "$(CFG)" == "make_ibrowser - Win32 Unicode Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "UDebug"
|
||||
# PROP BASE Intermediate_Dir "UDebug"
|
||||
# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1 DEBUG=1"
|
||||
# PROP BASE Rebuild_Opt "clean all"
|
||||
# PROP BASE Target_File "ibrowser.exe"
|
||||
# PROP BASE Bsc_Name ""
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "UDebug"
|
||||
# PROP Intermediate_Dir "UDebug"
|
||||
# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1 DEBUG=1"
|
||||
# PROP Rebuild_Opt "clean all"
|
||||
# PROP Target_File "ibrowser.exe"
|
||||
# PROP Bsc_Name ""
|
||||
# PROP Target_Dir ""
|
||||
|
||||
!ELSEIF "$(CFG)" == "make_ibrowser - Win32 Unicode Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "URelease"
|
||||
# PROP BASE Intermediate_Dir "URelease"
|
||||
# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1"
|
||||
# PROP BASE Rebuild_Opt "clean all"
|
||||
# PROP BASE Target_File "ibrowser.exe"
|
||||
# PROP BASE Bsc_Name ""
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "URelease"
|
||||
# PROP Intermediate_Dir "URelease"
|
||||
# PROP Cmd_Line "msdevfilt -gcc make -f Makefile.PCH UNICODE=1"
|
||||
# PROP Rebuild_Opt "clean all"
|
||||
# PROP Target_File "ibrowser.exe"
|
||||
# PROP Bsc_Name ""
|
||||
# PROP Target_Dir ""
|
||||
|
||||
!ELSEIF "$(CFG)" == "make_ibrowser - Win32 bjam"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW DEBUG=1"
|
||||
# PROP BASE Rebuild_Opt "clean all"
|
||||
# PROP BASE Target_File "ibrowser.exe"
|
||||
# PROP BASE Bsc_Name ""
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" bjam"
|
||||
# PROP Rebuild_Opt "clean&bjam release"
|
||||
# PROP Target_File "ibrowser.exe"
|
||||
# PROP Bsc_Name ""
|
||||
# PROP Target_Dir ""
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "make_ibrowser - Win32 Release"
|
||||
# Name "make_ibrowser - Win32 Debug"
|
||||
# Name "make_ibrowser - Win32 Unicode Debug"
|
||||
# Name "make_ibrowser - Win32 Unicode Release"
|
||||
# Name "make_ibrowser - Win32 bjam"
|
||||
|
||||
!IF "$(CFG)" == "make_ibrowser - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "make_ibrowser - Win32 Debug"
|
||||
|
||||
!ELSEIF "$(CFG)" == "make_ibrowser - Win32 Unicode Debug"
|
||||
|
||||
!ELSEIF "$(CFG)" == "make_ibrowser - Win32 Unicode Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "make_ibrowser - Win32 bjam"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Makefile
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Makefile.MinGW
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Makefile.PCH
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
28
reactos/base/applications/ibrowser/precomp.cpp
Normal file
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* Copyright 2005 Martin Fuchs
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
//
|
||||
// ROS Internet Web Browser - precompiled header support
|
||||
//
|
||||
// precomp.h
|
||||
//
|
||||
// Martin Fuchs, 25.01.2005
|
||||
//
|
||||
|
||||
#include "precomp.h"
|
32
reactos/base/applications/ibrowser/precomp.h
Normal file
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Copyright 2005 Martin Fuchs
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
//
|
||||
// ROS Internet Web Browser - precompiled header support
|
||||
//
|
||||
// precomp.h
|
||||
//
|
||||
// Martin Fuchs, 25.01.2005
|
||||
//
|
||||
|
||||
#include "utility/utility.h"
|
||||
#include "utility/comutil.h"
|
||||
|
||||
#include "ibrowser.h"
|
||||
|
9
reactos/base/applications/ibrowser/readme.txt
Normal file
|
@ -0,0 +1,9 @@
|
|||
|
||||
IBrowser is a Web Browser User Interface similar derived from ROS Explorer.
|
||||
It encapsulates the Mozilla or MS Web Browser Control.
|
||||
|
||||
|
||||
For more information about ReactOS Explorer please look at the FAQ web page:
|
||||
|
||||
http://www.sky.franken.de/explorer/
|
||||
|
BIN
reactos/base/applications/ibrowser/res/dot.ico
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
reactos/base/applications/ibrowser/res/dot_red.ico
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
reactos/base/applications/ibrowser/res/dot_trans.ico
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
reactos/base/applications/ibrowser/res/favorites.ico
Normal file
After Width: | Height: | Size: 9.2 KiB |
BIN
reactos/base/applications/ibrowser/res/ibrowser.ico
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
reactos/base/applications/ibrowser/res/network.ico
Normal file
After Width: | Height: | Size: 8.8 KiB |
BIN
reactos/base/applications/ibrowser/res/reactos.ico
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
reactos/base/applications/ibrowser/res/toolbar.bmp
Normal file
After Width: | Height: | Size: 4.3 KiB |
321
reactos/base/applications/ibrowser/utility/comutil.h
Normal file
|
@ -0,0 +1,321 @@
|
|||
/*
|
||||
* Copyright 2005 Martin Fuchs
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
//
|
||||
// ROS Internet Web Browser
|
||||
//
|
||||
// comutil.h
|
||||
//
|
||||
// C++ wrapper classes for COM interfaces
|
||||
//
|
||||
// Martin Fuchs, 25.01.2005
|
||||
//
|
||||
|
||||
|
||||
// windows shell headers
|
||||
#include <shellapi.h>
|
||||
#include <shlobj.h>
|
||||
|
||||
/*@@
|
||||
#if _MSC_VER>=1300 // VS.Net
|
||||
#include <comdefsp.h>
|
||||
using namespace _com_util;
|
||||
#endif
|
||||
*/
|
||||
|
||||
#ifndef _INC_COMUTIL // is comutil.h of MS headers not available?
|
||||
#ifndef _NO_COMUTIL
|
||||
#define _NO_COMUTIL
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
// Exception Handling
|
||||
|
||||
#ifndef _NO_COMUTIL
|
||||
|
||||
#define COMExceptionBase _com_error
|
||||
|
||||
#else
|
||||
|
||||
/// COM ExceptionBase class as replacement for _com_error
|
||||
struct COMExceptionBase
|
||||
{
|
||||
COMExceptionBase(HRESULT hr)
|
||||
: _hr(hr)
|
||||
{
|
||||
}
|
||||
|
||||
HRESULT Error() const
|
||||
{
|
||||
return _hr;
|
||||
}
|
||||
|
||||
LPCTSTR ErrorMessage() const
|
||||
{
|
||||
if (_msg.empty()) {
|
||||
LPTSTR pBuf;
|
||||
|
||||
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
|
||||
0, _hr, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (LPTSTR)&pBuf, 0, NULL)) {
|
||||
_msg = pBuf;
|
||||
LocalFree(pBuf);
|
||||
} else {
|
||||
TCHAR buffer[128];
|
||||
_stprintf(buffer, TEXT("unknown Exception: 0x%08lX"), _hr);
|
||||
_msg = buffer;
|
||||
}
|
||||
}
|
||||
|
||||
return _msg;
|
||||
}
|
||||
|
||||
protected:
|
||||
HRESULT _hr;
|
||||
mutable String _msg;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/// Exception with context information
|
||||
|
||||
struct COMException : public COMExceptionBase
|
||||
{
|
||||
typedef COMExceptionBase super;
|
||||
|
||||
COMException(HRESULT hr)
|
||||
: super(hr),
|
||||
_context(CURRENT_CONTEXT),
|
||||
_file(NULL), _line(0)
|
||||
{
|
||||
LOG(toString());
|
||||
LOG(CURRENT_CONTEXT.getStackTrace());
|
||||
}
|
||||
|
||||
COMException(HRESULT hr, const char* file, int line)
|
||||
: super(hr),
|
||||
_context(CURRENT_CONTEXT),
|
||||
_file(file), _line(line)
|
||||
{
|
||||
LOG(toString());
|
||||
LOG(CURRENT_CONTEXT.getStackTrace());
|
||||
}
|
||||
|
||||
COMException(HRESULT hr, const String& obj)
|
||||
: super(hr),
|
||||
_context(CURRENT_CONTEXT),
|
||||
_file(NULL), _line(0)
|
||||
{
|
||||
LOG(toString());
|
||||
LOG(CURRENT_CONTEXT.getStackTrace());
|
||||
}
|
||||
|
||||
COMException(HRESULT hr, const String& obj, const char* file, int line)
|
||||
: super(hr),
|
||||
_context(CURRENT_CONTEXT),
|
||||
_file(file), _line(line)
|
||||
{
|
||||
LOG(toString());
|
||||
LOG(CURRENT_CONTEXT.getStackTrace());
|
||||
}
|
||||
|
||||
String toString() const;
|
||||
|
||||
Context _context;
|
||||
|
||||
const char* _file;
|
||||
int _line;
|
||||
};
|
||||
|
||||
#define THROW_EXCEPTION(hr) throw COMException(hr, __FILE__, __LINE__)
|
||||
#define CHECKERROR(hr) ((void)(FAILED(hr)? THROW_EXCEPTION(hr): 0))
|
||||
|
||||
|
||||
#ifdef _NO_COMUTIL
|
||||
|
||||
inline void CheckError(HRESULT hr)
|
||||
{
|
||||
if (FAILED(hr))
|
||||
throw COMException(hr);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/// COM Initialisation
|
||||
|
||||
struct ComInit
|
||||
{
|
||||
ComInit()
|
||||
{
|
||||
CHECKERROR(CoInitialize(0));
|
||||
}
|
||||
|
||||
#if (_WIN32_WINNT>=0x0400) || defined(_WIN32_DCOM)
|
||||
ComInit(DWORD flag)
|
||||
{
|
||||
CHECKERROR(CoInitializeEx(0, flag));
|
||||
}
|
||||
#endif
|
||||
|
||||
~ComInit()
|
||||
{
|
||||
CoUninitialize();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/// OLE initialisation for drag drop support
|
||||
|
||||
struct OleInit
|
||||
{
|
||||
OleInit()
|
||||
{
|
||||
CHECKERROR(OleInitialize(0));
|
||||
}
|
||||
|
||||
~OleInit()
|
||||
{
|
||||
OleUninitialize();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/// Exception Handler for COM exceptions
|
||||
|
||||
extern void HandleException(COMException& e, HWND hwnd);
|
||||
|
||||
|
||||
/// wrapper class for COM interface pointers
|
||||
|
||||
template<typename T> struct SIfacePtr
|
||||
{
|
||||
SIfacePtr()
|
||||
: _p(0)
|
||||
{
|
||||
}
|
||||
|
||||
SIfacePtr(T* p)
|
||||
: _p(p)
|
||||
{
|
||||
if (p)
|
||||
p->AddRef();
|
||||
}
|
||||
|
||||
SIfacePtr(IUnknown* unknown, REFIID riid)
|
||||
{
|
||||
CHECKERROR(unknown->QueryInterface(riid, (LPVOID*)&_p));
|
||||
}
|
||||
|
||||
~SIfacePtr()
|
||||
{
|
||||
Free();
|
||||
}
|
||||
|
||||
T* operator->()
|
||||
{
|
||||
return _p;
|
||||
}
|
||||
|
||||
const T* operator->() const
|
||||
{
|
||||
return _p;
|
||||
}
|
||||
|
||||
/* not GCC compatible
|
||||
operator const T*() const
|
||||
{
|
||||
return _p;
|
||||
} */
|
||||
|
||||
operator T*()
|
||||
{
|
||||
return _p;
|
||||
}
|
||||
|
||||
T** operator&()
|
||||
{
|
||||
return &_p;
|
||||
}
|
||||
|
||||
bool empty() const //NOTE: GCC seems not to work correctly when defining operator bool() AND operator T*() at one time
|
||||
{
|
||||
return !_p;
|
||||
}
|
||||
|
||||
SIfacePtr& operator=(T* p)
|
||||
{
|
||||
Free();
|
||||
|
||||
if (p) {
|
||||
p->AddRef();
|
||||
_p = p;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
void operator=(SIfacePtr const& o)
|
||||
{
|
||||
T* h = _p;
|
||||
|
||||
if (o._p)
|
||||
o._p->AddRef();
|
||||
|
||||
_p = o._p;
|
||||
|
||||
if (h)
|
||||
h->Release();
|
||||
}
|
||||
|
||||
HRESULT CreateInstance(REFIID clsid, REFIID riid)
|
||||
{
|
||||
return CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, riid, (LPVOID*)&_p);
|
||||
}
|
||||
|
||||
template<typename I> HRESULT QueryInterface(REFIID riid, I* p)
|
||||
{
|
||||
return _p->QueryInterface(riid, (LPVOID*)p);
|
||||
}
|
||||
|
||||
T* get()
|
||||
{
|
||||
return _p;
|
||||
}
|
||||
|
||||
void Free()
|
||||
{
|
||||
T* h = _p;
|
||||
_p = NULL;
|
||||
|
||||
if (h)
|
||||
h->Release();
|
||||
}
|
||||
|
||||
protected:
|
||||
SIfacePtr(const SIfacePtr& o)
|
||||
: _p(o._p)
|
||||
{
|
||||
if (_p)
|
||||
_p->AddRef();
|
||||
}
|
||||
|
||||
T* _p;
|
||||
};
|
419
reactos/base/applications/ibrowser/utility/utility.cpp
Normal file
|
@ -0,0 +1,419 @@
|
|||
/*
|
||||
* Copyright 2003, 2004, 2005 Martin Fuchs
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
//
|
||||
// Explorer clone
|
||||
//
|
||||
// utility.cpp
|
||||
//
|
||||
// Martin Fuchs, 23.07.2003
|
||||
//
|
||||
|
||||
|
||||
#include <precomp.h>
|
||||
|
||||
//#include <shellapi.h>
|
||||
|
||||
#include <time.h>
|
||||
#include <sstream>
|
||||
|
||||
|
||||
DWORD WINAPI Thread::ThreadProc(void* para)
|
||||
{
|
||||
Thread* pThis = (Thread*) para;
|
||||
|
||||
int ret = pThis->Run();
|
||||
|
||||
pThis->_alive = false;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void CenterWindow(HWND hwnd)
|
||||
{
|
||||
RECT rt, prt;
|
||||
GetWindowRect(hwnd, &rt);
|
||||
|
||||
DWORD style;
|
||||
HWND owner = 0;
|
||||
|
||||
for(HWND wh=hwnd; (wh=GetWindow(wh,GW_OWNER))!=0; )
|
||||
if (((style=GetWindowStyle(wh))&WS_VISIBLE) && !(style&WS_MINIMIZE))
|
||||
{owner=wh; break;}
|
||||
|
||||
if (owner)
|
||||
GetWindowRect(owner, &prt);
|
||||
else
|
||||
SystemParametersInfo(SPI_GETWORKAREA, 0, &prt, 0); //@@ GetDesktopWindow() wäre auch hilfreich.
|
||||
|
||||
SetWindowPos(hwnd, 0, (prt.left+prt.right+rt.left-rt.right)/2,
|
||||
(prt.top+prt.bottom+rt.top-rt.bottom)/2, 0,0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER);
|
||||
|
||||
MoveVisible(hwnd);
|
||||
}
|
||||
|
||||
void MoveVisible(HWND hwnd)
|
||||
{
|
||||
RECT rc;
|
||||
GetWindowRect(hwnd, &rc);
|
||||
int left=rc.left, top=rc.top;
|
||||
|
||||
int xmax = GetSystemMetrics(SM_CXSCREEN);
|
||||
int ymax = GetSystemMetrics(SM_CYSCREEN);
|
||||
|
||||
if (rc.left < 0)
|
||||
rc.left = 0;
|
||||
else if (rc.right > xmax)
|
||||
if ((rc.left-=rc.right-xmax) < 0)
|
||||
rc.left = 0;
|
||||
|
||||
if (rc.top < 0)
|
||||
rc.top = 0;
|
||||
else if (rc.bottom > ymax)
|
||||
if ((rc.top-=rc.bottom-ymax) < 0)
|
||||
rc.top = 0;
|
||||
|
||||
if (rc.left!=left || rc.top!=top)
|
||||
SetWindowPos(hwnd, 0, rc.left,rc.top, 0,0, SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE);
|
||||
}
|
||||
|
||||
|
||||
void display_error(HWND hwnd, DWORD error) //@@ CONTEXT mit ausgeben -> display_error(HWND hwnd, const Exception& e)
|
||||
{
|
||||
PTSTR msg;
|
||||
|
||||
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
|
||||
0, error, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (PTSTR)&msg, 0, NULL)) {
|
||||
LOG(FmtString(TEXT("display_error(%#x): %s"), error, msg));
|
||||
|
||||
SetLastError(0);
|
||||
MessageBox(hwnd, msg, TEXT("ROS Explorer"), MB_OK);
|
||||
|
||||
if (GetLastError() == ERROR_INVALID_WINDOW_HANDLE)
|
||||
MessageBox(0, msg, TEXT("ROS Explorer"), MB_OK);
|
||||
} else {
|
||||
LOG(FmtString(TEXT("Unknown Error %#x"), error));
|
||||
|
||||
FmtString msg(TEXT("Unknown Error %#x"), error);
|
||||
|
||||
SetLastError(0);
|
||||
MessageBox(hwnd, msg, TEXT("ROS Explorer"), MB_OK);
|
||||
|
||||
if (GetLastError() == ERROR_INVALID_WINDOW_HANDLE)
|
||||
MessageBox(0, msg, TEXT("ROS Explorer"), MB_OK);
|
||||
}
|
||||
|
||||
LocalFree(msg);
|
||||
}
|
||||
|
||||
|
||||
Context Context::s_main("-NO-CONTEXT-");
|
||||
Context* Context::s_current = &Context::s_main;
|
||||
|
||||
String Context::toString() const
|
||||
{
|
||||
String str = _ctx;
|
||||
|
||||
if (!_obj.empty())
|
||||
str.appendf(TEXT("\nObject: %s"), (LPCTSTR)_obj);
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
String Context::getStackTrace() const
|
||||
{
|
||||
ostringstream str;
|
||||
|
||||
str << "Context Trace:\n";
|
||||
|
||||
for(const Context*p=this; p && p!=&s_main; p=p->_last) {
|
||||
str << "- " << p->_ctx;
|
||||
|
||||
if (!p->_obj.empty())
|
||||
str << " obj=" << ANS(p->_obj);
|
||||
|
||||
str << '\n';
|
||||
}
|
||||
|
||||
return str.str();
|
||||
}
|
||||
|
||||
|
||||
BOOL time_to_filetime(const time_t* t, FILETIME* ftime)
|
||||
{
|
||||
struct tm* tm = gmtime(t);
|
||||
SYSTEMTIME stime;
|
||||
|
||||
if (!tm)
|
||||
return FALSE;
|
||||
|
||||
stime.wYear = tm->tm_year+1900;
|
||||
stime.wMonth = tm->tm_mon+1;
|
||||
stime.wDayOfWeek = (WORD)-1;
|
||||
stime.wDay = tm->tm_mday;
|
||||
stime.wHour = tm->tm_hour;
|
||||
stime.wMinute = tm->tm_min;
|
||||
stime.wSecond = tm->tm_sec;
|
||||
stime.wMilliseconds = 0;
|
||||
|
||||
return SystemTimeToFileTime(&stime, ftime);
|
||||
}
|
||||
|
||||
|
||||
BOOL launch_file(HWND hwnd, LPCTSTR cmd, UINT nCmdShow, LPCTSTR parameters)
|
||||
{
|
||||
CONTEXT("launch_file()");
|
||||
|
||||
HINSTANCE hinst = ShellExecute(hwnd, NULL/*operation*/, cmd, parameters, NULL/*dir*/, nCmdShow);
|
||||
|
||||
if ((int)hinst <= 32) {
|
||||
display_error(hwnd, GetLastError());
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#ifdef UNICODE
|
||||
BOOL launch_fileA(HWND hwnd, LPSTR cmd, UINT nCmdShow, LPCSTR parameters)
|
||||
{
|
||||
HINSTANCE hinst = ShellExecuteA(hwnd, NULL/*operation*/, cmd, parameters, NULL/*dir*/, nCmdShow);
|
||||
|
||||
if ((int)hinst <= 32) {
|
||||
display_error(hwnd, GetLastError());
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* search for already running instance */
|
||||
|
||||
static int g_foundPrevInstance = 0;
|
||||
|
||||
static BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lparam)
|
||||
{
|
||||
TCHAR cls[128];
|
||||
|
||||
GetClassName(hwnd, cls, 128);
|
||||
|
||||
if (!lstrcmp(cls, (LPCTSTR)lparam)) {
|
||||
g_foundPrevInstance++;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* search for window of given class name to allow only one running instance */
|
||||
int find_window_class(LPCTSTR classname)
|
||||
{
|
||||
EnumWindows(EnumWndProc, (LPARAM)classname);
|
||||
|
||||
if (g_foundPrevInstance)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
typedef void (WINAPI*RUNDLLPROC)(HWND hwnd, HINSTANCE hinst, LPCTSTR cmdline, DWORD nCmdShow);
|
||||
|
||||
BOOL RunDLL(HWND hwnd, LPCTSTR dllname, LPCSTR procname, LPCTSTR cmdline, UINT nCmdShow)
|
||||
{
|
||||
HMODULE hmod = LoadLibrary(dllname);
|
||||
if (!hmod)
|
||||
return FALSE;
|
||||
|
||||
/*TODO
|
||||
<Windows NT/2000>
|
||||
It is possible to create a Unicode version of the function.
|
||||
Rundll32 first tries to find a function named EntryPointW.
|
||||
If it cannot find this function, it tries EntryPointA, then EntryPoint.
|
||||
To create a DLL that supports ANSI on Windows 95/98/Me and Unicode otherwise,
|
||||
export two functions: EntryPointW and EntryPoint.
|
||||
*/
|
||||
RUNDLLPROC proc = (RUNDLLPROC)GetProcAddress(hmod, procname);
|
||||
if (!proc) {
|
||||
FreeLibrary(hmod);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
proc(hwnd, hmod, cmdline, nCmdShow);
|
||||
|
||||
FreeLibrary(hmod);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
BOOL launch_cpanel(HWND hwnd, LPCTSTR applet)
|
||||
{
|
||||
//launch_file(_hwnd, applet, SW_SHOWNORMAL); // This would be enough, but we want the fastest solution.
|
||||
//launch_file(_hwnd, TEXT("rundll32.exe /d shell32.dll,Control_RunDLL ")+applet, SW_SHOWNORMAL);
|
||||
|
||||
return RunDLL(hwnd, TEXT("shell32"), "Control_RunDLL", applet, SW_SHOWNORMAL);
|
||||
}
|
||||
|
||||
|
||||
BOOL RecursiveCreateDirectory(LPCTSTR path_in)
|
||||
{
|
||||
TCHAR path[MAX_PATH], hole_path[MAX_PATH];
|
||||
|
||||
_tcscpy(hole_path, path_in);
|
||||
|
||||
int drv_len = 0;
|
||||
LPCTSTR d;
|
||||
|
||||
for(d=hole_path; *d && *d!='/' && *d!='\\'; ++d) {
|
||||
++drv_len;
|
||||
|
||||
if (*d == ':')
|
||||
break;
|
||||
}
|
||||
|
||||
LPTSTR dir = hole_path + drv_len;
|
||||
|
||||
int l;
|
||||
LPTSTR p = hole_path + (l=_tcslen(hole_path));
|
||||
|
||||
while(--p>=hole_path && (*p=='/' || *p=='\\'))
|
||||
*p = '\0';
|
||||
|
||||
WIN32_FIND_DATA w32fd;
|
||||
|
||||
HANDLE hFind = FindFirstFile(hole_path, &w32fd);
|
||||
|
||||
if (hFind == INVALID_HANDLE_VALUE) {
|
||||
_tcsncpy(path, hole_path, drv_len);
|
||||
int i = drv_len;
|
||||
|
||||
for(p=dir; *p=='/'||*p=='\\'; p++)
|
||||
path[i++] = *p++;
|
||||
|
||||
for(; i<l; i++) {
|
||||
memcpy(path, hole_path, i*sizeof(TCHAR));
|
||||
|
||||
for(; hole_path[i] && hole_path[i]!='/' && hole_path[i]!='\\'; i++)
|
||||
path[i] = hole_path[i];
|
||||
|
||||
path[i] = '\0';
|
||||
|
||||
hFind = FindFirstFile(path, &w32fd);
|
||||
|
||||
if (hFind != INVALID_HANDLE_VALUE)
|
||||
FindClose(hFind);
|
||||
else {
|
||||
LOG(FmtString(TEXT("CreateDirectory(\"%s\")"), path));
|
||||
|
||||
if (!CreateDirectory(path, 0))
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
} else
|
||||
FindClose(hFind);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
BOOL exists_path(LPCTSTR path)
|
||||
{
|
||||
WIN32_FIND_DATA fd;
|
||||
|
||||
HANDLE hfind = FindFirstFile(path, &fd);
|
||||
|
||||
if (hfind != INVALID_HANDLE_VALUE) {
|
||||
FindClose(hfind);
|
||||
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
bool SplitFileSysURL(LPCTSTR url, String& dir_out, String& fname_out)
|
||||
{
|
||||
if (!_tcsnicmp(url, TEXT("file://"), 7)) {
|
||||
url += 7;
|
||||
|
||||
// remove third slash in front of drive characters
|
||||
if (*url == '/')
|
||||
++url;
|
||||
}
|
||||
|
||||
if (exists_path(url)) {
|
||||
TCHAR path[_MAX_PATH];
|
||||
|
||||
// convert slashes to back slashes
|
||||
GetFullPathName(url, _MAX_PATH, path, NULL);
|
||||
|
||||
if (GetFileAttributes(path) & FILE_ATTRIBUTE_DIRECTORY)
|
||||
fname_out.erase();
|
||||
else {
|
||||
TCHAR drv[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
|
||||
|
||||
_tsplitpath(path, drv, dir, fname, ext);
|
||||
_stprintf(path, TEXT("%s%s"), drv, dir);
|
||||
|
||||
fname_out.printf(TEXT("%s%s"), fname, ext);
|
||||
}
|
||||
|
||||
dir_out = path;
|
||||
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/// Exception Handler for COM exceptions
|
||||
|
||||
void HandleException(COMException& e, HWND hwnd)
|
||||
{
|
||||
String msg = e.toString();
|
||||
|
||||
SetLastError(0);
|
||||
|
||||
if (hwnd && !IsWindowVisible(hwnd))
|
||||
hwnd = 0;
|
||||
|
||||
MessageBox(hwnd, msg, TEXT("ShellClasses Exception"), MB_ICONHAND|MB_OK);
|
||||
|
||||
// If displaying the error message box _with_ parent was not successfull, display it now without a parent window.
|
||||
if (GetLastError() == ERROR_INVALID_WINDOW_HANDLE)
|
||||
MessageBox(0, msg, TEXT("ShellClasses Exception"), MB_ICONHAND|MB_OK);
|
||||
}
|
||||
|
||||
|
||||
String COMException::toString() const
|
||||
{
|
||||
TCHAR msg[4*BUFFER_LEN];
|
||||
LPTSTR p = msg;
|
||||
|
||||
p += _stprintf(p, TEXT("%s\nContext: %s"), super::ErrorMessage(), (LPCTSTR)_context.toString());
|
||||
|
||||
if (_file)
|
||||
p += _stprintf(p, TEXT("\nLocation: %hs:%d"), _file, _line);
|
||||
|
||||
return msg;
|
||||
}
|
1022
reactos/base/applications/ibrowser/utility/utility.h
Normal file
1206
reactos/base/applications/ibrowser/utility/window.cpp
Normal file
1100
reactos/base/applications/ibrowser/utility/window.h
Normal file
623
reactos/base/applications/ibrowser/utility/xmlstorage.cpp
Normal file
|
@ -0,0 +1,623 @@
|
|||
|
||||
//
|
||||
// XML storage classes
|
||||
//
|
||||
// xmlstorage.cpp
|
||||
//
|
||||
// Copyright (c) 2004, 2005 Martin Fuchs <martin-fuchs@gmx.net>
|
||||
//
|
||||
|
||||
|
||||
/*
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
//#include "xmlstorage.h"
|
||||
#include <precomp.h>
|
||||
|
||||
|
||||
// work around GCC's wide string constant bug
|
||||
#ifdef __GNUC__
|
||||
const LPCXSSTR XMLStorage::XS_TRUE = XS_TEXT("true");
|
||||
const LPCXSSTR XMLStorage::XS_FALSE = XS_TEXT("false");
|
||||
const LPCXSSTR XMLStorage::XS_NUMBERFMT = XS_TEXT("%d");
|
||||
#endif
|
||||
|
||||
|
||||
namespace XMLStorage {
|
||||
|
||||
|
||||
static std::string unescape(const char* s, char b='"', char e='"')
|
||||
{
|
||||
const char* end = s + strlen(s);
|
||||
|
||||
// if (*s == b)
|
||||
// ++s;
|
||||
//
|
||||
// if (end>s && end[-1]==e)
|
||||
// --end;
|
||||
|
||||
if (*s == b)
|
||||
if (end>s && end[-1]==e)
|
||||
++s, --end;
|
||||
|
||||
return std::string(s, end-s);
|
||||
}
|
||||
|
||||
static std::string unescape(const char* s, int l, char b='"', char e='"')
|
||||
{
|
||||
const char* end = s + l;
|
||||
|
||||
// if (*s == b)
|
||||
// ++s;
|
||||
//
|
||||
// if (end>s && end[-1]==e)
|
||||
// --end;
|
||||
|
||||
if (*s == b)
|
||||
if (end>s && end[-1]==e)
|
||||
++s, --end;
|
||||
|
||||
return std::string(s, end-s);
|
||||
}
|
||||
|
||||
|
||||
/// move XPath like to position in XML tree
|
||||
bool XMLPos::go(const char* path)
|
||||
{
|
||||
XMLNode* node = _cur;
|
||||
|
||||
// Is this an absolute path?
|
||||
if (*path == '/') {
|
||||
node = _root;
|
||||
++path;
|
||||
}
|
||||
|
||||
node = node->find_relative(path);
|
||||
|
||||
if (node) {
|
||||
go_to(node);
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
|
||||
/// move XPath like to position in XML tree
|
||||
bool const_XMLPos::go(const char* path)
|
||||
{
|
||||
const XMLNode* node = _cur;
|
||||
|
||||
// Is this an absolute path?
|
||||
if (*path == '/') {
|
||||
node = _root;
|
||||
++path;
|
||||
}
|
||||
|
||||
node = node->find_relative(path);
|
||||
|
||||
if (node) {
|
||||
go_to(node);
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
const XMLNode* XMLNode::find_relative(const char* path) const
|
||||
{
|
||||
const XMLNode* node = this;
|
||||
|
||||
// parse relative path
|
||||
while(*path) {
|
||||
const char* slash = strchr(path, '/');
|
||||
if (slash == path)
|
||||
return NULL;
|
||||
|
||||
int l = slash? slash-path: strlen(path);
|
||||
std::string comp(path, l);
|
||||
path += l;
|
||||
|
||||
// look for [n] and [@attr_name="attr_value"] expressions in path components
|
||||
const char* bracket = strchr(comp.c_str(), '[');
|
||||
l = bracket? bracket-comp.c_str(): comp.length();
|
||||
std::string child_name(comp.c_str(), l);
|
||||
std::string attr_name, attr_value;
|
||||
|
||||
int n = 0;
|
||||
if (bracket) {
|
||||
std::string expr = unescape(bracket, '[', ']');
|
||||
const char* p = expr.c_str();
|
||||
|
||||
n = atoi(p); // read index number
|
||||
|
||||
if (n)
|
||||
n = n - 1; // convert into zero based index
|
||||
|
||||
const char* at = strchr(p, '@');
|
||||
|
||||
if (at) {
|
||||
p = at + 1;
|
||||
const char* equal = strchr(p, '=');
|
||||
|
||||
// read attribute name and value
|
||||
if (equal) {
|
||||
attr_name = unescape(p, equal-p);
|
||||
attr_value = unescape(equal+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (attr_name.empty())
|
||||
// search n.th child node with specified name
|
||||
node = node->find(child_name, n);
|
||||
else
|
||||
// search n.th child node with specified name and matching attribute value
|
||||
node = node->find(child_name, attr_name, attr_value, n);
|
||||
|
||||
if (!node)
|
||||
return NULL;
|
||||
|
||||
if (*path == '/')
|
||||
++path;
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
XMLNode* XMLNode::create_relative(const char* path)
|
||||
{
|
||||
XMLNode* node = this;
|
||||
|
||||
// parse relative path
|
||||
while(*path) {
|
||||
const char* slash = strchr(path, '/');
|
||||
if (slash == path)
|
||||
return NULL;
|
||||
|
||||
int l = slash? slash-path: strlen(path);
|
||||
std::string comp(path, l);
|
||||
path += l;
|
||||
|
||||
// look for [n] and [@attr_name="attr_value"] expressions in path components
|
||||
const char* bracket = strchr(comp.c_str(), '[');
|
||||
l = bracket? bracket-comp.c_str(): comp.length();
|
||||
std::string child_name(comp.c_str(), l);
|
||||
std::string attr_name, attr_value;
|
||||
|
||||
int n = 0;
|
||||
if (bracket) {
|
||||
std::string expr = unescape(bracket, '[', ']');
|
||||
const char* p = expr.c_str();
|
||||
|
||||
n = atoi(p); // read index number
|
||||
|
||||
if (n)
|
||||
n = n - 1; // convert into zero based index
|
||||
|
||||
const char* at = strchr(p, '@');
|
||||
|
||||
if (at) {
|
||||
p = at + 1;
|
||||
const char* equal = strchr(p, '=');
|
||||
|
||||
// read attribute name and value
|
||||
if (equal) {
|
||||
attr_name = unescape(p, equal-p);
|
||||
attr_value = unescape(equal+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
XMLNode* child;
|
||||
|
||||
if (attr_name.empty())
|
||||
// search n.th child node with specified name
|
||||
child = node->find(child_name, n);
|
||||
else
|
||||
// search n.th child node with specified name and matching attribute value
|
||||
child = node->find(child_name, attr_name, attr_value, n);
|
||||
|
||||
if (!child) {
|
||||
child = new XMLNode(child_name);
|
||||
node->add_child(child);
|
||||
|
||||
if (!attr_name.empty())
|
||||
(*node)[attr_name] = attr_value;
|
||||
}
|
||||
|
||||
node = child;
|
||||
|
||||
if (*path == '/')
|
||||
++path;
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
|
||||
/// read XML stream into XML tree below _pos
|
||||
XML_Status XMLReaderBase::read()
|
||||
{
|
||||
XML_Status status = XML_STATUS_OK;
|
||||
|
||||
while(status == XML_STATUS_OK) {
|
||||
char* buffer = (char*) XML_GetBuffer(_parser, BUFFER_LEN);
|
||||
|
||||
int l = read_buffer(buffer, BUFFER_LEN);
|
||||
if (l < 0)
|
||||
break;
|
||||
|
||||
status = XML_ParseBuffer(_parser, l, false);
|
||||
}
|
||||
|
||||
if (status != XML_STATUS_ERROR)
|
||||
status = XML_ParseBuffer(_parser, 0, true);
|
||||
|
||||
if (_pos->_children.empty())
|
||||
_pos->_trailing.append(_content);
|
||||
else
|
||||
_pos->_children.back()->_trailing.append(_content);
|
||||
|
||||
_content.erase();
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
/// store XML version and encoding into XML reader
|
||||
void XMLCALL XMLReaderBase::XML_XmlDeclHandler(void* userData, const XML_Char* version, const XML_Char* encoding, int standalone)
|
||||
{
|
||||
XMLReaderBase* pReader = (XMLReaderBase*) userData;
|
||||
|
||||
if (version)
|
||||
pReader->_xml_version = version;
|
||||
|
||||
if (encoding)
|
||||
pReader->_encoding = encoding;
|
||||
}
|
||||
|
||||
/// notifications about XML start tag
|
||||
void XMLCALL XMLReaderBase::XML_StartElementHandler(void* userData, const XML_Char* name, const XML_Char** atts)
|
||||
{
|
||||
XMLReaderBase* pReader = (XMLReaderBase*) userData;
|
||||
XMLPos& pos = pReader->_pos;
|
||||
|
||||
// search for end of first line
|
||||
const char* s = pReader->_content.c_str();
|
||||
const char* p = s;
|
||||
const char* e = p + pReader->_content.length();
|
||||
|
||||
for(; p<e; ++p)
|
||||
if (*p == '\n') {
|
||||
++p;
|
||||
break;
|
||||
}
|
||||
|
||||
if (p != s)
|
||||
if (pos->_children.empty()) { // no children in last node?
|
||||
if (pReader->_last_tag == TAG_START)
|
||||
pos->_content.append(s, p-s);
|
||||
else if (pReader->_last_tag == TAG_END)
|
||||
pos->_trailing.append(s, p-s);
|
||||
// else TAG_NONE -> don't store white space in root node
|
||||
} else
|
||||
pos->_children.back()->_trailing.append(s, p-s);
|
||||
|
||||
std::string leading;
|
||||
|
||||
if (p != e)
|
||||
leading.assign(p, e-p);
|
||||
|
||||
XMLNode* node = new XMLNode(String_from_XML_Char(name), leading);
|
||||
|
||||
pos.add_down(node);
|
||||
|
||||
while(*atts) {
|
||||
const XML_Char* attr_name = *atts++;
|
||||
const XML_Char* attr_value = *atts++;
|
||||
|
||||
(*node)[String_from_XML_Char(attr_name)] = String_from_XML_Char(attr_value);
|
||||
}
|
||||
|
||||
pReader->_last_tag = TAG_START;
|
||||
pReader->_content.erase();
|
||||
}
|
||||
|
||||
/// notifications about XML end tag
|
||||
void XMLCALL XMLReaderBase::XML_EndElementHandler(void* userData, const XML_Char* name)
|
||||
{
|
||||
XMLReaderBase* pReader = (XMLReaderBase*) userData;
|
||||
XMLPos& pos = pReader->_pos;
|
||||
|
||||
// search for end of first line
|
||||
const char* s = pReader->_content.c_str();
|
||||
const char* p = s;
|
||||
const char* e = p + pReader->_content.length();
|
||||
|
||||
for(; p<e; ++p)
|
||||
if (*p == '\n') {
|
||||
++p;
|
||||
break;
|
||||
}
|
||||
|
||||
if (p != s)
|
||||
if (pos->_children.empty()) // no children in current node?
|
||||
pos->_content.append(s, p-s);
|
||||
else
|
||||
if (pReader->_last_tag == TAG_START)
|
||||
pos->_content.append(s, p-s);
|
||||
else
|
||||
pos->_children.back()->_trailing.append(s, p-s);
|
||||
|
||||
if (p != e)
|
||||
pos->_end_leading.assign(p, e-p);
|
||||
|
||||
pos.back();
|
||||
|
||||
pReader->_last_tag = TAG_END;
|
||||
pReader->_content.erase();
|
||||
}
|
||||
|
||||
/// store content, white space and comments
|
||||
void XMLCALL XMLReaderBase::XML_DefaultHandler(void* userData, const XML_Char* s, int len)
|
||||
{
|
||||
XMLReaderBase* pReader = (XMLReaderBase*) userData;
|
||||
|
||||
pReader->_content.append(s, len);
|
||||
}
|
||||
|
||||
|
||||
std::string XMLReaderBase::get_error_string() const
|
||||
{
|
||||
XML_Error error = XML_GetErrorCode(_parser);
|
||||
|
||||
switch(error) {
|
||||
case XML_ERROR_NONE: return "XML_ERROR_NONE";
|
||||
case XML_ERROR_NO_MEMORY: return "XML_ERROR_NO_MEMORY";
|
||||
case XML_ERROR_SYNTAX: return "XML_ERROR_SYNTAX";
|
||||
case XML_ERROR_NO_ELEMENTS: return "XML_ERROR_NO_ELEMENTS";
|
||||
case XML_ERROR_INVALID_TOKEN: return "XML_ERROR_INVALID_TOKEN";
|
||||
case XML_ERROR_UNCLOSED_TOKEN: return "XML_ERROR_UNCLOSED_TOKEN";
|
||||
case XML_ERROR_PARTIAL_CHAR: return "XML_ERROR_PARTIAL_CHAR";
|
||||
case XML_ERROR_TAG_MISMATCH: return "XML_ERROR_TAG_MISMATCH";
|
||||
case XML_ERROR_DUPLICATE_ATTRIBUTE: return "XML_ERROR_DUPLICATE_ATTRIBUTE";
|
||||
case XML_ERROR_JUNK_AFTER_DOC_ELEMENT: return "XML_ERROR_JUNK_AFTER_DOC_ELEMENT";
|
||||
case XML_ERROR_PARAM_ENTITY_REF: return "XML_ERROR_PARAM_ENTITY_REF";
|
||||
case XML_ERROR_UNDEFINED_ENTITY: return "XML_ERROR_UNDEFINED_ENTITY";
|
||||
case XML_ERROR_RECURSIVE_ENTITY_REF: return "XML_ERROR_RECURSIVE_ENTITY_REF";
|
||||
case XML_ERROR_ASYNC_ENTITY: return "XML_ERROR_ASYNC_ENTITY";
|
||||
case XML_ERROR_BAD_CHAR_REF: return "XML_ERROR_BAD_CHAR_REF";
|
||||
case XML_ERROR_BINARY_ENTITY_REF: return "XML_ERROR_BINARY_ENTITY_REF";
|
||||
case XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF: return "XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF";
|
||||
case XML_ERROR_MISPLACED_XML_PI: return "XML_ERROR_MISPLACED_XML_PI";
|
||||
case XML_ERROR_UNKNOWN_ENCODING: return "XML_ERROR_UNKNOWN_ENCODING";
|
||||
case XML_ERROR_INCORRECT_ENCODING: return "XML_ERROR_INCORRECT_ENCODING";
|
||||
case XML_ERROR_UNCLOSED_CDATA_SECTION: return "XML_ERROR_UNCLOSED_CDATA_SECTION";
|
||||
case XML_ERROR_EXTERNAL_ENTITY_HANDLING: return "XML_ERROR_EXTERNAL_ENTITY_HANDLING";
|
||||
case XML_ERROR_NOT_STANDALONE: return "XML_ERROR_NOT_STANDALONE";
|
||||
case XML_ERROR_UNEXPECTED_STATE: return "XML_ERROR_UNEXPECTED_STATE";
|
||||
case XML_ERROR_ENTITY_DECLARED_IN_PE: return "XML_ERROR_ENTITY_DECLARED_IN_PE";
|
||||
case XML_ERROR_FEATURE_REQUIRES_XML_DTD: return "XML_ERROR_FEATURE_REQUIRES_XML_DTD";
|
||||
case XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING: return "XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING";
|
||||
case XML_ERROR_UNBOUND_PREFIX: return "XML_ERROR_UNBOUND_PREFIX";
|
||||
// EXPAT version >= 1.95.8
|
||||
#if XML_MAJOR_VERSION>1 || (XML_MAJOR_VERSION==1 && XML_MINOR_VERSION>95) || (XML_MAJOR_VERSION==1 && XML_MINOR_VERSION==95 && XML_MICRO_VERSION>7)
|
||||
case XML_ERROR_UNDECLARING_PREFIX: return "XML_ERROR_UNDECLARING_PREFIX";
|
||||
case XML_ERROR_INCOMPLETE_PE: return "XML_ERROR_INCOMPLETE_PE";
|
||||
case XML_ERROR_XML_DECL: return "XML_ERROR_XML_DECL";
|
||||
case XML_ERROR_TEXT_DECL: return "XML_ERROR_TEXT_DECL";
|
||||
case XML_ERROR_PUBLICID: return "XML_ERROR_PUBLICID";
|
||||
case XML_ERROR_SUSPENDED: return "XML_ERROR_SUSPENDED";
|
||||
case XML_ERROR_NOT_SUSPENDED: return "XML_ERROR_NOT_SUSPENDED";
|
||||
case XML_ERROR_ABORTED: return "XML_ERROR_ABORTED";
|
||||
case XML_ERROR_FINISHED: return "XML_ERROR_FINISHED";
|
||||
case XML_ERROR_SUSPEND_PE: return "XML_ERROR_SUSPEND_PE";
|
||||
//#endif
|
||||
//#if XML_MAJOR_VERSION>=2
|
||||
/* Added in 2.0. */
|
||||
case XML_ERROR_RESERVED_PREFIX_XML: return "XML_ERROR_RESERVED_PREFIX_XML";
|
||||
case XML_ERROR_RESERVED_PREFIX_XMLNS: return "XML_ERROR_RESERVED_PREFIX_XMLNS";
|
||||
case XML_ERROR_RESERVED_NAMESPACE_URI: return "XML_ERROR_RESERVED_NAMESPACE_URI";
|
||||
#endif
|
||||
}
|
||||
|
||||
std::ostringstream out;
|
||||
|
||||
out << "XML parser error #" << error;
|
||||
|
||||
return out.str();
|
||||
}
|
||||
|
||||
|
||||
std::string EncodeXMLString(const XS_String& str)
|
||||
{
|
||||
LPCXSSTR s = str.c_str();
|
||||
LPXSSTR buffer = (LPXSSTR)alloca(5*sizeof(XS_CHAR)*XS_len(s)); // worst case. "&"
|
||||
LPXSSTR o = buffer;
|
||||
|
||||
for(LPCXSSTR p=s; *p; ++p)
|
||||
switch(*p) {
|
||||
case '&':
|
||||
*o++ = '&'; *o++ = 'a'; *o++ = 'm'; *o++ = 'p'; *o++ = ';';
|
||||
break;
|
||||
|
||||
case '<':
|
||||
*o++ = '&'; *o++ = 'l'; *o++ = 't'; *o++ = ';';
|
||||
break;
|
||||
|
||||
case '>':
|
||||
*o++ = '&'; *o++ = 'g'; *o++ = 't'; *o++ = ';';
|
||||
break;
|
||||
|
||||
case '"':
|
||||
*o++ = '&'; *o++ = 'q'; *o++ = 'u'; *o++ = 'o'; *o++ = 't'; *o++ = ';';
|
||||
break;
|
||||
|
||||
case '\'':
|
||||
*o++ = '&'; *o++ = 'a'; *o++ = 'p'; *o++ = 'o'; *o++ = 's'; *o++ = ';';
|
||||
break;
|
||||
|
||||
default:
|
||||
*o++ = *p;
|
||||
}
|
||||
|
||||
#ifdef XS_STRING_UTF8
|
||||
return XS_String(buffer, o-buffer);
|
||||
#else
|
||||
return get_utf8(buffer, o-buffer);
|
||||
#endif
|
||||
}
|
||||
|
||||
XS_String DecodeXMLString(const XS_String& str)
|
||||
{
|
||||
LPCXSSTR s = str.c_str();
|
||||
LPXSSTR buffer = (LPXSSTR)alloca(sizeof(XS_CHAR)*XS_len(s));
|
||||
LPXSSTR o = buffer;
|
||||
|
||||
for(LPCXSSTR p=s; *p; ++p)
|
||||
if (*p == '&') {
|
||||
if (!XS_nicmp(p+1, XS_TEXT("lt;"), 3)) {
|
||||
*o++ = '<';
|
||||
p += 3;
|
||||
} else if (!XS_nicmp(p+1, XS_TEXT("gt;"), 3)) {
|
||||
*o++ = '>';
|
||||
p += 3;
|
||||
} else if (!XS_nicmp(p+1, XS_TEXT("amp;"), 4)) {
|
||||
*o++ = '&';
|
||||
p += 4;
|
||||
} else if (!XS_nicmp(p+1, XS_TEXT("quot;"), 5)) {
|
||||
*o++ = '"';
|
||||
p += 5;
|
||||
} else if (!XS_nicmp(p+1, XS_TEXT("apos;"), 5)) {
|
||||
*o++ = '\'';
|
||||
p += 5;
|
||||
} else
|
||||
*o++ = *p;
|
||||
} else
|
||||
*o++ = *p;
|
||||
|
||||
return XS_String(buffer, o-buffer);
|
||||
}
|
||||
|
||||
|
||||
/// write node with children tree to output stream using original white space
|
||||
void XMLNode::write_worker(std::ostream& out, int indent) const
|
||||
{
|
||||
out << _leading << '<' << EncodeXMLString(*this);
|
||||
|
||||
for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it)
|
||||
out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\"";
|
||||
|
||||
if (!_children.empty() || !_content.empty()) {
|
||||
out << '>' << _content;
|
||||
|
||||
for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it)
|
||||
(*it)->write_worker(out, indent+1);
|
||||
|
||||
out << _end_leading << "</" << EncodeXMLString(*this) << '>';
|
||||
} else
|
||||
out << "/>";
|
||||
|
||||
out << _trailing;
|
||||
}
|
||||
|
||||
|
||||
/// pretty print node with children tree to output stream
|
||||
void XMLNode::pretty_write_worker(std::ostream& out, int indent) const
|
||||
{
|
||||
for(int i=indent; i--; )
|
||||
out << XML_INDENT_SPACE;
|
||||
|
||||
out << '<' << EncodeXMLString(*this);
|
||||
|
||||
for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it)
|
||||
out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\"";
|
||||
|
||||
if (!_children.empty() || !_content.empty()) {
|
||||
out << ">\n";
|
||||
|
||||
for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it)
|
||||
(*it)->pretty_write_worker(out, indent+1);
|
||||
|
||||
for(int i=indent; i--; )
|
||||
out << XML_INDENT_SPACE;
|
||||
|
||||
out << "</" << EncodeXMLString(*this) << ">\n";
|
||||
} else
|
||||
out << "/>\n";
|
||||
}
|
||||
|
||||
|
||||
/// write node with children tree to output stream using smart formating
|
||||
void XMLNode::smart_write_worker(std::ostream& out, int indent) const
|
||||
{
|
||||
if (_leading.empty())
|
||||
for(int i=indent; i--; )
|
||||
out << XML_INDENT_SPACE;
|
||||
else
|
||||
out << _leading;
|
||||
|
||||
out << '<' << EncodeXMLString(*this);
|
||||
|
||||
for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it)
|
||||
out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\"";
|
||||
|
||||
if (_children.empty() && _content.empty())
|
||||
out << "/>";
|
||||
else {
|
||||
out << '>';
|
||||
|
||||
if (_content.empty())
|
||||
out << '\n';
|
||||
else
|
||||
out << _content;
|
||||
|
||||
Children::const_iterator it = _children.begin();
|
||||
|
||||
if (it != _children.end()) {
|
||||
for(; it!=_children.end(); ++it)
|
||||
(*it)->smart_write_worker(out, indent+1);
|
||||
|
||||
if (_end_leading.empty())
|
||||
for(int i=indent; i--; )
|
||||
out << XML_INDENT_SPACE;
|
||||
else
|
||||
out << _end_leading;
|
||||
} else
|
||||
out << _end_leading;
|
||||
|
||||
out << "</" << EncodeXMLString(*this) << '>';
|
||||
}
|
||||
|
||||
if (_trailing.empty())
|
||||
out << '\n';
|
||||
else
|
||||
out << _trailing;
|
||||
}
|
||||
|
||||
|
||||
} // namespace XMLStorage
|
1733
reactos/base/applications/ibrowser/utility/xmlstorage.h
Normal file
309
reactos/base/applications/ibrowser/webchild.cpp
Normal file
|
@ -0,0 +1,309 @@
|
|||
/*
|
||||
* Copyright 2004, 2005 Martin Fuchs
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
//
|
||||
// ROS Internet Web Browser
|
||||
//
|
||||
// webchild.cpp
|
||||
//
|
||||
// Martin Fuchs, 25.01.2005
|
||||
//
|
||||
|
||||
|
||||
#include <precomp.h>
|
||||
|
||||
#include "ibrowser_intres.h"
|
||||
|
||||
#include "webchild.h"
|
||||
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
||||
#if _MSC_VER>=1300 // vtMissing for VS.Net
|
||||
#include <comutil.h>
|
||||
#pragma comment(lib, "comsupp")
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#ifdef __MINGW32__ // MinGW is lacking vtMissing (as of 07.02.2004)
|
||||
static Variant vtMissing;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
//#include <mshtml.h>
|
||||
|
||||
|
||||
Variant::Variant(const VARIANT& var)
|
||||
{
|
||||
VariantInit(this);
|
||||
CheckError(VariantCopy(this, const_cast<VARIANT*>(&var)));
|
||||
}
|
||||
|
||||
Variant::Variant(const VARIANT* var)
|
||||
{
|
||||
VariantInit(this);
|
||||
CheckError(VariantCopy(this, const_cast<VARIANT*>(var)));
|
||||
}
|
||||
|
||||
Variant::~Variant()
|
||||
{
|
||||
VariantClear(this);
|
||||
}
|
||||
|
||||
|
||||
Variant::operator long() const
|
||||
{
|
||||
Variant v;
|
||||
CheckError(VariantChangeType(&v, (VARIANT*)this, 0, VT_I4));
|
||||
return V_I4(&v);
|
||||
}
|
||||
|
||||
Variant::operator bool() const
|
||||
{
|
||||
Variant v;
|
||||
CheckError(VariantChangeType(&v, (VARIANT*)this, 0, VT_BOOL));
|
||||
return V_BOOL(&v)? true: false;
|
||||
}
|
||||
|
||||
Variant::operator IDispatch*() const
|
||||
{
|
||||
Variant v;
|
||||
CheckError(VariantChangeType(&v, (VARIANT*)this, 0, VT_DISPATCH));
|
||||
return V_DISPATCH(&v);
|
||||
}
|
||||
|
||||
Variant::operator VARIANT_BOOL() const
|
||||
{
|
||||
Variant v;
|
||||
CheckError(VariantChangeType(&v, (VARIANT*)this, 0, VT_BOOL));
|
||||
return V_BOOL(&v);
|
||||
}
|
||||
|
||||
|
||||
void BStr::assign(BSTR s)
|
||||
{
|
||||
if (!SysReAllocString(&_p, s))
|
||||
THROW_EXCEPTION(E_OUTOFMEMORY);
|
||||
}
|
||||
|
||||
void BStr::assign(const VARIANT& var)
|
||||
{
|
||||
if (V_VT(&var) == VT_BSTR)
|
||||
assign(V_BSTR(&var));
|
||||
else {
|
||||
Variant v;
|
||||
CheckError(VariantChangeType(&v, const_cast<VARIANT*>(&var), 0, VT_BSTR));
|
||||
assign(V_BSTR(&v));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BrowserNavigator::BrowserNavigator()
|
||||
: _browser_initialized(false)
|
||||
{
|
||||
}
|
||||
|
||||
void BrowserNavigator::attach(IWebBrowser* browser)
|
||||
{
|
||||
_browser = browser;
|
||||
}
|
||||
|
||||
void BrowserNavigator::goto_url(LPCTSTR url)
|
||||
{
|
||||
if (_browser_initialized)
|
||||
_browser->Navigate(BStr(url), NULL, NULL, NULL, NULL);
|
||||
else {
|
||||
_new_url = url;
|
||||
|
||||
_browser->Navigate(L"about:blank", NULL, NULL, NULL, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void BrowserNavigator::set_html_page(const String& html_txt)
|
||||
{
|
||||
_new_html_txt = html_txt;
|
||||
|
||||
goto_url(TEXT("about:blank"));
|
||||
}
|
||||
|
||||
void T2nA_binary(LPCTSTR s, LPSTR d, int len)
|
||||
{
|
||||
while(len-- > 0)
|
||||
*d++ = (unsigned char)*s++;
|
||||
}
|
||||
|
||||
void BrowserNavigator::navigated(LPCTSTR url)
|
||||
{
|
||||
_browser_initialized = true;
|
||||
|
||||
bool nav = false;
|
||||
|
||||
if (!_new_url.empty()) {
|
||||
if (!_tcscmp(url,TEXT("about:blank")) && _new_url!=TEXT("about:blank")) {
|
||||
_browser->Navigate(BStr(_new_url), NULL, NULL, NULL, NULL);
|
||||
++nav;
|
||||
}
|
||||
|
||||
_new_url.erase();
|
||||
}
|
||||
|
||||
if (!nav && !_new_html_txt.empty()) { ///@todo move this into DocumentComplete() ?
|
||||
int len = _new_html_txt.length();
|
||||
HGLOBAL hHtmlText = GlobalAlloc(GPTR, len);
|
||||
|
||||
if (!hHtmlText) {
|
||||
T2nA_binary(_new_html_txt, (char*)hHtmlText, len);
|
||||
_new_html_txt.erase();
|
||||
|
||||
SIfacePtr<IStream> pStream;
|
||||
HRESULT hr = CreateStreamOnHGlobal(hHtmlText, TRUE, &pStream);
|
||||
|
||||
if (SUCCEEDED(hr)) {
|
||||
SIfacePtr<IDispatch> pHtmlDoc;
|
||||
CheckError(_browser->get_Document(&pHtmlDoc));
|
||||
|
||||
SIfacePtr<IPersistStreamInit> pPersistStreamInit;
|
||||
pHtmlDoc.QueryInterface(IID_IPersistStreamInit, &pPersistStreamInit);
|
||||
|
||||
CheckError(pPersistStreamInit->InitNew());
|
||||
CheckError(pPersistStreamInit->Load(pStream));
|
||||
} else
|
||||
GlobalFree(hHtmlText);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
HWND create_webchildwindow(const WebChildWndInfo& info)
|
||||
{
|
||||
WebChildWindow* pWnd = WebChildWindow::create(info);
|
||||
|
||||
if (!pWnd)
|
||||
return 0;
|
||||
|
||||
return *pWnd;
|
||||
}
|
||||
|
||||
static const CLSID CLSID_MozillaBrowser =
|
||||
{0x1339B54C, 0x3453, 0x11D2, {0x93, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
||||
|
||||
|
||||
WebChildWindow::WebChildWindow(HWND hwnd, const WebChildWndInfo& info)
|
||||
: super(hwnd, info._hwndFrame),
|
||||
web_super(_navigator)
|
||||
{
|
||||
// first try to create a web control with MS IE's CLASSID
|
||||
HRESULT hr = create_control(hwnd, CLSID_WebBrowser, IID_IWebBrowser2);
|
||||
|
||||
// If this failed, try to use Mozilla's web control
|
||||
if (FAILED(hr))
|
||||
hr = create_control(hwnd, CLSID_MozillaBrowser, IID_IWebBrowser2);
|
||||
|
||||
if (SUCCEEDED(hr)) {
|
||||
_navigator.attach(_control);
|
||||
|
||||
_connector = auto_ptr<EventConnector>(new EventConnector(_control, DIID_DWebBrowserEvents2, this));
|
||||
|
||||
// We need to call Navigate() here to initialize the browser control (see _browser_initialized)
|
||||
_control->Navigate(BStr(info._url), &vtMissing, &vtMissing, &vtMissing, &vtMissing);
|
||||
}
|
||||
}
|
||||
|
||||
LRESULT WebChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
try {
|
||||
switch(nmsg) {
|
||||
case WM_ERASEBKGND:
|
||||
if (!_control) {
|
||||
HDC hdc = (HDC)wparam;
|
||||
ClientRect rect(_hwnd);
|
||||
|
||||
HBRUSH hbrush = CreateSolidBrush(RGB(200,200,235));
|
||||
BkMode mode(hdc, TRANSPARENT);
|
||||
TextColor color(hdc, RGB(200,40,40));
|
||||
FillRect(hdc, &rect, hbrush);
|
||||
DrawText(hdc, TEXT("Sorry - no web browser control could be loaded."), -1, &rect, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
|
||||
DeleteObject(hbrush);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
|
||||
case PM_DISPATCH_COMMAND: {
|
||||
if (_control) {
|
||||
HRESULT hr = E_FAIL;
|
||||
|
||||
switch(LOWORD(wparam)) {
|
||||
case ID_GO_BACK:
|
||||
hr = _control->GoBack();
|
||||
break;
|
||||
|
||||
case ID_GO_FORWARD:
|
||||
hr = _control->GoForward();
|
||||
break;
|
||||
|
||||
case ID_GO_UP:
|
||||
///@todo
|
||||
break;
|
||||
|
||||
case ID_GO_HOME:
|
||||
hr = _control->GoHome();
|
||||
break;
|
||||
|
||||
case ID_GO_SEARCH:
|
||||
hr = _control->GoSearch();
|
||||
break;
|
||||
|
||||
case ID_REFRESH:
|
||||
hr = _control->Refresh();
|
||||
break;
|
||||
|
||||
case ID_STOP:
|
||||
hr = _control->Stop();
|
||||
break;
|
||||
|
||||
default:
|
||||
return super::WndProc(nmsg, wparam, lparam);
|
||||
}
|
||||
|
||||
if (FAILED(hr) && hr!=E_FAIL)
|
||||
THROW_EXCEPTION(hr);
|
||||
}
|
||||
|
||||
return TRUE;}
|
||||
|
||||
default:
|
||||
return super::WndProc(nmsg, wparam, lparam);
|
||||
}
|
||||
} catch(COMException& e) {
|
||||
HandleException(e, _hwnd);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
String WebChildWindow::jump_to_int(LPCTSTR url)
|
||||
{
|
||||
_navigator.goto_url(url);
|
||||
|
||||
return url;
|
||||
}
|
1103
reactos/base/applications/ibrowser/webchild.h
Normal file
155
reactos/base/applications/msconfig/De.rc
Normal file
|
@ -0,0 +1,155 @@
|
|||
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
|
||||
|
||||
IDD_MSCONFIG_DIALOG DIALOG DISCARDABLE 0, 0, 378, 220
|
||||
STYLE DS_CENTER | WS_MINIMIZEBOX | WS_POPUP |
|
||||
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU |
|
||||
WS_THICKFRAME
|
||||
CAPTION "Systemkonfigurationsprogramm"
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "Tab1",IDC_TAB,"SysTabControl32",WS_TABSTOP,2,2,374,195
|
||||
DEFPUSHBUTTON "OK", IDOK, 211, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
PUSHBUTTON "&Hilfe", IDC_BTN_HELP, 2, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
PUSHBUTTON "Abbrechen", IDCANCEL, 267, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
PUSHBUTTON "Ü&bernehmen", IDC_BTN_APPLY, 323, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
END
|
||||
|
||||
IDD_STARTUP_PAGE DIALOG DISCARDABLE 0, 0, 362, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "List3",IDC_STARTUP_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 2, 1, 360, 148
|
||||
PUSHBUTTON "Alle &aktivieren",IDC_BTN_STARTUP_ACTIVATE,223,155,66,14
|
||||
PUSHBUTTON "Alle &deaktivieren",IDC_BTN_STARTUP_DEACTIVATE,295,155,66,14
|
||||
END
|
||||
|
||||
IDD_TOOLS_PAGE DIALOG DISCARDABLE 0, 0, 362, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "List2",IDC_TOOLS_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 2, 1, 360, 134
|
||||
EDITTEXT IDC_TOOLS_CMDLINE, 1, 139, 360, 12, ES_READONLY
|
||||
PUSHBUTTON "&Ausführen", IDC_BTN_RUN, 311, 155, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
END
|
||||
|
||||
IDD_SERVICES_PAGE DIALOG DISCARDABLE 0, 0, 362, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "List1",IDC_SERVICES_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,2,1,360,148
|
||||
PUSHBUTTON "Alle &aktivieren",IDC_BTN_SERVICES_ACTIVATE,223,155,66,14
|
||||
PUSHBUTTON "Alle &deaktivieren",IDC_BTN_SERVICES_DEACTIVATE,295,155,66,14
|
||||
END
|
||||
|
||||
IDD_GENERAL_PAGE DIALOG DISCARDABLE 0, 0, 362, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
GROUPBOX "Systemstartauswahl", -1, 10, 10, 340, 150
|
||||
CONTROL "&Normaler Systemstart - Alle Gerätetreiber und Dienste laden", IDC_CBX_NORMAL_START, "Button", 0x50010009, 20, 30, 210, 10
|
||||
CONTROL "&Diagnosesystemstart - Nur grundlegende Geräte und Dienste laden", IDC_CBX_DIAGNOSTIC_START, "Button", 0x50010009, 20, 45, 230, 10
|
||||
CONTROL "B&enutzerdefinierter Systemstart", IDC_CBX_SELECTIVE_STARTUP, "Button", 0x50010009, 20, 60, 120, 10
|
||||
CHECKBOX "D&atei SYSTEM.INI verarbeiten", IDC_CBX_SYSTEM_INI, 30, 80, 110, 10
|
||||
CHECKBOX "&Systemdienste laden", IDC_CBX_SYSTEM_SERVICE, 30, 95, 90, 10
|
||||
CHECKBOX "S&ystemstartelemente laden", IDC_CBX_STARTUP_ITEM, 30, 110, 110, 10
|
||||
END
|
||||
|
||||
IDD_FREELDR_PAGE DIALOG DISCARDABLE 0, 0, 362, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "", IDC_LIST_BOX, "ListBox", 0x50010141, 10, 10, 340, 50, 0x00000200
|
||||
PUSHBUTTON "&Alle Bootpfade überprüfen", IDC_BTN_CHECK_BOOT_PATH, 10, 65, 90, 12
|
||||
PUSHBUTTON "A&ls Standard", IDC_BTN_SET_DEFAULT_BOOT, 120, 65, 63, 12
|
||||
PUSHBUTTON "Nach &oben", IDC_BTN_MOVE_UP_BOOT_OPTION, 203, 65, 63, 12
|
||||
PUSHBUTTON "Nach &unten", IDC_BTN_MOVE_DOWN_BOOT_OPTION, 286, 65, 63, 12
|
||||
GROUPBOX "Boot Optionen", -1, 10, 80, 250, 90
|
||||
CHECKBOX "/SA&FEBOOT", IDC_CBX_SAFE_BOOT, 15, 90, 50, 10
|
||||
CHECKBOX "/&NOGUIBOOT", IDC_CBX_NO_GUI_BOOT, 15, 105, 55, 10
|
||||
CHECKBOX "/&BOOTLOG", IDC_CBX_BOOT_LOG, 15, 120, 50, 10
|
||||
CHECKBOX "/BAS&EVIDEO", IDC_CBX_BASE_VIDEO, 15, 135, 55, 10
|
||||
CHECKBOX "/S&OS", IDC_CBX_SOS, 15, 150, 50, 10
|
||||
PUSHBUTTON "E&rweiterte Optionen...", IDC_BTN_ADVANCED_OPTIONS, 100, 150, 90, 12
|
||||
LTEXT "&Zeitlimit:", -1, 280, 91, 30, 10
|
||||
EDITTEXT IDC_TXT_BOOT_TIMEOUT, 310, 90, 25, 12, ES_LEFT
|
||||
LTEXT "Sek.", -1, 340, 91, 15, 10
|
||||
END
|
||||
|
||||
IDD_FREELDR_ADVANCED_PAGE DIALOG DISCARDABLE 0, 0, 175, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CHECKBOX "/&MAXMEM=", IDC_CBX_MAX_MEM, 10, 10, 50, 10
|
||||
EDITTEXT IDC_TXT_MAX_MEM, 80, 10, 60, 12
|
||||
CONTROL "",IDC_SCR_MAX_MEM, "msctls_updown32", 0x50000000, 140, 10, 11, 11
|
||||
CHECKBOX "/&NUMPROC=", IDC_CBX_NUM_PROC, 10, 25, 50, 10
|
||||
COMBOBOX IDC_DRP_NUM_PROC, 80, 25, 60, 10, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
CHECKBOX "/&PCILOCK", IDC_CBX_PCI_LOCK, 10, 40, 50, 10
|
||||
CHECKBOX "/P&ROFILE", IDC_CBX_PROFILE, 10, 55, 50, 10
|
||||
CHECKBOX "/&IRQ", IDC_CBX_IRQ, 10, 70, 40, 12
|
||||
EDITTEXT IDC_TXT_IRQ, 80, 70, 60, 12, ES_LEFT
|
||||
CHECKBOX "/&DEBUG", IDC_CBX_DEBUG, 10, 85, 40, 10
|
||||
CHECKBOX "/D&EBUGPORT", IDC_CBX_DEBUG_PORT, 20, 100, 60, 10
|
||||
COMBOBOX IDC_DRP_DEBUG_PORT, 80, 100, 60, 10, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
CHECKBOX "/&BAUDRATE", IDC_CBX_BAUD_RATE, 20, 115, 50, 10
|
||||
COMBOBOX IDC_DRP_DRP_BAUD_RATE, 80, 115, 60, 10, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
CHECKBOX "/&CHANNEL", IDC_CBX_CHANNEL, 20, 130, 50, 10
|
||||
EDITTEXT IDC_TXT_CHANNEL, 80, 130, 60, 12, ES_LEFT
|
||||
CONTROL "",IDC_SCR_CHANNEL, "msctls_updown32", 0x50000000, 140, 130, 11, 11
|
||||
PUSHBUTTON "OK", IDC_OK, 20, 160, 50, 12
|
||||
PUSHBUTTON "Abbrechen", IDC_CANCEL, 100, 160, 50, 12
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_MSCONFIG "Systemkonfigurationsprogramm"
|
||||
IDS_TAB_GENERAL "Allgemein"
|
||||
IDS_TAB_SYSTEM "SYSTEM.INI"
|
||||
IDS_TAB_FREELDR "FREELDR.INI"
|
||||
IDS_TAB_SERVICES "Dienste"
|
||||
IDS_TAB_STARTUP "Systemstart"
|
||||
IDS_TAB_TOOLS "Tools"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_SERVICES_COLUMN_SERVICE "Dienst"
|
||||
IDS_SERVICES_COLUMN_REQ "Erforderlich"
|
||||
IDS_SERVICES_COLUMN_VENDOR "Hersteller"
|
||||
IDS_SERVICES_COLUMN_STATUS "Status"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_TOOLS_COLUMN_NAME "Name"
|
||||
IDS_TOOLS_COLUMN_DESCR "Beschreibung"
|
||||
|
||||
IDS_TOOLS_CMD_NAME "Konsole"
|
||||
IDS_TOOLS_CMD_DESCR ""
|
||||
IDS_TOOLS_CMD_CMD "cmd.exe"
|
||||
|
||||
IDS_TOOLS_INFO_NAME "Version"
|
||||
IDS_TOOLS_INFO_DESCR "Zeigt die installierte ReactOS Version an."
|
||||
IDS_TOOLS_INFO_CMD "winver.exe"
|
||||
|
||||
IDS_TOOLS_REGEDIT_NAME "Registrierungs-Editor"
|
||||
IDS_TOOLS_REGEDIT_DESCR "Öffnet den Registrierungs-Editor."
|
||||
IDS_TOOLS_REGEDIT_CMD "regedit.exe"
|
||||
|
||||
IDS_TOOLS_SYSDM_NAME "Systemeigenschaften"
|
||||
IDS_TOOLS_SYSDM_DESCR "Zeigt Informationen über diesen Rechner an."
|
||||
IDS_TOOLS_SYSDM_CMD "control"
|
||||
IDS_TOOLS_SYSDM_PARAM "sysdm.cpl"
|
||||
|
||||
IDS_STARTUP_COLUMN_ELEMENT "Element"
|
||||
IDS_STARTUP_COLUMN_CMD "Befehl"
|
||||
IDS_STARTUP_COLUMN_PATH "Pfad"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_SERVICES_STATUS_RUNNING "Gestartet"
|
||||
IDS_SERVICES_STATUS_STOPPED "Beendet"
|
||||
IDS_SERVICES_YES "Ja"
|
||||
IDS_SERVICES_UNKNOWN "Unbekannt"
|
||||
END
|
155
reactos/base/applications/msconfig/En.rc
Normal file
|
@ -0,0 +1,155 @@
|
|||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
|
||||
IDD_MSCONFIG_DIALOG DIALOG DISCARDABLE 0, 0, 378, 220
|
||||
STYLE DS_CENTER | WS_MINIMIZEBOX | WS_POPUP |
|
||||
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU |
|
||||
WS_THICKFRAME
|
||||
CAPTION "System configuration program"
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "Tab1",IDC_TAB,"SysTabControl32",WS_TABSTOP,2,2,374,195
|
||||
DEFPUSHBUTTON "OK", IDOK, 211, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
PUSHBUTTON "&Help", IDC_BTN_HELP, 2, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
PUSHBUTTON "Cancel", IDCANCEL, 267, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
PUSHBUTTON "Apply", IDC_BTN_APPLY, 323, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
END
|
||||
|
||||
IDD_STARTUP_PAGE DIALOG DISCARDABLE 0, 0, 362, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "List3",IDC_STARTUP_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 2, 1, 360, 148
|
||||
PUSHBUTTON "&Activate all",IDC_BTN_STARTUP_ACTIVATE,223,155,66,14
|
||||
PUSHBUTTON "&Deactivate all",IDC_BTN_STARTUP_DEACTIVATE,295,155,66,14
|
||||
END
|
||||
|
||||
IDD_TOOLS_PAGE DIALOG DISCARDABLE 0, 0, 362, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "List2",IDC_TOOLS_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 2, 1, 360, 134
|
||||
EDITTEXT IDC_TOOLS_CMDLINE, 1, 139, 360, 12, ES_READONLY
|
||||
PUSHBUTTON "&Run", IDC_BTN_RUN, 311, 155, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
END
|
||||
|
||||
IDD_SERVICES_PAGE DIALOG DISCARDABLE 0, 0, 362, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "List1",IDC_SERVICES_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,2,1,360,148
|
||||
PUSHBUTTON "&Activate all",IDC_BTN_SERVICES_ACTIVATE,223,155,66,14
|
||||
PUSHBUTTON "&Deactivate all",IDC_BTN_SERVICES_DEACTIVATE,295,155,66,14
|
||||
END
|
||||
|
||||
IDD_GENERAL_PAGE DIALOG DISCARDABLE 0, 0, 362, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
GROUPBOX "Startup Selection", -1, 10, 10, 340, 150
|
||||
CONTROL "&Normal Startup - load all device drivers and services", IDC_CBX_NORMAL_START, "Button", 0x50010009, 20, 30, 180, 10
|
||||
CONTROL "&Diagnostic Startup - load basic devices and services only", IDC_CBX_DIAGNOSTIC_START, "Button", 0x50010009, 20, 45, 195, 10
|
||||
CONTROL "S&elective Startup", IDC_CBX_SELECTIVE_STARTUP, "Button", 0x50010009, 20, 60, 70, 10
|
||||
CHECKBOX "P&rocess SYSTEM.INI File", IDC_CBX_SYSTEM_INI, 30, 80, 95, 10
|
||||
CHECKBOX "&Load System Services", IDC_CBX_SYSTEM_SERVICE, 30, 95, 90, 10
|
||||
CHECKBOX "&L&oad Startup Items", IDC_CBX_STARTUP_ITEM, 30, 110, 75, 10
|
||||
END
|
||||
|
||||
IDD_FREELDR_PAGE DIALOG DISCARDABLE 0, 0, 362, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "", IDC_LIST_BOX, "ListBox", 0x50010141, 10, 10, 340, 50, 0x00000200
|
||||
PUSHBUTTON "&Check All Boot Paths", IDC_BTN_CHECK_BOOT_PATH, 10, 65, 70, 12
|
||||
PUSHBUTTON "&Set as Default", IDC_BTN_SET_DEFAULT_BOOT, 100, 65, 70, 12
|
||||
PUSHBUTTON "Move &Up", IDC_BTN_MOVE_UP_BOOT_OPTION, 190, 65, 70, 12
|
||||
PUSHBUTTON "Move &Down", IDC_BTN_MOVE_DOWN_BOOT_OPTION, 280, 65, 70, 12
|
||||
GROUPBOX "Boot Options", -1, 10, 80, 250, 90
|
||||
CHECKBOX "/SA&FEBOOT", IDC_CBX_SAFE_BOOT, 15, 90, 50, 10
|
||||
CHECKBOX "/&NOGUIBOOT", IDC_CBX_NO_GUI_BOOT, 15, 105, 55, 10
|
||||
CHECKBOX "/&BOOTLOG", IDC_CBX_BOOT_LOG, 15, 120, 50, 10
|
||||
CHECKBOX "/BAS&EVIDEO", IDC_CBX_BASE_VIDEO, 15, 135, 55, 10
|
||||
CHECKBOX "/S&OS", IDC_CBX_SOS, 15, 150, 50, 10
|
||||
PUSHBUTTON "Ad&vanced Options...", IDC_BTN_ADVANCED_OPTIONS, 100, 150, 70, 12
|
||||
LTEXT "&Timeout:", -1, 280, 91, 30, 10
|
||||
EDITTEXT IDC_TXT_BOOT_TIMEOUT, 310, 90, 25, 12, ES_LEFT
|
||||
LTEXT "sec.", -1, 340, 91, 15, 10
|
||||
END
|
||||
|
||||
IDD_FREELDR_ADVANCED_PAGE DIALOG DISCARDABLE 0, 0, 175, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CHECKBOX "/&MAXMEM=", IDC_CBX_MAX_MEM, 10, 10, 50, 10
|
||||
EDITTEXT IDC_TXT_MAX_MEM, 80, 10, 60, 12
|
||||
CONTROL "",IDC_SCR_MAX_MEM, "msctls_updown32", 0x50000000, 140, 10, 11, 11
|
||||
CHECKBOX "/&NUMPROC=", IDC_CBX_NUM_PROC, 10, 25, 50, 10
|
||||
COMBOBOX IDC_DRP_NUM_PROC, 80, 25, 60, 10, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
CHECKBOX "/&PCILOCK", IDC_CBX_PCI_LOCK, 10, 40, 50, 10
|
||||
CHECKBOX "/P&ROFILE", IDC_CBX_PROFILE, 10, 55, 50, 10
|
||||
CHECKBOX "/&IRQ", IDC_CBX_IRQ, 10, 70, 40, 12
|
||||
EDITTEXT IDC_TXT_IRQ, 80, 70, 60, 12, ES_LEFT
|
||||
CHECKBOX "/&DEBUG", IDC_CBX_DEBUG, 10, 85, 40, 10
|
||||
CHECKBOX "/D&EBUGPORT", IDC_CBX_DEBUG_PORT, 20, 100, 60, 10
|
||||
COMBOBOX IDC_DRP_DEBUG_PORT, 80, 100, 60, 10, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
CHECKBOX "/&BAUDRATE", IDC_CBX_BAUD_RATE, 20, 115, 50, 10
|
||||
COMBOBOX IDC_DRP_DRP_BAUD_RATE, 80, 115, 60, 10, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
CHECKBOX "/&CHANNEL", IDC_CBX_CHANNEL, 20, 130, 50, 10
|
||||
EDITTEXT IDC_TXT_CHANNEL, 80, 130, 60, 12, ES_LEFT
|
||||
CONTROL "",IDC_SCR_CHANNEL, "msctls_updown32", 0x50000000, 140, 130, 11, 11
|
||||
PUSHBUTTON "Ok", IDC_OK, 20, 160, 50, 12
|
||||
PUSHBUTTON "Cancel", IDC_CANCEL, 100, 160, 50, 12
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_MSCONFIG "System configuration program"
|
||||
IDS_TAB_GENERAL "General"
|
||||
IDS_TAB_SYSTEM "SYSTEM.INI"
|
||||
IDS_TAB_FREELDR "FREELDR.INI"
|
||||
IDS_TAB_SERVICES "Services"
|
||||
IDS_TAB_STARTUP "Startup"
|
||||
IDS_TAB_TOOLS "Tools"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_SERVICES_COLUMN_SERVICE "Service"
|
||||
IDS_SERVICES_COLUMN_REQ "Required"
|
||||
IDS_SERVICES_COLUMN_VENDOR "Vendor"
|
||||
IDS_SERVICES_COLUMN_STATUS "Status"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_TOOLS_COLUMN_NAME "Name"
|
||||
IDS_TOOLS_COLUMN_DESCR "Description"
|
||||
|
||||
IDS_TOOLS_CMD_NAME "Console"
|
||||
IDS_TOOLS_CMD_DESCR ""
|
||||
IDS_TOOLS_CMD_CMD "cmd.exe"
|
||||
|
||||
IDS_TOOLS_INFO_NAME "Version"
|
||||
IDS_TOOLS_INFO_DESCR "Displays version information."
|
||||
IDS_TOOLS_INFO_CMD "winver.exe"
|
||||
|
||||
IDS_TOOLS_REGEDIT_NAME "Registry-Editor"
|
||||
IDS_TOOLS_REGEDIT_DESCR "Opens the Registry-Editor."
|
||||
IDS_TOOLS_REGEDIT_CMD "regedit.exe"
|
||||
|
||||
IDS_TOOLS_SYSDM_NAME "System properties"
|
||||
IDS_TOOLS_SYSDM_DESCR "Shows information about this computer."
|
||||
IDS_TOOLS_SYSDM_CMD "control"
|
||||
IDS_TOOLS_SYSDM_PARAM "sysdm.cpl"
|
||||
|
||||
IDS_STARTUP_COLUMN_ELEMENT "Element"
|
||||
IDS_STARTUP_COLUMN_CMD "Command"
|
||||
IDS_STARTUP_COLUMN_PATH "Path"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_SERVICES_STATUS_RUNNING "Running"
|
||||
IDS_SERVICES_STATUS_STOPPED "Stopped"
|
||||
IDS_SERVICES_YES "Yes"
|
||||
IDS_SERVICES_UNKNOWN "Unknown"
|
||||
END
|
96
reactos/base/applications/msconfig/Fr.rc
Normal file
|
@ -0,0 +1,96 @@
|
|||
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
|
||||
|
||||
IDD_MSCONFIG_DIALOG DIALOG DISCARDABLE 0, 0, 378, 220
|
||||
STYLE DS_CENTER | WS_MINIMIZEBOX | WS_POPUP |
|
||||
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU |
|
||||
WS_THICKFRAME
|
||||
CAPTION "Utilitaire de configuration système"
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "Tab1",IDC_TAB,"SysTabControl32",WS_TABSTOP,2,2,374,195
|
||||
DEFPUSHBUTTON "OK", IDOK, 211, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
PUSHBUTTON "&Aide", IDC_BTN_HELP, 2, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
PUSHBUTTON "Annuler", IDCANCEL, 267, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
PUSHBUTTON "A&ppliquer", IDC_BTN_APPLY, 323, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
END
|
||||
|
||||
IDD_STARTUP_PAGE DIALOG DISCARDABLE 0, 0, 362, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "List3",IDC_STARTUP_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 2, 1, 360, 148
|
||||
PUSHBUTTON "&Activer tout",IDC_BTN_STARTUP_ACTIVATE,223,155,66,14
|
||||
PUSHBUTTON "&Désactiver tout",IDC_BTN_STARTUP_DEACTIVATE,295,155,66,14
|
||||
END
|
||||
|
||||
IDD_TOOLS_PAGE DIALOG DISCARDABLE 0, 0, 362, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "List2",IDC_TOOLS_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 2, 1, 360, 134
|
||||
EDITTEXT IDC_TOOLS_CMDLINE, 1, 139, 360, 12, ES_READONLY
|
||||
PUSHBUTTON "&Lancer", IDC_BTN_RUN, 311, 155, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
END
|
||||
|
||||
IDD_SERVICES_PAGE DIALOG DISCARDABLE 0, 0, 362, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "List1",IDC_SERVICES_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,2,1,360,148
|
||||
PUSHBUTTON "&Activer tout",IDC_BTN_SERVICES_ACTIVATE,223,155,66,14
|
||||
PUSHBUTTON "&Désactiver tout",IDC_BTN_SERVICES_DEACTIVATE,295,155,66,14
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_MSCONFIG "Utilitaire de configuration système"
|
||||
IDS_TAB_GENERAL "Général"
|
||||
IDS_TAB_SYSTEM "SYSTEM.INI"
|
||||
IDS_TAB_FREELDR "FREELDR.INI"
|
||||
IDS_TAB_SERVICES "Services"
|
||||
IDS_TAB_STARTUP "Démarrage"
|
||||
IDS_TAB_TOOLS "Outils"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_SERVICES_COLUMN_SERVICE "Service"
|
||||
IDS_SERVICES_COLUMN_REQ "Requis"
|
||||
IDS_SERVICES_COLUMN_VENDOR "Fabricant"
|
||||
IDS_SERVICES_COLUMN_STATUS "Etat"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_TOOLS_COLUMN_NAME "Nom"
|
||||
IDS_TOOLS_COLUMN_DESCR "Description"
|
||||
|
||||
IDS_TOOLS_CMD_NAME "Console"
|
||||
IDS_TOOLS_CMD_DESCR ""
|
||||
IDS_TOOLS_CMD_CMD "cmd.exe"
|
||||
|
||||
IDS_TOOLS_INFO_NAME "Version"
|
||||
IDS_TOOLS_INFO_DESCR "Affiche les informations de version."
|
||||
IDS_TOOLS_INFO_CMD "winver.exe"
|
||||
|
||||
IDS_TOOLS_REGEDIT_NAME "Editeur de Registre"
|
||||
IDS_TOOLS_REGEDIT_DESCR "Ouvre l'éditeur de Registre"
|
||||
IDS_TOOLS_REGEDIT_CMD "regedit.exe"
|
||||
|
||||
IDS_TOOLS_SYSDM_NAME "Propriétés système"
|
||||
IDS_TOOLS_SYSDM_DESCR "Affiche/modifie des information a propos de l'ordinateur."
|
||||
IDS_TOOLS_SYSDM_CMD "control"
|
||||
IDS_TOOLS_SYSDM_PARAM "sysdm.cpl"
|
||||
|
||||
IDS_STARTUP_COLUMN_ELEMENT "Elément"
|
||||
IDS_STARTUP_COLUMN_CMD "Commande"
|
||||
IDS_STARTUP_COLUMN_PATH "Chemin"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_SERVICES_STATUS_RUNNING "En cours"
|
||||
IDS_SERVICES_STATUS_STOPPED "Arrêté"
|
||||
IDS_SERVICES_YES "Oui"
|
||||
IDS_SERVICES_UNKNOWN "Inconnu"
|
||||
END
|
98
reactos/base/applications/msconfig/Hu.rc
Normal file
|
@ -0,0 +1,98 @@
|
|||
// Hungarian resources, by Robert Horvath (Talley at cubeclub.hu)
|
||||
|
||||
LANGUAGE LANG_HUNGARIAN, SUBLANG_NEUTRAL
|
||||
|
||||
IDD_MSCONFIG_DIALOG DIALOG DISCARDABLE 0, 0, 378, 220
|
||||
STYLE DS_CENTER | WS_MINIMIZEBOX | WS_POPUP |
|
||||
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU |
|
||||
WS_THICKFRAME
|
||||
CAPTION "Rendszerbeállítások"
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "Tab1",IDC_TAB,"SysTabControl32",WS_TABSTOP,2,2,374,195
|
||||
DEFPUSHBUTTON "OK", IDOK, 211, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
PUSHBUTTON "&Súgó", IDC_BTN_HELP, 2, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
PUSHBUTTON "Mégse", IDCANCEL, 267, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
PUSHBUTTON "Alkalmaz", IDC_BTN_APPLY, 323, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
END
|
||||
|
||||
IDD_STARTUP_PAGE DIALOG DISCARDABLE 0, 0, 362, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "List3",IDC_STARTUP_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 2, 1, 360, 148
|
||||
PUSHBUTTON "Mindet &bekapcsol",IDC_BTN_STARTUP_ACTIVATE,223,155,66,14
|
||||
PUSHBUTTON "Mindet &kikapcsol",IDC_BTN_STARTUP_DEACTIVATE,295,155,66,14
|
||||
END
|
||||
|
||||
IDD_TOOLS_PAGE DIALOG DISCARDABLE 0, 0, 362, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "List2",IDC_TOOLS_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 2, 1, 360, 134
|
||||
EDITTEXT IDC_TOOLS_CMDLINE, 1, 139, 360, 12, ES_READONLY
|
||||
PUSHBUTTON "&Futtat", IDC_BTN_RUN, 311, 155, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
END
|
||||
|
||||
IDD_SERVICES_PAGE DIALOG DISCARDABLE 0, 0, 362, 175
|
||||
STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "List1",IDC_SERVICES_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,2,1,360,148
|
||||
PUSHBUTTON "Mindet &bekapcsol",IDC_BTN_SERVICES_ACTIVATE,223,155,66,14
|
||||
PUSHBUTTON "Mindet &kikapcsol",IDC_BTN_SERVICES_DEACTIVATE,295,155,66,14
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_MSCONFIG "Rendszerkonfiguráciüs segédprogram"
|
||||
IDS_TAB_GENERAL "Általános"
|
||||
IDS_TAB_SYSTEM "SYSTEM.INI"
|
||||
IDS_TAB_FREELDR "FREELDR.INI"
|
||||
IDS_TAB_SERVICES "Szolgáltatások"
|
||||
IDS_TAB_STARTUP "Automatikus indítás"
|
||||
IDS_TAB_TOOLS "Segédprogramok"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_SERVICES_COLUMN_SERVICE "Szolgálgatás"
|
||||
IDS_SERVICES_COLUMN_REQ "Lényeges"
|
||||
IDS_SERVICES_COLUMN_VENDOR "Gyártó"
|
||||
IDS_SERVICES_COLUMN_STATUS "Állapot"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_TOOLS_COLUMN_NAME "Név"
|
||||
IDS_TOOLS_COLUMN_DESCR "Description"
|
||||
|
||||
IDS_TOOLS_CMD_NAME "Konzol"
|
||||
IDS_TOOLS_CMD_DESCR ""
|
||||
IDS_TOOLS_CMD_CMD "cmd.exe"
|
||||
|
||||
IDS_TOOLS_INFO_NAME "Verzió"
|
||||
IDS_TOOLS_INFO_DESCR "Megjeleníti a verzió-információkat."
|
||||
IDS_TOOLS_INFO_CMD "winver.exe"
|
||||
|
||||
IDS_TOOLS_REGEDIT_NAME "Rendszerleíróadatbázis-szerkesztõ"
|
||||
IDS_TOOLS_REGEDIT_DESCR "Megnyitja a szerkesztõ programot."
|
||||
IDS_TOOLS_REGEDIT_CMD "regedit.exe"
|
||||
|
||||
IDS_TOOLS_SYSDM_NAME "Rendszertulajdonságok"
|
||||
IDS_TOOLS_SYSDM_DESCR "Megjeleníti a számítógép információkat."
|
||||
IDS_TOOLS_SYSDM_CMD "control"
|
||||
IDS_TOOLS_SYSDM_PARAM "sysdm.cpl"
|
||||
|
||||
IDS_STARTUP_COLUMN_ELEMENT "Element"
|
||||
IDS_STARTUP_COLUMN_CMD "Parancs"
|
||||
IDS_STARTUP_COLUMN_PATH "Elérési út"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_SERVICES_STATUS_RUNNING "Fut"
|
||||
IDS_SERVICES_STATUS_STOPPED "Leállítva"
|
||||
IDS_SERVICES_YES "Igen"
|
||||
IDS_SERVICES_UNKNOWN "Ismeretlen"
|
||||
END
|
17
reactos/base/applications/msconfig/freeldrpage.c
Normal file
|
@ -0,0 +1,17 @@
|
|||
#include <precomp.h>
|
||||
|
||||
HWND hFreeLdrPage;
|
||||
HWND hFreeLdrDialog;
|
||||
|
||||
INT_PTR CALLBACK
|
||||
FreeLdrPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message) {
|
||||
case WM_INITDIALOG:
|
||||
hFreeLdrDialog = hDlg;
|
||||
SetWindowPos(hDlg, NULL, 10, 32, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
3
reactos/base/applications/msconfig/freeldrpage.h
Normal file
|
@ -0,0 +1,3 @@
|
|||
extern HWND hFreeLdrPage;
|
||||
|
||||
INT_PTR CALLBACK FreeLdrPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
|
17
reactos/base/applications/msconfig/generalpage.c
Normal file
|
@ -0,0 +1,17 @@
|
|||
#include <precomp.h>
|
||||
|
||||
HWND hGeneralPage;
|
||||
HWND hGeneralDialog;
|
||||
|
||||
INT_PTR CALLBACK
|
||||
GeneralPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message) {
|
||||
case WM_INITDIALOG:
|
||||
hGeneralDialog = hDlg;
|
||||
SetWindowPos(hDlg, NULL, 10, 32, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
3
reactos/base/applications/msconfig/generalpage.h
Normal file
|
@ -0,0 +1,3 @@
|
|||
extern HWND hGeneralPage;
|
||||
|
||||
INT_PTR CALLBACK GeneralPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
|
198
reactos/base/applications/msconfig/msconfig.c
Normal file
|
@ -0,0 +1,198 @@
|
|||
#include <precomp.h>
|
||||
|
||||
HINSTANCE hInst = 0;
|
||||
|
||||
HWND hMainWnd; /* Main Window */
|
||||
HWND hTabWnd; /* Tab Control Window */
|
||||
|
||||
void MsConfig_OnTabWndSelChange(void);
|
||||
|
||||
BOOL OnCreate(HWND hWnd)
|
||||
{
|
||||
TCHAR szTemp[256];
|
||||
TCITEM item;
|
||||
|
||||
hTabWnd = GetDlgItem(hWnd, IDC_TAB);
|
||||
hGeneralPage = CreateDialog(hInst, MAKEINTRESOURCE(IDD_GENERAL_PAGE), hWnd, GeneralPageWndProc);
|
||||
hSystemPage = CreateDialog(hInst, MAKEINTRESOURCE(IDD_SYSTEM_PAGE), hWnd, SystemPageWndProc);
|
||||
hFreeLdrPage = CreateDialog(hInst, MAKEINTRESOURCE(IDD_FREELDR_PAGE), hWnd, FreeLdrPageWndProc);
|
||||
hServicesPage = CreateDialog(hInst, MAKEINTRESOURCE(IDD_SERVICES_PAGE), hWnd, ServicesPageWndProc);
|
||||
hStartupPage = CreateDialog(hInst, MAKEINTRESOURCE(IDD_STARTUP_PAGE), hWnd, StartupPageWndProc);
|
||||
hToolsPage = CreateDialog(hInst, MAKEINTRESOURCE(IDD_TOOLS_PAGE), hWnd, ToolsPageWndProc);
|
||||
|
||||
LoadString(hInst, IDS_MSCONFIG, szTemp, 256);
|
||||
SetWindowText(hWnd, szTemp);
|
||||
|
||||
// Insert Tab Pages
|
||||
LoadString(hInst, IDS_TAB_GENERAL, szTemp, 256);
|
||||
memset(&item, 0, sizeof(TCITEM));
|
||||
item.mask = TCIF_TEXT;
|
||||
item.pszText = szTemp;
|
||||
TabCtrl_InsertItem(hTabWnd, 0, &item);
|
||||
|
||||
LoadString(hInst, IDS_TAB_SYSTEM, szTemp, 256);
|
||||
memset(&item, 0, sizeof(TCITEM));
|
||||
item.mask = TCIF_TEXT;
|
||||
item.pszText = szTemp;
|
||||
TabCtrl_InsertItem(hTabWnd, 1, &item);
|
||||
|
||||
LoadString(hInst, IDS_TAB_FREELDR, szTemp, 256);
|
||||
memset(&item, 0, sizeof(TCITEM));
|
||||
item.mask = TCIF_TEXT;
|
||||
item.pszText = szTemp;
|
||||
TabCtrl_InsertItem(hTabWnd, 2, &item);
|
||||
|
||||
LoadString(hInst, IDS_TAB_SERVICES, szTemp, 256);
|
||||
memset(&item, 0, sizeof(TCITEM));
|
||||
item.mask = TCIF_TEXT;
|
||||
item.pszText = szTemp;
|
||||
TabCtrl_InsertItem(hTabWnd, 3, &item);
|
||||
|
||||
LoadString(hInst, IDS_TAB_STARTUP, szTemp, 256);
|
||||
memset(&item, 0, sizeof(TCITEM));
|
||||
item.mask = TCIF_TEXT;
|
||||
item.pszText = szTemp;
|
||||
TabCtrl_InsertItem(hTabWnd, 4, &item);
|
||||
|
||||
LoadString(hInst, IDS_TAB_TOOLS, szTemp, 256);
|
||||
memset(&item, 0, sizeof(TCITEM));
|
||||
item.mask = TCIF_TEXT;
|
||||
item.pszText = szTemp;
|
||||
TabCtrl_InsertItem(hTabWnd, 5, &item);
|
||||
|
||||
MsConfig_OnTabWndSelChange();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
void MsConfig_OnTabWndSelChange(void)
|
||||
{
|
||||
switch (TabCtrl_GetCurSel(hTabWnd)) {
|
||||
case 0: //General
|
||||
ShowWindow(hGeneralPage, SW_SHOW);
|
||||
ShowWindow(hSystemPage, SW_HIDE);
|
||||
ShowWindow(hFreeLdrPage, SW_HIDE);
|
||||
ShowWindow(hServicesPage, SW_HIDE);
|
||||
ShowWindow(hStartupPage, SW_HIDE);
|
||||
ShowWindow(hToolsPage, SW_HIDE);
|
||||
BringWindowToTop(hGeneralPage);
|
||||
break;
|
||||
case 1: //SYSTEM.INI
|
||||
ShowWindow(hGeneralPage, SW_HIDE);
|
||||
ShowWindow(hSystemPage, SW_SHOW);
|
||||
ShowWindow(hToolsPage, SW_HIDE);
|
||||
ShowWindow(hStartupPage, SW_HIDE);
|
||||
ShowWindow(hFreeLdrPage, SW_HIDE);
|
||||
ShowWindow(hServicesPage, SW_HIDE);
|
||||
BringWindowToTop(hSystemPage);
|
||||
break;
|
||||
case 2: //Freeldr
|
||||
ShowWindow(hGeneralPage, SW_HIDE);
|
||||
ShowWindow(hSystemPage, SW_HIDE);
|
||||
ShowWindow(hFreeLdrPage, SW_SHOW);
|
||||
ShowWindow(hServicesPage, SW_HIDE);
|
||||
ShowWindow(hStartupPage, SW_HIDE);
|
||||
ShowWindow(hToolsPage, SW_HIDE);
|
||||
BringWindowToTop(hFreeLdrPage);
|
||||
break;
|
||||
case 3: //Services
|
||||
ShowWindow(hGeneralPage, SW_HIDE);
|
||||
ShowWindow(hSystemPage, SW_HIDE);
|
||||
ShowWindow(hFreeLdrPage, SW_HIDE);
|
||||
ShowWindow(hServicesPage, SW_SHOW);
|
||||
ShowWindow(hStartupPage, SW_HIDE);
|
||||
ShowWindow(hToolsPage, SW_HIDE);
|
||||
BringWindowToTop(hServicesPage);
|
||||
break;
|
||||
case 4: //startup
|
||||
ShowWindow(hGeneralPage, SW_HIDE);
|
||||
ShowWindow(hSystemPage, SW_HIDE);
|
||||
ShowWindow(hFreeLdrPage, SW_HIDE);
|
||||
ShowWindow(hServicesPage, SW_HIDE);
|
||||
ShowWindow(hStartupPage, SW_SHOW);
|
||||
ShowWindow(hToolsPage, SW_HIDE);
|
||||
BringWindowToTop(hStartupPage);
|
||||
break;
|
||||
case 5: //Tools
|
||||
ShowWindow(hGeneralPage, SW_HIDE);
|
||||
ShowWindow(hSystemPage, SW_HIDE);
|
||||
ShowWindow(hFreeLdrPage, SW_HIDE);
|
||||
ShowWindow(hServicesPage, SW_HIDE);
|
||||
ShowWindow(hStartupPage, SW_HIDE);
|
||||
ShowWindow(hToolsPage, SW_SHOW);
|
||||
BringWindowToTop(hToolsPage);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Message handler for dialog box. */
|
||||
INT_PTR CALLBACK
|
||||
MsConfigWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
int idctrl;
|
||||
LPNMHDR pnmh;
|
||||
|
||||
switch (message) {
|
||||
case WM_INITDIALOG:
|
||||
hMainWnd = hDlg;
|
||||
return OnCreate(hDlg);
|
||||
|
||||
case WM_COMMAND:
|
||||
|
||||
if (LOWORD(wParam) == IDOK) {
|
||||
//MsConfig_OnSaveChanges();
|
||||
}
|
||||
|
||||
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
|
||||
EndDialog(hDlg, LOWORD(wParam));
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_NOTIFY:
|
||||
idctrl = (int)wParam;
|
||||
pnmh = (LPNMHDR)lParam;
|
||||
if ((pnmh->hwndFrom == hTabWnd) &&
|
||||
(pnmh->idFrom == IDC_TAB) &&
|
||||
(pnmh->code == TCN_SELCHANGE))
|
||||
{
|
||||
MsConfig_OnTabWndSelChange();
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_DESTROY:
|
||||
DestroyWindow(hToolsPage);
|
||||
DestroyWindow(hGeneralPage);
|
||||
DestroyWindow(hServicesPage);
|
||||
DestroyWindow(hStartupPage);
|
||||
DestroyWindow(hFreeLdrPage);
|
||||
DestroyWindow(hSystemPage);
|
||||
return DefWindowProc(hDlg, message, wParam, lParam);
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int APIENTRY WinMain(HINSTANCE hInstance,
|
||||
HINSTANCE hPrevInstance,
|
||||
LPSTR lpCmdLine,
|
||||
int nCmdShow)
|
||||
{
|
||||
|
||||
INITCOMMONCONTROLSEX InitControls;
|
||||
|
||||
InitControls.dwSize = sizeof(INITCOMMONCONTROLSEX);
|
||||
InitControls.dwICC = ICC_TAB_CLASSES | ICC_LISTVIEW_CLASSES;
|
||||
InitCommonControlsEx(&InitControls);
|
||||
|
||||
hInst = hInstance;
|
||||
|
||||
DialogBox(hInst, (LPCTSTR)IDD_MSCONFIG_DIALOG, NULL, MsConfigWndProc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* EOF */
|
2
reactos/base/applications/msconfig/msconfig.h
Normal file
|
@ -0,0 +1,2 @@
|
|||
extern HINSTANCE hInst;
|
||||
|
19
reactos/base/applications/msconfig/msconfig.rc
Normal file
|
@ -0,0 +1,19 @@
|
|||
#include <windows.h>
|
||||
#include <commctrl.h>
|
||||
|
||||
#include "resource.h"
|
||||
|
||||
|
||||
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||
|
||||
#define REACTOS_VERSION_DLL
|
||||
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Systemconfiguration Tool\0"
|
||||
#define REACTOS_STR_INTERNAL_NAME "msconfig\0"
|
||||
#define REACTOS_STR_ORIGINAL_FILENAME "msconfig.exe\0"
|
||||
#include <reactos/version.rc>
|
||||
|
||||
|
||||
#include "De.rc"
|
||||
#include "En.rc"
|
||||
#include "Fr.rc"
|
||||
#include "Hu.rc"
|
26
reactos/base/applications/msconfig/msconfig.xml
Normal file
|
@ -0,0 +1,26 @@
|
|||
<module name="msconfig" type="win32gui" installbase="system32" installname="msconfig.exe">
|
||||
<include base="msconfig">.</include>
|
||||
<define name="UNICODE" />
|
||||
<define name="_UNICODE" />
|
||||
<define name="__REACTOS__" />
|
||||
<define name="__USE_W32API" />
|
||||
<define name="_WIN32_IE">0x600</define>
|
||||
<define name="_WIN32_WINNT">0x501</define>
|
||||
<library>kernel32</library>
|
||||
<library>user32</library>
|
||||
<library>advapi32</library>
|
||||
<library>version</library>
|
||||
<library>comctl32</library>
|
||||
<library>shell32</library>
|
||||
<compilationunit name="unit.c">
|
||||
<file>toolspage.c</file>
|
||||
<file>srvpage.c</file>
|
||||
<file>systempage.c</file>
|
||||
<file>startuppage.c</file>
|
||||
<file>freeldrpage.c</file>
|
||||
<file>generalpage.c</file>
|
||||
<file>msconfig.c</file>
|
||||
</compilationunit>
|
||||
<file>msconfig.rc</file>
|
||||
<pch>precomp.h</pch>
|
||||
</module>
|
19
reactos/base/applications/msconfig/precomp.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
#include <windows.h>
|
||||
#define NTOS_MODE_USER
|
||||
#include <commctrl.h>
|
||||
#include <winuser.h>
|
||||
#include <tchar.h>
|
||||
|
||||
#include "resource.h"
|
||||
#include "msconfig.h"
|
||||
#include "toolspage.h"
|
||||
#include "srvpage.h"
|
||||
#include "startuppage.h"
|
||||
#include "freeldrpage.h"
|
||||
#include "systempage.h"
|
||||
#include "generalpage.h"
|
||||
|
||||
#define MAX_KEY_LENGTH 255
|
||||
#define MAX_VALUE_NAME 16383
|
||||
|
||||
|
104
reactos/base/applications/msconfig/resource.h
Normal file
|
@ -0,0 +1,104 @@
|
|||
#define IDD_MSCONFIG_DIALOG 101
|
||||
#define IDD_TOOLS_PAGE 102
|
||||
#define IDD_SERVICES_PAGE 103
|
||||
#define IDD_GENERAL_PAGE 104
|
||||
#define IDD_STARTUP_PAGE 105
|
||||
#define IDD_FREELDR_PAGE 106
|
||||
#define IDD_SYSTEM_PAGE 107
|
||||
#define IDD_FREELDR_ADVANCED_PAGE 108
|
||||
|
||||
#define IDC_TAB 1001
|
||||
#define IDC_BTN_APPLY 1002
|
||||
#define IDC_BTN_HELP 1003
|
||||
#define IDC_TOOLS_CMDLINE 1004
|
||||
#define IDC_BTN_RUN 1005
|
||||
#define IDC_SERVICES_LIST 1006
|
||||
#define IDC_TOOLS_LIST 1007
|
||||
#define IDC_STARTUP_LIST 1008
|
||||
#define IDC_BTN_SERVICES_ACTIVATE 1009
|
||||
#define IDC_BTN_SERVICES_DEACTIVATE 1010
|
||||
#define IDC_BTN_STARTUP_ACTIVATE 1011
|
||||
#define IDC_BTN_STARTUP_DEACTIVATE 1012
|
||||
#define IDC_CBX_NORMAL_START 1013
|
||||
#define IDC_CBX_DIAGNOSTIC_START 1014
|
||||
#define IDC_CBX_SELECTIVE_STARTUP 1015
|
||||
#define IDC_CBX_SYSTEM_INI 1016
|
||||
#define IDC_CBX_SYSTEM_SERVICE 1017
|
||||
#define IDC_CBX_STARTUP_ITEM 1018
|
||||
#define IDC_LIST_BOX 1019
|
||||
#define IDC_BTN_CHECK_BOOT_PATH 1020
|
||||
#define IDC_BTN_SET_DEFAULT_BOOT 1021
|
||||
#define IDC_BTN_MOVE_UP_BOOT_OPTION 1022
|
||||
#define IDC_BTN_MOVE_DOWN_BOOT_OPTION 1023
|
||||
#define IDC_CBX_SAFE_BOOT 1024
|
||||
#define IDC_CBX_NO_GUI_BOOT 1025
|
||||
#define IDC_CBX_BOOT_LOG 1026
|
||||
#define IDC_CBX_BASE_VIDEO 1027
|
||||
#define IDC_CBX_SOS 1028
|
||||
#define IDC_BTN_ADVANCED_OPTIONS 1029
|
||||
#define IDC_TXT_BOOT_TIMEOUT 1030
|
||||
#define IDC_CBX_MAX_MEM 1031
|
||||
#define IDC_TXT_MAX_MEM 1032
|
||||
#define IDC_SCR_MAX_MEM 1033
|
||||
#define IDC_CBX_NUM_PROC 1034
|
||||
#define IDC_DRP_NUM_PROC 1035
|
||||
#define IDC_CBX_PCI_LOCK 1036
|
||||
#define IDC_CBX_PROFILE 1037
|
||||
#define IDC_CBX_IRQ 1038
|
||||
#define IDC_TXT_IRQ 1039
|
||||
#define IDC_CBX_DEBUG 1040
|
||||
#define IDC_CBX_DEBUG_PORT 1041
|
||||
#define IDC_DRP_DEBUG_PORT 1042
|
||||
#define IDC_CBX_BAUD_RATE 1043
|
||||
#define IDC_DRP_DRP_BAUD_RATE 1044
|
||||
#define IDC_CBX_CHANNEL 1045
|
||||
#define IDC_TXT_CHANNEL 1046
|
||||
#define IDC_SCR_CHANNEL 1047
|
||||
#define IDC_OK 1048
|
||||
#define IDC_CANCEL 1049
|
||||
|
||||
#define IDS_TAB_TOOLS 2001
|
||||
#define IDS_TAB_SYSTEM 2002
|
||||
#define IDS_TAB_FREELDR 2003
|
||||
#define IDS_TAB_STARTUP 2004
|
||||
#define IDS_TAB_SERVICES 2005
|
||||
#define IDS_TAB_GENERAL 2006
|
||||
|
||||
#define IDS_TOOLS_COLUMN_NAME 2010
|
||||
#define IDS_TOOLS_COLUMN_DESCR 2011
|
||||
#define IDS_SERVICES_COLUMN_SERVICE 2012
|
||||
#define IDS_SERVICES_COLUMN_REQ 2013
|
||||
#define IDS_SERVICES_COLUMN_VENDOR 2014
|
||||
#define IDS_SERVICES_COLUMN_STATUS 2015
|
||||
#define IDS_STARTUP_COLUMN_ELEMENT 2016
|
||||
#define IDS_STARTUP_COLUMN_CMD 2017
|
||||
#define IDS_STARTUP_COLUMN_PATH 2018
|
||||
|
||||
#define IDS_TOOLS_CMD_NAME 2100
|
||||
#define IDS_TOOLS_CMD_DESCR 2101
|
||||
#define IDS_TOOLS_CMD_CMD 2102
|
||||
#define IDS_TOOLS_CMD_PARAM 2103
|
||||
|
||||
#define IDS_TOOLS_INFO_NAME 2104
|
||||
#define IDS_TOOLS_INFO_DESCR 2105
|
||||
#define IDS_TOOLS_INFO_CMD 2106
|
||||
#define IDS_TOOLS_INFO_PARAM 2107
|
||||
|
||||
#define IDS_TOOLS_REGEDIT_NAME 2108
|
||||
#define IDS_TOOLS_REGEDIT_DESCR 2109
|
||||
#define IDS_TOOLS_REGEDIT_CMD 2110
|
||||
#define IDS_TOOLS_REGEDIT_PARAM 2111
|
||||
|
||||
#define IDS_TOOLS_SYSDM_NAME 2112
|
||||
#define IDS_TOOLS_SYSDM_DESCR 2113
|
||||
#define IDS_TOOLS_SYSDM_CMD 2114
|
||||
#define IDS_TOOLS_SYSDM_PARAM 2115
|
||||
|
||||
#define IDS_SERVICES_STATUS_STOPPED 2200
|
||||
#define IDS_SERVICES_STATUS_RUNNING 2201
|
||||
#define IDS_SERVICES_YES 2202
|
||||
#define IDS_SERVICES_UNKNOWN 2203
|
||||
|
||||
#define IDS_MSCONFIG 3000
|
||||
|
||||
/* EOF */
|
251
reactos/base/applications/msconfig/srvpage.c
Normal file
|
@ -0,0 +1,251 @@
|
|||
#include <precomp.h>
|
||||
|
||||
HWND hServicesPage;
|
||||
HWND hServicesListCtrl;
|
||||
HWND hServicesDialog;
|
||||
|
||||
void GetServices ( void );
|
||||
|
||||
INT_PTR CALLBACK
|
||||
ServicesPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LV_COLUMN column;
|
||||
TCHAR szTemp[256];
|
||||
DWORD dwStyle;
|
||||
|
||||
switch (message) {
|
||||
case WM_INITDIALOG:
|
||||
|
||||
hServicesListCtrl = GetDlgItem(hDlg, IDC_SERVICES_LIST);
|
||||
hServicesDialog = hDlg;
|
||||
|
||||
dwStyle = (DWORD) SendMessage(hServicesListCtrl, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
|
||||
dwStyle = dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES;
|
||||
SendMessage(hServicesListCtrl, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle);
|
||||
|
||||
SetWindowPos(hDlg, NULL, 10, 32, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
|
||||
|
||||
// Initialize the application page's controls
|
||||
column.mask = LVCF_TEXT | LVCF_WIDTH;
|
||||
|
||||
LoadString(hInst, IDS_SERVICES_COLUMN_SERVICE, szTemp, 256);
|
||||
column.pszText = szTemp;
|
||||
column.cx = 200;
|
||||
ListView_InsertColumn(hServicesListCtrl, 0, &column);
|
||||
|
||||
column.mask = LVCF_TEXT | LVCF_WIDTH;
|
||||
LoadString(hInst, IDS_SERVICES_COLUMN_REQ, szTemp, 256);
|
||||
column.pszText = szTemp;
|
||||
column.cx = 70;
|
||||
ListView_InsertColumn(hServicesListCtrl, 1, &column);
|
||||
|
||||
column.mask = LVCF_TEXT | LVCF_WIDTH;
|
||||
LoadString(hInst, IDS_SERVICES_COLUMN_VENDOR, szTemp, 256);
|
||||
column.pszText = szTemp;
|
||||
column.cx = 200;
|
||||
ListView_InsertColumn(hServicesListCtrl, 2, &column);
|
||||
|
||||
column.mask = LVCF_TEXT | LVCF_WIDTH;
|
||||
LoadString(hInst, IDS_SERVICES_COLUMN_STATUS, szTemp, 256);
|
||||
column.pszText = szTemp;
|
||||
column.cx = 70;
|
||||
ListView_InsertColumn(hServicesListCtrl, 3, &column);
|
||||
|
||||
GetServices();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
GetServices ( void )
|
||||
{
|
||||
LV_ITEM item;
|
||||
WORD wCodePage;
|
||||
WORD wLangID;
|
||||
SC_HANDLE ScHandle;
|
||||
SC_HANDLE hService;
|
||||
DWORD BytesNeeded = 0;
|
||||
DWORD ResumeHandle = 0;
|
||||
DWORD NumServices = 0;
|
||||
DWORD dwHandle, dwLen;
|
||||
size_t Index;
|
||||
UINT BufLen;
|
||||
TCHAR szStatus[128];
|
||||
TCHAR* lpData;
|
||||
TCHAR* lpBuffer;
|
||||
TCHAR szStrFileInfo[80];
|
||||
TCHAR FileName[MAX_PATH];
|
||||
LPVOID pvData;
|
||||
|
||||
LPSERVICE_FAILURE_ACTIONS pServiceFailureActions = NULL;
|
||||
LPQUERY_SERVICE_CONFIG pServiceConfig = NULL;
|
||||
ENUM_SERVICE_STATUS_PROCESS *pServiceStatus = NULL;
|
||||
|
||||
ScHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
|
||||
if (ScHandle != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
if (EnumServicesStatusEx(ScHandle, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL, (LPBYTE)pServiceStatus, 0, &BytesNeeded, &NumServices, &ResumeHandle, 0) == 0)
|
||||
{
|
||||
/* Call function again if required size was returned */
|
||||
if (GetLastError() == ERROR_MORE_DATA)
|
||||
{
|
||||
/* reserve memory for service info array */
|
||||
pServiceStatus = (ENUM_SERVICE_STATUS_PROCESS *) HeapAlloc(GetProcessHeap(), 0, BytesNeeded);
|
||||
if (!pServiceStatus)
|
||||
return;
|
||||
|
||||
/* fill array with service info */
|
||||
if (EnumServicesStatusEx(ScHandle, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL, (LPBYTE)pServiceStatus, BytesNeeded, &BytesNeeded, &NumServices, &ResumeHandle, 0) == 0)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, pServiceStatus);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else /* exit on failure */
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (NumServices)
|
||||
{
|
||||
if (!pServiceStatus)
|
||||
return;
|
||||
for (Index = 0; Index < NumServices; Index++)
|
||||
{
|
||||
memset(&item, 0, sizeof(LV_ITEM));
|
||||
item.mask = LVIF_TEXT;
|
||||
item.iImage = 0;
|
||||
item.pszText = pServiceStatus[Index].lpDisplayName;
|
||||
item.iItem = ListView_GetItemCount(hServicesListCtrl);
|
||||
item.lParam = 0;
|
||||
item.iItem = ListView_InsertItem(hServicesListCtrl, &item);
|
||||
|
||||
BytesNeeded = 0;
|
||||
hService = OpenService(ScHandle, pServiceStatus[Index].lpServiceName, SC_MANAGER_CONNECT);
|
||||
if (hService != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
/* check if service is required by the system*/
|
||||
if (!QueryServiceConfig2(hService, SERVICE_CONFIG_FAILURE_ACTIONS, (LPBYTE)pServiceFailureActions, 0, &BytesNeeded))
|
||||
{
|
||||
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
||||
{
|
||||
pServiceFailureActions = (LPSERVICE_FAILURE_ACTIONS) HeapAlloc(GetProcessHeap(), 0, BytesNeeded);
|
||||
if (pServiceFailureActions == NULL)
|
||||
return;
|
||||
|
||||
if (!QueryServiceConfig2(hService, SERVICE_CONFIG_FAILURE_ACTIONS, (LPBYTE)pServiceFailureActions, BytesNeeded, &BytesNeeded))
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, pServiceFailureActions);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else /* exit on failure */
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (pServiceFailureActions->cActions)
|
||||
{
|
||||
if (pServiceFailureActions->lpsaActions[0].Type == SC_ACTION_REBOOT)
|
||||
{
|
||||
LoadString(hInst, IDS_SERVICES_YES, szStatus, 128);
|
||||
item.pszText = szStatus;
|
||||
item.iSubItem = 1;
|
||||
SendMessage(hServicesListCtrl, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
}
|
||||
}
|
||||
|
||||
if (pServiceFailureActions != NULL)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, pServiceFailureActions);
|
||||
pServiceFailureActions = NULL;
|
||||
}
|
||||
|
||||
/* get vendor of service binary */
|
||||
BytesNeeded = 0;
|
||||
if (!QueryServiceConfig(hService, pServiceConfig, 0, &BytesNeeded))
|
||||
{
|
||||
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
||||
{
|
||||
pServiceConfig = (LPQUERY_SERVICE_CONFIG) HeapAlloc(GetProcessHeap(), 0, BytesNeeded);
|
||||
if (pServiceConfig == NULL)
|
||||
return;
|
||||
|
||||
if (!QueryServiceConfig(hService, pServiceConfig, BytesNeeded, &BytesNeeded))
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, pServiceConfig);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else /* exit on failure */
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
memset(&FileName, 0, MAX_PATH);
|
||||
if (_tcscspn(pServiceConfig->lpBinaryPathName, _T("\"")))
|
||||
{
|
||||
_tcsncpy(FileName, pServiceConfig->lpBinaryPathName, _tcscspn(pServiceConfig->lpBinaryPathName, _T(" ")) );
|
||||
}
|
||||
else
|
||||
{
|
||||
_tcscpy(FileName, pServiceConfig->lpBinaryPathName);
|
||||
}
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, pServiceConfig);
|
||||
pServiceConfig = NULL;
|
||||
|
||||
dwLen = GetFileVersionInfoSize(FileName, &dwHandle);
|
||||
if (dwLen)
|
||||
{
|
||||
lpData = (TCHAR*) HeapAlloc(GetProcessHeap(), 0, dwLen);
|
||||
if (lpData == NULL)
|
||||
return;
|
||||
|
||||
if (!GetFileVersionInfo (FileName, dwHandle, dwLen, lpData)) {
|
||||
HeapFree(GetProcessHeap(), 0, lpData);
|
||||
return;
|
||||
}
|
||||
|
||||
if (VerQueryValue(lpData, _T("\\VarFileInfo\\Translation"), &pvData, (PUINT) &BufLen))
|
||||
{
|
||||
wCodePage = LOWORD(*(DWORD*) pvData);
|
||||
wLangID = HIWORD(*(DWORD*) pvData);
|
||||
wsprintf(szStrFileInfo, _T("StringFileInfo\\%04X%04X\\CompanyName"), wCodePage, wLangID);
|
||||
}
|
||||
|
||||
if (VerQueryValue (lpData, szStrFileInfo, (LPVOID) &lpBuffer, (PUINT) &BufLen)) {
|
||||
item.pszText = lpBuffer;
|
||||
item.iSubItem = 2;
|
||||
SendMessage(hServicesListCtrl, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, lpData);
|
||||
}
|
||||
else
|
||||
{
|
||||
LoadString(hInst, IDS_SERVICES_UNKNOWN, szStatus, 128);
|
||||
item.pszText = szStatus;
|
||||
item.iSubItem = 2;
|
||||
SendMessage(hServicesListCtrl, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
}
|
||||
CloseServiceHandle(hService);
|
||||
}
|
||||
|
||||
LoadString(hInst, ((pServiceStatus[Index].ServiceStatusProcess.dwCurrentState == SERVICE_STOPPED) ? IDS_SERVICES_STATUS_STOPPED : IDS_SERVICES_STATUS_RUNNING), szStatus, 128);
|
||||
item.pszText = szStatus;
|
||||
item.iSubItem = 3;
|
||||
SendMessage(hServicesListCtrl, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, pServiceStatus);
|
||||
CloseServiceHandle(ScHandle);
|
||||
}
|
||||
|
||||
|
||||
}
|
4
reactos/base/applications/msconfig/srvpage.h
Normal file
|
@ -0,0 +1,4 @@
|
|||
extern HWND hServicesPage;
|
||||
extern HWND hServicesListCtrl;
|
||||
|
||||
INT_PTR CALLBACK ServicesPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
|
123
reactos/base/applications/msconfig/startuppage.c
Normal file
|
@ -0,0 +1,123 @@
|
|||
#include <precomp.h>
|
||||
|
||||
HWND hStartupPage;
|
||||
HWND hStartupListCtrl;
|
||||
HWND hStartupDialog;
|
||||
|
||||
void GetAutostartEntriesFromRegistry ( HKEY hRootKey, TCHAR* KeyName );
|
||||
|
||||
INT_PTR CALLBACK
|
||||
StartupPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LV_COLUMN column;
|
||||
TCHAR szTemp[256];
|
||||
DWORD dwStyle;
|
||||
|
||||
switch (message) {
|
||||
case WM_INITDIALOG:
|
||||
|
||||
hStartupListCtrl = GetDlgItem(hDlg, IDC_STARTUP_LIST);
|
||||
hStartupDialog = hDlg;
|
||||
|
||||
dwStyle = (DWORD) SendMessage(hStartupListCtrl, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
|
||||
dwStyle = dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES;
|
||||
SendMessage(hStartupListCtrl, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle);
|
||||
|
||||
SetWindowPos(hDlg, NULL, 10, 32, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
|
||||
|
||||
// Initialize the application page's controls
|
||||
column.mask = LVCF_TEXT | LVCF_WIDTH;
|
||||
|
||||
LoadString(hInst, IDS_STARTUP_COLUMN_ELEMENT, szTemp, 256);
|
||||
column.pszText = szTemp;
|
||||
column.cx = 150;
|
||||
ListView_InsertColumn(hStartupListCtrl, 0, &column);
|
||||
|
||||
column.mask = LVCF_TEXT | LVCF_WIDTH;
|
||||
LoadString(hInst, IDS_STARTUP_COLUMN_CMD, szTemp, 256);
|
||||
column.pszText = szTemp;
|
||||
column.cx = 150;
|
||||
ListView_InsertColumn(hStartupListCtrl, 1, &column);
|
||||
|
||||
column.mask = LVCF_TEXT | LVCF_WIDTH;
|
||||
LoadString(hInst, IDS_STARTUP_COLUMN_PATH, szTemp, 256);
|
||||
column.pszText = szTemp;
|
||||
column.cx = 250;
|
||||
ListView_InsertColumn(hStartupListCtrl, 2, &column);
|
||||
|
||||
GetAutostartEntriesFromRegistry(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"));
|
||||
GetAutostartEntriesFromRegistry(HKEY_CURRENT_USER, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"));
|
||||
//FIXME: What about HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit
|
||||
//FIXME: Common Startup (startmenu)
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
GetAutostartEntriesFromRegistry ( HKEY hRootKey, TCHAR* KeyName )
|
||||
{
|
||||
HKEY hKey;
|
||||
DWORD Index, dwValues, retVal, dwType;
|
||||
DWORD dwValueLength, dwDataLength = MAX_VALUE_NAME;
|
||||
TCHAR* Data;
|
||||
TCHAR lpValueName[MAX_KEY_LENGTH];
|
||||
TCHAR Path[MAX_KEY_LENGTH + 5];
|
||||
LV_ITEM item;
|
||||
|
||||
if (RegOpenKeyEx(hRootKey, KeyName, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
|
||||
{
|
||||
if (RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwValues, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
|
||||
{
|
||||
for (Index = 0, retVal = ERROR_SUCCESS; Index < dwValues; Index++)
|
||||
{
|
||||
dwValueLength = MAX_KEY_LENGTH;
|
||||
dwDataLength = MAX_VALUE_NAME;
|
||||
Data = (TCHAR*) HeapAlloc(GetProcessHeap(), 0, MAX_VALUE_NAME * sizeof(TCHAR));
|
||||
if (Data == NULL)
|
||||
break;
|
||||
retVal = RegEnumValue(hKey, Index, lpValueName, &dwValueLength, NULL, &dwType, (LPBYTE)Data, &dwDataLength);
|
||||
if (retVal == ERROR_SUCCESS)
|
||||
{
|
||||
memset(&item, 0, sizeof(LV_ITEM));
|
||||
item.mask = LVIF_TEXT;
|
||||
item.iImage = 0;
|
||||
item.pszText = lpValueName;
|
||||
item.iItem = ListView_GetItemCount(hStartupListCtrl);
|
||||
item.lParam = 0;
|
||||
ListView_InsertItem(hStartupListCtrl, &item);
|
||||
|
||||
if (dwType == REG_SZ)
|
||||
{
|
||||
GetLongPathName(Data, Data, (DWORD) _tcsclen(Data));
|
||||
item.pszText = Data;
|
||||
item.iSubItem = 1;
|
||||
SendMessage(hStartupListCtrl, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
}
|
||||
|
||||
switch (PtrToLong(hRootKey))
|
||||
{
|
||||
case PtrToLong(HKEY_LOCAL_MACHINE):
|
||||
_tcscpy(Path, _T("HKLM\\\0"));
|
||||
break;
|
||||
case PtrToLong(HKEY_CURRENT_USER):
|
||||
_tcscpy(Path, _T("HKCU\\\0"));
|
||||
break;
|
||||
default:
|
||||
_tcscpy(Path, _T("\0"));
|
||||
}
|
||||
|
||||
_tcscat(Path, KeyName);
|
||||
item.pszText = Path;
|
||||
item.iSubItem = 2;
|
||||
SendMessage(hStartupListCtrl, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
HeapFree(GetProcessHeap(), 0, Data);
|
||||
}
|
||||
}
|
||||
}
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
|
||||
}
|
4
reactos/base/applications/msconfig/startuppage.h
Normal file
|
@ -0,0 +1,4 @@
|
|||
extern HWND hStartupPage;
|
||||
extern HWND hStartupPageListCtrl;
|
||||
|
||||
INT_PTR CALLBACK StartupPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
|
17
reactos/base/applications/msconfig/systempage.c
Normal file
|
@ -0,0 +1,17 @@
|
|||
#include <precomp.h>
|
||||
|
||||
HWND hSystemPage;
|
||||
HWND hSystemDialog;
|
||||
|
||||
INT_PTR CALLBACK
|
||||
SystemPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message) {
|
||||
case WM_INITDIALOG:
|
||||
hSystemDialog = hDlg;
|
||||
SetWindowPos(hDlg, NULL, 10, 32, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
3
reactos/base/applications/msconfig/systempage.h
Normal file
|
@ -0,0 +1,3 @@
|
|||
extern HWND hSystemPage;
|
||||
|
||||
INT_PTR CALLBACK SystemPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
|
124
reactos/base/applications/msconfig/toolspage.c
Normal file
|
@ -0,0 +1,124 @@
|
|||
#include <precomp.h>
|
||||
|
||||
HWND hToolsPage;
|
||||
HWND hToolsListCtrl;
|
||||
HWND hToolsDialog;
|
||||
|
||||
void AddItem ( DWORD, DWORD, DWORD, DWORD );
|
||||
void FillListView ( void );
|
||||
|
||||
DWORD ListItems_Cmds[20];
|
||||
DWORD ListItems_Params[20];
|
||||
|
||||
void AddItem ( DWORD name_id, DWORD descr_id, DWORD cmd_id , DWORD param_id ) {
|
||||
TCHAR szTemp[256];
|
||||
LV_ITEM item;
|
||||
|
||||
LoadString(hInst, name_id, szTemp, 256);
|
||||
memset(&item, 0, sizeof(LV_ITEM));
|
||||
item.mask = LVIF_TEXT;
|
||||
item.iImage = 0;
|
||||
item.pszText = szTemp;
|
||||
item.iItem = ListView_GetItemCount(hToolsListCtrl);
|
||||
item.lParam = 0;
|
||||
ListView_InsertItem(hToolsListCtrl, &item);
|
||||
|
||||
ListItems_Cmds[item.iItem] = cmd_id;
|
||||
ListItems_Params[item.iItem] = param_id;
|
||||
|
||||
LoadString(hInst, descr_id, szTemp, 256);
|
||||
item.pszText = szTemp;
|
||||
item.iSubItem = 1;
|
||||
SendMessage(hToolsListCtrl, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
}
|
||||
|
||||
void FillListView ( void ) {
|
||||
AddItem(IDS_TOOLS_CMD_NAME, IDS_TOOLS_CMD_DESCR, IDS_TOOLS_CMD_CMD, IDS_TOOLS_CMD_PARAM);
|
||||
AddItem(IDS_TOOLS_REGEDIT_NAME, IDS_TOOLS_REGEDIT_DESCR, IDS_TOOLS_REGEDIT_CMD,IDS_TOOLS_REGEDIT_PARAM);
|
||||
AddItem(IDS_TOOLS_SYSDM_NAME, IDS_TOOLS_SYSDM_DESCR, IDS_TOOLS_SYSDM_CMD, IDS_TOOLS_SYSDM_PARAM);
|
||||
AddItem(IDS_TOOLS_INFO_NAME, IDS_TOOLS_INFO_DESCR, IDS_TOOLS_INFO_CMD, IDS_TOOLS_INFO_PARAM);
|
||||
}
|
||||
|
||||
INT_PTR CALLBACK
|
||||
ToolsPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LV_COLUMN column;
|
||||
TCHAR szTemp[256];
|
||||
TCHAR szTemp2[256];
|
||||
LPNMITEMACTIVATE lpnmitem;
|
||||
LPNMHDR nmh;
|
||||
DWORD dwStyle;
|
||||
|
||||
switch (message) {
|
||||
case WM_INITDIALOG:
|
||||
|
||||
hToolsListCtrl = GetDlgItem(hDlg, IDC_TOOLS_LIST);
|
||||
hToolsDialog = hDlg;
|
||||
|
||||
dwStyle = (DWORD) SendMessage(hToolsListCtrl, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
|
||||
dwStyle = dwStyle | LVS_EX_FULLROWSELECT;
|
||||
SendMessage(hToolsListCtrl, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle);
|
||||
|
||||
SetWindowPos(hDlg, NULL, 10, 32, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
|
||||
|
||||
// Initialize the application page's controls
|
||||
column.mask = LVCF_TEXT | LVCF_WIDTH;
|
||||
|
||||
LoadString(hInst, IDS_TOOLS_COLUMN_NAME, szTemp, 256);
|
||||
column.pszText = szTemp;
|
||||
column.cx = 150;
|
||||
ListView_InsertColumn(hToolsListCtrl, 0, &column);
|
||||
|
||||
column.mask = LVCF_TEXT | LVCF_WIDTH;
|
||||
LoadString(hInst, IDS_TOOLS_COLUMN_DESCR, szTemp, 256);
|
||||
column.pszText = szTemp;
|
||||
column.cx = 500;
|
||||
ListView_InsertColumn(hToolsListCtrl, 1, &column);
|
||||
|
||||
FillListView();
|
||||
return TRUE;
|
||||
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam))
|
||||
{
|
||||
case IDC_BTN_RUN:
|
||||
if (ListView_GetSelectionMark(hToolsListCtrl) != -1) {
|
||||
LoadString(hInst, ListItems_Cmds[ListView_GetSelectionMark(hToolsListCtrl)], szTemp, 256);
|
||||
LoadString(hInst, ListItems_Params[ListView_GetSelectionMark(hToolsListCtrl)], szTemp2, 256);
|
||||
ShellExecute(0, _T("open"), szTemp, szTemp2, _T(""), SW_NORMAL);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_NOTIFY:
|
||||
nmh = (LPNMHDR) lParam;
|
||||
if (nmh->hwndFrom == hToolsListCtrl)
|
||||
{
|
||||
switch (nmh->code)
|
||||
{
|
||||
case NM_CLICK:
|
||||
lpnmitem = (LPNMITEMACTIVATE) lParam;
|
||||
if (lpnmitem->iItem > -1) {
|
||||
LoadString(hInst, ListItems_Cmds[lpnmitem->iItem], szTemp, 256);
|
||||
LoadString(hInst, ListItems_Params[lpnmitem->iItem], szTemp2, 256);
|
||||
_tcscat(szTemp, _T(" "));
|
||||
_tcscat(szTemp, szTemp2);
|
||||
SendDlgItemMessage(hToolsDialog, IDC_TOOLS_CMDLINE, WM_SETTEXT, 0, (LPARAM) szTemp);
|
||||
}
|
||||
break;
|
||||
case NM_DBLCLK:
|
||||
lpnmitem = (LPNMITEMACTIVATE) lParam;
|
||||
if (lpnmitem->iItem > -1) {
|
||||
LoadString(hInst, ListItems_Cmds[lpnmitem->iItem], szTemp, 256);
|
||||
LoadString(hInst, ListItems_Params[lpnmitem->iItem], szTemp2, 256);
|
||||
ShellExecute(0, _T("open"), szTemp, szTemp2, _T(""), SW_NORMAL);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
5
reactos/base/applications/msconfig/toolspage.h
Normal file
|
@ -0,0 +1,5 @@
|
|||
extern HWND hToolsPage;
|
||||
extern HWND hToolsListCtrl;
|
||||
|
||||
INT_PTR CALLBACK ToolsPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
|
61
reactos/base/applications/sc/control.c
Normal file
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS SC utility
|
||||
* FILE: subsys/system/sc/control.c
|
||||
* PURPOSE: control ReactOS services
|
||||
* PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
|
||||
* REVISIONS:
|
||||
* Ged Murphy 20/10/05 Created
|
||||
*
|
||||
*/
|
||||
|
||||
#include "sc.h"
|
||||
|
||||
/*
|
||||
* handles the following commands:
|
||||
* control, continue, interrogate, pause, stop
|
||||
*/
|
||||
|
||||
BOOL Control(DWORD Control, LPCTSTR ServiceName, LPCTSTR *Args)
|
||||
{
|
||||
SC_HANDLE hSc;
|
||||
SERVICE_STATUS Status;
|
||||
|
||||
#ifdef SCDBG
|
||||
/* testing */
|
||||
_tprintf(_T("service to control - %s\n\n"), ServiceName);
|
||||
_tprintf(_T("command - %lu\n\n"), Control);
|
||||
_tprintf(_T("Arguments :\n"));
|
||||
while (*Args)
|
||||
{
|
||||
printf("%s\n", *Args);
|
||||
Args++;
|
||||
}
|
||||
#endif /* SCDBG */
|
||||
|
||||
hSc = OpenService(hSCManager, ServiceName,
|
||||
SERVICE_INTERROGATE | SERVICE_PAUSE_CONTINUE |
|
||||
SERVICE_STOP | SERVICE_USER_DEFINED_CONTROL |
|
||||
SERVICE_QUERY_STATUS);
|
||||
|
||||
if (hSc == NULL)
|
||||
{
|
||||
_tprintf(_T("openService failed\n"));
|
||||
ReportLastError();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (! ControlService(hSc, Control, &Status))
|
||||
{
|
||||
_tprintf(_T("[SC] controlService FAILED %lu:\n\n"), GetLastError());
|
||||
ReportLastError();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
CloseServiceHandle(hSc);
|
||||
|
||||
/* print the status information */
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
58
reactos/base/applications/sc/create.c
Normal file
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS SC utility
|
||||
* FILE: subsys/system/sc/create.c
|
||||
* PURPOSE: control ReactOS services
|
||||
* PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
|
||||
* REVISIONS:
|
||||
* Ged Murphy 20/10/05 Created
|
||||
*
|
||||
*/
|
||||
|
||||
#include "sc.h"
|
||||
|
||||
BOOL Create(LPCTSTR ServiceName, LPCTSTR *ServiceArgs)
|
||||
{
|
||||
SC_HANDLE hSc;
|
||||
LPCTSTR BinaryPathName = *++ServiceArgs;
|
||||
// LPCTSTR *Options = ++ServiceArgs;
|
||||
|
||||
if ((! ServiceName) || (! BinaryPathName))
|
||||
return CreateUsage();
|
||||
|
||||
#ifdef SCDBG
|
||||
/* testing */
|
||||
printf("service to create - %s\n", ServiceName);
|
||||
printf("Binary path - %s\n", BinaryPathName);
|
||||
printf("Arguments :\n");
|
||||
while (*Options)
|
||||
{
|
||||
printf("%s\n", *Options);
|
||||
Options++;
|
||||
}
|
||||
#endif
|
||||
hSc = CreateService(hSCManager,
|
||||
ServiceName,
|
||||
ServiceName,
|
||||
SERVICE_ALL_ACCESS,
|
||||
SERVICE_WIN32_OWN_PROCESS,
|
||||
SERVICE_DEMAND_START,
|
||||
SERVICE_ERROR_NORMAL,
|
||||
BinaryPathName,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
if (hSc == NULL)
|
||||
{
|
||||
_tprintf(_T("CreateService failed\n"));
|
||||
ReportLastError();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
_tprintf(_T("[SC] CreateService SUCCESS\n"));
|
||||
CloseServiceHandle(hSc);
|
||||
return TRUE;
|
||||
}
|
42
reactos/base/applications/sc/delete.c
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS SC utility
|
||||
* FILE: subsys/system/sc/delete.c
|
||||
* PURPOSE: control ReactOS services
|
||||
* PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
|
||||
* REVISIONS:
|
||||
* Ged Murphy 20/10/05 Created
|
||||
*
|
||||
*/
|
||||
|
||||
#include "sc.h"
|
||||
|
||||
BOOL Delete(LPCTSTR ServiceName)
|
||||
{
|
||||
SC_HANDLE hSc;
|
||||
|
||||
#ifdef SCDBG
|
||||
/* testing */
|
||||
printf("service to delete - %s\n\n", ServiceName);
|
||||
#endif
|
||||
|
||||
hSc = OpenService(hSCManager, ServiceName, DELETE);
|
||||
|
||||
if (hSc == NULL)
|
||||
{
|
||||
_tprintf(_T("openService failed\n"));
|
||||
ReportLastError();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (! DeleteService(hSc))
|
||||
{
|
||||
_tprintf(_T("DeleteService failed\n"));
|
||||
ReportLastError();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
_tprintf(_T("[SC] DeleteService SUCCESS\n"));
|
||||
CloseServiceHandle(hSc);
|
||||
return TRUE;
|
||||
}
|
327
reactos/base/applications/sc/query.c
Normal file
|
@ -0,0 +1,327 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS SC utility
|
||||
* FILE: subsys/system/sc/query.c
|
||||
* PURPOSE: control ReactOS services
|
||||
* PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
|
||||
* REVISIONS:
|
||||
* Ged Murphy 20/10/05 Created
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* TODO:
|
||||
* Allow calling of 2 options e.g.:
|
||||
* type= driver state= inactive
|
||||
*/
|
||||
|
||||
#include "sc.h"
|
||||
|
||||
/* local function decs */
|
||||
VOID PrintService(BOOL bExtended);
|
||||
BOOL EnumServices(DWORD ServiceType, DWORD ServiceState);
|
||||
BOOL QueryService(LPCTSTR ServiceName, BOOL bExtended);
|
||||
|
||||
/* global variables */
|
||||
static ENUM_SERVICE_STATUS_PROCESS *pServiceStatus = NULL;
|
||||
DWORD NumServices = 0;
|
||||
|
||||
|
||||
BOOL
|
||||
Query(LPCTSTR ServiceName, LPCTSTR *ServiceArgs, BOOL bExtended)
|
||||
{
|
||||
if (! ServiceName) /* display all running services and drivers */
|
||||
{
|
||||
/* get default values */
|
||||
EnumServices(SERVICE_WIN32, SERVICE_ACTIVE);
|
||||
|
||||
/* print default values */
|
||||
PrintService(bExtended);
|
||||
}
|
||||
else if (_tcsicmp(ServiceName, _T("type=")) == 0)
|
||||
{
|
||||
LPCTSTR Type = *ServiceArgs;
|
||||
|
||||
if (_tcsicmp(Type, _T("driver")) == 0)
|
||||
EnumServices(SERVICE_DRIVER, SERVICE_ACTIVE);
|
||||
else if (_tcsicmp(Type, _T("service")) == 0)
|
||||
EnumServices(SERVICE_WIN32, SERVICE_ACTIVE);
|
||||
else if (_tcsicmp(Type, _T("all")) == 0)
|
||||
EnumServices(SERVICE_DRIVER|SERVICE_WIN32, SERVICE_ACTIVE);
|
||||
else
|
||||
{
|
||||
_tprintf(_T("\nERROR following \"type=\"!\n"));
|
||||
_tprintf(_T("Must be \"driver\" or \"service\" or \"all\"\n"));
|
||||
}
|
||||
|
||||
PrintService(bExtended);
|
||||
}
|
||||
else if(_tcsicmp(ServiceName, _T("state=")) == 0)
|
||||
{
|
||||
LPCTSTR State = *ServiceArgs;
|
||||
|
||||
if (_tcsicmp(State, _T("inactive")) == 0)
|
||||
EnumServices(SERVICE_WIN32, SERVICE_INACTIVE);
|
||||
else if (_tcsicmp(State, _T("all")) == 0)
|
||||
EnumServices(SERVICE_WIN32, SERVICE_STATE_ALL);
|
||||
else
|
||||
{
|
||||
_tprintf(_T("\nERROR following \"state=\"!\n"));
|
||||
_tprintf(_T("Must be \"active\" or \"inactive\" or \"all\"\n"));
|
||||
}
|
||||
|
||||
PrintService(bExtended);
|
||||
}
|
||||
/*
|
||||
else if(_tcsicmp(ServiceName, _T("bufsize=")))
|
||||
|
||||
else if(_tcsicmp(ServiceName, _T("ri=")))
|
||||
|
||||
else if(_tcsicmp(ServiceName, _T("group=")))
|
||||
*/
|
||||
else /* print only the service requested */
|
||||
{
|
||||
QueryService(ServiceName, bExtended);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
BOOL
|
||||
QueryService(LPCTSTR ServiceName, BOOL bExtended)
|
||||
{
|
||||
SERVICE_STATUS_PROCESS *pServiceInfo = NULL;
|
||||
SC_HANDLE hSc;
|
||||
DWORD BufSiz = 0;
|
||||
DWORD BytesNeeded = 0;
|
||||
DWORD Ret;
|
||||
|
||||
hSc = OpenService(hSCManager, ServiceName, SERVICE_QUERY_STATUS);
|
||||
|
||||
if (hSc == NULL)
|
||||
{
|
||||
_tprintf(_T("QueryService: openService failed\n"));
|
||||
ReportLastError();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Ret = QueryServiceStatusEx(hSc,
|
||||
SC_STATUS_PROCESS_INFO,
|
||||
NULL,
|
||||
BufSiz,
|
||||
&BytesNeeded);
|
||||
|
||||
if ((Ret != 0) || (GetLastError() != ERROR_INSUFFICIENT_BUFFER))
|
||||
{
|
||||
_tprintf(_T("QueryService: First call to QueryServiceStatusEx failed : "));
|
||||
ReportLastError();
|
||||
return FALSE;
|
||||
}
|
||||
else /* Call function again if required size was returned */
|
||||
{
|
||||
/* reserve memory for service info array */
|
||||
pServiceInfo = (SERVICE_STATUS_PROCESS *)
|
||||
HeapAlloc(GetProcessHeap(), 0, BytesNeeded);
|
||||
if (pServiceInfo == NULL)
|
||||
{
|
||||
_tprintf(_T("QueryService: Failed to allocate memory : "));
|
||||
ReportLastError();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* fill array with service info */
|
||||
if (! QueryServiceStatusEx(hSc,
|
||||
SC_STATUS_PROCESS_INFO,
|
||||
(LPBYTE)pServiceInfo,
|
||||
BytesNeeded,
|
||||
&BytesNeeded))
|
||||
{
|
||||
_tprintf(_T("QueryService: Second call to QueryServiceStatusEx failed : "));
|
||||
ReportLastError();
|
||||
HeapFree(GetProcessHeap(), 0, pServiceInfo);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
_tprintf(_T("SERVICE_NAME: %s\n"), ServiceName);
|
||||
|
||||
_tprintf(_T("\tTYPE : %x "),
|
||||
(unsigned int)pServiceInfo->dwServiceType);
|
||||
switch (pServiceInfo->dwServiceType)
|
||||
{
|
||||
case 1 : _tprintf(_T("KERNEL_DRIVER\n")); break;
|
||||
case 2 : _tprintf(_T("FILE_SYSTEM_DRIVER\n")); break;
|
||||
case 16 : _tprintf(_T("WIN32_OWN_PROCESS\n")); break;
|
||||
case 32 : _tprintf(_T("WIN32_SHARE_PROCESS\n")); break;
|
||||
default : _tprintf(_T("\n")); break;
|
||||
}
|
||||
|
||||
_tprintf(_T("\tSTATE : %x "),
|
||||
(unsigned int)pServiceInfo->dwCurrentState);
|
||||
|
||||
switch (pServiceInfo->dwCurrentState)
|
||||
{
|
||||
case 1 : _tprintf(_T("STOPPED\n")); break;
|
||||
case 2 : _tprintf(_T("START_PENDING\n")); break;
|
||||
case 3 : _tprintf(_T("STOP_PENDING\n")); break;
|
||||
case 4 : _tprintf(_T("RUNNING\n")); break;
|
||||
case 5 : _tprintf(_T("CONTINUE_PENDING\n")); break;
|
||||
case 6 : _tprintf(_T("PAUSE_PENDING\n")); break;
|
||||
case 7 : _tprintf(_T("PAUSED\n")); break;
|
||||
default : _tprintf(_T("\n")); break;
|
||||
}
|
||||
|
||||
// _tprintf(_T("\n\taccepted : 0x%x\n\n"),
|
||||
// pServiceStatus[i].ServiceStatusProcess.dwControlsAccepted);
|
||||
// (STOPPABLE,NOT_PAUSABLE,ACCEPTS_SHUTDOWN)
|
||||
|
||||
_tprintf(_T("\tWIN32_EXIT_CODE : %d (0x%x)\n"),
|
||||
(unsigned int)pServiceInfo->dwWin32ExitCode,
|
||||
(unsigned int)pServiceInfo->dwWin32ExitCode);
|
||||
_tprintf(_T("\tSERVICE_EXIT_CODE : %d (0x%x)\n"),
|
||||
(unsigned int)pServiceInfo->dwServiceSpecificExitCode,
|
||||
(unsigned int)pServiceInfo->dwServiceSpecificExitCode);
|
||||
_tprintf(_T("\tCHECKPOINT : 0x%x\n"),
|
||||
(unsigned int)pServiceInfo->dwCheckPoint);
|
||||
_tprintf(_T("\tWAIT_HINT : 0x%x\n"),
|
||||
(unsigned int)pServiceInfo->dwWaitHint);
|
||||
if (bExtended)
|
||||
{
|
||||
_tprintf(_T("\tPID : %lu\n"),
|
||||
pServiceInfo->dwProcessId);
|
||||
_tprintf(_T("\tFLAGS : %lu\n"),
|
||||
pServiceInfo->dwServiceFlags);
|
||||
}
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, pServiceInfo);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
BOOL
|
||||
EnumServices(DWORD ServiceType, DWORD ServiceState)
|
||||
{
|
||||
DWORD BufSize = 0;
|
||||
DWORD BytesNeeded = 0;
|
||||
DWORD ResumeHandle = 0;
|
||||
DWORD Ret;
|
||||
|
||||
/* determine required buffer size */
|
||||
Ret = EnumServicesStatusEx(hSCManager,
|
||||
SC_ENUM_PROCESS_INFO,
|
||||
ServiceType,
|
||||
ServiceState,
|
||||
(LPBYTE)pServiceStatus,
|
||||
BufSize,
|
||||
&BytesNeeded,
|
||||
&NumServices,
|
||||
&ResumeHandle,
|
||||
0);
|
||||
|
||||
if ((Ret != 0) && (GetLastError() != ERROR_MORE_DATA))
|
||||
{
|
||||
_tprintf(_T("EnumServices: First call to EnumServicesStatusEx failed : "));
|
||||
ReportLastError();
|
||||
return FALSE;
|
||||
}
|
||||
else /* Call function again if required size was returned */
|
||||
{
|
||||
/* reserve memory for service info array */
|
||||
pServiceStatus = (ENUM_SERVICE_STATUS_PROCESS *)
|
||||
HeapAlloc(GetProcessHeap(), 0, BytesNeeded);
|
||||
if (pServiceStatus == NULL)
|
||||
{
|
||||
_tprintf(_T("EnumServices: Failed to allocate memory : "));
|
||||
ReportLastError();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* fill array with service info */
|
||||
if (! EnumServicesStatusEx(hSCManager,
|
||||
SC_ENUM_PROCESS_INFO,
|
||||
ServiceType,
|
||||
ServiceState,
|
||||
(LPBYTE)pServiceStatus,
|
||||
BytesNeeded,
|
||||
&BytesNeeded,
|
||||
&NumServices,
|
||||
&ResumeHandle,
|
||||
0))
|
||||
{
|
||||
_tprintf(_T("EnumServices: Second call to EnumServicesStatusEx failed : "));
|
||||
ReportLastError();
|
||||
HeapFree(GetProcessHeap(), 0, pServiceStatus);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
PrintService(BOOL bExtended)
|
||||
{
|
||||
DWORD i;
|
||||
|
||||
for (i=0; i < NumServices; i++)
|
||||
{
|
||||
|
||||
_tprintf(_T("SERVICE_NAME: %s\n"), pServiceStatus[i].lpServiceName);
|
||||
_tprintf(_T("DISPLAY_NAME: %s\n"), pServiceStatus[i].lpDisplayName);
|
||||
|
||||
_tprintf(_T("\tTYPE : %x "),
|
||||
(unsigned int)pServiceStatus[i].ServiceStatusProcess.dwServiceType);
|
||||
switch (pServiceStatus[i].ServiceStatusProcess.dwServiceType)
|
||||
{
|
||||
case 1 : _tprintf(_T("KERNEL_DRIVER\n")); break;
|
||||
case 2 : _tprintf(_T("FILE_SYSTEM_DRIVER\n")); break;
|
||||
case 16 : _tprintf(_T("WIN32_OWN_PROCESS\n")); break;
|
||||
case 32 : _tprintf(_T("WIN32_SHARE_PROCESS\n")); break;
|
||||
default : _tprintf(_T("\n")); break;
|
||||
}
|
||||
|
||||
_tprintf(_T("\tSTATE : %x "),
|
||||
(unsigned int)pServiceStatus[i].ServiceStatusProcess.dwCurrentState);
|
||||
|
||||
switch (pServiceStatus[i].ServiceStatusProcess.dwCurrentState)
|
||||
{
|
||||
case 1 : _tprintf(_T("STOPPED\n")); break;
|
||||
case 2 : _tprintf(_T("START_PENDING\n")); break;
|
||||
case 3 : _tprintf(_T("STOP_PENDING\n")); break;
|
||||
case 4 : _tprintf(_T("RUNNING\n")); break;
|
||||
case 5 : _tprintf(_T("CONTINUE_PENDING\n")); break;
|
||||
case 6 : _tprintf(_T("PAUSE_PENDING\n")); break;
|
||||
case 7 : _tprintf(_T("PAUSED\n")); break;
|
||||
default : _tprintf(_T("\n")); break;
|
||||
}
|
||||
|
||||
// _tprintf(_T("\n\taccepted : 0x%x\n\n"),
|
||||
// pServiceStatus[i].ServiceStatusProcess.dwControlsAccepted);
|
||||
// (STOPPABLE,NOT_PAUSABLE,ACCEPTS_SHUTDOWN)
|
||||
|
||||
_tprintf(_T("\tWIN32_EXIT_CODE : %d (0x%x)\n"),
|
||||
(unsigned int)pServiceStatus[i].ServiceStatusProcess.dwWin32ExitCode,
|
||||
(unsigned int)pServiceStatus[i].ServiceStatusProcess.dwWin32ExitCode);
|
||||
_tprintf(_T("\tSERVICE_EXIT_CODE : %d (0x%x)\n"),
|
||||
(unsigned int)pServiceStatus[i].ServiceStatusProcess.dwServiceSpecificExitCode,
|
||||
(unsigned int)pServiceStatus[i].ServiceStatusProcess.dwServiceSpecificExitCode);
|
||||
_tprintf(_T("\tCHECKPOINT : 0x%x\n"),
|
||||
(unsigned int)pServiceStatus[i].ServiceStatusProcess.dwCheckPoint);
|
||||
_tprintf(_T("\tWAIT_HINT : 0x%x\n"),
|
||||
(unsigned int)pServiceStatus[i].ServiceStatusProcess.dwWaitHint);
|
||||
if (bExtended)
|
||||
{
|
||||
_tprintf(_T("\tPID : %lu\n"),
|
||||
pServiceStatus[i].ServiceStatusProcess.dwProcessId);
|
||||
_tprintf(_T("\tFLAGS : %lu\n"),
|
||||
pServiceStatus[i].ServiceStatusProcess.dwServiceFlags);
|
||||
}
|
||||
|
||||
_tprintf(_T("\n"));
|
||||
}
|
||||
|
||||
_tprintf(_T("number : %lu\n"), NumServices);
|
||||
}
|
212
reactos/base/applications/sc/sc.c
Normal file
|
@ -0,0 +1,212 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS SC utility
|
||||
* FILE: subsys/system/sc/sc.c
|
||||
* PURPOSE: control ReactOS services
|
||||
* PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
|
||||
* REVISIONS:
|
||||
* Ged Murphy 20/10/05 Created
|
||||
*
|
||||
*/
|
||||
|
||||
#include "sc.h"
|
||||
|
||||
SC_HANDLE hSCManager;
|
||||
|
||||
DWORD ReportLastError(VOID)
|
||||
{
|
||||
LPVOID lpMsgBuf;
|
||||
DWORD RetVal;
|
||||
|
||||
DWORD ErrorCode = GetLastError();
|
||||
if (ErrorCode != ERROR_SUCCESS)
|
||||
{
|
||||
RetVal = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||||
FORMAT_MESSAGE_FROM_SYSTEM |
|
||||
FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||
NULL,
|
||||
ErrorCode,
|
||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
|
||||
(LPTSTR) &lpMsgBuf,
|
||||
0,
|
||||
NULL );
|
||||
|
||||
if (RetVal != 0)
|
||||
{
|
||||
_tprintf(_T("%s"), (LPTSTR)lpMsgBuf);
|
||||
|
||||
LocalFree(lpMsgBuf);
|
||||
/* return number of TCHAR's stored in output buffer
|
||||
* excluding '\0' - as FormatMessage does*/
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT ScControl(LPTSTR MachineName, // remote machine name
|
||||
LPCTSTR Command, // sc command
|
||||
LPCTSTR ServiceName, // name of service
|
||||
LPCTSTR *ServiceArgs, // any options
|
||||
DWORD ArgCount) // argument counter
|
||||
{
|
||||
/* count trailing arguments */
|
||||
ArgCount -= 3;
|
||||
|
||||
if (MachineName)
|
||||
{
|
||||
_tprintf(_T("Remote service control is not yet implemented\n"));
|
||||
return 2;
|
||||
}
|
||||
|
||||
/* if we are emurating the services, we don't need administrator access */
|
||||
if ( (_tcsicmp(Command, _T("query")) == 0) || (_tcsicmp(Command, _T("queryex")) == 0) )
|
||||
hSCManager = OpenSCManager(MachineName, NULL, SC_MANAGER_ENUMERATE_SERVICE);
|
||||
else
|
||||
hSCManager = OpenSCManager(MachineName, NULL, SC_MANAGER_ALL_ACCESS);
|
||||
if (hSCManager == NULL)
|
||||
{
|
||||
_tprintf(_T("[SC] OpenSCManager FAILED %lu:\n\n"), GetLastError());
|
||||
ReportLastError();
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* emurate command */
|
||||
if (_tcsicmp(Command, _T("query")) == 0)
|
||||
Query(ServiceName, ServiceArgs, FALSE);
|
||||
|
||||
else if (_tcsicmp(Command, _T("queryex")) == 0)
|
||||
Query(ServiceName, ServiceArgs, TRUE);
|
||||
|
||||
else if (_tcsicmp(Command, _T("start")) == 0)
|
||||
{
|
||||
if (ServiceName)
|
||||
Start(ServiceName, ServiceArgs, ArgCount);
|
||||
else
|
||||
StartUsage();
|
||||
}
|
||||
else if (_tcsicmp(Command, _T("pause")) == 0)
|
||||
{
|
||||
if (ServiceName)
|
||||
Control(SERVICE_CONTROL_PAUSE, ServiceName, ServiceArgs);
|
||||
else
|
||||
PauseUsage();
|
||||
}
|
||||
else if (_tcsicmp(Command, _T("interrogate")) == 0)
|
||||
{
|
||||
if (ServiceName)
|
||||
Control(SERVICE_CONTROL_INTERROGATE, ServiceName, ServiceArgs);
|
||||
else
|
||||
InterrogateUsage();
|
||||
}
|
||||
else if (_tcsicmp(Command, _T("stop")) == 0)
|
||||
{
|
||||
if (ServiceName)
|
||||
Control(SERVICE_CONTROL_STOP, ServiceName, ServiceArgs);
|
||||
else
|
||||
StopUsage();
|
||||
}
|
||||
else if (_tcsicmp(Command, _T("continue")) == 0)
|
||||
{
|
||||
if (ServiceName)
|
||||
Control(SERVICE_CONTROL_CONTINUE, ServiceName, ServiceArgs);
|
||||
else
|
||||
ContinueUsage();
|
||||
}
|
||||
else if (_tcsicmp(Command, _T("delete")) == 0)
|
||||
{
|
||||
if (ServiceName)
|
||||
Delete(ServiceName);
|
||||
else
|
||||
DeleteUsage();
|
||||
}
|
||||
else if (_tcsicmp(Command, _T("create")) == 0)
|
||||
{
|
||||
if (*ServiceArgs)
|
||||
Create(ServiceName, ServiceArgs);
|
||||
else
|
||||
CreateUsage();
|
||||
}
|
||||
else if (_tcsicmp(Command, _T("control")) == 0)
|
||||
{
|
||||
if (ServiceName)
|
||||
Control(0, ServiceName, ServiceArgs);
|
||||
else
|
||||
ContinueUsage();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(_UNICODE) && defined(__GNUC__)
|
||||
static
|
||||
#endif
|
||||
|
||||
int _tmain(int argc, LPCTSTR argv[])
|
||||
{
|
||||
LPTSTR MachineName = NULL; // remote machine
|
||||
LPCTSTR Command = NULL; // sc command
|
||||
LPCTSTR ServiceName = NULL; // Name of service
|
||||
|
||||
if (argc < 2)
|
||||
return MainUsage();
|
||||
|
||||
/* get server name */
|
||||
if ((argv[1][0] == '\\') && (argv[1][1] == '\\'))
|
||||
{
|
||||
if (argc < 3)
|
||||
return MainUsage();
|
||||
|
||||
_tcscpy(MachineName, argv[1]);
|
||||
Command = argv[2];
|
||||
if (argc > 3)
|
||||
ServiceName = argv[3];
|
||||
return ScControl(MachineName, Command, ServiceName, &argv[4], argc);
|
||||
}
|
||||
else
|
||||
{
|
||||
Command = argv[1];
|
||||
if (argc > 2)
|
||||
ServiceName = argv[2];
|
||||
return ScControl(MachineName, Command, ServiceName, &argv[3], argc);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#if defined(_UNICODE) && defined(__GNUC__)
|
||||
/* HACK - MINGW HAS NO OFFICIAL SUPPORT FOR wmain()!!! */
|
||||
int main( int argc, char **argv )
|
||||
{
|
||||
WCHAR **argvW;
|
||||
int i, j, Ret = 1;
|
||||
|
||||
if ((argvW = malloc(argc * sizeof(WCHAR*))))
|
||||
{
|
||||
/* convert the arguments */
|
||||
for (i = 0, j = 0; i < argc; i++)
|
||||
{
|
||||
if (!(argvW[i] = malloc((strlen(argv[i]) + 1) * sizeof(WCHAR))))
|
||||
{
|
||||
j++;
|
||||
}
|
||||
swprintf(argvW[i], L"%hs", argv[i]);
|
||||
}
|
||||
|
||||
if (j == 0)
|
||||
{
|
||||
/* no error converting the parameters, call wmain() */
|
||||
Ret = wmain(argc, (LPCTSTR *)argvW);
|
||||
}
|
||||
|
||||
/* free the arguments */
|
||||
for (i = 0; i < argc; i++)
|
||||
{
|
||||
if (argvW[i])
|
||||
free(argvW[i]);
|
||||
}
|
||||
free(argvW);
|
||||
}
|
||||
|
||||
return Ret;
|
||||
}
|
||||
#endif
|
30
reactos/base/applications/sc/sc.h
Normal file
|
@ -0,0 +1,30 @@
|
|||
#include <windows.h>
|
||||
#include <conio.h>
|
||||
#include <stdio.h>
|
||||
#include <tchar.h>
|
||||
|
||||
extern SC_HANDLE hSCManager; // declared in sc.c
|
||||
|
||||
//#define SCDBG
|
||||
|
||||
/* control functions */
|
||||
BOOL Query(LPCTSTR ServiceName, LPCTSTR *ServiceArgs, BOOL bExtended);
|
||||
BOOL Start(LPCTSTR ServiceName, LPCTSTR *ServiceArgs, INT ArgCount);
|
||||
BOOL Create(LPCTSTR ServiceName, LPCTSTR *ServiceArgs);
|
||||
BOOL Delete(LPCTSTR ServiceName);
|
||||
BOOL Control(DWORD Control, LPCTSTR ServiceName, LPCTSTR *Args);
|
||||
|
||||
/* print and error functions */
|
||||
DWORD ReportLastError(VOID);
|
||||
|
||||
/* usage functions */
|
||||
INT MainUsage(VOID);
|
||||
INT StartUsage(VOID);
|
||||
INT PauseUsage(VOID);
|
||||
INT InterrogateUsage(VOID);
|
||||
INT ContinueUsage(VOID);
|
||||
INT StopUsage(VOID);
|
||||
INT ConfigUsage(VOID);
|
||||
INT DescriptionUsage(VOID);
|
||||
INT DeleteUsage(VOID);
|
||||
INT CreateUsage(VOID);
|
4
reactos/base/applications/sc/sc.rc
Normal file
|
@ -0,0 +1,4 @@
|
|||
#define REACTOS_STR_FILE_DESCRIPTION "Services control application\0"
|
||||
#define REACTOS_STR_INTERNAL_NAME "sc\0"
|
||||
#define REACTOS_STR_ORIGINAL_FILENAME "sc.exe\0"
|
||||
#include <reactos/version.rc>
|
17
reactos/base/applications/sc/sc.xml
Normal file
|
@ -0,0 +1,17 @@
|
|||
<module name="sc" type="win32cui" installbase="system32" installname="sc.exe">
|
||||
<define name="__USE_W32API" />
|
||||
<define name="DEFINE_GUID" />
|
||||
<define name="UNICODE" />
|
||||
<define name="_UNICODE" />
|
||||
<library>kernel32</library>
|
||||
<library>advapi32</library>
|
||||
<file>sc.c</file>
|
||||
<file>start.c</file>
|
||||
<file>query.c</file>
|
||||
<file>control.c</file>
|
||||
<file>create.c</file>
|
||||
<file>delete.c</file>
|
||||
<file>usage.c</file>
|
||||
<file>sc.rc</file>
|
||||
<pch>sc.h</pch>
|
||||
</module>
|
111
reactos/base/applications/sc/start.c
Normal file
|
@ -0,0 +1,111 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS SC utility
|
||||
* FILE: subsys/system/sc/start.c
|
||||
* PURPOSE: control ReactOS services
|
||||
* PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
|
||||
* REVISIONS:
|
||||
* Ged Murphy 20/10/05 Created
|
||||
*
|
||||
*/
|
||||
|
||||
#include "sc.h"
|
||||
|
||||
BOOL Start(LPCTSTR ServiceName, LPCTSTR *ServiceArgs, INT ArgCount)
|
||||
{
|
||||
SC_HANDLE hSc;
|
||||
SERVICE_STATUS_PROCESS ServiceStatus, ServiceStatus2;
|
||||
DWORD BytesNeeded;
|
||||
|
||||
#ifdef SCDBG
|
||||
/* testing */
|
||||
_tprintf(_T("service to start - %s\n\n"), ServiceName);
|
||||
_tprintf(_T("Arguments :\n"));
|
||||
while (*ServiceArgs)
|
||||
{
|
||||
printf("%s\n", *ServiceArgs);
|
||||
ServiceArgs++;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* get a handle to the service requested for starting */
|
||||
hSc = OpenService(hSCManager, ServiceName, SERVICE_ALL_ACCESS);
|
||||
|
||||
if (hSc == NULL)
|
||||
{
|
||||
_tprintf(_T("openService failed\n"));
|
||||
ReportLastError();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* start the service opened */
|
||||
if (! StartService(hSc, ArgCount, ServiceArgs))
|
||||
{
|
||||
_tprintf(_T("[SC] StartService FAILED %lu:\n\n"), GetLastError());
|
||||
ReportLastError();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (! QueryServiceStatusEx(
|
||||
hSc,
|
||||
SC_STATUS_PROCESS_INFO,
|
||||
(LPBYTE)&ServiceStatus,
|
||||
sizeof(SERVICE_STATUS_PROCESS),
|
||||
&BytesNeeded))
|
||||
{
|
||||
_tprintf(_T("QueryServiceStatusEx 1 failed\n"));
|
||||
ReportLastError();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
while (ServiceStatus.dwCurrentState == SERVICE_START_PENDING)
|
||||
{
|
||||
/* wait before checking status */
|
||||
Sleep(ServiceStatus.dwWaitHint);
|
||||
|
||||
/* check status again */
|
||||
if (! QueryServiceStatusEx(
|
||||
hSc,
|
||||
SC_STATUS_PROCESS_INFO,
|
||||
(LPBYTE)&ServiceStatus,
|
||||
sizeof(SERVICE_STATUS_PROCESS),
|
||||
&BytesNeeded))
|
||||
{
|
||||
_tprintf(_T("QueryServiceStatusEx 2 failed\n"));
|
||||
ReportLastError();
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
QueryServiceStatusEx(hSc, SC_STATUS_PROCESS_INFO, (LPBYTE)&ServiceStatus2,
|
||||
sizeof(SERVICE_STATUS_PROCESS), &BytesNeeded);
|
||||
|
||||
CloseServiceHandle(hSc);
|
||||
|
||||
if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
|
||||
{
|
||||
_tprintf(_T("\nSERVICE_NAME: %s\n"), ServiceName);
|
||||
_tprintf(_T("\tTYPE : %lu\n"), ServiceStatus2.dwServiceType);
|
||||
_tprintf(_T("\tSTATE : %lu\n"), ServiceStatus2.dwCurrentState);
|
||||
_tprintf(_T("\tWIN32_EXIT_CODE : %lu\n"), ServiceStatus2.dwWin32ExitCode);
|
||||
_tprintf(_T("\tCHECKPOINT : %lu\n"), ServiceStatus2.dwCheckPoint);
|
||||
_tprintf(_T("\tWAIT_HINT : %lu\n"), ServiceStatus2.dwWaitHint);
|
||||
_tprintf(_T("\tPID : %lu\n"), ServiceStatus2.dwProcessId);
|
||||
_tprintf(_T("\tFLAGS : %lu\n"), ServiceStatus2.dwServiceFlags);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
_tprintf(_T("Failed to start %s\n"), ServiceName);
|
||||
_tprintf(_T("Curent state: %lu\n"), ServiceStatus.dwCurrentState);
|
||||
_tprintf(_T("Exit code: %lu\n"), ServiceStatus.dwWin32ExitCode);
|
||||
_tprintf(_T("Service Specific exit code: %lu\n"),
|
||||
ServiceStatus.dwServiceSpecificExitCode);
|
||||
_tprintf(_T("Check point: %lu\n"), ServiceStatus.dwCheckPoint);
|
||||
_tprintf(_T("Wait hint: %lu\n"), ServiceStatus.dwWaitHint);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
}
|
204
reactos/base/applications/sc/usage.c
Normal file
|
@ -0,0 +1,204 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS SC utility
|
||||
* FILE: subsys/system/sc/usage.c
|
||||
* PURPOSE: control ReactOS services
|
||||
* PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
|
||||
* REVISIONS:
|
||||
* Ged Murphy 20/10/05 Created
|
||||
*
|
||||
*/
|
||||
#include "sc.h"
|
||||
|
||||
INT MainUsage(VOID)
|
||||
{
|
||||
INT c;
|
||||
|
||||
_tprintf(_T("DESCRIPTION:\n")
|
||||
_T("\tSC is a command line program used for communicating with\n")
|
||||
_T("\tthe Service Control Manager and its services.\n")
|
||||
_T("USAGE:\n")
|
||||
_T("\tsc <server> [command] [service name] <option1> <option2>...\n")
|
||||
|
||||
_T("\tThe optional parameter <server> has the form \"\\ServerName\"\n")
|
||||
_T("\tFurther help on commands can be obtained by typing: \"sc [command]\"\n")
|
||||
_T("\tService Commands:\n")
|
||||
_T("\t query : Queries the status for a service, or\n")
|
||||
_T("\t enumerates the status for types of services.\n")
|
||||
_T("\t queryex : Queries the extended status for a service, or\n")
|
||||
// _T("\t enumerates the status for types of services.\n"
|
||||
_T("\t start : Starts a service.\n")
|
||||
_T("\t pause : Sends a PAUSE control request to a service.\n")
|
||||
_T("\t interrogate : Sends a INTERROGATE control request to a service.\n")
|
||||
_T("\t continue : Sends a CONTINUE control request to a service.\n")
|
||||
_T("\t stop : Sends a STOP request to a service.\n")
|
||||
// "\t config : Changes the configuration of a service (persistant).\n"
|
||||
// "\t description : Changes the description of a service.\n"
|
||||
// "\t failure : Changes the actions taken by a service upon failure.\n"
|
||||
// "\t qc : Queries the configuration information for a service.\n"
|
||||
// "\t qdescription : Queries the description for a service.\n"
|
||||
// "\t qfailure : Queries the actions taken by a service upon failure.\n"
|
||||
_T("\t delete : Deletes a service (from the registry).\n")
|
||||
_T("\t create : Creates a service. (adds it to the registry).\n")
|
||||
_T("\t control : Sends a control to a service.\n"));
|
||||
// "\t sdshow : Displays a service's security descriptor.\n")
|
||||
// "\t sdset : Sets a service's security descriptor.\n")
|
||||
// "\t GetDisplayName : Gets the DisplayName for a service.\n")
|
||||
// "\t GetKeyName : Gets the ServiceKeyName for a service.\n")
|
||||
// "\t EnumDepend : Enumerates Service Dependencies.\n")
|
||||
// "\n")
|
||||
// "\tService Name Independant Commands:\n")
|
||||
// "\t boot : (ok | bad) Indicates whether the last boot should\n")
|
||||
// "\t be saved as the last-known-good boot configuration\n")
|
||||
// "\t Lock : Locks the SCM Database\n")
|
||||
// "\t QueryLock : Queries the LockStatus for the SCM Database\n")
|
||||
|
||||
_tprintf(_T("\nWould you like to see help for the QUERY and QUERYEX commands? [ y | n ]: "));
|
||||
c = _getch(); // _gettch isn't defined in our tchar.h
|
||||
_tprintf(_T("%c\n"), c);
|
||||
if (tolower(c) == 'y')
|
||||
{
|
||||
_tprintf(_T("QUERY and QUERYEX OPTIONS :\n")
|
||||
_T(" If the query command is followed by a service name, the status\n")
|
||||
_T(" for that service is returned. Further options do not apply in\n")
|
||||
_T(" this case. If the query command is followed by nothing or one of\n")
|
||||
_T(" the options listed below, the services are enumerated.\n")
|
||||
_T(" type= Type of services to enumerate (driver, service, all)\n")
|
||||
_T(" (default = service)\n")
|
||||
_T(" state= State of services to enumerate (inactive, all)\n")
|
||||
_T(" (default = active)\n")
|
||||
/*
|
||||
_T(" bufsize= The size (in bytes) of the enumeration buffer\n")
|
||||
_T(" (default = 4096)\n")
|
||||
_T(" ri= The resume index number at which to begin the enumeration\n")
|
||||
_T(" (default = 0)\n")
|
||||
_T(" group= Service group to enumerate\n")
|
||||
_T(" (default = all groups)\n")
|
||||
*/
|
||||
_T("SYNTAX EXAMPLES\n")
|
||||
_T("sc query - Enumerates status for active services & drivers\n")
|
||||
_T("sc query messenger - Displays status for the messenger service\n")
|
||||
_T("sc queryex messenger - Displays extended status for the messenger service\n")
|
||||
_T("sc query type= driver - Enumerates only active drivers\n")
|
||||
_T("sc query type= service - Enumerates only Win32 services\n")
|
||||
_T("sc query state= all - Enumerates all services & drivers\n")
|
||||
// _T("sc query bufsize= 50 - Enumerates with a 50 byte buffer.\n")
|
||||
// _T("sc query ri= 14 - Enumerates with resume index = 14\n")
|
||||
// _T("sc queryex group= "" - Enumerates active services not in a group\n")
|
||||
_T("sc query type= service type= interact - Enumerates all interactive services\n"));
|
||||
// _T("sc query type= driver group= NDIS - Enumerates all NDIS drivers\n"));
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT StartUsage(VOID)
|
||||
{
|
||||
_tprintf(_T("DESCRIPTION:\n")
|
||||
_T(" Starts a service running.\n")
|
||||
_T("USAGE:\n")
|
||||
_T(" sc <server> start [service name] <arg1> <arg2> ...\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT PauseUsage(VOID)
|
||||
{
|
||||
_tprintf(_T("DESCRIPTION:\n")
|
||||
_T(" Sends a PAUSE control request to a service.\n")
|
||||
_T("USAGE:\n")
|
||||
_T(" sc <server> pause [service name]\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT InterrogateUsage(VOID)
|
||||
{
|
||||
_tprintf(_T("DESCRIPTION:\n")
|
||||
_T(" Sends an INTERROGATE control request to a service.\n")
|
||||
_T("USAGE:\n")
|
||||
_T(" sc <server> interrogate [service name]\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT StopUsage(VOID)
|
||||
{
|
||||
_tprintf(_T("DESCRIPTION:\n")
|
||||
_T(" Sends an STOP control request to a service.\n")
|
||||
_T("USAGE:\n")
|
||||
_T(" sc <server> stop [service name]\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT ContinueUsage(VOID)
|
||||
{
|
||||
_tprintf(_T("DESCRIPTION:\n")
|
||||
_T(" Sends an CONTINUE control request to a service.\n")
|
||||
_T("USAGE:\n")
|
||||
_T(" sc <server> continue [service name]\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT ConfigUsage(VOID)
|
||||
{
|
||||
_tprintf(_T("not yet implemented\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT DescriptionUsage(VOID)
|
||||
{
|
||||
_tprintf(_T("DESCRIPTION:\n")
|
||||
_T(" Sets the description string for a service.\n")
|
||||
_T("USAGE:\n")
|
||||
_T(" sc <server> description [service name]\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT DeleteUsage(VOID)
|
||||
{
|
||||
_tprintf(_T("DESCRIPTION:\n")
|
||||
_T(" Deletes a service entry from the registry.\n")
|
||||
_T(" If the service is running, or another process has an\n")
|
||||
_T(" open handle to the service, the service is simply marked\n")
|
||||
_T(" for deletion.\n")
|
||||
_T("USAGE:\n")
|
||||
_T(" sc <server> delete [service name]\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT CreateUsage(VOID)
|
||||
{
|
||||
_tprintf(_T("Creates a service entry in the registry and Service Database.\n")
|
||||
_T("SYNTAX:\n")
|
||||
_T("sc create [service name] [binPath= ] <option1> <option2>...\n")
|
||||
_T("CREATE OPTIONS:\n")
|
||||
_T("NOTE: The option name includes the equal sign.\n")
|
||||
_T(" type= <own|share|interact|kernel|filesys|rec>\n")
|
||||
_T(" (default = own)\n")
|
||||
_T(" start= <boot|system|auto|demand|disabled>\n")
|
||||
_T(" (default = demand)\n")
|
||||
_T(" error= <normal|severe|critical|ignore>\n")
|
||||
_T(" (default = normal)\n")
|
||||
_T(" binPath= <BinaryPathName>\n")
|
||||
_T(" group= <LoadOrderGroup>\n")
|
||||
_T(" tag= <yes|no>\n")
|
||||
_T(" depend= <Dependencies(separated by / (forward slash))>\n")
|
||||
_T(" obj= <AccountName|ObjectName>\n")
|
||||
_T(" (default = LocalSystem)\n")
|
||||
_T(" DisplayName= <display name>\n")
|
||||
_T(" password= <password>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
121
reactos/base/applications/servman/De.rc
Normal file
|
@ -0,0 +1,121 @@
|
|||
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
|
||||
|
||||
IDR_MAINMENU MENU
|
||||
BEGIN
|
||||
POPUP "&Datei"
|
||||
BEGIN
|
||||
MENUITEM "B&eenden",ID_FILE_EXIT
|
||||
END
|
||||
POPUP "Action"
|
||||
BEGIN
|
||||
MENUITEM "Start",ID_START
|
||||
MENUITEM "Stopp",ID_STOP
|
||||
MENUITEM "Pause",ID_PAUSE
|
||||
MENUITEM "Fortsetzen",ID_RESUME
|
||||
MENUITEM "Neustart",ID_RESTART
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Aktualisieren",ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Eigenschaften",ID_PROP
|
||||
END
|
||||
POPUP "Ansicht"
|
||||
BEGIN
|
||||
MENUITEM "Anpassen",ID_VIEW_CUSTOMIZE
|
||||
END
|
||||
POPUP "Hilfe"
|
||||
BEGIN
|
||||
MENUITEM "Info",ID_HELP_ABOUT
|
||||
END
|
||||
END
|
||||
|
||||
IDD_ABOUTBOX DIALOG DISCARDABLE 22,16,190,182
|
||||
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Über den Service Manager"
|
||||
FONT 8, "Tahoma"
|
||||
BEGIN
|
||||
CONTROL "Service Manager v0.1\nCopyright (C) 2006\nby Ged Murphy (gedmurphy@gmail.com)",
|
||||
IDC_STATIC,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,48,7,130,26
|
||||
DEFPUSHBUTTON "Schließen",IDOK,140,162,44,15,WS_GROUP
|
||||
ICON IDI_SM_ICON,IDC_STATIC,12,7,30,20
|
||||
EDITTEXT IDC_LICENSE_EDIT,8,44,174,107,ES_MULTILINE |
|
||||
ES_READONLY | WS_VSCROLL
|
||||
END
|
||||
|
||||
|
||||
IDD_DLG_GENERAL DIALOGEX 6,6,253,225
|
||||
CAPTION "Allgemein"
|
||||
FONT 8,"MS Sans Serif",0,0
|
||||
STYLE 0x10CF0000
|
||||
BEGIN
|
||||
CONTROL "Dienstname:",IDC_STATIC,"Static",0x50000000,4,11,53,11
|
||||
CONTROL "Anzeigename:",IDC_STATIC,"Static",0x50000000,4,29,53,11
|
||||
CONTROL "Beschreibung",IDC_STATIC,"Static",0x50000000,4,51,53,11
|
||||
CONTROL "",IDC_SERV_NAME,"Static",0x50000000,70,11,176,11
|
||||
CONTROL "",IDC_DISP_NAME,"Static",0x50001000,70,29,176,12
|
||||
CONTROL "",IDC_DESCRIPTION,"Static",0x50201000,70,46,176,22
|
||||
CONTROL "Pfad zum ausführbarem Programm:",IDC_STATIC,"Static",0x50000000,6,73,150,9
|
||||
CONTROL "",IDC_STATIC,"Static",0x50001000,6,86,238,12
|
||||
CONTROL "Starttyp:",IDC_STATIC,"Static",0x50000000,6,108,53,11
|
||||
CONTROL "",IDC_START_TYPE,"ComboBox",0x50010003,70,107,176,11
|
||||
CONTROL "Status des Dienstes:",IDC_STATIC,"Static",0x50000000,4,138,100,11
|
||||
CONTROL "",IDC_SERV_STATUS,"Static",0x50000000,70,138,176,11
|
||||
CONTROL "Start",IDC_START,"Button",0x50010000,6,155,54,15
|
||||
CONTROL "Stopp",IDC_STOP,"Button",0x50010000,68,155,54,15
|
||||
CONTROL "Pause",IDC_PAUSE,"Button",0x50010000,130,155,54,15
|
||||
CONTROL "Fortsetzen",IDC_RESUME,"Button",0x50010000,192,155,54,15
|
||||
CONTROL "Sie können die Startparameter festlegen, die verwendet werden, wenn Sie den Dienst von hier aus starten.",IDC_STATIC,"Static",0x50000000,6,177,240,15
|
||||
CONTROL "Startparameter",IDC_STATIC,"Static",0x50000000,6,199,53,11
|
||||
CONTROL "",IDC_START_PARAM,"Static",0x50001000,70,199,176,11
|
||||
END
|
||||
|
||||
IDB_BUTTONS BITMAP "buttons.bmp"
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_FIRSTCOLUMN "Name"
|
||||
IDS_SECONDCOLUMN "Beschreibung"
|
||||
IDS_THIRDCOLUMN "Status"
|
||||
IDS_FOURTHCOLUMN "Starttyp"
|
||||
IDS_FITHCOLUMN "Anmelden als"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_SERVICES_STATUS_RUNNING "Gestartet"
|
||||
IDS_SERVICES_STATUS_STOPPED "Gestoppt"
|
||||
IDS_SERVICES_YES "Ja"
|
||||
IDS_SERVICES_UNKNOWN "Unbekannt"
|
||||
IDS_SERVICES_AUTO "Automatisch"
|
||||
IDS_SERVICES_MAN "Manuel"
|
||||
IDS_SERVICES_DIS "Deaktiviert"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_SERVICES_NUM_SERVICES "Dienste: %d"
|
||||
IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA."
|
||||
/*"This program is free software; you can redistribute it "
|
||||
"and/or modify it under the terms of the GNU Lesser General "
|
||||
"Public License as published by the Free Software Foundation; "
|
||||
"either version 2.1 of the License, or (at your option) any "
|
||||
"later version.\r\n\r\nThis program is distributed in the hope "
|
||||
"that it will be useful, but WITHOUT ANY WARRANTY; without even "
|
||||
"the implied warranty of MERCHANTABILITY or FITNESS FOR A "
|
||||
"PARTICULAR PURPOSE. See the GNU General Public License for more "
|
||||
"details.\r\n\r\nYou should have received a copy of the GNU "
|
||||
"General Public License along with this program; if not, write "
|
||||
"to the Free Software Foundation, Inc., 59 Temple Place - Suite "
|
||||
"330, Boston, MA 02111-1307, USA." */
|
||||
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_TOOLTIP_PROP "Eigenschaften"
|
||||
IDS_TOOLTIP_REFRESH "Aktualisieren"
|
||||
IDS_TOOLTIP_EXPORT "Liste exportieren"
|
||||
IDS_TOOLTIP_START "Dienst starten"
|
||||
IDS_TOOLTIP_STOP "Dienst beenden"
|
||||
IDS_TOOLTIP_PAUSE "Diest pausieren"
|
||||
IDS_TOOLTIP_RESTART "Diest neustarten"
|
||||
END
|
182
reactos/base/applications/servman/En.rc
Normal file
|
@ -0,0 +1,182 @@
|
|||
IDR_MAINMENU MENU
|
||||
BEGIN
|
||||
POPUP "&File"
|
||||
BEGIN
|
||||
MENUITEM "E&xit",ID_EXIT
|
||||
END
|
||||
POPUP "Action"
|
||||
BEGIN
|
||||
MENUITEM "Start",ID_START
|
||||
MENUITEM "Stop",ID_STOP
|
||||
MENUITEM "Pause",ID_PAUSE
|
||||
MENUITEM "Resume",ID_RESUME
|
||||
MENUITEM "Restart",ID_RESTART
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Refresh",ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Properties",ID_PROP
|
||||
END
|
||||
POPUP "View"
|
||||
BEGIN
|
||||
MENUITEM "Customize",ID_VIEW_CUSTOMIZE
|
||||
END
|
||||
POPUP "Help"
|
||||
BEGIN
|
||||
MENUITEM "About",ID_ABOUT
|
||||
END
|
||||
END
|
||||
IDR_POPUP MENU
|
||||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "Start",ID_START
|
||||
MENUITEM "Stop",ID_STOP
|
||||
MENUITEM "Pause",ID_PAUSE
|
||||
MENUITEM "Resume",ID_RESUME
|
||||
MENUITEM "Restart",ID_RESTART
|
||||
MENUITEM SEPARATOR
|
||||
POPUP "All tasks"
|
||||
BEGIN
|
||||
MENUITEM "Start",ID_START
|
||||
MENUITEM "Stop",ID_STOP
|
||||
MENUITEM "Pause",ID_PAUSE
|
||||
MENUITEM "Resume",ID_RESUME
|
||||
MENUITEM "Restart",ID_RESTART
|
||||
MENUITEM "Refresh",ID_REFRESH
|
||||
END
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Refresh",ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Properties",ID_PROP
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Help",ID_HELP
|
||||
END
|
||||
END
|
||||
|
||||
IDD_ABOUTBOX DIALOGEX 22,16,190,182
|
||||
CAPTION "About Service Manager"
|
||||
FONT 8,"Tahoma",0,0
|
||||
STYLE WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME
|
||||
BEGIN
|
||||
LTEXT "Service Manager v0.1\nCopyright (C) 2006\nby Ged Murphy (gedmurphy@gmail.com)", IDC_STATIC, 48, 7, 130, 26
|
||||
PUSHBUTTON "Close", IDOK, 75, 162, 44, 15
|
||||
ICON IDI_SM_ICON, IDC_STATIC, 10, 10, 7, 30
|
||||
EDITTEXT IDC_LICENSE_EDIT, 8, 44, 174, 107, WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_READONLY | ES_MULTILINE
|
||||
END
|
||||
|
||||
IDD_DLG_GENERAL DIALOGEX 6,6,253,225
|
||||
CAPTION "General"
|
||||
FONT 8,"Tahoma",0,0
|
||||
STYLE WS_BORDER | WS_VISIBLE | WS_DLGFRAME | WS_SYSMENU | WS_THICKFRAME | WS_GROUP | WS_TABSTOP
|
||||
BEGIN
|
||||
LTEXT "", IDC_SERV_NAME, 70,11,176,11, WS_CHILD | WS_VISIBLE
|
||||
EDITTEXT IDC_DISP_NAME, 70, 29, 176, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_READONLY
|
||||
EDITTEXT IDC_DESCRIPTION, 70, 46, 176, 24, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_MULTILINE | ES_READONLY
|
||||
EDITTEXT IDC_EXEPATH, 6, 86, 240, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_READONLY
|
||||
CONTROL "",IDC_START_TYPE,"ComboBox",0x50010003,70,107,176,11
|
||||
PUSHBUTTON "Start", IDC_START, 6, 155, 54, 15
|
||||
PUSHBUTTON "Stop", IDC_STOP, 68, 155, 54, 15
|
||||
PUSHBUTTON "Pause", IDC_PAUSE , 130, 155, 54, 15
|
||||
PUSHBUTTON "Resume", IDC_RESUME, 192, 155, 54, 15
|
||||
LTEXT "Service name:", IDC_STATIC, 4, 11, 53, 11
|
||||
LTEXT "Display name:", IDC_STATIC, 4, 29, 53, 11
|
||||
LTEXT "Description", IDC_STATIC, 4, 51, 53, 11
|
||||
LTEXT "Path to executable:", IDC_STATIC, 6, 73, 82, 9
|
||||
LTEXT "Startup type:", IDC_STATIC, 6, 108, 53, 11
|
||||
LTEXT "Service status:", IDC_STATIC, 4, 138, 53, 11
|
||||
CONTROL "",IDC_SERV_STATUS,"Static",0x50000000,70,138,176,11
|
||||
LTEXT "You can specify the start parameters that apply when you start the service from here.",IDC_STATIC, 6,177,240,15
|
||||
LTEXT "Start parameters", IDC_STATIC, 6, 199, 53, 11
|
||||
EDITTEXT IDC_START_PARAM, 68, 199, 178, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||
END
|
||||
|
||||
IDD_DLG_DEPEND DIALOGEX 6,6,253,225
|
||||
CAPTION "Dependencies"
|
||||
FONT 8,"Tahoma",0,0
|
||||
STYLE WS_BORDER | WS_VISIBLE | WS_DLGFRAME | WS_SYSMENU | WS_THICKFRAME | WS_GROUP | WS_TABSTOP
|
||||
BEGIN
|
||||
CONTROL "",IDC_DEPEND_TREE1,"SysTreeView32",0x50010007,8,70,236,68,0x00000200
|
||||
CONTROL "",IDC_DEPEND_TREE2,"SysTreeView32",0x50010007,8,151,234,67,0x00000200
|
||||
CONTROL "Some services depend on other services, system drivers and load order groups. If a system component is stopped or it is not running properly, dependant services can be affected.",IDC_STATIC,"Static",0x50000000,8,7,238,26
|
||||
CONTROL "This service depends on the following components",IDC_STATIC,"Static",0x50000000,8,57,236,9
|
||||
CONTROL "",IDC_DEPEND_SERVICE,"Static",0x50000000,8,38,236,13
|
||||
END
|
||||
|
||||
IDD_DLG_CREATE DIALOGEX 6,6,225,209
|
||||
CAPTION "Create a service"
|
||||
FONT 8,"Tahoma",0,0
|
||||
STYLE WS_BORDER | WS_VISIBLE | WS_DLGFRAME | WS_SYSMENU | WS_THICKFRAME | WS_GROUP | WS_TABSTOP
|
||||
BEGIN
|
||||
CONTROL "",IDC_CREATE_SERVNAME,"Edit",0x50010000,72,12,150,11,0x00000200
|
||||
CONTROL "",IDC_CREATE_DISPNAME,"Edit",0x50010000,72,31,150,11,0x00000200
|
||||
CONTROL "",IDC_CREATE_PATH,"Edit",0x50010000,8,62,214,13,0x00000200
|
||||
CONTROL "",IDC_CREATE_DESC,"Edit",0x50010000,10,97,210,48,0x00000200
|
||||
CONTROL "",IDC_CREATE_OPTIONS,"Edit",0x50010000,10,162,210,13,0x00000200
|
||||
CONTROL "Service Name :",IDC_STATIC,"Static",0x50000202,12,12,54,9
|
||||
CONTROL "Display Name :",IDC_STATIC,"Static",0x50000202,12,33,54,9
|
||||
CONTROL "Path to executable :",IDC_STATIC,"Static",0x50000000,10,51,68,9
|
||||
CONTROL "Description :",IDC_STATIC,"Static",0x50000000,12,86,44,9
|
||||
CONTROL "OK",IDOK,"Button",0x50010000,126,192,44,13
|
||||
CONTROL "Cancel",IDCANCEL,"Button",0x50010000,176,192,46,13
|
||||
CONTROL "Additional options (click help for details)",IDC_STATIC,"Static",0x50000000,10,151,134,9
|
||||
CONTROL "Help",ID_CREATE_HELP,"Button",0x50010000,6,192,44,13
|
||||
END
|
||||
|
||||
IDD_DLG_PROGRESS DIALOGEX 6,6,255,89
|
||||
CAPTION "Service Control"
|
||||
FONT 8,"MS Sans Serif",0,0
|
||||
STYLE WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME
|
||||
EXSTYLE WS_EX_TOOLWINDOW
|
||||
BEGIN
|
||||
CONTROL "",IDC_SERVCON_PROGRESS,"msctls_progress32",0x50000000,8,46,238,13
|
||||
CONTROL "",IDC_SERVCON_INFO,"Static",0x50000000,8,5,236,11
|
||||
CONTROL "",IDC_SERVCON_NAME,"Static",0x50000000,8,25,66,11
|
||||
CONTROL "&Close",IDOK,"Button",0x50010000,100,70,54,13
|
||||
END
|
||||
|
||||
|
||||
IDB_BUTTONS BITMAP DISCARDABLE "res/toolbar.bmp"
|
||||
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_FIRSTCOLUMN "Name"
|
||||
IDS_SECONDCOLUMN "Description"
|
||||
IDS_THIRDCOLUMN "Status"
|
||||
IDS_FOURTHCOLUMN "Startup Type"
|
||||
IDS_FITHCOLUMN "Log On As"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_SERVICES_STARTED "Started"
|
||||
IDS_SERVICES_STOPPED "Stopped"
|
||||
IDS_SERVICES_AUTO "Automatic"
|
||||
IDS_SERVICES_MAN "Manual"
|
||||
IDS_SERVICES_DIS "Disabled"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_NUM_SERVICES "Num Services: %d"
|
||||
IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_TOOLTIP_PROP "Properties"
|
||||
IDS_TOOLTIP_REFRESH "Refresh"
|
||||
IDS_TOOLTIP_EXPORT "Export list"
|
||||
IDS_TOOLTIP_START "Start service"
|
||||
IDS_TOOLTIP_STOP "Stop service"
|
||||
IDS_TOOLTIP_PAUSE "Pause service"
|
||||
IDS_TOOLTIP_RESTART "Restart service"
|
||||
IDS_TOOLTIP_NEW "Create a new service"
|
||||
IDS_TOOLTIP_HELP "Help"
|
||||
IDS_TOOLTIP_EXIT "Exit"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_PROGRESS_INFO "ReactOS is attempting to %s the following service"
|
||||
END
|
54
reactos/base/applications/servman/about.c
Normal file
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Services
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: subsys/system/servman/about.c
|
||||
* PURPOSE: About dialog box message handler
|
||||
* COPYRIGHT: Copyright 2005 Ged Murphy <gedmurphy@gmail.com>
|
||||
*
|
||||
*/
|
||||
|
||||
//ShellAbout(hwnd, _T("test"), _T("test2"), MAKEINTRESOURCE(IDI_SM_ICON));
|
||||
|
||||
#include "servman.h"
|
||||
|
||||
extern HINSTANCE hInstance;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable : 4100)
|
||||
#endif
|
||||
BOOL CALLBACK
|
||||
AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
HWND hLicenseEditWnd;
|
||||
HICON hIcon = NULL;
|
||||
TCHAR strLicense[0x1000];
|
||||
|
||||
switch (message)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
|
||||
hIcon = LoadImage(hInstance, MAKEINTRESOURCE(IDI_SM_ICON), IMAGE_ICON, 16, 16, 0);
|
||||
SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
|
||||
|
||||
hLicenseEditWnd = GetDlgItem(hDlg, IDC_LICENSE_EDIT);
|
||||
|
||||
LoadString(hInstance, IDS_LICENSE, strLicense, 0x1000);
|
||||
|
||||
SetWindowText(hLicenseEditWnd, strLicense);
|
||||
|
||||
return TRUE;
|
||||
|
||||
case WM_COMMAND:
|
||||
|
||||
if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL))
|
||||
{
|
||||
DestroyIcon(hIcon);
|
||||
EndDialog(hDlg, LOWORD(wParam));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
138
reactos/base/applications/servman/control.c
Normal file
|
@ -0,0 +1,138 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Services
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: subsys/system/servman/control
|
||||
* PURPOSE: Stops, pauses and resumes a service
|
||||
* COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "servman.h"
|
||||
|
||||
extern HWND hListView;
|
||||
|
||||
|
||||
BOOL Control(HWND hProgDlg, DWORD Control)
|
||||
{
|
||||
HWND hProgBar;
|
||||
SC_HANDLE hSCManager;
|
||||
SC_HANDLE hSc;
|
||||
ENUM_SERVICE_STATUS_PROCESS *Service = NULL;
|
||||
SERVICE_STATUS_PROCESS ServiceStatus;
|
||||
SERVICE_STATUS Status;
|
||||
LVITEM item;
|
||||
DWORD BytesNeeded = 0;
|
||||
DWORD dwStartTickCount, dwOldCheckPoint;
|
||||
|
||||
item.mask = LVIF_PARAM;
|
||||
item.iItem = GetSelectedItem();
|
||||
SendMessage(hListView, LVM_GETITEM, 0, (LPARAM)&item);
|
||||
|
||||
/* copy pointer to selected service */
|
||||
Service = (ENUM_SERVICE_STATUS_PROCESS *)item.lParam;
|
||||
|
||||
/* set the progress bar range and step */
|
||||
hProgBar = GetDlgItem(hProgDlg, IDC_SERVCON_PROGRESS);
|
||||
SendMessage(hProgBar, PBM_SETRANGE, 0, MAKELPARAM(0, PROGRESSRANGE));
|
||||
SendMessage(hProgBar, PBM_SETSTEP, (WPARAM)1, 0);
|
||||
|
||||
/* open handle to the SCM */
|
||||
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
||||
if (hSCManager == NULL)
|
||||
{
|
||||
GetError(0);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* open handle to the service */
|
||||
hSc = OpenService(hSCManager, Service->lpServiceName,
|
||||
SC_MANAGER_ALL_ACCESS);
|
||||
if (hSc == NULL)
|
||||
{
|
||||
GetError(0);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* process requested action */
|
||||
if (! ControlService(hSc, Control, &Status))
|
||||
{
|
||||
GetError(0);
|
||||
CloseServiceHandle(hSc);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* query the state of the service */
|
||||
if (! QueryServiceStatusEx(hSc,
|
||||
SC_STATUS_PROCESS_INFO,
|
||||
(LPBYTE)&ServiceStatus,
|
||||
sizeof(SERVICE_STATUS_PROCESS),
|
||||
&BytesNeeded))
|
||||
{
|
||||
GetError(0);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Save the tick count and initial checkpoint. */
|
||||
dwStartTickCount = GetTickCount();
|
||||
dwOldCheckPoint = ServiceStatus.dwCheckPoint;
|
||||
|
||||
/* loop whilst service is not running */
|
||||
/* FIXME: needs more control adding. 'Loop' is temparary */
|
||||
while (ServiceStatus.dwCurrentState != Control)
|
||||
{
|
||||
DWORD dwWaitTime;
|
||||
|
||||
dwWaitTime = ServiceStatus.dwWaitHint / 10;
|
||||
|
||||
if( dwWaitTime < 500 )
|
||||
dwWaitTime = 500;
|
||||
else if ( dwWaitTime > 5000 )
|
||||
dwWaitTime = 5000;
|
||||
|
||||
/* increment the progress bar */
|
||||
SendMessage(hProgBar, PBM_STEPIT, 0, 0);
|
||||
|
||||
/* wait before checking status */
|
||||
Sleep(dwWaitTime);
|
||||
|
||||
/* check status again */
|
||||
if (! QueryServiceStatusEx(
|
||||
hSc,
|
||||
SC_STATUS_PROCESS_INFO,
|
||||
(LPBYTE)&ServiceStatus,
|
||||
sizeof(SERVICE_STATUS_PROCESS),
|
||||
&BytesNeeded))
|
||||
{
|
||||
GetError(0);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (ServiceStatus.dwCheckPoint > dwOldCheckPoint)
|
||||
{
|
||||
/* The service is making progress. increment the progress bar */
|
||||
SendMessage(hProgBar, PBM_STEPIT, 0, 0);
|
||||
dwStartTickCount = GetTickCount();
|
||||
dwOldCheckPoint = ServiceStatus.dwCheckPoint;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(GetTickCount() - dwStartTickCount > ServiceStatus.dwWaitHint)
|
||||
{
|
||||
/* No progress made within the wait hint */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CloseServiceHandle(hSc);
|
||||
|
||||
if (ServiceStatus.dwCurrentState == Control)
|
||||
{
|
||||
SendMessage(hProgBar, PBM_DELTAPOS, PROGRESSRANGE, 0);
|
||||
Sleep(1000);
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
return FALSE;
|
||||
|
||||
}
|
33
reactos/base/applications/servman/geterror.c
Normal file
|
@ -0,0 +1,33 @@
|
|||
//#include <stdarg>
|
||||
#include "servman.h"
|
||||
/* temp file for debugging */
|
||||
|
||||
VOID GetError(DWORD err)
|
||||
{
|
||||
LPVOID lpMsgBuf;
|
||||
|
||||
if (err == 0)
|
||||
err = GetLastError();
|
||||
|
||||
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||||
FORMAT_MESSAGE_FROM_SYSTEM |
|
||||
FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||
NULL,
|
||||
err,
|
||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
|
||||
(LPTSTR) &lpMsgBuf,
|
||||
0,
|
||||
NULL );
|
||||
|
||||
MessageBox(NULL, lpMsgBuf, _T("Error!"), MB_OK | MB_ICONERROR);
|
||||
|
||||
LocalFree(lpMsgBuf);
|
||||
}
|
||||
|
||||
|
||||
VOID DisplayString(PTCHAR Msg)
|
||||
{
|
||||
|
||||
MessageBox(NULL, Msg, _T("Error!"), MB_OK | MB_ICONERROR);
|
||||
|
||||
}
|
45
reactos/base/applications/servman/progress.c
Normal file
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Services
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: subsys/system/servman/progress.c
|
||||
* PURPOSE: Progress dialog box message handler
|
||||
* COPYRIGHT: Copyright 2006 Ged Murphy <gedmurphy@gmail.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "servman.h"
|
||||
|
||||
extern HINSTANCE hInstance;
|
||||
//extern HWND hMainWnd;
|
||||
|
||||
|
||||
BOOL CALLBACK ProgressDialogProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch(Message)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
switch(LOWORD(wParam))
|
||||
{
|
||||
case IDOK:
|
||||
DestroyWindow(hDlg);
|
||||
break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_DESTROY:
|
||||
DestroyWindow(hDlg);
|
||||
break;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
295
reactos/base/applications/servman/propsheet.c
Normal file
|
@ -0,0 +1,295 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Services
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: subsys/system/servman/propsheet.c
|
||||
* PURPOSE: Property dialog box message handler
|
||||
* COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "servman.h"
|
||||
|
||||
extern ENUM_SERVICE_STATUS_PROCESS *pServiceStatus;
|
||||
extern HINSTANCE hInstance;
|
||||
extern HWND hListView;
|
||||
extern HWND hMainWnd;
|
||||
|
||||
|
||||
typedef struct _PROP_DLG_INFO
|
||||
{
|
||||
LPTSTR lpServiceName;
|
||||
LPTSTR lpDisplayName;
|
||||
LPTSTR lpDescription;
|
||||
LPTSTR lpPathToExe;
|
||||
TCHAR szStartupType;
|
||||
TCHAR szServiceStatus[25];
|
||||
LPTSTR lpStartParams;
|
||||
} PROP_DLG_INFO, *PPROP_DLG_INFO;
|
||||
|
||||
|
||||
/*
|
||||
* Fills the 'startup type' combo box with possible
|
||||
* values and sets it to value of the selected item
|
||||
*/
|
||||
VOID SetStartupType(HKEY hKey, HWND hwndDlg)
|
||||
{
|
||||
HWND hList;
|
||||
TCHAR buf[25];
|
||||
DWORD dwValueSize = 0;
|
||||
DWORD StartUp = 0;
|
||||
|
||||
hList = GetDlgItem(hwndDlg, IDC_START_TYPE);
|
||||
|
||||
LoadString(hInstance, IDS_SERVICES_AUTO, buf, sizeof(buf) / sizeof(TCHAR));
|
||||
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)buf);
|
||||
LoadString(hInstance, IDS_SERVICES_MAN, buf, sizeof(buf) / sizeof(TCHAR));
|
||||
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)buf);
|
||||
LoadString(hInstance, IDS_SERVICES_DIS, buf, sizeof(buf) / sizeof(TCHAR));
|
||||
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)buf);
|
||||
|
||||
dwValueSize = sizeof(DWORD);
|
||||
if (RegQueryValueEx(hKey,
|
||||
_T("Start"),
|
||||
NULL,
|
||||
NULL,
|
||||
(LPBYTE)&StartUp,
|
||||
&dwValueSize))
|
||||
{
|
||||
RegCloseKey(hKey);
|
||||
return;
|
||||
}
|
||||
|
||||
if (StartUp == 0x02)
|
||||
SendMessage(hList, CB_SETCURSEL, 0, 0);
|
||||
else if (StartUp == 0x03)
|
||||
SendMessage(hList, CB_SETCURSEL, 1, 0);
|
||||
else if (StartUp == 0x04)
|
||||
SendMessage(hList, CB_SETCURSEL, 2, 0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Populates the General Properties dialog with
|
||||
* the relevant service information
|
||||
*/
|
||||
VOID GetDlgInfo(HWND hwndDlg)
|
||||
{
|
||||
HKEY hKey;
|
||||
ENUM_SERVICE_STATUS_PROCESS *Service = NULL;
|
||||
PROP_DLG_INFO DlgInfo;
|
||||
LPCTSTR Path = _T("System\\CurrentControlSet\\Services\\%s");
|
||||
TCHAR buf[300];
|
||||
|
||||
/* get pointer to selected service */
|
||||
Service = GetSelectedService();
|
||||
|
||||
/* open the registry key for the service */
|
||||
_sntprintf(buf, sizeof(buf) / sizeof(TCHAR), Path, Service->lpServiceName);
|
||||
RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
||||
buf,
|
||||
0,
|
||||
KEY_READ,
|
||||
&hKey);
|
||||
|
||||
/* set the service name */
|
||||
DlgInfo.lpServiceName = Service->lpServiceName;
|
||||
SendDlgItemMessage(hwndDlg, IDC_SERV_NAME, WM_SETTEXT, 0, (
|
||||
LPARAM)DlgInfo.lpServiceName);
|
||||
|
||||
|
||||
/* set the display name */
|
||||
DlgInfo.lpDisplayName = Service->lpDisplayName;
|
||||
SendDlgItemMessage(hwndDlg, IDC_DISP_NAME, WM_SETTEXT, 0,
|
||||
(LPARAM)DlgInfo.lpDisplayName);
|
||||
|
||||
|
||||
/* set the description */
|
||||
if (GetDescription(hKey, &DlgInfo.lpDescription))
|
||||
SendDlgItemMessage(hwndDlg, IDC_DESCRIPTION, WM_SETTEXT, 0,
|
||||
(LPARAM)DlgInfo.lpDescription);
|
||||
|
||||
|
||||
/* set the executable path */
|
||||
if (GetExecutablePath(&DlgInfo.lpPathToExe))
|
||||
SendDlgItemMessage(hwndDlg, IDC_EXEPATH, WM_SETTEXT, 0, (LPARAM)DlgInfo.lpPathToExe);
|
||||
|
||||
|
||||
/* set startup type */
|
||||
SetStartupType(hKey, hwndDlg);
|
||||
|
||||
|
||||
|
||||
/* set service status */
|
||||
if (Service->ServiceStatusProcess.dwCurrentState == SERVICE_RUNNING)
|
||||
{
|
||||
LoadString(hInstance, IDS_SERVICES_STARTED, DlgInfo.szServiceStatus,
|
||||
sizeof(DlgInfo.szServiceStatus) / sizeof(TCHAR));
|
||||
SendDlgItemMessageW(hwndDlg, IDC_SERV_STATUS, WM_SETTEXT, 0, (LPARAM)DlgInfo.szServiceStatus);
|
||||
}
|
||||
else
|
||||
{
|
||||
LoadString(hInstance, IDS_SERVICES_STOPPED, DlgInfo.szServiceStatus,
|
||||
sizeof(DlgInfo.szServiceStatus) / sizeof(TCHAR));
|
||||
SendDlgItemMessageW(hwndDlg, IDC_SERV_STATUS, WM_SETTEXT, 0, (LPARAM)DlgInfo.szServiceStatus);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable : 4100)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* General Property dialog callback.
|
||||
* Controls messages to the General dialog
|
||||
*/
|
||||
/* FIXME: this may be better as a modeless dialog */
|
||||
INT_PTR CALLBACK
|
||||
GeneralPageProc(HWND hwndDlg,
|
||||
UINT uMsg,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam)
|
||||
{
|
||||
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
GetDlgInfo(hwndDlg);
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
switch(LOWORD(wParam))
|
||||
{
|
||||
case IDC_START:
|
||||
SendMessage(hMainWnd, WM_COMMAND, ID_START, 0);
|
||||
break;
|
||||
|
||||
case IDC_STOP:
|
||||
SendMessage(hMainWnd, WM_COMMAND, ID_STOP, 0);
|
||||
break;
|
||||
|
||||
case IDC_PAUSE:
|
||||
SendMessage(hMainWnd, WM_COMMAND, ID_PAUSE, 0);
|
||||
break;
|
||||
|
||||
case IDC_RESUME:
|
||||
SendMessage(hMainWnd, WM_COMMAND, ID_RESUME, 0);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_DESTROY:
|
||||
break;
|
||||
|
||||
case WM_NOTIFY:
|
||||
{
|
||||
LPNMHDR lpnm = (LPNMHDR)lParam;
|
||||
|
||||
switch (lpnm->code)
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Dependancies Property dialog callback.
|
||||
* Controls messages to the Dependancies dialog
|
||||
*/
|
||||
/* FIXME: this may be better as a modeless dialog */
|
||||
INT_PTR CALLBACK
|
||||
DependanciesPageProc(HWND hwndDlg,
|
||||
UINT uMsg,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam)
|
||||
{
|
||||
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
switch(LOWORD(wParam))
|
||||
{
|
||||
case IDC_START:
|
||||
break;
|
||||
|
||||
case IDC_STOP:
|
||||
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_DESTROY:
|
||||
break;
|
||||
|
||||
case WM_NOTIFY:
|
||||
{
|
||||
LPNMHDR lpnm = (LPNMHDR)lParam;
|
||||
|
||||
switch (lpnm->code)
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
static VOID
|
||||
InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc)
|
||||
{
|
||||
ZeroMemory(psp, sizeof(PROPSHEETPAGE));
|
||||
psp->dwSize = sizeof(PROPSHEETPAGE);
|
||||
psp->dwFlags = PSP_DEFAULT;
|
||||
psp->hInstance = hInstance;
|
||||
psp->pszTemplate = MAKEINTRESOURCE(idDlg);
|
||||
psp->pfnDlgProc = DlgProc;
|
||||
}
|
||||
|
||||
|
||||
LONG APIENTRY
|
||||
OpenPropSheet(HWND hwnd)
|
||||
{
|
||||
PROPSHEETHEADER psh;
|
||||
PROPSHEETPAGE psp[2];
|
||||
TCHAR Caption[256];
|
||||
|
||||
LoadString(hInstance, IDS_PROP_SHEET, Caption, sizeof(Caption) / sizeof(TCHAR));
|
||||
|
||||
ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
|
||||
psh.dwSize = sizeof(PROPSHEETHEADER);
|
||||
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE;
|
||||
psh.hwndParent = NULL;
|
||||
psh.hInstance = hInstance;
|
||||
psh.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SM_ICON));
|
||||
psh.pszCaption = Caption;
|
||||
psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
|
||||
psh.nStartPage = 0;
|
||||
psh.ppsp = psp;
|
||||
|
||||
InitPropSheetPage(&psp[0], IDD_DLG_GENERAL, GeneralPageProc);
|
||||
//InitPropSheetPage(&psp[1], IDD_DLG_GENERAL, LogonPageProc);
|
||||
//InitPropSheetPage(&psp[2], IDD_DLG_GENERAL, RecoveryPageProc);
|
||||
InitPropSheetPage(&psp[1], IDD_DLG_DEPEND, DependanciesPageProc);
|
||||
|
||||
|
||||
return (LONG)(PropertySheet(&psh) != -1);
|
||||
}
|
||||
|
619
reactos/base/applications/servman/query.c
Normal file
|
@ -0,0 +1,619 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Services
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: subsys/system/servman/query.c
|
||||
* PURPOSE: Query service information
|
||||
* COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "servman.h"
|
||||
|
||||
extern HINSTANCE hInstance;
|
||||
extern HWND hListView;
|
||||
extern HWND hStatus;
|
||||
|
||||
/* Stores the complete services array */
|
||||
ENUM_SERVICE_STATUS_PROCESS *pServiceStatus = NULL;
|
||||
|
||||
|
||||
/* Free service array */
|
||||
VOID FreeMemory(VOID)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, pServiceStatus);
|
||||
}
|
||||
|
||||
|
||||
|
||||
ENUM_SERVICE_STATUS_PROCESS*
|
||||
GetSelectedService(VOID)
|
||||
{
|
||||
ENUM_SERVICE_STATUS_PROCESS *pSelectedService = NULL;
|
||||
LVITEM item;
|
||||
|
||||
item.mask = LVIF_PARAM;
|
||||
item.iItem = GetSelectedItem();
|
||||
SendMessage(hListView, LVM_GETITEM, 0, (LPARAM)&item);
|
||||
|
||||
/* copy pointer to selected service */
|
||||
pSelectedService = (ENUM_SERVICE_STATUS_PROCESS *)item.lParam;
|
||||
|
||||
return pSelectedService;
|
||||
}
|
||||
|
||||
|
||||
/* Retrives the service description from the registry */
|
||||
BOOL GetDescription(HKEY hKey, LPTSTR *retDescription)
|
||||
{
|
||||
|
||||
LPTSTR Description = NULL;
|
||||
DWORD dwValueSize = 0;
|
||||
LONG ret = RegQueryValueEx(hKey,
|
||||
_T("Description"),
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&dwValueSize);
|
||||
if (ret != ERROR_SUCCESS && ret != ERROR_FILE_NOT_FOUND && ret != ERROR_INVALID_HANDLE)
|
||||
{
|
||||
RegCloseKey(hKey);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (ret != ERROR_FILE_NOT_FOUND)
|
||||
{
|
||||
Description = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwValueSize);
|
||||
if (Description == NULL)
|
||||
{
|
||||
RegCloseKey(hKey);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if(RegQueryValueEx(hKey,
|
||||
_T("Description"),
|
||||
NULL,
|
||||
NULL,
|
||||
(LPBYTE)Description,
|
||||
&dwValueSize))
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, Description);
|
||||
RegCloseKey(hKey);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* copy pointer over */
|
||||
*retDescription = Description;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* get vendor of service binary */
|
||||
BOOL GetExecutablePath(LPTSTR *ExePath)
|
||||
{
|
||||
SC_HANDLE hSCManager = NULL;
|
||||
SC_HANDLE hSc = NULL;
|
||||
LPQUERY_SERVICE_CONFIG pServiceConfig = NULL;
|
||||
ENUM_SERVICE_STATUS_PROCESS *Service = NULL;
|
||||
DWORD BytesNeeded = 0;
|
||||
|
||||
/* copy pointer to selected service */
|
||||
Service = GetSelectedService();
|
||||
|
||||
/* open handle to the SCM */
|
||||
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
|
||||
if (hSCManager == NULL)
|
||||
{
|
||||
GetError(0);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* get a handle to the service requested for starting */
|
||||
hSc = OpenService(hSCManager, Service->lpServiceName, SERVICE_QUERY_CONFIG);
|
||||
if (hSc == NULL)
|
||||
{
|
||||
GetError(0);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
|
||||
if (!QueryServiceConfig(hSc, pServiceConfig, 0, &BytesNeeded))
|
||||
{
|
||||
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
||||
{
|
||||
pServiceConfig = (LPQUERY_SERVICE_CONFIG)
|
||||
HeapAlloc(GetProcessHeap(), 0, BytesNeeded);
|
||||
if (pServiceConfig == NULL)
|
||||
goto cleanup;
|
||||
|
||||
if (!QueryServiceConfig(hSc,
|
||||
pServiceConfig,
|
||||
BytesNeeded,
|
||||
&BytesNeeded))
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, pServiceConfig);
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
else /* exit on failure */
|
||||
{
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
*ExePath = pServiceConfig->lpBinaryPathName;
|
||||
|
||||
CloseServiceHandle(hSCManager);
|
||||
CloseServiceHandle(hSc);
|
||||
|
||||
return TRUE;
|
||||
|
||||
cleanup:
|
||||
if (hSCManager != NULL)
|
||||
CloseServiceHandle(hSCManager);
|
||||
if (hSc != NULL)
|
||||
CloseServiceHandle(hSc);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
BOOL
|
||||
RefreshServiceList(VOID)
|
||||
{
|
||||
LVITEM item;
|
||||
TCHAR szNumServices[32];
|
||||
TCHAR szStatus[64];
|
||||
DWORD NumServices = 0;
|
||||
DWORD Index;
|
||||
LPCTSTR Path = _T("System\\CurrentControlSet\\Services\\%s");
|
||||
|
||||
ListView_DeleteAllItems(hListView);
|
||||
|
||||
NumServices = GetServiceList();
|
||||
|
||||
if (NumServices)
|
||||
{
|
||||
HICON hiconItem; /* icon for list-view items */
|
||||
HIMAGELIST hSmall; /* image list for other views */
|
||||
TCHAR buf[300]; /* buffer to hold key path */
|
||||
INT NumListedServ = 0; /* how many services were listed */
|
||||
|
||||
/* Create the icon image lists */
|
||||
hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON),
|
||||
GetSystemMetrics(SM_CYSMICON), ILC_MASK | ILC_COLOR16, 1, 1);
|
||||
|
||||
/* Add an icon to each image list */
|
||||
hiconItem = LoadImage(hInstance, MAKEINTRESOURCE(IDI_SM_ICON),
|
||||
IMAGE_ICON, 16, 16, 0);
|
||||
ImageList_AddIcon(hSmall, hiconItem);
|
||||
|
||||
/* assign the image to the list view */
|
||||
ListView_SetImageList(hListView, hSmall, LVSIL_SMALL);
|
||||
|
||||
for (Index = 0; Index < NumServices; Index++)
|
||||
{
|
||||
HKEY hKey = NULL;
|
||||
LPTSTR Description = NULL;
|
||||
LPTSTR LogOnAs = NULL;
|
||||
DWORD StartUp = 0;
|
||||
DWORD dwValueSize;
|
||||
|
||||
/* open the registry key for the service */
|
||||
_sntprintf(buf, 300, Path,
|
||||
pServiceStatus[Index].lpServiceName);
|
||||
|
||||
RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
||||
buf,
|
||||
0,
|
||||
KEY_READ,
|
||||
&hKey);
|
||||
|
||||
|
||||
/* set the display name */
|
||||
|
||||
ZeroMemory(&item, sizeof(LVITEM));
|
||||
item.mask = LVIF_TEXT | LVIF_PARAM;
|
||||
item.pszText = pServiceStatus[Index].lpDisplayName;
|
||||
|
||||
/* Set a pointer for each service so we can query it later.
|
||||
* Not all services are added to the list, so we can't query
|
||||
* the item number as they become out of sync with the array */
|
||||
item.lParam = (LPARAM)&pServiceStatus[Index];
|
||||
|
||||
item.iItem = ListView_GetItemCount(hListView);
|
||||
item.iItem = ListView_InsertItem(hListView, &item);
|
||||
|
||||
|
||||
|
||||
|
||||
/* set the description */
|
||||
|
||||
if (GetDescription(hKey, &Description))
|
||||
{
|
||||
item.pszText = Description;
|
||||
item.iSubItem = 1;
|
||||
SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, Description);
|
||||
}
|
||||
|
||||
|
||||
/* set the status */
|
||||
|
||||
if (pServiceStatus[Index].ServiceStatusProcess.dwCurrentState
|
||||
== SERVICE_RUNNING)
|
||||
{
|
||||
LoadString(hInstance, IDS_SERVICES_STARTED, szStatus,
|
||||
sizeof(szStatus) / sizeof(TCHAR));
|
||||
item.pszText = szStatus;
|
||||
item.iSubItem = 2;
|
||||
SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* set the startup type */
|
||||
|
||||
dwValueSize = sizeof(DWORD);
|
||||
if (RegQueryValueEx(hKey,
|
||||
_T("Start"),
|
||||
NULL,
|
||||
NULL,
|
||||
(LPBYTE)&StartUp,
|
||||
&dwValueSize))
|
||||
{
|
||||
RegCloseKey(hKey);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (StartUp == 0x02)
|
||||
{
|
||||
LoadString(hInstance, IDS_SERVICES_AUTO, szStatus,
|
||||
sizeof(szStatus) / sizeof(TCHAR));
|
||||
item.pszText = szStatus;
|
||||
item.iSubItem = 3;
|
||||
SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
}
|
||||
else if (StartUp == 0x03)
|
||||
{
|
||||
LoadString(hInstance, IDS_SERVICES_MAN, szStatus,
|
||||
sizeof(szStatus) / sizeof(TCHAR));
|
||||
item.pszText = szStatus;
|
||||
item.iSubItem = 3;
|
||||
SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
}
|
||||
else if (StartUp == 0x04)
|
||||
{
|
||||
LoadString(hInstance, IDS_SERVICES_DIS, szStatus,
|
||||
sizeof(szStatus) / sizeof(TCHAR));
|
||||
item.pszText = szStatus;
|
||||
item.iSubItem = 3;
|
||||
SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* set Log On As */
|
||||
|
||||
dwValueSize = 0;
|
||||
if (RegQueryValueEx(hKey,
|
||||
_T("ObjectName"),
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&dwValueSize))
|
||||
{
|
||||
RegCloseKey(hKey);
|
||||
continue;
|
||||
}
|
||||
|
||||
LogOnAs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwValueSize);
|
||||
if (LogOnAs == NULL)
|
||||
{
|
||||
RegCloseKey(hKey);
|
||||
return FALSE;
|
||||
}
|
||||
if(RegQueryValueEx(hKey,
|
||||
_T("ObjectName"),
|
||||
NULL,
|
||||
NULL,
|
||||
(LPBYTE)LogOnAs,
|
||||
&dwValueSize))
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, LogOnAs);
|
||||
RegCloseKey(hKey);
|
||||
continue;
|
||||
}
|
||||
|
||||
item.pszText = LogOnAs;
|
||||
item.iSubItem = 4;
|
||||
SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, LogOnAs);
|
||||
|
||||
RegCloseKey(hKey);
|
||||
|
||||
}
|
||||
|
||||
NumListedServ = ListView_GetItemCount(hListView);
|
||||
|
||||
/* set the number of listed services in the status bar */
|
||||
LoadString(hInstance, IDS_NUM_SERVICES, szNumServices,
|
||||
sizeof(szNumServices) / sizeof(TCHAR));
|
||||
_sntprintf(buf, 300, szNumServices, NumListedServ);
|
||||
SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)buf);
|
||||
}
|
||||
|
||||
/* turn redraw flag on. It's turned off initially via the LBS_NOREDRAW flag */
|
||||
SendMessage (hListView, WM_SETREDRAW, TRUE, 0) ;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
DWORD
|
||||
GetServiceList(VOID)
|
||||
{
|
||||
SC_HANDLE ScHandle;
|
||||
|
||||
DWORD BytesNeeded = 0;
|
||||
DWORD ResumeHandle = 0;
|
||||
DWORD NumServices = 0;
|
||||
|
||||
ScHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
|
||||
if (ScHandle != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
if (EnumServicesStatusEx(ScHandle,
|
||||
SC_ENUM_PROCESS_INFO,
|
||||
SERVICE_WIN32,
|
||||
SERVICE_STATE_ALL,
|
||||
(LPBYTE)pServiceStatus,
|
||||
0, &BytesNeeded,
|
||||
&NumServices,
|
||||
&ResumeHandle,
|
||||
0) == 0)
|
||||
{
|
||||
/* Call function again if required size was returned */
|
||||
if (GetLastError() == ERROR_MORE_DATA)
|
||||
{
|
||||
/* reserve memory for service info array */
|
||||
pServiceStatus = (ENUM_SERVICE_STATUS_PROCESS *)
|
||||
HeapAlloc(GetProcessHeap(), 0, BytesNeeded);
|
||||
if (pServiceStatus == NULL)
|
||||
return FALSE;
|
||||
|
||||
/* fill array with service info */
|
||||
if (EnumServicesStatusEx(ScHandle,
|
||||
SC_ENUM_PROCESS_INFO,
|
||||
SERVICE_WIN32,
|
||||
SERVICE_STATE_ALL,
|
||||
(LPBYTE)pServiceStatus,
|
||||
BytesNeeded,
|
||||
&BytesNeeded,
|
||||
&NumServices,
|
||||
&ResumeHandle,
|
||||
0) == 0)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, pServiceStatus);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else /* exit on failure */
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CloseServiceHandle(ScHandle);
|
||||
|
||||
return NumServices;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
//WORD wCodePage;
|
||||
//WORD wLangID;
|
||||
//SC_HANDLE hService;
|
||||
//DWORD dwHandle, dwLen;
|
||||
//UINT BufLen;
|
||||
//TCHAR* lpData;
|
||||
//TCHAR* lpBuffer;
|
||||
//TCHAR szStrFileInfo[80];
|
||||
//TCHAR FileName[MAX_PATH];
|
||||
//LPVOID pvData;
|
||||
|
||||
//LPSERVICE_FAILURE_ACTIONS pServiceFailureActions = NULL;
|
||||
//LPQUERY_SERVICE_CONFIG pServiceConfig = NULL;
|
||||
|
||||
BytesNeeded = 0;
|
||||
hService = OpenService(ScHandle,
|
||||
pServiceStatus[Index].lpServiceName,
|
||||
SC_MANAGER_CONNECT);
|
||||
if (hService != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
/ * check if service is required by the system* /
|
||||
if (!QueryServiceConfig2(hService,
|
||||
SERVICE_CONFIG_FAILURE_ACTIONS,
|
||||
(LPBYTE)pServiceFailureActions,
|
||||
0,
|
||||
&BytesNeeded))
|
||||
{
|
||||
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
||||
{
|
||||
pServiceFailureActions = (LPSERVICE_FAILURE_ACTIONS)
|
||||
HeapAlloc(GetProcessHeap(), 0, BytesNeeded);
|
||||
if (pServiceFailureActions == NULL)
|
||||
return FALSE;
|
||||
|
||||
if (!QueryServiceConfig2(hService,
|
||||
SERVICE_CONFIG_FAILURE_ACTIONS,
|
||||
(LPBYTE)pServiceFailureActions,
|
||||
BytesNeeded,
|
||||
&BytesNeeded))
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, pServiceFailureActions);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else / * exit on failure * /
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
if (pServiceFailureActions->cActions)
|
||||
{
|
||||
if (pServiceFailureActions->lpsaActions[0].Type == SC_ACTION_REBOOT)
|
||||
{
|
||||
LoadString(hInstance, IDS_SERVICES_YES, szStatus, 128);
|
||||
item.pszText = szStatus;
|
||||
item.iSubItem = 1;
|
||||
SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
}
|
||||
}
|
||||
|
||||
if (pServiceFailureActions != NULL)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, pServiceFailureActions);
|
||||
pServiceFailureActions = NULL;
|
||||
}
|
||||
|
||||
/ * get vendor of service binary * /
|
||||
BytesNeeded = 0;
|
||||
if (!QueryServiceConfig(hService, pServiceConfig, 0, &BytesNeeded))
|
||||
{
|
||||
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
||||
{
|
||||
pServiceConfig = (LPQUERY_SERVICE_CONFIG)
|
||||
HeapAlloc(GetProcessHeap(), 0, BytesNeeded);
|
||||
if (pServiceConfig == NULL)
|
||||
return FALSE;
|
||||
|
||||
if (!QueryServiceConfig(hService,
|
||||
pServiceConfig,
|
||||
BytesNeeded,
|
||||
&BytesNeeded))
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, pServiceConfig);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else / * exit on failure * /
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
memset(&FileName, 0, MAX_PATH);
|
||||
if (_tcscspn(pServiceConfig->lpBinaryPathName, _T("\"")))
|
||||
{
|
||||
_tcsncpy(FileName, pServiceConfig->lpBinaryPathName,
|
||||
_tcscspn(pServiceConfig->lpBinaryPathName, _T(" ")) );
|
||||
}
|
||||
else
|
||||
{
|
||||
_tcscpy(FileName, pServiceConfig->lpBinaryPathName);
|
||||
}
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, pServiceConfig);
|
||||
pServiceConfig = NULL;
|
||||
|
||||
dwLen = GetFileVersionInfoSize(FileName, &dwHandle);
|
||||
if (dwLen)
|
||||
{
|
||||
lpData = (TCHAR*) HeapAlloc(GetProcessHeap(), 0, dwLen);
|
||||
if (lpData == NULL)
|
||||
return FALSE;
|
||||
|
||||
if (!GetFileVersionInfo (FileName, dwHandle, dwLen, lpData)) {
|
||||
HeapFree(GetProcessHeap(), 0, lpData);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (VerQueryValue(lpData, _T("\\VarFileInfo\\Translation"), &pvData, (PUINT) &BufLen))
|
||||
{
|
||||
wCodePage = LOWORD(*(DWORD*) pvData);
|
||||
wLangID = HIWORD(*(DWORD*) pvData);
|
||||
wsprintf(szStrFileInfo, _T("StringFileInfo\\%04X%04X\\CompanyName"), wCodePage, wLangID);
|
||||
}
|
||||
|
||||
if (VerQueryValue (lpData, szStrFileInfo, (LPVOID) &lpBuffer, (PUINT) &BufLen)) {
|
||||
item.pszText = lpBuffer;
|
||||
item.iSubItem = 2;
|
||||
SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, lpData);
|
||||
}
|
||||
else
|
||||
{
|
||||
LoadString(hInstance, IDS_SERVICES_UNKNOWN, szStatus, 128);
|
||||
item.pszText = szStatus;
|
||||
item.iSubItem = 2;
|
||||
SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
}
|
||||
CloseServiceHandle(hService);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, pServiceConfig);
|
||||
pServiceConfig = NULL;
|
||||
|
||||
dwLen = GetFileVersionInfoSize(FileName, &dwHandle);
|
||||
if (dwLen)
|
||||
{
|
||||
lpData = (TCHAR*) HeapAlloc(GetProcessHeap(), 0, dwLen);
|
||||
if (lpData == NULL)
|
||||
return FALSE;
|
||||
|
||||
if (!GetFileVersionInfo (FileName, dwHandle, dwLen, lpData)) {
|
||||
HeapFree(GetProcessHeap(), 0, lpData);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (VerQueryValue(lpData, _T("\\VarFileInfo\\Translation"),
|
||||
&pvData, (PUINT) &BufLen))
|
||||
{
|
||||
wCodePage = LOWORD(*(DWORD*) pvData);
|
||||
wLangID = HIWORD(*(DWORD*) pvData);
|
||||
wsprintf(szStrFileInfo, _T("StringFileInfo\\%04X%04X\\CompanyName"),
|
||||
wCodePage, wLangID);
|
||||
}
|
||||
|
||||
if (VerQueryValue (lpData, szStrFileInfo, (LPVOID) &lpBuffer, (PUINT) &BufLen))
|
||||
{
|
||||
item.pszText = lpBuffer;
|
||||
item.iSubItem = 2;
|
||||
SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, lpData);
|
||||
}
|
||||
else
|
||||
{
|
||||
LoadString(hInstance, IDS_SERVICES_UNKNOWN, szStatus, 128);
|
||||
item.pszText = szStatus;
|
||||
item.iSubItem = 2;
|
||||
SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
|
||||
}
|
||||
|
||||
|
||||
*/
|
||||
|