BEGIN\r
POPUP "&File"\r
BEGIN\r
- MENUITEM "E&xit",ID_EXIT\r
+ MENUITEM "Export...", ID_EXPORT\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "E&xit", ID_EXIT\r
END\r
POPUP "Action"\r
BEGIN\r
- MENUITEM "Start",ID_START\r
- MENUITEM "Stop",ID_STOP\r
- MENUITEM "Pause",ID_PAUSE\r
- MENUITEM "Resume",ID_RESUME\r
- MENUITEM "Restart",ID_RESTART\r
+ MENUITEM "Connect to...", ID_NET_CON, GRAYED\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "Start", ID_START, GRAYED\r
+ MENUITEM "Stop", ID_STOP, GRAYED\r
+ MENUITEM "Pause", ID_PAUSE, GRAYED\r
+ MENUITEM "Resume", ID_RESUME, GRAYED\r
+ MENUITEM "Restart", ID_RESTART, GRAYED\r
MENUITEM SEPARATOR\r
- MENUITEM "Refresh",ID_REFRESH\r
+ MENUITEM "Refresh", ID_REFRESH\r
MENUITEM SEPARATOR\r
- MENUITEM "Properties",ID_PROP\r
+ MENUITEM "Edit...", ID_EDIT, GRAYED\r
+ MENUITEM "Create...", ID_CREATE\r
+ MENUITEM "Delete...", ID_DELETE, GRAYED\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "Properties...", ID_PROP, GRAYED\r
END\r
POPUP "View"\r
BEGIN\r
- MENUITEM "Customize",ID_VIEW_CUSTOMIZE\r
+ MENUITEM "Large Icons", ID_VIEW_LARGE\r
+ MENUITEM "Small Icons", ID_VIEW_SMALL\r
+ MENUITEM "List", ID_VIEW_LIST\r
+ MENUITEM "Details", ID_VIEW_DETAILS\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "Customize...",ID_VIEW_CUSTOMIZE, GRAYED\r
END\r
POPUP "Help"\r
BEGIN\r
- MENUITEM "About",ID_ABOUT\r
+ MENUITEM "About...", ID_ABOUT\r
END\r
END\r
IDR_POPUP MENU\r
BEGIN\r
POPUP "popup"\r
BEGIN\r
- MENUITEM "Start",ID_START\r
- MENUITEM "Stop",ID_STOP\r
- MENUITEM "Pause",ID_PAUSE\r
- MENUITEM "Resume",ID_RESUME\r
- MENUITEM "Restart",ID_RESTART\r
+ MENUITEM "Start", ID_START, GRAYED\r
+ MENUITEM "Stop", ID_STOP, GRAYED\r
+ MENUITEM "Pause", ID_PAUSE, GRAYED\r
+ MENUITEM "Resume", ID_RESUME, GRAYED\r
+ MENUITEM "Restart", ID_RESTART, GRAYED\r
MENUITEM SEPARATOR\r
- POPUP "All tasks"\r
- BEGIN\r
- MENUITEM "Start",ID_START\r
- MENUITEM "Stop",ID_STOP\r
- MENUITEM "Pause",ID_PAUSE\r
- MENUITEM "Resume",ID_RESUME\r
- MENUITEM "Restart",ID_RESTART\r
- MENUITEM "Refresh",ID_REFRESH\r
- END\r
+ MENUITEM "Refresh", ID_REFRESH\r
MENUITEM SEPARATOR\r
- MENUITEM "Refresh",ID_REFRESH\r
+ MENUITEM "Edit...", ID_EDIT, GRAYED\r
+ MENUITEM "Delete...", ID_DELETE, GRAYED\r
MENUITEM SEPARATOR\r
- MENUITEM "Properties",ID_PROP\r
+ MENUITEM "Properties...", ID_PROP, GRAYED\r
MENUITEM SEPARATOR\r
- MENUITEM "Help",ID_HELP\r
+ MENUITEM "Help...", ID_HELP\r
END\r
END\r
\r
FONT 8,"Tahoma",0,0\r
STYLE WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME\r
BEGIN\r
- LTEXT "Service Manager v0.1\nCopyright (C) 2006\nby Ged Murphy (gedmurphy@gmail.com)", IDC_STATIC, 48, 7, 130, 26\r
+ LTEXT "Service Manager v0.5\nCopyright (C) 2005-2006\nby Ged Murphy (gedmurphy@gmail.com)", IDC_STATIC, 48, 7, 130, 26\r
PUSHBUTTON "Close", IDOK, 75, 162, 44, 15\r
ICON IDI_SM_ICON, IDC_STATIC, 10, 10, 7, 30\r
EDITTEXT IDC_LICENSE_EDIT, 8, 44, 174, 107, WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_READONLY | ES_MULTILINE\r
EDITTEXT IDC_DESCRIPTION, 70, 46, 176, 24, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_MULTILINE | ES_READONLY\r
EDITTEXT IDC_EXEPATH, 6, 86, 240, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_READONLY\r
CONTROL "",IDC_START_TYPE,"ComboBox",0x50010003,70,107,176,11\r
- PUSHBUTTON "Start", IDC_START, 6, 155, 54, 15\r
- PUSHBUTTON "Stop", IDC_STOP, 68, 155, 54, 15\r
- PUSHBUTTON "Pause", IDC_PAUSE , 130, 155, 54, 15\r
- PUSHBUTTON "Resume", IDC_RESUME, 192, 155, 54, 15\r
+ PUSHBUTTON "Start", IDC_START, 6, 155, 54, 15, WS_DISABLED\r
+ PUSHBUTTON "Stop", IDC_STOP, 68, 155, 54, 15, WS_DISABLED\r
+ PUSHBUTTON "Pause", IDC_PAUSE , 130, 155, 54, 15, WS_DISABLED\r
+ PUSHBUTTON "Resume", IDC_RESUME, 192, 155, 54, 15, WS_DISABLED\r
LTEXT "Service name:", IDC_STATIC, 4, 11, 53, 11\r
LTEXT "Display name:", IDC_STATIC, 4, 29, 53, 11\r
- LTEXT "Description", IDC_STATIC, 4, 51, 53, 11\r
+ LTEXT "Description:", IDC_STATIC, 4, 51, 53, 11\r
LTEXT "Path to executable:", IDC_STATIC, 6, 73, 82, 9\r
LTEXT "Startup type:", IDC_STATIC, 6, 108, 53, 11\r
LTEXT "Service status:", IDC_STATIC, 4, 138, 53, 11\r
CONTROL "",IDC_SERV_STATUS,"Static",0x50000000,70,138,176,11\r
LTEXT "You can specify the start parameters that apply when you start the service from here.",IDC_STATIC, 6,177,240,15\r
- LTEXT "Start parameters", IDC_STATIC, 6, 199, 53, 11\r
+ LTEXT "Start parameters:", IDC_STATIC, 6, 200, 58, 11\r
EDITTEXT IDC_START_PARAM, 68, 199, 178, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP\r
END\r
\r
BEGIN\r
CONTROL "",IDC_DEPEND_TREE1,"SysTreeView32",0x50010007,8,70,236,68,0x00000200\r
CONTROL "",IDC_DEPEND_TREE2,"SysTreeView32",0x50010007,8,151,234,67,0x00000200\r
- 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\r
- CONTROL "This service depends on the following components",IDC_STATIC,"Static",0x50000000,8,57,236,9\r
- CONTROL "",IDC_DEPEND_SERVICE,"Static",0x50000000,8,38,236,13\r
+ LTEXT "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,8, 7, 238, 26\r
+ LTEXT "This service depends on the following components", IDC_STATIC, 8, 57, 236, 9\r
+ LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13\r
END\r
\r
IDD_DLG_CREATE DIALOGEX 6,6,225,209\r
CONTROL "",IDC_CREATE_PATH,"Edit",0x50010000,8,62,214,13,0x00000200\r
CONTROL "",IDC_CREATE_DESC,"Edit",0x50010000,10,97,210,48,0x00000200\r
CONTROL "",IDC_CREATE_OPTIONS,"Edit",0x50010000,10,162,210,13,0x00000200\r
- CONTROL "Service Name :",IDC_STATIC,"Static",0x50000202,12,12,54,9\r
- CONTROL "Display Name :",IDC_STATIC,"Static",0x50000202,12,33,54,9\r
- CONTROL "Path to executable :",IDC_STATIC,"Static",0x50000000,10,51,68,9\r
+ CONTROL "*Service Name :",IDC_STATIC,"Static",0x50000202,12,12,54,9\r
+ CONTROL "*Display Name :",IDC_STATIC,"Static",0x50000202,12,33,54,9\r
+ CONTROL "*Path to executable :",IDC_STATIC,"Static",0x50000000,10,51,68,9\r
CONTROL "Description :",IDC_STATIC,"Static",0x50000000,12,86,44,9\r
CONTROL "OK",IDOK,"Button",0x50010000,126,192,44,13\r
CONTROL "Cancel",IDCANCEL,"Button",0x50010000,176,192,46,13\r
CONTROL "Help",ID_CREATE_HELP,"Button",0x50010000,6,192,44,13\r
END\r
\r
+IDD_DLG_DELETE DIALOGEX 6,6,185,148\r
+CAPTION "Delete a service"\r
+FONT 8,"Tahoma",0,0\r
+STYLE WS_BORDER | WS_DLGFRAME | DS_MODALFRAME\r
+BEGIN\r
+ ICON IDI_WARNING, IDC_STATIC, 10, 8, 24, 22\r
+ LTEXT "Are you sure you want to delete the following service? This cannot be undone once removed!", IDC_STATIC, 50, 6, 125, 25\r
+ LTEXT "Service Name:",IDC_STATIC, 6, 40, 80, 9\r
+ LTEXT "", IDC_DEL_NAME, 15, 53, 160, 15\r
+ EDITTEXT IDC_DEL_DESC, 6, 73, 174, 48, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_EX_STATICEDGE | ES_MULTILINE | ES_READONLY\r
+ PUSHBUTTON "Yes", IDOK, 26, 129, 54, 13\r
+ PUSHBUTTON "No", IDCANCEL, 102, 129, 54, 13\r
+END\r
+\r
+IDD_DLG_HELP_OPTIONS DIALOGEX 6,6,200,150\r
+CAPTION "Options"\r
+FONT 8,"MS Sans Serif",0,0\r
+STYLE 0x10CF0000\r
+BEGIN\r
+ LTEXT "", IDC_CREATE_HELP, 6, 5, 200, 150\r
+ PUSHBUTTON "Ok", IDOK, 75, 130, 44, 13\r
+END\r
+\r
IDD_DLG_PROGRESS DIALOGEX 6,6,255,89\r
CAPTION "Service Control"\r
FONT 8,"MS Sans Serif",0,0\r
EXSTYLE WS_EX_TOOLWINDOW\r
BEGIN\r
CONTROL "",IDC_SERVCON_PROGRESS,"msctls_progress32",0x50000000,8,46,238,13\r
- CONTROL "",IDC_SERVCON_INFO,"Static",0x50000000,8,5,236,11\r
- CONTROL "",IDC_SERVCON_NAME,"Static",0x50000000,8,25,66,11\r
- CONTROL "&Close",IDOK,"Button",0x50010000,100,70,54,13\r
+ LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11\r
+ LTEXT "", IDC_SERVCON_NAME, 8, 25, 66, 11\r
+ PUSHBUTTON "&Close", IDOK, 100, 70, 54, 13\r
END\r
\r
\r
STRINGTABLE DISCARDABLE\r
BEGIN\r
IDS_NUM_SERVICES "Num Services: %d"\r
- 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"\r
+ 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 General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA."\r
END\r
\r
STRINGTABLE DISCARDABLE\r
\r
STRINGTABLE DISCARDABLE\r
BEGIN\r
- IDS_PROGRESS_INFO "ReactOS is attempting to %s the following service"\r
+ IDS_PROGRESS_INFO_START "ReactOS is attempting to start the following service"\r
+ IDS_PROGRESS_INFO_STOP "ReactOS is attempting to stop the following service"\r
+ IDS_CREATE_SUCCESS "Service Created Succesfully"\r
+ IDS_CREATE_REQ "* = required fields"\r
+ IDS_DELETE_STOP "You must manually stop the service before deleting!"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE\r
+BEGIN\r
+ IDS_HELP_OPTIONS "CREATE OPTIONS:\r\nNOTE: The option name includes the equal sign.\r\n type= <own|share|interact|kernel|filesys|rec>\r\n (default = own)\r\n start= <boot|system|auto|demand|disabled>\r\n (default = demand) \r\n error= <normal|severe|critical|ignore>\r\n (default = normal)\r\n group= <LoadOrderGroup>\r\n tag= <yes|no>\r\n depend= <Dependencies(separated by / (forward slash))>\r\n obj= <AccountName|ObjectName>\r\n (default = LocalSystem)\r\n password= <password>\r\n"\r
END\r
/*\r
* PROJECT: ReactOS Services\r
* LICENSE: GPL - See COPYING in the top level directory\r
- * FILE: subsys/system/servman/about.c\r
+ * FILE: base/system/servman/about.c\r
* PURPOSE: About dialog box message handler\r
* COPYRIGHT: Copyright 2005 Ged Murphy <gedmurphy@gmail.com>\r
*\r
{\r
HWND hLicenseEditWnd;\r
HICON hIcon = NULL;\r
- TCHAR strLicense[0x1000];\r
+ TCHAR strLicense[700];\r
\r
switch (message)\r
{\r
\r
hLicenseEditWnd = GetDlgItem(hDlg, IDC_LICENSE_EDIT);\r
\r
- LoadString(hInstance, IDS_LICENSE, strLicense, 0x1000);\r
+ LoadString(hInstance, IDS_LICENSE, strLicense,\r
+ sizeof(strLicense) / sizeof(TCHAR));\r
\r
SetWindowText(hLicenseEditWnd, strLicense);\r
\r
/*\r
* PROJECT: ReactOS Services\r
* LICENSE: GPL - See COPYING in the top level directory\r
- * FILE: subsys/system/servman/control\r
+ * FILE: base/system/servman/control\r
* PURPOSE: Stops, pauses and resumes a service\r
* COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>\r
*\r
GetError(0);\r
return FALSE;\r
}\r
- \r
+\r
if (ServiceStatus.dwCheckPoint > dwOldCheckPoint)\r
{\r
/* The service is making progress. increment the progress bar */\r
--- /dev/null
+/*\r
+ * PROJECT: ReactOS Services\r
+ * LICENSE: GPL - See COPYING in the top level directory\r
+ * FILE: base/system/servman/create.c\r
+ * PURPOSE: Create a new service\r
+ * COPYRIGHT: Copyright 2006 Ged Murphy <gedmurphy@gmail.com>\r
+ *\r
+ */\r
+\r
+#include "servman.h"\r
+\r
+extern HINSTANCE hInstance;\r
+BOOL bHelpOpen = FALSE;\r
+\r
+\r
+BOOL Create(LPTSTR ServiceName,\r
+ LPTSTR DisplayName,\r
+ LPTSTR BinPath,\r
+ LPTSTR Description,\r
+ LPTSTR Options)\r
+{\r
+ SC_HANDLE hSCManager;\r
+ SC_HANDLE hSc;\r
+ TCHAR Buf[32];\r
+\r
+ /* open handle to the SCM */\r
+ hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);\r
+ if (hSCManager == NULL)\r
+ {\r
+ GetError(0);\r
+ return FALSE;\r
+ }\r
+\r
+ hSc = CreateService(hSCManager,\r
+ ServiceName,\r
+ DisplayName,\r
+ SERVICE_ALL_ACCESS,\r
+ SERVICE_WIN32_OWN_PROCESS,\r
+ SERVICE_DEMAND_START,\r
+ SERVICE_ERROR_NORMAL,\r
+ BinPath,\r
+ NULL,\r
+ NULL,\r
+ NULL,\r
+ NULL,\r
+ NULL);\r
+\r
+ if (hSc == NULL)\r
+ {\r
+ GetError(0);\r
+ return FALSE;\r
+ }\r
+\r
+ SetDescription(ServiceName, Description);\r
+\r
+ LoadString(hInstance, IDS_CREATE_SUCCESS, Buf,\r
+ sizeof(Buf) / sizeof(TCHAR));\r
+ DisplayString(Buf);\r
+ CloseServiceHandle(hSCManager);\r
+ CloseServiceHandle(hSc);\r
+ return TRUE;\r
+}\r
+\r
+\r
+#ifdef _MSC_VER\r
+#pragma warning(disable : 4100)\r
+#endif\r
+BOOL CALLBACK\r
+CreateHelpDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+ HWND hHelp;\r
+ HICON hIcon = NULL;\r
+ TCHAR Buf[1000];\r
+\r
+ switch (message)\r
+ {\r
+ case WM_INITDIALOG:\r
+ hIcon = LoadImage(hInstance, MAKEINTRESOURCE(IDI_SM_ICON), IMAGE_ICON, 16, 16, 0);\r
+ SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);\r
+\r
+ hHelp = GetDlgItem(hDlg, IDC_CREATE_HELP);\r
+\r
+ LoadString(hInstance, IDS_HELP_OPTIONS, Buf,\r
+ sizeof(Buf) / sizeof(TCHAR));\r
+\r
+ SetWindowText(hHelp, Buf);\r
+\r
+ return TRUE;\r
+\r
+ case WM_COMMAND:\r
+ if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL))\r
+ {\r
+ DestroyIcon(hIcon);\r
+ DestroyWindow(hDlg);\r
+ return TRUE;\r
+ }\r
+ break;\r
+\r
+ case WM_DESTROY:\r
+ bHelpOpen = FALSE;\r
+ break;\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+\r
+BOOL CALLBACK\r
+CreateDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+ HICON hIcon = NULL;\r
+\r
+ switch (message)\r
+ {\r
+ case WM_INITDIALOG:\r
+ hIcon = LoadImage(hInstance, MAKEINTRESOURCE(IDI_SM_ICON), IMAGE_ICON, 16, 16, 0);\r
+ SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);\r
+ return TRUE;\r
+\r
+ case WM_COMMAND:\r
+ switch (LOWORD(wParam))\r
+ {\r
+ case IDOK:\r
+ {\r
+ LPTSTR ServiceName = NULL;\r
+ LPTSTR DisplayName = NULL;\r
+ LPTSTR BinPath = NULL;\r
+ LPTSTR Description = NULL;\r
+ LPTSTR Options = NULL;\r
+ HWND hwnd;\r
+ TCHAR Buf[32];\r
+ INT iLen = 0;\r
+\r
+ /* get service name */\r
+ hwnd = GetDlgItem(hDlg, IDC_CREATE_SERVNAME);\r
+ iLen = GetWindowTextLength(hwnd);\r
+ if (iLen != 0)\r
+ {\r
+ ServiceName = HeapAlloc(GetProcessHeap(), 0, iLen+1);\r
+ if (ServiceName != NULL)\r
+ {\r
+ GetWindowText(hwnd, ServiceName, iLen+1);\r
+ }\r
+\r
+ }\r
+ else\r
+ {\r
+ LoadString(hInstance, IDS_CREATE_REQ, Buf,\r
+ sizeof(Buf) / sizeof(TCHAR));\r
+ DisplayString(Buf);\r
+ SetFocus(hwnd);\r
+ break;\r
+ }\r
+\r
+ /* get display name */\r
+ iLen = 0;\r
+ hwnd = GetDlgItem(hDlg, IDC_CREATE_DISPNAME);\r
+ iLen = GetWindowTextLength(hwnd);\r
+ if (iLen != 0)\r
+ {\r
+ DisplayName = HeapAlloc(GetProcessHeap(), 0, iLen+1);\r
+ if (DisplayName != NULL)\r
+ GetWindowText(hwnd, DisplayName, iLen+1);\r
+\r
+ }\r
+ else\r
+ {\r
+ LoadString(hInstance, IDS_CREATE_REQ, Buf,\r
+ sizeof(Buf) / sizeof(TCHAR));\r
+ DisplayString(Buf);\r
+ SetFocus(hwnd);\r
+ break;\r
+ }\r
+\r
+ /* get binary path */\r
+ iLen = 0;\r
+ hwnd = GetDlgItem(hDlg, IDC_CREATE_PATH);\r
+ iLen = GetWindowTextLength(hwnd);\r
+ if (iLen != 0)\r
+ {\r
+ BinPath = HeapAlloc(GetProcessHeap(), 0, iLen+1);\r
+ if (BinPath != NULL)\r
+ GetWindowText(hwnd, BinPath, iLen+1);\r
+\r
+ }\r
+ else\r
+ {\r
+ LoadString(hInstance, IDS_CREATE_REQ, Buf,\r
+ sizeof(Buf) / sizeof(TCHAR));\r
+ DisplayString(Buf);\r
+ SetFocus(hwnd);\r
+ break;\r
+ }\r
+\r
+ /* get description */\r
+ iLen = 0;\r
+ hwnd = GetDlgItem(hDlg, IDC_CREATE_DESC);\r
+ iLen = GetWindowTextLength(hwnd);\r
+ if (iLen != 0)\r
+ {\r
+ Description = HeapAlloc(GetProcessHeap(), 0, iLen+1);\r
+ if (Description != NULL)\r
+ GetWindowText(hwnd, Description, iLen+1);\r
+\r
+ }\r
+\r
+ /* get options */\r
+ iLen = 0;\r
+ hwnd = GetDlgItem(hDlg, IDC_CREATE_PATH);\r
+ iLen = GetWindowTextLength(hwnd);\r
+ if (iLen != 0)\r
+ {\r
+ Options = HeapAlloc(GetProcessHeap(), 0, iLen+1);\r
+ if (Options != NULL)\r
+ GetWindowText(hwnd, Options, iLen+1);\r
+\r
+ }\r
+\r
+ Create(ServiceName, DisplayName, BinPath, Description, Options);\r
+\r
+ if (ServiceName != NULL)\r
+ HeapFree(GetProcessHeap(), 0, ServiceName);\r
+ if (DisplayName != NULL)\r
+ HeapFree(GetProcessHeap(), 0, DisplayName);\r
+ if (BinPath != NULL)\r
+ HeapFree(GetProcessHeap(), 0, BinPath);\r
+ if (Description != NULL)\r
+ HeapFree(GetProcessHeap(), 0, Description);\r
+ if (Options != NULL)\r
+ HeapFree(GetProcessHeap(), 0, Options);\r
+\r
+\r
+ DestroyIcon(hIcon);\r
+ EndDialog(hDlg, LOWORD(wParam));\r
+ return TRUE;\r
+ }\r
+\r
+ case IDCANCEL:\r
+ DestroyIcon(hIcon);\r
+ EndDialog(hDlg, LOWORD(wParam));\r
+ return TRUE;\r
+\r
+ case ID_CREATE_HELP:\r
+ {\r
+ HWND hHelp;\r
+\r
+ if (! bHelpOpen)\r
+ {\r
+ hHelp = CreateDialog(hInstance,\r
+ MAKEINTRESOURCE(IDD_DLG_HELP_OPTIONS),\r
+ hDlg,\r
+ (DLGPROC)CreateHelpDialogProc);\r
+ if(hHelp != NULL)\r
+ {\r
+ ShowWindow(hHelp, SW_SHOW);\r
+ bHelpOpen = TRUE;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ }\r
+\r
+ }\r
+\r
+ return FALSE;\r
+}\r
--- /dev/null
+/*\r
+ * PROJECT: ReactOS Services\r
+ * LICENSE: GPL - See COPYING in the top level directory\r
+ * FILE: base/system/servman/delete.c\r
+ * PURPOSE: Delete an existing service\r
+ * COPYRIGHT: Copyright 2006 Ged Murphy <gedmurphy@gmail.com>\r
+ *\r
+ */\r
+\r
+#include "servman.h"\r
+\r
+extern HINSTANCE hInstance;\r
+extern HWND hListView;\r
+\r
+BOOL DoDeleteService(HWND hDlg)\r
+{\r
+ SC_HANDLE hSCManager;\r
+ SC_HANDLE hSc;\r
+ ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
+\r
+ /* open handle to the SCM */\r
+ hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);\r
+ if (hSCManager == NULL)\r
+ {\r
+ GetError(0);\r
+ return FALSE;\r
+ }\r
+\r
+ /* copy pointer to selected service */\r
+ Service = GetSelectedService();\r
+\r
+ /* get a handle to the service requested for starting */\r
+ hSc = OpenService(hSCManager, Service->lpServiceName, DELETE);\r
+ if (hSc == NULL)\r
+ {\r
+ GetError(0);\r
+ return FALSE;\r
+ }\r
+\r
+ /* start the service opened */\r
+ if (! DeleteService(hSc))\r
+ {\r
+ GetError(0);\r
+ return FALSE;\r
+ }\r
+\r
+\r
+ CloseServiceHandle(hSCManager);\r
+ CloseServiceHandle(hSc);\r
+\r
+ return TRUE;\r
+}\r
+\r
+\r
+#ifdef _MSC_VER\r
+#pragma warning(disable : 4100)\r
+#endif\r
+BOOL CALLBACK\r
+DeleteDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+ ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
+ HICON hIcon = NULL;\r
+ TCHAR Buf[1000];\r
+ LVITEM item;\r
+\r
+ switch (message)\r
+ {\r
+ case WM_INITDIALOG:\r
+\r
+ hIcon = LoadImage(hInstance, MAKEINTRESOURCE(IDI_SM_ICON), IMAGE_ICON, 16, 16, 0);\r
+ SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);\r
+\r
+ /* get pointer to selected service */\r
+ Service = GetSelectedService();\r
+\r
+ SendDlgItemMessage(hDlg, IDC_DEL_NAME, WM_SETTEXT, 0, (LPARAM)Service->lpDisplayName);\r
+\r
+\r
+ item.mask = LVIF_TEXT;\r
+ item.iItem = GetSelectedItem();\r
+ item.iSubItem = 1;\r
+ item.pszText = Buf;\r
+ item.cchTextMax = sizeof(Buf);\r
+ SendMessage(hListView, LVM_GETITEM, 0, (LPARAM)&item);\r
+\r
+ SendDlgItemMessage(hDlg, IDC_DEL_DESC, WM_SETTEXT, 0,\r
+ (LPARAM)Buf);\r
+\r
+ return TRUE;\r
+\r
+ case WM_COMMAND:\r
+ switch (LOWORD(wParam))\r
+ {\r
+ case IDOK:\r
+ if (DoDeleteService(hDlg))\r
+ ListView_DeleteItem(hListView, GetSelectedItem());\r
+\r
+ DestroyIcon(hIcon);\r
+ EndDialog(hDlg, LOWORD(wParam));\r
+ return TRUE;\r
+\r
+ case IDCANCEL:\r
+ DestroyIcon(hIcon);\r
+ EndDialog(hDlg, LOWORD(wParam));\r
+ return TRUE;\r
+ }\r
+ }\r
+\r
+ return FALSE;\r
+}\r
--- /dev/null
+/*\r
+ * PROJECT: ReactOS Services\r
+ * LICENSE: GPL - See COPYING in the top level directory\r
+ * FILE: base/system/servman/export.c\r
+ * PURPOSE: Save services to a file\r
+ * COPYRIGHT: Copyright 2006 Ged Murphy <gedmurphy@gmail.com>\r
+ *\r
+ */\r
+\r
+#include "servman.h"\r
+\r
+extern HWND hListView;\r
+\r
+\r
+DWORD GetTextFromListView(TCHAR Text[500], INT row, INT col)\r
+{\r
+ LVITEM item;\r
+ DWORD NumChars;\r
+\r
+ ZeroMemory(&item, sizeof(item));\r
+ item.mask = LVIF_TEXT;\r
+ item.iSubItem = col;\r
+ item.pszText = Text;\r
+ item.cchTextMax = 500;\r
+ NumChars = (INT)SendMessage(hListView, LVM_GETITEMTEXT, row, (LPARAM)&item);\r
+\r
+ return NumChars;\r
+}\r
+\r
+\r
+BOOL SaveServicesToFile(LPCTSTR pszFileName)\r
+{\r
+ HANDLE hFile;\r
+ BOOL bSuccess = FALSE;\r
+\r
+ hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, NULL,\r
+ CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\r
+ if(hFile != INVALID_HANDLE_VALUE)\r
+ {\r
+ TCHAR LVText[500];\r
+ TCHAR newl = _T('\n');\r
+ TCHAR tab = _T('\t');\r
+ DWORD dwTextLength, dwWritten;\r
+ INT NumListedServ = 0;\r
+ INT i, k;\r
+\r
+ NumListedServ = ListView_GetItemCount(hListView);\r
+\r
+ for (i=0; i < NumListedServ; i++)\r
+ {\r
+ for (k=0; k<5; k++)\r
+ {\r
+ dwTextLength = GetTextFromListView(LVText, i, k);\r
+ if (LVText != NULL)\r
+ {\r
+ WriteFile(hFile, LVText, sizeof(TCHAR) * dwTextLength, &dwWritten, NULL);\r
+ WriteFile(hFile, &tab, sizeof(TCHAR), &dwWritten, NULL);\r
+ }\r
+ }\r
+ WriteFile(hFile, &newl, sizeof(TCHAR), &dwWritten, NULL);\r
+ }\r
+ CloseHandle(hFile);\r
+ bSuccess = TRUE;\r
+ }\r
+ return bSuccess;\r
+}\r
+\r
+\r
+VOID ExportFile(HWND hwnd)\r
+{\r
+ OPENFILENAME ofn;\r
+ TCHAR szFileName[MAX_PATH] = _T("");\r
+\r
+ ZeroMemory(&ofn, sizeof(ofn));\r
+\r
+ ofn.lStructSize = sizeof(OPENFILENAME);\r
+ ofn.hwndOwner = hwnd;\r
+ ofn.lpstrFilter = _T("Text (Tab Delimited)(*.txt)\0*.txt\0Text (Comma Delimited)(*.csv)\0*.csv\0");\r
+ ofn.lpstrFile = szFileName;\r
+ ofn.nMaxFile = MAX_PATH;\r
+ ofn.lpstrDefExt = _T("txt");\r
+ ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;\r
+\r
+ if(GetSaveFileName(&ofn))\r
+ {\r
+ if (SaveServicesToFile(szFileName))\r
+ return;\r
+ }\r
+\r
+ if (CommDlgExtendedError() != CDERR_GENERALCODES)\r
+ MessageBox(NULL, _T("Export to file failed"), NULL, 0);\r
+}\r
-//#include <stdarg>\r
+/*\r
+ * PROJECT: ReactOS Services\r
+ * LICENSE: GPL - See COPYING in the top level directory\r
+ * FILE: base/system/servman/geterror.c\r
+ * PURPOSE: displays error messages\r
+ * COPYRIGHT: Copyright 2005 Ged Murphy <gedmurphy@gmail.com>\r
+ *\r
+ */\r
+\r
#include "servman.h"\r
-/* temp file for debugging */\r
+\r
\r
VOID GetError(DWORD err)\r
{\r
VOID DisplayString(PTCHAR Msg)\r
{\r
\r
- MessageBox(NULL, Msg, _T("Error!"), MB_OK | MB_ICONERROR);\r
+ MessageBox(NULL, Msg, _T("Note!"), MB_OK);\r
\r
}\r
/*\r
* PROJECT: ReactOS Services\r
* LICENSE: GPL - See COPYING in the top level directory\r
- * FILE: subsys/system/servman/progress.c\r
+ * FILE: base/system/servman/progress.c\r
* PURPOSE: Progress dialog box message handler\r
* COPYRIGHT: Copyright 2006 Ged Murphy <gedmurphy@gmail.com>\r
*\r
/*\r
* PROJECT: ReactOS Services\r
* LICENSE: GPL - See COPYING in the top level directory\r
- * FILE: subsys/system/servman/propsheet.c\r
+ * FILE: base/system/servman/propsheet.c\r
* PURPOSE: Property dialog box message handler\r
* COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>\r
*\r
\r
#include "servman.h"\r
\r
+HWND hwndGenDlg;\r
extern ENUM_SERVICE_STATUS_PROCESS *pServiceStatus;\r
extern HINSTANCE hInstance;\r
extern HWND hListView;\r
} PROP_DLG_INFO, *PPROP_DLG_INFO;\r
\r
\r
+\r
+VOID SetButtonStates()\r
+{\r
+ HWND hButton;\r
+ ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
+ DWORD Flags, State;\r
+\r
+ /* get pointer to selected service */\r
+ Service = GetSelectedService();\r
+\r
+ Flags = Service->ServiceStatusProcess.dwControlsAccepted;\r
+ State = Service->ServiceStatusProcess.dwCurrentState;\r
+\r
+ if (State == SERVICE_STOPPED)\r
+ {\r
+ hButton = GetDlgItem(hwndGenDlg, IDC_START);\r
+ EnableWindow (hButton, TRUE);\r
+ }\r
+\r
+ if ( (Flags & SERVICE_ACCEPT_STOP) && (State == SERVICE_RUNNING) )\r
+ {\r
+ hButton = GetDlgItem(hwndGenDlg, IDC_STOP);\r
+ EnableWindow (hButton, TRUE);\r
+ }\r
+\r
+ if ( (Flags & SERVICE_ACCEPT_PAUSE_CONTINUE) && (State == SERVICE_RUNNING) )\r
+ {\r
+ hButton = GetDlgItem(hwndGenDlg, IDC_PAUSE);\r
+ EnableWindow (hButton, TRUE);\r
+ }\r
+\r
+ if ( (Flags & SERVICE_ACCEPT_STOP) && (State == SERVICE_RUNNING) )\r
+ {\r
+ hButton = GetDlgItem(hwndGenDlg, IDC_PAUSE);\r
+ EnableWindow (hButton, TRUE);\r
+ }\r
+}\r
+\r
/*\r
* Fills the 'startup type' combo box with possible\r
* values and sets it to value of the selected item\r
*/\r
-VOID SetStartupType(HKEY hKey, HWND hwndDlg)\r
+VOID SetStartupType(LPTSTR lpServiceName)\r
{\r
HWND hList;\r
+ HKEY hKey;\r
TCHAR buf[25];\r
DWORD dwValueSize = 0;\r
DWORD StartUp = 0;\r
+ LPCTSTR Path = _T("System\\CurrentControlSet\\Services\\%s");\r
+ TCHAR KeyBuf[300];\r
\r
- hList = GetDlgItem(hwndDlg, IDC_START_TYPE);\r
+ /* open the registry key for the service */\r
+ _sntprintf(KeyBuf, sizeof(KeyBuf) / sizeof(TCHAR), Path, lpServiceName);\r
+ RegOpenKeyEx(HKEY_LOCAL_MACHINE,\r
+ KeyBuf,\r
+ 0,\r
+ KEY_READ,\r
+ &hKey);\r
+\r
+ hList = GetDlgItem(hwndGenDlg, IDC_START_TYPE);\r
\r
LoadString(hInstance, IDS_SERVICES_AUTO, buf, sizeof(buf) / sizeof(TCHAR));\r
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)buf);\r
* Populates the General Properties dialog with\r
* the relevant service information\r
*/\r
-VOID GetDlgInfo(HWND hwndDlg)\r
+VOID GetDlgInfo()\r
{\r
- HKEY hKey;\r
ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
PROP_DLG_INFO DlgInfo;\r
- LPCTSTR Path = _T("System\\CurrentControlSet\\Services\\%s");\r
- TCHAR buf[300];\r
+ \r
\r
/* get pointer to selected service */\r
Service = GetSelectedService();\r
\r
- /* open the registry key for the service */\r
- _sntprintf(buf, sizeof(buf) / sizeof(TCHAR), Path, Service->lpServiceName);\r
- RegOpenKeyEx(HKEY_LOCAL_MACHINE,\r
- buf,\r
- 0,\r
- KEY_READ,\r
- &hKey);\r
\r
/* set the service name */\r
DlgInfo.lpServiceName = Service->lpServiceName;\r
- SendDlgItemMessage(hwndDlg, IDC_SERV_NAME, WM_SETTEXT, 0, (\r
+ SendDlgItemMessage(hwndGenDlg, IDC_SERV_NAME, WM_SETTEXT, 0, (\r
LPARAM)DlgInfo.lpServiceName);\r
\r
\r
/* set the display name */\r
DlgInfo.lpDisplayName = Service->lpDisplayName;\r
- SendDlgItemMessage(hwndDlg, IDC_DISP_NAME, WM_SETTEXT, 0,\r
+ SendDlgItemMessage(hwndGenDlg, IDC_DISP_NAME, WM_SETTEXT, 0,\r
(LPARAM)DlgInfo.lpDisplayName);\r
\r
\r
/* set the description */\r
- if (GetDescription(hKey, &DlgInfo.lpDescription))\r
- SendDlgItemMessage(hwndDlg, IDC_DESCRIPTION, WM_SETTEXT, 0,\r
+ if (GetDescription(Service->lpServiceName, &DlgInfo.lpDescription))\r
+ SendDlgItemMessage(hwndGenDlg, IDC_DESCRIPTION, WM_SETTEXT, 0,\r
(LPARAM)DlgInfo.lpDescription);\r
\r
\r
/* set the executable path */\r
if (GetExecutablePath(&DlgInfo.lpPathToExe))\r
- SendDlgItemMessage(hwndDlg, IDC_EXEPATH, WM_SETTEXT, 0, (LPARAM)DlgInfo.lpPathToExe);\r
+ SendDlgItemMessage(hwndGenDlg, IDC_EXEPATH, WM_SETTEXT, 0, (LPARAM)DlgInfo.lpPathToExe);\r
\r
\r
/* set startup type */\r
- SetStartupType(hKey, hwndDlg);\r
-\r
+ SetStartupType(Service->lpServiceName);\r
\r
\r
/* set service status */\r
{\r
LoadString(hInstance, IDS_SERVICES_STARTED, DlgInfo.szServiceStatus,\r
sizeof(DlgInfo.szServiceStatus) / sizeof(TCHAR));\r
- SendDlgItemMessageW(hwndDlg, IDC_SERV_STATUS, WM_SETTEXT, 0, (LPARAM)DlgInfo.szServiceStatus);\r
+ SendDlgItemMessageW(hwndGenDlg, IDC_SERV_STATUS, WM_SETTEXT, 0, (LPARAM)DlgInfo.szServiceStatus);\r
}\r
else\r
{\r
LoadString(hInstance, IDS_SERVICES_STOPPED, DlgInfo.szServiceStatus,\r
sizeof(DlgInfo.szServiceStatus) / sizeof(TCHAR));\r
- SendDlgItemMessageW(hwndDlg, IDC_SERV_STATUS, WM_SETTEXT, 0, (LPARAM)DlgInfo.szServiceStatus);\r
+ SendDlgItemMessageW(hwndGenDlg, IDC_SERV_STATUS, WM_SETTEXT, 0, (LPARAM)DlgInfo.szServiceStatus);\r
}\r
\r
-\r
-\r
-\r
}\r
\r
\r
+\r
#ifdef _MSC_VER\r
#pragma warning(disable : 4100)\r
#endif\r
* General Property dialog callback.\r
* Controls messages to the General dialog\r
*/\r
-/* FIXME: this may be better as a modeless dialog */\r
INT_PTR CALLBACK\r
GeneralPageProc(HWND hwndDlg,\r
UINT uMsg,\r
WPARAM wParam,\r
LPARAM lParam)\r
{\r
+ hwndGenDlg = hwndDlg;\r
\r
switch (uMsg)\r
{\r
case WM_INITDIALOG:\r
- GetDlgInfo(hwndDlg);\r
- break;\r
+ GetDlgInfo();\r
+ SetButtonStates();\r
+ break;\r
\r
case WM_COMMAND:\r
switch(LOWORD(wParam))\r
{\r
+ case IDC_START_TYPE:\r
+ /* Enable the 'Apply' button */\r
+ //PropSheet_Changed(GetParent(hwndDlg), hwndDlg);\r
+ break;\r
+\r
case IDC_START:\r
SendMessage(hMainWnd, WM_COMMAND, ID_START, 0);\r
- break;\r
+ break;\r
\r
case IDC_STOP:\r
SendMessage(hMainWnd, WM_COMMAND, ID_STOP, 0);\r
- break;\r
+ break;\r
\r
case IDC_PAUSE:\r
SendMessage(hMainWnd, WM_COMMAND, ID_PAUSE, 0);\r
- break;\r
+ break;\r
\r
case IDC_RESUME:\r
SendMessage(hMainWnd, WM_COMMAND, ID_RESUME, 0);\r
- break;\r
+ break;\r
+\r
+ case IDC_START_PARAM:\r
+ /* Enable the 'Apply' button */\r
+ //PropSheet_Changed(GetParent(hwndDlg), hwndDlg);\r
+ break;\r
+\r
}\r
break;\r
\r
case WM_DESTROY:\r
- break;\r
+ break;\r
\r
case WM_NOTIFY:\r
{\r
LPNMHDR lpnm = (LPNMHDR)lParam;\r
\r
switch (lpnm->code)\r
+ {\r
+ case MCN_SELECT:\r
+ /* Enable the 'Apply' button */\r
+ PropSheet_Changed(GetParent(hwndDlg), hwndDlg);\r
+ break;\r
\r
- default:\r
+ default:\r
break;\r
+ }\r
}\r
- break;\r
+ break;\r
}\r
\r
return FALSE;\r
* Dependancies Property dialog callback.\r
* Controls messages to the Dependancies dialog\r
*/\r
-/* FIXME: this may be better as a modeless dialog */\r
INT_PTR CALLBACK\r
DependanciesPageProc(HWND hwndDlg,\r
- UINT uMsg,\r
- WPARAM wParam,\r
- LPARAM lParam)\r
+ UINT uMsg,\r
+ WPARAM wParam,\r
+ LPARAM lParam)\r
{\r
\r
switch (uMsg)\r
}\r
\r
\r
+INT CALLBACK AddEditButton(HWND hwnd, UINT message, LPARAM lParam)\r
+{\r
+ HWND hEditButton;\r
+\r
+ switch (message)\r
+ {\r
+ case PSCB_PRECREATE:\r
+ /*hEditButton = CreateWindowEx(0,\r
+ WC_BUTTON,\r
+ NULL,\r
+ WS_CHILD | WS_VISIBLE,\r
+ 20, 300, 30, 15,\r
+ hwnd,\r
+ NULL,\r
+ hInstance,\r
+ NULL);\r
+ if (hEditButton == NULL)\r
+ GetError(0);*/\r
+\r
+ hEditButton = GetDlgItem(hwnd, PSBTN_OK);\r
+ DestroyWindow(hEditButton);\r
+ //SetWindowText(hEditButton, _T("test"));\r
+\r
+ return TRUE;\r
+ }\r
+ return TRUE;\r
+}\r
+\r
+\r
+\r
+\r
static VOID\r
InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc)\r
{\r
LONG APIENTRY\r
OpenPropSheet(HWND hwnd)\r
{\r
- PROPSHEETHEADER psh;\r
- PROPSHEETPAGE psp[2];\r
- TCHAR Caption[256];\r
-\r
- LoadString(hInstance, IDS_PROP_SHEET, Caption, sizeof(Caption) / sizeof(TCHAR));\r
-\r
- ZeroMemory(&psh, sizeof(PROPSHEETHEADER));\r
- psh.dwSize = sizeof(PROPSHEETHEADER);\r
- psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE;\r
- psh.hwndParent = NULL;\r
- psh.hInstance = hInstance;\r
- psh.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SM_ICON));\r
- psh.pszCaption = Caption;\r
- psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);\r
- psh.nStartPage = 0;\r
- psh.ppsp = psp;\r
-\r
- InitPropSheetPage(&psp[0], IDD_DLG_GENERAL, GeneralPageProc);\r
- //InitPropSheetPage(&psp[1], IDD_DLG_GENERAL, LogonPageProc);\r
- //InitPropSheetPage(&psp[2], IDD_DLG_GENERAL, RecoveryPageProc);\r
- InitPropSheetPage(&psp[1], IDD_DLG_DEPEND, DependanciesPageProc);\r
-\r
-\r
- return (LONG)(PropertySheet(&psh) != -1);\r
+ PROPSHEETHEADER psh;\r
+ PROPSHEETPAGE psp[2];\r
+ ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
+\r
+ Service = GetSelectedService();\r
+\r
+ ZeroMemory(&psh, sizeof(PROPSHEETHEADER));\r
+ psh.dwSize = sizeof(PROPSHEETHEADER);\r
+ psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE | PSH_USECALLBACK;\r
+ psh.hwndParent = hwnd;\r
+ psh.hInstance = hInstance;\r
+ psh.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SM_ICON));\r
+ psh.pszCaption = Service->lpDisplayName;\r
+ psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);\r
+ psh.nStartPage = 0;\r
+ psh.pfnCallback = AddEditButton;\r
+ psh.ppsp = psp;\r
+\r
+\r
+ InitPropSheetPage(&psp[0], IDD_DLG_GENERAL, GeneralPageProc);\r
+ //InitPropSheetPage(&psp[1], IDD_DLG_GENERAL, LogonPageProc);\r
+ //InitPropSheetPage(&psp[2], IDD_DLG_GENERAL, RecoveryPageProc);\r
+ InitPropSheetPage(&psp[1], IDD_DLG_DEPEND, DependanciesPageProc);\r
+\r
+ return (LONG)(PropertySheet(&psh) != -1);\r
}\r
\r
/*\r
* PROJECT: ReactOS Services\r
* LICENSE: GPL - See COPYING in the top level directory\r
- * FILE: subsys/system/servman/query.c\r
+ * FILE: base/system/servman/query.c\r
* PURPOSE: Query service information\r
* COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>\r
*\r
\r
\r
\r
-ENUM_SERVICE_STATUS_PROCESS* \r
+ENUM_SERVICE_STATUS_PROCESS*\r
GetSelectedService(VOID)\r
{\r
ENUM_SERVICE_STATUS_PROCESS *pSelectedService = NULL;\r
}\r
\r
\r
-/* Retrives the service description from the registry */\r
-BOOL GetDescription(HKEY hKey, LPTSTR *retDescription)\r
+/* Sets the service description in the registry */\r
+BOOL SetDescription(LPTSTR ServiceName, LPTSTR Description)\r
{\r
+ HKEY hKey;\r
+ LPCTSTR Path = _T("System\\CurrentControlSet\\Services\\%s");\r
+ TCHAR buf[300];\r
+ TCHAR szBuf[MAX_PATH];\r
+ LONG val;\r
+\r
+\r
+ /* open the registry key for the service */\r
+ _sntprintf(buf, sizeof(buf) / sizeof(TCHAR), Path, ServiceName);\r
+ RegOpenKeyEx(HKEY_LOCAL_MACHINE,\r
+ buf,\r
+ 0,\r
+ KEY_WRITE,\r
+ &hKey);\r
+\r
+\r
+ if ((val = RegSetValueEx(hKey,\r
+ _T("Description"),\r
+ 0,\r
+ REG_SZ,\r
+ (LPBYTE)Description,\r
+ (DWORD)lstrlen(szBuf)+1)) != ERROR_SUCCESS)\r
+ {\r
+ GetError(val);\r
+ return FALSE;\r
+ }\r
+\r
+\r
+ RegCloseKey(hKey);\r
+ return TRUE;\r
+}\r
\r
+\r
+\r
+/* Retrives the service description from the registry */\r
+BOOL GetDescription(LPTSTR lpServiceName, LPTSTR *retDescription)\r
+{\r
+ HKEY hKey;\r
LPTSTR Description = NULL;\r
DWORD dwValueSize = 0;\r
- LONG ret = RegQueryValueEx(hKey,\r
- _T("Description"),\r
- NULL,\r
- NULL,\r
- NULL,\r
- &dwValueSize);\r
+ LONG ret;\r
+ LPCTSTR Path = _T("System\\CurrentControlSet\\Services\\%s");\r
+ TCHAR buf[300];\r
+\r
+ /* open the registry key for the service */\r
+ _sntprintf(buf, sizeof(buf) / sizeof(TCHAR), Path, lpServiceName);\r
+ RegOpenKeyEx(HKEY_LOCAL_MACHINE,\r
+ buf,\r
+ 0,\r
+ KEY_READ,\r
+ &hKey);\r
+\r
+ ret = RegQueryValueEx(hKey,\r
+ _T("Description"),\r
+ NULL,\r
+ NULL,\r
+ NULL,\r
+ &dwValueSize);\r
if (ret != ERROR_SUCCESS && ret != ERROR_FILE_NOT_FOUND && ret != ERROR_INVALID_HANDLE)\r
{\r
RegCloseKey(hKey);\r
}\r
\r
\r
+VOID InitListViewImage(VOID)\r
+{\r
+ HICON hSmIconItem, hLgIconItem; /* icon for list-view items */\r
+ HIMAGELIST hSmall, hLarge; /* image list for other views */\r
+\r
+\r
+ /* Create the icon image lists */\r
+ hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON),\r
+ GetSystemMetrics(SM_CYSMICON), ILC_MASK | ILC_COLOR32, 1, 1);\r
+\r
+ hLarge = ImageList_Create(GetSystemMetrics(SM_CXICON),\r
+ GetSystemMetrics(SM_CYICON), ILC_MASK | ILC_COLOR32, 1, 1);\r
+\r
+ /* Add an icon to each image list */\r
+ hSmIconItem = LoadImage(hInstance, MAKEINTRESOURCE(IDI_SM_ICON),\r
+ IMAGE_ICON, 16, 16, 0);\r
+ ImageList_AddIcon(hSmall, hSmIconItem);\r
+\r
+ hLgIconItem = LoadImage(hInstance, MAKEINTRESOURCE(IDI_SM_ICON),\r
+ IMAGE_ICON, 32, 32, 0);\r
+ ImageList_AddIcon(hLarge, hLgIconItem);\r
+\r
+ /* assign the image to the list view */\r
+ ListView_SetImageList(hListView, hSmall, LVSIL_SMALL);\r
+ ListView_SetImageList(hListView, hLarge, LVSIL_NORMAL);\r
+\r
+}\r
+\r
\r
\r
BOOL\r
\r
ListView_DeleteAllItems(hListView);\r
\r
+ InitListViewImage();\r
+\r
NumServices = GetServiceList();\r
\r
if (NumServices)\r
{\r
- HICON hiconItem; /* icon for list-view items */\r
- HIMAGELIST hSmall; /* image list for other views */\r
TCHAR buf[300]; /* buffer to hold key path */\r
INT NumListedServ = 0; /* how many services were listed */\r
\r
- /* Create the icon image lists */\r
- hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON),\r
- GetSystemMetrics(SM_CYSMICON), ILC_MASK | ILC_COLOR16, 1, 1);\r
-\r
- /* Add an icon to each image list */\r
- hiconItem = LoadImage(hInstance, MAKEINTRESOURCE(IDI_SM_ICON),\r
- IMAGE_ICON, 16, 16, 0);\r
- ImageList_AddIcon(hSmall, hiconItem);\r
-\r
- /* assign the image to the list view */\r
- ListView_SetImageList(hListView, hSmall, LVSIL_SMALL);\r
-\r
for (Index = 0; Index < NumServices; Index++)\r
{\r
HKEY hKey = NULL;\r
\r
\r
\r
-\r
/* set the description */\r
\r
- if (GetDescription(hKey, &Description))\r
+ if (GetDescription(pServiceStatus[Index].lpServiceName, &Description))\r
{\r
item.pszText = Description;\r
item.iSubItem = 1;\r
\r
return NumServices;\r
}\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-/*\r
- //WORD wCodePage;\r
- //WORD wLangID;\r
- //SC_HANDLE hService;\r
- //DWORD dwHandle, dwLen;\r
- //UINT BufLen;\r
- //TCHAR* lpData;\r
- //TCHAR* lpBuffer;\r
- //TCHAR szStrFileInfo[80];\r
- //TCHAR FileName[MAX_PATH];\r
- //LPVOID pvData;\r
-\r
- //LPSERVICE_FAILURE_ACTIONS pServiceFailureActions = NULL;\r
- //LPQUERY_SERVICE_CONFIG pServiceConfig = NULL;\r
-\r
- BytesNeeded = 0;\r
- hService = OpenService(ScHandle,\r
- pServiceStatus[Index].lpServiceName,\r
- SC_MANAGER_CONNECT);\r
- if (hService != INVALID_HANDLE_VALUE)\r
- {\r
- / * check if service is required by the system* /\r
- if (!QueryServiceConfig2(hService,\r
- SERVICE_CONFIG_FAILURE_ACTIONS,\r
- (LPBYTE)pServiceFailureActions,\r
- 0,\r
- &BytesNeeded))\r
- {\r
- if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)\r
- {\r
- pServiceFailureActions = (LPSERVICE_FAILURE_ACTIONS)\r
- HeapAlloc(GetProcessHeap(), 0, BytesNeeded);\r
- if (pServiceFailureActions == NULL)\r
- return FALSE;\r
-\r
- if (!QueryServiceConfig2(hService,\r
- SERVICE_CONFIG_FAILURE_ACTIONS,\r
- (LPBYTE)pServiceFailureActions,\r
- BytesNeeded,\r
- &BytesNeeded))\r
- {\r
- HeapFree(GetProcessHeap(), 0, pServiceFailureActions);\r
- return FALSE;\r
- }\r
- }\r
- else / * exit on failure * /\r
- {\r
- return FALSE;\r
- }\r
- }\r
- if (pServiceFailureActions->cActions)\r
- {\r
- if (pServiceFailureActions->lpsaActions[0].Type == SC_ACTION_REBOOT)\r
- {\r
- LoadString(hInstance, IDS_SERVICES_YES, szStatus, 128);\r
- item.pszText = szStatus;\r
- item.iSubItem = 1;\r
- SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
- }\r
- }\r
-\r
- if (pServiceFailureActions != NULL)\r
- {\r
- HeapFree(GetProcessHeap(), 0, pServiceFailureActions);\r
- pServiceFailureActions = NULL;\r
- }\r
-\r
- / * get vendor of service binary * /\r
- BytesNeeded = 0;\r
- if (!QueryServiceConfig(hService, pServiceConfig, 0, &BytesNeeded))\r
- {\r
- if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)\r
- {\r
- pServiceConfig = (LPQUERY_SERVICE_CONFIG)\r
- HeapAlloc(GetProcessHeap(), 0, BytesNeeded);\r
- if (pServiceConfig == NULL)\r
- return FALSE;\r
-\r
- if (!QueryServiceConfig(hService,\r
- pServiceConfig,\r
- BytesNeeded,\r
- &BytesNeeded))\r
- {\r
- HeapFree(GetProcessHeap(), 0, pServiceConfig);\r
- return FALSE;\r
- }\r
- }\r
- else / * exit on failure * /\r
- {\r
- return FALSE;\r
- }\r
- }\r
-\r
- memset(&FileName, 0, MAX_PATH);\r
- if (_tcscspn(pServiceConfig->lpBinaryPathName, _T("\"")))\r
- {\r
- _tcsncpy(FileName, pServiceConfig->lpBinaryPathName,\r
- _tcscspn(pServiceConfig->lpBinaryPathName, _T(" ")) );\r
- }\r
- else\r
- {\r
- _tcscpy(FileName, pServiceConfig->lpBinaryPathName);\r
- }\r
-\r
- HeapFree(GetProcessHeap(), 0, pServiceConfig);\r
- pServiceConfig = NULL;\r
-\r
- dwLen = GetFileVersionInfoSize(FileName, &dwHandle);\r
- if (dwLen)\r
- {\r
- lpData = (TCHAR*) HeapAlloc(GetProcessHeap(), 0, dwLen);\r
- if (lpData == NULL)\r
- return FALSE;\r
-\r
- if (!GetFileVersionInfo (FileName, dwHandle, dwLen, lpData)) {\r
- HeapFree(GetProcessHeap(), 0, lpData);\r
- return FALSE;\r
- }\r
-\r
- if (VerQueryValue(lpData, _T("\\VarFileInfo\\Translation"), &pvData, (PUINT) &BufLen))\r
- {\r
- wCodePage = LOWORD(*(DWORD*) pvData);\r
- wLangID = HIWORD(*(DWORD*) pvData);\r
- wsprintf(szStrFileInfo, _T("StringFileInfo\\%04X%04X\\CompanyName"), wCodePage, wLangID);\r
- }\r
-\r
- if (VerQueryValue (lpData, szStrFileInfo, (LPVOID) &lpBuffer, (PUINT) &BufLen)) {\r
- item.pszText = lpBuffer;\r
- item.iSubItem = 2;\r
- SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
- }\r
- HeapFree(GetProcessHeap(), 0, lpData);\r
- }\r
- else\r
- {\r
- LoadString(hInstance, IDS_SERVICES_UNKNOWN, szStatus, 128);\r
- item.pszText = szStatus;\r
- item.iSubItem = 2;\r
- SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
- }\r
- CloseServiceHandle(hService);\r
- }\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
- HeapFree(GetProcessHeap(), 0, pServiceConfig);\r
- pServiceConfig = NULL;\r
-\r
- dwLen = GetFileVersionInfoSize(FileName, &dwHandle);\r
- if (dwLen)\r
- {\r
- lpData = (TCHAR*) HeapAlloc(GetProcessHeap(), 0, dwLen);\r
- if (lpData == NULL)\r
- return FALSE;\r
-\r
- if (!GetFileVersionInfo (FileName, dwHandle, dwLen, lpData)) {\r
- HeapFree(GetProcessHeap(), 0, lpData);\r
- return FALSE;\r
- }\r
-\r
- if (VerQueryValue(lpData, _T("\\VarFileInfo\\Translation"),\r
- &pvData, (PUINT) &BufLen))\r
- {\r
- wCodePage = LOWORD(*(DWORD*) pvData);\r
- wLangID = HIWORD(*(DWORD*) pvData);\r
- wsprintf(szStrFileInfo, _T("StringFileInfo\\%04X%04X\\CompanyName"),\r
- wCodePage, wLangID);\r
- }\r
-\r
- if (VerQueryValue (lpData, szStrFileInfo, (LPVOID) &lpBuffer, (PUINT) &BufLen))\r
- {\r
- item.pszText = lpBuffer;\r
- item.iSubItem = 2;\r
- SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
- }\r
- HeapFree(GetProcessHeap(), 0, lpData);\r
- }\r
- else\r
- {\r
- LoadString(hInstance, IDS_SERVICES_UNKNOWN, szStatus, 128);\r
- item.pszText = szStatus;\r
- item.iSubItem = 2;\r
- SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
- }\r
-\r
-\r
-*/\r
-\r
#define IDC_SERVLIST 1000\r
#define IDC_TOOLBAR 1001\r
#define IDC_STATUSBAR 1002\r
+#define IDC_EDIT_BUTTON 1003\r
\r
#define ID_PROP 2000\r
#define ID_REFRESH 2001\r
#define ID_PAUSE 2005\r
#define ID_RESUME 2006\r
#define ID_RESTART 2007\r
-#define ID_NEW 2008\r
-#define ID_HELP 2009\r
-#define ID_EXIT 2010\r
+#define ID_EDIT 2008\r
+#define ID_CREATE 2009\r
+#define ID_DELETE 2010\r
+#define ID_HELP 2011\r
+#define ID_EXIT 2012\r
+#define ID_NET_CON 2013\r
\r
#define IDR_MAINMENU 102\r
#define IDR_POPUP 103\r
#define ID_VIEW_CUSTOMIZE 4021\r
+#define ID_VIEW_LARGE 4022\r
+#define ID_VIEW_SMALL 4023\r
+#define ID_VIEW_LIST 4024\r
+#define ID_VIEW_DETAILS 4025\r
#define ID_ABOUT 4031\r
\r
/* List view columns */\r
#define TBICON_PROP 0\r
#define TBICON_REFRESH 1\r
#define TBICON_EXPORT 2\r
-#define TBICON_NEW 3\r
+#define TBICON_CREATE 3\r
#define TBICON_START 4\r
#define TBICON_STOP 5\r
#define TBICON_PAUSE 6\r
#define TBICON_EXIT 9\r
\r
/* properties dialog */\r
-#define IDS_PROP_SHEET 10000\r
#define IDD_DLG_GENERAL 10001\r
#define IDC_SERV_NAME 10041\r
#define IDC_DISP_NAME 10051\r
#define IDC_RESUME 10161\r
#define IDC_START_PARAM 10191\r
\r
+/* dependancies dialog */\r
#define IDD_DLG_DEPEND 20001\r
#define IDC_DEPEND_TREE1 20002\r
#define IDC_DEPEND_TREE2 20003\r
#define IDC_CREATE_DESC 8004\r
#define IDC_CREATE_OPTIONS 8005\r
#define ID_CREATE_HELP 8006\r
+#define IDD_DLG_HELP_OPTIONS 8020\r
+#define IDC_CREATE_HELP 8021\r
+#define IDS_HELP_OPTIONS 8022\r
+#define IDS_CREATE_SUCCESS 8023\r
+#define IDS_CREATE_REQ 8024\r
+\r
+\r
+/* delete service dialog */\r
+#define IDD_DLG_DELETE 9000\r
+#define IDC_DEL_GROUP 9001\r
+#define IDC_DEL_NAME 9002\r
+#define IDC_DEL_DESC 9003\r
+#define IDS_DELETE_STOP 9010\r
+\r
\r
/* progress bar */\r
#define IDD_DLG_PROGRESS 7000\r
#define IDC_SERVCON_PROGRESS 7001\r
#define IDC_SERVCON_INFO 7002\r
#define IDC_SERVCON_NAME 7003\r
-#define IDS_PROGRESS_INFO 7004\r
+#define IDS_PROGRESS_INFO_START 7004\r
+#define IDS_PROGRESS_INFO_STOP 7005\r
+\r
+\r
/*\r
* PROJECT: ReactOS Services\r
* LICENSE: GPL - See COPYING in the top level directory\r
- * FILE: subsys/system/servman/servman.c\r
+ * FILE: base/system/servman/servman.c\r
* PURPOSE: Main window message handler\r
* COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>\r
*\r
HWND hTool;\r
HWND hProgDlg;\r
HMENU hShortcutMenu;\r
-INT SelectedItem;\r
+INT SelectedItem = -1;\r
+\r
+TBBUTTON *ptbb;\r
+\r
+extern HWND hwndGenDlg;\r
\r
\r
INT GetSelectedItem(VOID)\r
return SelectedItem;\r
}\r
\r
+VOID SetView(DWORD View)\r
+{\r
+ DWORD Style = GetWindowLong(hListView, GWL_STYLE);\r
+\r
+ if ((Style & LVS_TYPEMASK) != View)\r
+ SetWindowLong(hListView, GWL_STYLE, (Style & ~LVS_TYPEMASK) | View);\r
+}\r
+\r
+\r
+VOID SetMenuAndButtonStates()\r
+{\r
+ HMENU hMainMenu;\r
+ ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
+ DWORD Flags, State;\r
+\r
+ /* get handle to menu */\r
+ hMainMenu = GetMenu(hMainWnd);\r
+\r
+ /* set all to greyed */\r
+ EnableMenuItem(hMainMenu, ID_START, MF_GRAYED);\r
+ EnableMenuItem(hMainMenu, ID_STOP, MF_GRAYED);\r
+ EnableMenuItem(hMainMenu, ID_PAUSE, MF_GRAYED);\r
+ EnableMenuItem(hMainMenu, ID_RESUME, MF_GRAYED);\r
+ EnableMenuItem(hMainMenu, ID_RESTART, MF_GRAYED);\r
+\r
+ EnableMenuItem(hShortcutMenu, ID_START, MF_GRAYED);\r
+ EnableMenuItem(hShortcutMenu, ID_STOP, MF_GRAYED);\r
+ EnableMenuItem(hShortcutMenu, ID_PAUSE, MF_GRAYED);\r
+ EnableMenuItem(hShortcutMenu, ID_RESUME, MF_GRAYED);\r
+ EnableMenuItem(hShortcutMenu, ID_RESTART, MF_GRAYED);\r
+\r
+ SendMessage(hTool, TB_SETSTATE, ID_START,\r
+ (LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));\r
+ SendMessage(hTool, TB_SETSTATE, ID_STOP,\r
+ (LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));\r
+ SendMessage(hTool, TB_SETSTATE, ID_PAUSE,\r
+ (LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));\r
+ SendMessage(hTool, TB_SETSTATE, ID_RESTART,\r
+ (LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));\r
+\r
+ if (GetSelectedItem() != -1)\r
+ {\r
+ /* get pointer to selected service */\r
+ Service = GetSelectedService();\r
+\r
+ Flags = Service->ServiceStatusProcess.dwControlsAccepted;\r
+ State = Service->ServiceStatusProcess.dwCurrentState;\r
+\r
+ if (State == SERVICE_STOPPED)\r
+ {\r
+ EnableMenuItem(hMainMenu, ID_START, MF_ENABLED);\r
+ EnableMenuItem(hShortcutMenu, ID_START, MF_ENABLED);\r
+ SendMessage(hTool, TB_SETSTATE, ID_START,\r
+ (LPARAM)MAKELONG(TBSTATE_ENABLED, 0));\r
+ }\r
+\r
+ if ( (Flags & SERVICE_ACCEPT_STOP) && (State == SERVICE_RUNNING) )\r
+ {\r
+ EnableMenuItem(hMainMenu, ID_STOP, MF_ENABLED);\r
+ EnableMenuItem(hShortcutMenu, ID_STOP, MF_ENABLED);\r
+ SendMessage(hTool, TB_SETSTATE, ID_STOP,\r
+ (LPARAM)MAKELONG(TBSTATE_ENABLED, 0));\r
+ }\r
+\r
+ if ( (Flags & SERVICE_ACCEPT_PAUSE_CONTINUE) && (State == SERVICE_RUNNING) )\r
+ {\r
+ EnableMenuItem(hMainMenu, ID_PAUSE, MF_ENABLED);\r
+ EnableMenuItem(hShortcutMenu, ID_PAUSE, MF_ENABLED);\r
+ SendMessage(hTool, TB_SETSTATE, ID_PAUSE,\r
+ (LPARAM)MAKELONG(TBSTATE_ENABLED, 0));\r
+ }\r
+\r
+ if ( (Flags & SERVICE_ACCEPT_STOP) && (State == SERVICE_RUNNING) )\r
+ {\r
+ EnableMenuItem(hMainMenu, ID_RESTART, MF_ENABLED);\r
+ EnableMenuItem(hShortcutMenu, ID_RESTART, MF_ENABLED);\r
+ SendMessage(hTool, TB_SETSTATE, ID_RESTART,\r
+ (LPARAM)MAKELONG(TBSTATE_ENABLED, 0));\r
+ }\r
+ }\r
+ else\r
+ {\r
+ EnableMenuItem(hMainMenu, ID_PROP, MF_GRAYED);\r
+ EnableMenuItem(hMainMenu, ID_DELETE, MF_GRAYED);\r
+ EnableMenuItem(hShortcutMenu, ID_DELETE, MF_GRAYED);\r
+ SendMessage(hTool, TB_SETSTATE, ID_PROP,\r
+ (LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));\r
+ }\r
+\r
+}\r
+\r
+\r
+\r
\r
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)\r
{\r
/* Toolbar buttons */\r
TBBUTTON tbb [NUM_BUTTONS] =\r
{ /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */\r
- {TBICON_PROP, ID_PROP, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, /* properties */\r
- {TBICON_REFRESH, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, /* refresh */\r
- {TBICON_EXPORT, ID_EXPORT, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, /* export */\r
+ {TBICON_PROP, ID_PROP, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0}, /* properties */\r
+ {TBICON_REFRESH, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, /* refresh */\r
+ {TBICON_EXPORT, ID_EXPORT, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, /* export */\r
\r
/* Note: First item for a seperator is its width in pixels */\r
- {15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */\r
+ {15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */\r
\r
- {TBICON_NEW, ID_NEW, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* create */\r
+ {TBICON_CREATE, ID_CREATE, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* create */\r
\r
- {15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */\r
+ {15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */\r
\r
- {TBICON_START, ID_START, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* start */\r
- {TBICON_STOP, ID_STOP, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* stop */\r
- {TBICON_PAUSE, ID_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* pause */\r
- {TBICON_RESTART, ID_RESTART, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* restart */\r
+ {TBICON_START, ID_START, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* start */\r
+ {TBICON_STOP, ID_STOP, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* stop */\r
+ {TBICON_PAUSE, ID_PAUSE, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* pause */\r
+ {TBICON_RESTART, ID_RESTART, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* restart */\r
\r
- {15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */\r
+ {15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */\r
\r
- {TBICON_HELP, ID_HELP, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* help */\r
- {TBICON_EXIT, ID_EXIT, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* exit */\r
+ {TBICON_HELP, ID_HELP, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* help */\r
+ {TBICON_EXIT, ID_EXIT, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* exit */\r
\r
};\r
\r
+ ptbb = tbb;\r
+\r
/* ======================== Create Toolbar ============================== */\r
\r
/* Create Toolbar */\r
tbb[0].iBitmap += iImageOffset; /* properties */\r
tbb[1].iBitmap += iImageOffset; /* refresh */\r
tbb[2].iBitmap += iImageOffset; /* export */\r
- tbb[4].iBitmap += iImageOffset; /* new */\r
+ tbb[4].iBitmap += iImageOffset; /* create */\r
tbb[6].iBitmap += iImageOffset; /* start */\r
tbb[7].iBitmap += iImageOffset; /* stop */\r
tbb[8].iBitmap += iImageOffset; /* pause */\r
MessageBox(hwnd, _T("Could not create List View."), _T("Error"), MB_OK | MB_ICONERROR);\r
\r
ListView_SetExtendedListViewStyle(hListView, LVS_EX_FULLROWSELECT |\r
- LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP);\r
+ /*LVS_EX_GRIDLINES |*/ LVS_EX_HEADERDRAGDROP);\r
\r
lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT;\r
lvc.fmt = LVCFMT_LEFT;\r
/* name */\r
lvc.iSubItem = 0;\r
lvc.cx = 150;\r
- LoadString(hInstance, IDS_FIRSTCOLUMN, szTemp, 256);\r
+ LoadString(hInstance, IDS_FIRSTCOLUMN, szTemp,\r
+ sizeof(szTemp) / sizeof(TCHAR));\r
lvc.pszText = szTemp;\r
ListView_InsertColumn(hListView, 0, &lvc);\r
\r
/* description */\r
lvc.iSubItem = 1;\r
lvc.cx = 240;\r
- LoadString(hInstance, IDS_SECONDCOLUMN, szTemp, 256);\r
+ LoadString(hInstance, IDS_SECONDCOLUMN, szTemp,\r
+ sizeof(szTemp) / sizeof(TCHAR));\r
lvc.pszText = szTemp;\r
ListView_InsertColumn(hListView, 1, &lvc);\r
\r
/* status */\r
lvc.iSubItem = 2;\r
lvc.cx = 55;\r
- LoadString(hInstance, IDS_THIRDCOLUMN, szTemp, 256);\r
+ LoadString(hInstance, IDS_THIRDCOLUMN, szTemp,\r
+ sizeof(szTemp) / sizeof(TCHAR));\r
lvc.pszText = szTemp;\r
ListView_InsertColumn(hListView, 2, &lvc);\r
\r
/* startup type */\r
lvc.iSubItem = 3;\r
lvc.cx = 80;\r
- LoadString(hInstance, IDS_FOURTHCOLUMN, szTemp, 256);\r
+ LoadString(hInstance, IDS_FOURTHCOLUMN, szTemp,\r
+ sizeof(szTemp) / sizeof(TCHAR));\r
lvc.pszText = szTemp;\r
ListView_InsertColumn(hListView, 3, &lvc);\r
\r
/* logon as */\r
lvc.iSubItem = 4;\r
lvc.cx = 100;\r
- LoadString(hInstance, IDS_FITHCOLUMN, szTemp, 256);\r
+ LoadString(hInstance, IDS_FITHCOLUMN, szTemp,\r
+ sizeof(szTemp) / sizeof(TCHAR));\r
lvc.pszText = szTemp;\r
ListView_InsertColumn(hListView, 4, &lvc);\r
\r
OpenPropSheet(hwnd);\r
break;\r
\r
+ case LVN_COLUMNCLICK:\r
+\r
+ break;\r
+\r
case LVN_ITEMCHANGED:\r
{\r
LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam;\r
+ ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
+ HMENU hMainMenu;\r
\r
+ /* get handle to menu */\r
+ hMainMenu = GetMenu(hMainWnd);\r
+\r
+ /* activate properties menu item, if not already */\r
+ if (GetMenuState(hMainMenu, ID_PROP, MF_BYCOMMAND) != MF_ENABLED)\r
+ EnableMenuItem(hMainMenu, ID_PROP, MF_ENABLED);\r
+\r
+ /* activate delete menu item, if not already */\r
+ if (GetMenuState(hMainMenu, ID_DELETE, MF_BYCOMMAND) != MF_ENABLED)\r
+ {\r
+ EnableMenuItem(hMainMenu, ID_DELETE, MF_ENABLED);\r
+ EnableMenuItem(hShortcutMenu, ID_DELETE, MF_ENABLED);\r
+ }\r
+\r
+\r
+ /* globally set selected service */\r
SelectedItem = pnmv->iItem;\r
\r
+ /* alter options for the service */\r
+ SetMenuAndButtonStates();\r
+\r
+ /* get pointer to selected service */\r
+ Service = GetSelectedService();\r
+\r
+ /* set current selected service in the status bar */\r
+ SendMessage(hStatus, SB_SETTEXT, 1, (LPARAM)Service->lpDisplayName);\r
+\r
+ /* show the properties button */\r
+ SendMessage(hTool, TB_SETSTATE, ID_PROP,\r
+ (LPARAM)MAKELONG(TBSTATE_ENABLED, 0));\r
+\r
}\r
break;\r
\r
lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_EXPORT);\r
break;\r
\r
+ case ID_CREATE:\r
+ lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_NEW);\r
+ break;\r
+\r
case ID_START:\r
lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_START);\r
break;\r
lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_RESTART);\r
break;\r
\r
- case ID_NEW:\r
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_NEW);\r
- break;\r
-\r
case ID_HELP:\r
lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_HELP);\r
break;\r
switch(LOWORD(wParam))\r
{\r
case ID_PROP:\r
- OpenPropSheet(hwnd);\r
+ if (GetSelectedItem() != -1)\r
+ OpenPropSheet(hwnd);\r
\r
break;\r
\r
case ID_REFRESH:\r
RefreshServiceList();\r
+ SelectedItem = -1;\r
+\r
+ /* disable menus and buttons */\r
+ SetMenuAndButtonStates();\r
+\r
+ /* clear the service in the status bar */\r
+ SendMessage(hStatus, SB_SETTEXT, 1, _T('\0'));\r
+\r
break;\r
\r
case ID_EXPORT:\r
+ ExportFile(hListView);\r
+ SetFocus(hListView);\r
+ break;\r
+\r
+ case ID_CREATE:\r
+ DialogBox(hInstance,\r
+ MAKEINTRESOURCE(IDD_DLG_CREATE),\r
+ hMainWnd,\r
+ (DLGPROC)CreateDialogProc);\r
+ SetFocus(hListView);\r
+ break;\r
+\r
+ case ID_DELETE:\r
+ {\r
+ ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
+\r
+ Service = GetSelectedService();\r
+\r
+ if (Service->ServiceStatusProcess.dwCurrentState !=\r
+ SERVICE_RUNNING)\r
+ {\r
+ DialogBox(hInstance,\r
+ MAKEINTRESOURCE(IDD_DLG_DELETE),\r
+ hMainWnd,\r
+ (DLGPROC)DeleteDialogProc);\r
+ }\r
+ else\r
+ {\r
+ TCHAR Buf[60];\r
+ LoadString(hInstance, IDS_DELETE_STOP, Buf,\r
+ sizeof(Buf) / sizeof(TCHAR));\r
+ DisplayString(Buf);\r
+ }\r
+\r
+ SetFocus(hListView);\r
+\r
+ }\r
break;\r
\r
case ID_START:\r
{\r
ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
- TCHAR buf1[100];\r
- TCHAR buf2[100];\r
+ TCHAR ProgDlgBuf[100];\r
+\r
/* open the progress dialog */\r
- hProgDlg = CreateDialog(GetModuleHandle(NULL), \r
+ hProgDlg = CreateDialog(GetModuleHandle(NULL),\r
MAKEINTRESOURCE(IDD_DLG_PROGRESS),\r
- hMainWnd, \r
+ hMainWnd,\r
(DLGPROC)ProgressDialogProc);\r
if (hProgDlg != NULL)\r
{\r
ShowWindow(hProgDlg, SW_SHOW);\r
\r
/* write the info to the progress dialog */\r
- LoadString(hInstance, IDS_PROGRESS_INFO, buf1,\r
- sizeof(buf1) / sizeof(TCHAR));\r
- _sntprintf(buf2, 100, buf1, _T("start"));\r
- SendDlgItemMessage(hProgDlg, IDC_SERVCON_INFO, WM_SETTEXT, 0, (LPARAM)buf2);\r
+ LoadString(hInstance, IDS_PROGRESS_INFO_START, ProgDlgBuf,\r
+ sizeof(ProgDlgBuf) / sizeof(TCHAR));\r
+ SendDlgItemMessage(hProgDlg, IDC_SERVCON_INFO, WM_SETTEXT,\r
+ 0, (LPARAM)ProgDlgBuf);\r
\r
/* get pointer to selected service */\r
Service = GetSelectedService();\r
\r
/* write the service name to the progress dialog */\r
- SendDlgItemMessage(hProgDlg, IDC_SERVCON_NAME, WM_SETTEXT, 0, \r
+ SendDlgItemMessage(hProgDlg, IDC_SERVCON_NAME, WM_SETTEXT, 0,\r
(LPARAM)Service->lpServiceName);\r
}\r
\r
{\r
LVITEM item;\r
TCHAR szStatus[64];\r
+ TCHAR buf[25];\r
\r
LoadString(hInstance, IDS_SERVICES_STARTED, szStatus,\r
sizeof(szStatus) / sizeof(TCHAR));\r
item.iItem = GetSelectedItem();\r
item.iSubItem = 2;\r
SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
+\r
+ /* change dialog status */\r
+ if (hwndGenDlg)\r
+ {\r
+ LoadString(hInstance, IDS_SERVICES_STARTED, buf,\r
+ sizeof(buf) / sizeof(TCHAR));\r
+ SendDlgItemMessageW(hwndGenDlg, IDC_SERV_STATUS, WM_SETTEXT,\r
+ 0, (LPARAM)buf);\r
+ }\r
}\r
\r
SendMessage(hProgDlg, WM_DESTROY, 0, 0);\r
+\r
}\r
break;\r
\r
case ID_STOP:\r
{\r
ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
- TCHAR buf1[100];\r
- TCHAR buf2[100];\r
+ TCHAR ProgDlgBuf[100];\r
+\r
/* open the progress dialog */\r
- hProgDlg = CreateDialog(GetModuleHandle(NULL), \r
+ hProgDlg = CreateDialog(GetModuleHandle(NULL),\r
MAKEINTRESOURCE(IDD_DLG_PROGRESS),\r
- hMainWnd, \r
+ hMainWnd,\r
(DLGPROC)ProgressDialogProc);\r
if (hProgDlg != NULL)\r
{\r
ShowWindow(hProgDlg, SW_SHOW);\r
\r
/* write the info to the progress dialog */\r
- LoadString(hInstance, IDS_PROGRESS_INFO, buf1,\r
- sizeof(buf1) / sizeof(TCHAR));\r
- _sntprintf(buf2, 100, buf1, _T("stop"));\r
- SendDlgItemMessage(hProgDlg, IDC_SERVCON_INFO, WM_SETTEXT, 0, (LPARAM)buf2);\r
+ LoadString(hInstance, IDS_PROGRESS_INFO_STOP, ProgDlgBuf,\r
+ sizeof(ProgDlgBuf) / sizeof(TCHAR));\r
+ SendDlgItemMessage(hProgDlg, IDC_SERVCON_INFO,\r
+ WM_SETTEXT, 0, (LPARAM)ProgDlgBuf);\r
\r
/* get pointer to selected service */\r
Service = GetSelectedService();\r
\r
/* write the service name to the progress dialog */\r
- SendDlgItemMessage(hProgDlg, IDC_SERVCON_NAME, WM_SETTEXT, 0, \r
+ SendDlgItemMessage(hProgDlg, IDC_SERVCON_NAME, WM_SETTEXT, 0,\r
(LPARAM)Service->lpServiceName);\r
}\r
\r
if( Control(hProgDlg, SERVICE_CONTROL_STOP) )\r
{\r
LVITEM item;\r
+ TCHAR buf[25];\r
\r
- item.pszText = '\0';\r
+ item.pszText = _T('\0');\r
item.iItem = GetSelectedItem();\r
item.iSubItem = 2;\r
SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
+\r
+ /* change dialog status */\r
+ if (hwndGenDlg)\r
+ {\r
+ LoadString(hInstance, IDS_SERVICES_STOPPED, buf,\r
+ sizeof(buf) / sizeof(TCHAR));\r
+ SendDlgItemMessageW(hwndGenDlg, IDC_SERV_STATUS, WM_SETTEXT,\r
+ 0, (LPARAM)buf);\r
+ }\r
}\r
\r
SendMessage(hProgDlg, WM_DESTROY, 0, 0);\r
+\r
}\r
break;\r
\r
SendMessage(hMainWnd, WM_COMMAND, 0, ID_START);\r
break;\r
\r
- case ID_NEW:\r
- break;\r
-\r
case ID_HELP:\r
MessageBox(NULL, _T("Help is not yet implemented\n"),\r
_T("Note!"), MB_OK | MB_ICONINFORMATION);\r
+ SetFocus(hListView);\r
break;\r
\r
case ID_EXIT:\r
PostMessage(hwnd, WM_CLOSE, 0, 0);\r
break;\r
\r
+ case ID_VIEW_LARGE:\r
+ SetView(LVS_ICON);\r
+ break;\r
+\r
+ case ID_VIEW_SMALL:\r
+ SetView(LVS_SMALLICON);\r
+ break;\r
+\r
+ case ID_VIEW_LIST:\r
+ SetView(LVS_LIST);\r
+ break;\r
+\r
+ case ID_VIEW_DETAILS:\r
+ SetView(LVS_REPORT);\r
+ break;\r
+\r
case ID_VIEW_CUSTOMIZE:\r
break;\r
\r
MAKEINTRESOURCE(IDD_ABOUTBOX),\r
hMainWnd,\r
(DLGPROC)AboutDialogProc);\r
- break;\r
+ SetFocus(hListView);\r
+ break;\r
\r
}\r
break;\r
#ifndef __SERVMAN_H\r
#define __SERVMAN_H\r
\r
-#define WIN32_LEAN_AND_MEAN\r
+//#define WIN32_LEAN_AND_MEAN\r
#include <windows.h>\r
#include <windowsx.h> /* GET_X/Y_LPARAM */\r
#include <stdio.h>\r
BOOL RefreshServiceList(VOID);\r
\r
BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
+BOOL CALLBACK CreateDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
+BOOL CALLBACK DeleteDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
BOOL CALLBACK ProgressDialogProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam);\r
\r
BOOL DoStartService(HWND hProgDlg);\r
VOID FreeMemory(VOID);\r
VOID DisplayString(PTCHAR);\r
\r
-BOOL GetDescription(HKEY, LPTSTR *);\r
+BOOL SetDescription(LPTSTR, LPTSTR);\r
+BOOL GetDescription(LPTSTR, LPTSTR *);\r
BOOL GetExecutablePath(LPTSTR *);\r
\r
LONG APIENTRY OpenPropSheet(HWND);\r
\r
DWORD GetServiceList(VOID);\r
\r
+VOID ExportFile(HWND);\r
\r
#endif /* __SERVMAN_H */\r
<?xml version="1.0"?>\r
-<!DOCTYPE project SYSTEM "tools/rbuild/project.dtd">\r
-<module name="servman" type="win32gui" installbase="system32" installname="servman.exe">\r
- <include base="servman">.</include>\r
- <define name="UNICODE" />\r
- <define name="_UNICODE" />\r
- <define name="__REACTOS__" />\r
- <define name="__USE_W32API" />\r
- <define name="_WIN32_IE">0x600</define>\r
- <define name="_WIN32_WINNT">0x501</define>\r
- <library>kernel32</library>\r
- <library>user32</library>\r
- <library>advapi32</library>\r
- <library>version</library>\r
- <library>comctl32</library>\r
- <library>shell32</library>\r
- <compilationunit name="unit.c">\r
- <file>about.c</file>\r
- <file>control.c</file>\r
- <file>geterror.c</file>\r
- <file>progress.c</file>\r
- <file>propsheet.c</file>\r
- <file>query.c</file>\r
- <file>servman.c</file>\r
- <file>start.c</file>\r
- </compilationunit>\r
- <file>servman.rc</file>\r
- <pch>servman.h</pch>\r
-</module>\r
+<rbuild xmlns:xi="http://www.w3.org/2001/XInclude">\r
+ <module name="servman" type="win32gui" installbase="system32" installname="servman.exe">\r
+ <include base="servman">.</include>\r
+ <define name="UNICODE" />\r
+ <define name="_UNICODE" />\r
+ <define name="__REACTOS__" />\r
+ <define name="__USE_W32API" />\r
+ <define name="_WIN32_IE">0x600</define>\r
+ <define name="_WIN32_WINNT">0x501</define>\r
+ <library>kernel32</library>\r
+ <library>user32</library>\r
+ <library>advapi32</library>\r
+ <library>version</library>\r
+ <library>comctl32</library>\r
+ <library>shell32</library>\r
+ <library>comdlg32</library>\r
+ <compilationunit name="unit.c">\r
+ <file>about.c</file>\r
+ <file>control.c</file>\r
+ <file>create.c</file>\r
+ <file>delete.c</file>\r
+ <file>export.c</file>\r
+ <file>geterror.c</file>\r
+ <file>progress.c</file>\r
+ <file>propsheet.c</file>\r
+ <file>query.c</file>\r
+ <file>servman.c</file>\r
+ <file>start.c</file> \r
+ </compilationunit>\r
+ <file>servman.rc</file>\r
+ <pch>servman.h</pch>\r
+ </module>\r
+</rbuild>\r
/*\r
* PROJECT: ReactOS Services\r
* LICENSE: GPL - See COPYING in the top level directory\r
- * FILE: subsys/system/servman/start.c\r
+ * FILE: base/system/servman/start.c\r
* PURPOSE: Start a service\r
* COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>\r
*\r
GetError(0);\r
return FALSE;\r
}\r
- \r
+\r
if (ServiceStatus.dwCheckPoint > dwOldCheckPoint)\r
{\r
/* The service is making progress. increment the progress bar */\r