Merge Service Manager from audited repositry
authorGed Murphy <gedmurphy@reactos.org>
Sun, 19 Feb 2006 16:22:59 +0000 (16:22 +0000)
committerGed Murphy <gedmurphy@reactos.org>
Sun, 19 Feb 2006 16:22:59 +0000 (16:22 +0000)
Revision: 98
Author: gedmurphy
Date: 20:32:56, 06 February 2006
Message:
- fix some buffer checks
- remove item from listview when deleted
----
Modified : /trunk/reactos/base/applications/servman/En.rc
Modified : /trunk/reactos/base/applications/servman/about.c
Modified : /trunk/reactos/base/applications/servman/create.c
Modified : /trunk/reactos/base/applications/servman/delete.c
Modified : /trunk/reactos/base/applications/servman/geterror.c
Modified : /trunk/reactos/base/applications/servman/query.c
Modified : /trunk/reactos/base/applications/servman/resource.h
Modified : /trunk/reactos/base/applications/servman/servman.c

Revision: 97
Author: gedmurphy
Date: 20:18:58, 05 February 2006
Message:
ensure required fields are filled.
----
Modified : /trunk/reactos/base/applications/servman/En.rc
Modified : /trunk/reactos/base/applications/servman/create.c

Revision: 96
Author: gedmurphy
Date: 20:09:42, 05 February 2006
Message:
use a modeless dialog
----
Modified : /trunk/reactos/base/applications/servman/create.c

Revision: 88
Author: gedmurphy
Date: 13:25:46, 04 February 2006
Message:
these were in the wrong place according to the new tree structure
http://www.reactos.org/wiki/index.php/New_Tree_Structure
----
Modified : /trunk/reactos/base/applications/applications.rbuild
Added : /trunk/reactos/base/applications/msconfig(Copy From Path: /trunk/reactos/base/system/msconfig, Revision, 84
Added : /trunk/reactos/base/applications/sc(Copy From Path: /trunk/reactos/base/system/sc, Revision, 84
Added : /trunk/reactos/base/applications/servman(Copy From Path: /trunk/reactos/base/system/servman, Revision, 84
Deleted : /trunk/reactos/base/system/msconfig
Deleted : /trunk/reactos/base/system/sc
Deleted : /trunk/reactos/base/system/servman
Modified : /trunk/reactos/base/system/system.rbuild

Revision: 77
Author: gedmurphy
Date: 20:38:07, 03 February 2006
Message:
fix setting of the description when creating services
----
Modified : /trunk/reactos/base/system/servman/create.c
Modified : /trunk/reactos/base/system/servman/query.c
Modified : /trunk/reactos/base/system/servman/servman.h

Revision: 76
Author: gedmurphy
Date: 20:03:48, 03 February 2006
Message:
group registry gathering data together
----
Modified : /trunk/reactos/base/system/servman/propsheet.c
Modified : /trunk/reactos/base/system/servman/query.c
Modified : /trunk/reactos/base/system/servman/servman.h

Revision: 75
Author: gedmurphy
Date: 19:18:17, 03 February 2006
Message:
fix displaying of large icons. Thanks to Christoph for pointing this out.
----
Modified : /trunk/reactos/base/system/servman/query.c

Revision: 74
Author: gedmurphy
Date: 18:19:53, 03 February 2006
Message:
- add functionality to delete current services
- allow setting of a description when creating services
- turn off toolbar buttons and menu items when not usable
- fix the toolbar icons so they don't look weird when greyed out
- a few other random bugfixes and alterations.
----
Modified : /trunk/reactos/base/system/servman/En.rc
Modified : /trunk/reactos/base/system/servman/create.c
Added : /trunk/reactos/base/system/servman/delete.c
Modified : /trunk/reactos/base/system/servman/propsheet.c
Modified : /trunk/reactos/base/system/servman/query.c
Modified : /trunk/reactos/base/system/servman/res/toolbar.bmp
Modified : /trunk/reactos/base/system/servman/resource.h
Modified : /trunk/reactos/base/system/servman/servman.c
Modified : /trunk/reactos/base/system/servman/servman.h
Modified : /trunk/reactos/base/system/servman/servman.rbuild

Revision: 72
Author: martinf
Date: 20:20:51, 02 February 2006
Message:
convert *.rbuild files into valid XML files by inserting XML headers and a <rbuild> root nodes
----
Modified : /trunk/reactos/ReactOS-ppc.rbuild
Modified : /trunk/reactos/ReactOS.rbuild
Modified : /trunk/reactos/base/applications/applications.rbuild
Modified : /trunk/reactos/base/applications/ibrowser/ibrowser.rbuild
Modified : /trunk/reactos/base/applications/network/arp/arp.rbuild
Modified : /trunk/reactos/base/applications/network/ipconfig/ipconfig.rbuild
Modified : /trunk/reactos/base/applications/network/netstat/netstat.rbuild
Modified : /trunk/reactos/base/applications/network/tracert/tracert.rbuild
Modified : /trunk/reactos/base/applications/winefile/winefile.rbuild
Modified : /trunk/reactos/base/base.rbuild
Modified : /trunk/reactos/base/services/tcpsvcs/tcpsvcs.rbuild
Modified : /trunk/reactos/base/shell/explorer/explorer.rbuild
Modified : /trunk/reactos/base/shell/explorer/notifyhook/notifyhook.rbuild
Modified : /trunk/reactos/base/shell/shell.rbuild
Modified : /trunk/reactos/base/system/msconfig/msconfig.rbuild
Modified : /trunk/reactos/base/system/sc/sc.rbuild
Modified : /trunk/reactos/base/system/servman/servman.rbuild
Modified : /trunk/reactos/base/system/system.rbuild
Modified : /trunk/reactos/baseaddress.rbuild
Modified : /trunk/reactos/boot/boot.rbuild
Modified : /trunk/reactos/boot/bootcd/bootcd.rbuild
Modified : /trunk/reactos/boot/freeldr/bootsect/bootsect.rbuild
Modified : /trunk/reactos/boot/freeldr/freeldr.rbuild
Modified : /trunk/reactos/config.template.rbuild
Modified : /trunk/reactos/drivers/base/null/null.rbuild
Modified : /trunk/reactos/lib/directory.rbuild
Modified : /trunk/reactos/lib/inflib/inflib.rbuild
Modified : /trunk/reactos/lib/rossym
Modified : /trunk/reactos/lib/rossym/rossym.rbuild
Modified : /trunk/reactos/subsystems/subsystems.rbuild

Revision: 71
Author: gedmurphy
Date: 22:07:06, 01 February 2006
Message:
fix writing to file
----
Modified : /trunk/reactos/base/system/servman/export.c

Revision: 70
Author: gedmurphy
Date: 19:41:17, 01 February 2006
Message:
- set the button states according to the service
- Set the main and popup menus according to the current environment or service
- allow viewing in list or icon mode too
----
Modified : /trunk/reactos/base/system/servman/En.rc
Modified : /trunk/reactos/base/system/servman/export.c
Modified : /trunk/reactos/base/system/servman/propsheet.c
Modified : /trunk/reactos/base/system/servman/query.c
Modified : /trunk/reactos/base/system/servman/resource.h
Modified : /trunk/reactos/base/system/servman/servman.c

Revision: 69
Author: gedmurphy
Date: 22:41:45, 31 January 2006
Message:
add missing library
----
Modified : /trunk/reactos/base/system/servman/servman.rbuild

Revision: 68
Author: gedmurphy
Date: 20:43:06, 31 January 2006
Message:
- write services to file
- added a roadmap for fun
----
Modified : /trunk/reactos/base/system/servman/export.c
Added : /trunk/reactos/base/system/servman/roadmap.txt

Revision: 61
Author: gedmurphy
Date: 22:50:50, 30 January 2006
Message:
revert the progress dialog change until I write a better solution.
----
Modified : /trunk/reactos/base/system/servman/servman.c

Revision: 46
Author: gedmurphy
Date: 18:55:32, 30 January 2006
Message:
Forgot the rbuild file.
----
Modified : /trunk/reactos/base/system/servman/servman.rbuild

Revision: 45
Author: gedmurphy
Date: 18:48:10, 30 January 2006
Message:
- Add basic support for creating services
- Start to put in functionality for exporting all services to a file
- Don't open the progress dialog if the action fails
----
Modified : /trunk/reactos/base/system/servman/En.rc
Modified : /trunk/reactos/base/system/servman/about.c
Modified : /trunk/reactos/base/system/servman/control.c
Added : /trunk/reactos/base/system/servman/create.c
Added : /trunk/reactos/base/system/servman/export.c
Modified : /trunk/reactos/base/system/servman/geterror.c
Modified : /trunk/reactos/base/system/servman/propsheet.c
Modified : /trunk/reactos/base/system/servman/query.c
Modified : /trunk/reactos/base/system/servman/resource.h
Modified : /trunk/reactos/base/system/servman/servman.c
Modified : /trunk/reactos/base/system/servman/servman.h
Modified : /trunk/reactos/base/system/servman/start.c

svn path=/trunk/; revision=21159

15 files changed:
reactos/base/applications/servman/En.rc
reactos/base/applications/servman/about.c
reactos/base/applications/servman/control.c
reactos/base/applications/servman/create.c [new file with mode: 0644]
reactos/base/applications/servman/delete.c [new file with mode: 0644]
reactos/base/applications/servman/export.c [new file with mode: 0644]
reactos/base/applications/servman/geterror.c
reactos/base/applications/servman/progress.c
reactos/base/applications/servman/propsheet.c
reactos/base/applications/servman/query.c
reactos/base/applications/servman/resource.h
reactos/base/applications/servman/servman.c
reactos/base/applications/servman/servman.h
reactos/base/applications/servman/servman.rbuild
reactos/base/applications/servman/start.c

index 32de931..1cd9bc9 100644 (file)
@@ -2,54 +2,60 @@ IDR_MAINMENU MENU
 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
@@ -58,7 +64,7 @@ CAPTION "About Service Manager"
 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
@@ -74,19 +80,19 @@ BEGIN
   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
@@ -97,9 +103,9 @@ STYLE WS_BORDER | WS_VISIBLE | WS_DLGFRAME | WS_SYSMENU | WS_THICKFRAME | WS_GRO
 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
@@ -112,9 +118,9 @@ BEGIN
   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
@@ -122,6 +128,29 @@ BEGIN
   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
@@ -129,9 +158,9 @@ STYLE WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME
 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
@@ -159,7 +188,7 @@ END
 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
@@ -178,5 +207,14 @@ END
 \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
index 64da2c9..411fc22 100644 (file)
@@ -1,7 +1,7 @@
 /*\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
@@ -21,7 +21,7 @@ AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 {\r
     HWND  hLicenseEditWnd;\r
     HICON hIcon = NULL;\r
-    TCHAR strLicense[0x1000];\r
+    TCHAR strLicense[700];\r
 \r
     switch (message)\r
     {\r
@@ -32,7 +32,8 @@ AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 \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
index b1a1785..c4f6398 100644 (file)
@@ -1,7 +1,7 @@
 /*\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
@@ -106,7 +106,7 @@ BOOL Control(HWND hProgDlg, DWORD Control)
             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
diff --git a/reactos/base/applications/servman/create.c b/reactos/base/applications/servman/create.c
new file mode 100644 (file)
index 0000000..1f40c6a
--- /dev/null
@@ -0,0 +1,266 @@
+/*\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
diff --git a/reactos/base/applications/servman/delete.c b/reactos/base/applications/servman/delete.c
new file mode 100644 (file)
index 0000000..1755c65
--- /dev/null
@@ -0,0 +1,110 @@
+/*\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
diff --git a/reactos/base/applications/servman/export.c b/reactos/base/applications/servman/export.c
new file mode 100644 (file)
index 0000000..e5c1dc5
--- /dev/null
@@ -0,0 +1,92 @@
+/*\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
index 29c28f4..10fa4da 100644 (file)
@@ -1,6 +1,14 @@
-//#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
@@ -28,6 +36,6 @@ VOID GetError(DWORD err)
 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
index afe1575..a438ca6 100644 (file)
@@ -1,7 +1,7 @@
 /*\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
index 50e514b..1c672e0 100644 (file)
@@ -1,7 +1,7 @@
 /*\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
@@ -9,6 +9,7 @@
 \r
 #include "servman.h"\r
 \r
+HWND hwndGenDlg;\r
 extern ENUM_SERVICE_STATUS_PROCESS *pServiceStatus;\r
 extern HINSTANCE hInstance;\r
 extern HWND hListView;\r
@@ -27,18 +28,67 @@ typedef struct _PROP_DLG_INFO
 } 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
@@ -73,51 +123,41 @@ VOID SetStartupType(HKEY hKey, HWND hwndDlg)
  * 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
@@ -125,21 +165,19 @@ VOID GetDlgInfo(HWND hwndDlg)
     {\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
@@ -148,54 +186,72 @@ VOID GetDlgInfo(HWND hwndDlg)
  * 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
@@ -207,12 +263,11 @@ GeneralPageProc(HWND hwndDlg,
  * 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
@@ -252,6 +307,37 @@ DependanciesPageProc(HWND hwndDlg,
 }\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
@@ -267,29 +353,30 @@ InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc)
 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
index 4922e20..bd07ccf 100644 (file)
@@ -1,7 +1,7 @@
 /*\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
@@ -25,7 +25,7 @@ VOID FreeMemory(VOID)
 \r
 \r
 \r
-ENUM_SERVICE_STATUS_PROCESS* \r
+ENUM_SERVICE_STATUS_PROCESS*\r
 GetSelectedService(VOID)\r
 {\r
     ENUM_SERVICE_STATUS_PROCESS *pSelectedService = NULL;\r
@@ -42,18 +42,67 @@ GetSelectedService(VOID)
 }\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
@@ -158,6 +207,34 @@ cleanup:
 }\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
@@ -172,27 +249,15 @@ RefreshServiceList(VOID)
 \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
@@ -228,10 +293,9 @@ RefreshServiceList(VOID)
 \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
@@ -414,206 +478,3 @@ GetServiceList(VOID)
 \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
index 927e91e..053c4a5 100644 (file)
@@ -8,6 +8,7 @@
 #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
@@ -59,7 +67,7 @@
 #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
@@ -68,7 +76,6 @@
 #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
@@ -82,6 +89,7 @@
 #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
index f186361..1a73ce8 100644 (file)
@@ -1,7 +1,7 @@
 /*\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
@@ -18,7 +18,11 @@ HWND hStatus;
 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
@@ -26,6 +30,99 @@ INT GetSelectedItem(VOID)
     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
@@ -42,29 +139,31 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
             /* 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
@@ -90,7 +189,7 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
             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
@@ -122,7 +221,7 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
                 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
@@ -132,35 +231,40 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
             /* 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
@@ -244,12 +348,47 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
                     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
@@ -277,6 +416,10 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
                             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
@@ -293,10 +436,6 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
                             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
@@ -332,42 +471,88 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
                    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
@@ -375,6 +560,7 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
                     {\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
@@ -382,51 +568,72 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
                         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
@@ -443,18 +650,32 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
                     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
@@ -463,7 +684,8 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
                               MAKEINTRESOURCE(IDD_ABOUTBOX),\r
                               hMainWnd,\r
                               (DLGPROC)AboutDialogProc);\r
-                 break;\r
+                    SetFocus(hListView);\r
+                break;\r
 \r
                    }\r
            break;\r
index be22a04..1150d1d 100644 (file)
@@ -1,7 +1,7 @@
 #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
@@ -16,6 +16,8 @@
 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
@@ -29,12 +31,14 @@ VOID GetError(DWORD);
 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
index 9970fc7..1b53df2 100644 (file)
@@ -1,29 +1,34 @@
 <?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
index 25908fb..3b13dc9 100644 (file)
@@ -1,7 +1,7 @@
 /*\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
@@ -99,7 +99,7 @@ BOOL DoStartService(HWND hProgDlg)
             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