1. remove all hardcode strings to En.rc

2. make it unicode and anis 

svn path=/trunk/; revision=15476
This commit is contained in:
Magnus Olsen 2005-05-23 16:48:22 +00:00
parent d920c40eee
commit ab215aa2bf
4 changed files with 157 additions and 37 deletions

View file

@ -0,0 +1,57 @@
#include "resource.h"
/*
* Moved all hardcoded strings to En.rc.
* By Magnus Olsen 2005 magnus@itkonsult-olsen.com
*/
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
{
IDS_boot, "boot subsystem_name"
IDS_help, "help [command]"
IDS_info, "info [subsystem_id]"
IDS_reboot, "reboot subsystem_id"
IDS_shutdown,"shutdown subsystem_id"
IDS_boot_msg, "bootstrap an optional environment subsystem;"
IDS_help_msg, "print help for command;"
IDS_info_msg, "print information about a booted subsystem\n\
if subsystem_id is omitted, a list of booted\n\
environment subsystems is printed."
IDS_reboot_msg, "reboot an optional environment subsystem;"
IDS_shutdown_msg, "shutdown an optional environment subsystem;"
IDS_Unknown, "Unknown command '%s'.\n"
IDS_Status, "Status 0x%08lx\n"
IDS_SM1, "SM SubSystem Directory\n\n\
SSID PID Flags\n\
---- -------- ------------\n"
IDS_SM2, "%04x %08lx %04x\n"
IDS_ID, "SubSystem ID: %d\n\
Flags: %04x\n\
Process ID: %ld\n"
IDS_Not_Imp, "not implemented\n"
IDS_Mangers, "ReactOS/Win32 Session Manager Control Tool\n\n"
IDS_USING, "Usage:\n\
\tsm\n\
\tsm help [command]\n\
\tsm command [arguments]\n\n'sm help' will print the list of valid commands.\n"
IDS_FAILS_MNG, "Failed to connect to the Session Manager! (Status=0x%08lx)\n"
}

View file

@ -0,0 +1,27 @@
#define RC_STRING_MAX_SIZE 200
#define IDS_boot 100
#define IDS_help 101
#define IDS_info 102
#define IDS_reboot 103
#define IDS_shutdown 104
#define IDS_boot_msg 205
#define IDS_help_msg 206
#define IDS_info_msg 207
#define IDS_reboot_msg 208
#define IDS_shutdown_msg 209
#define IDS_Unknown 300
#define IDS_Not_Imp 301
#define IDS_ID 302
#define IDS_SM2 303
#define IDS_SM1 304
#define IDS_Status 305
#define IDS_Mangers 306
#define IDS_USING 307
#define IDS_FAILS_MNG 308
/* EOF */

View file

@ -26,6 +26,8 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <tchar.h>
#include "resource.h"
#define NTOS_MODE_USER #define NTOS_MODE_USER
#include <ntos.h> #include <ntos.h>
@ -39,10 +41,10 @@ HANDLE hSmApiPort = (HANDLE) 0;
typedef struct _SM_CMD_DESCRIPTOR typedef struct _SM_CMD_DESCRIPTOR
{ {
const char * Name; TCHAR Name[RC_STRING_MAX_SIZE];
int (*EntryPoint)(int,char**); int (*EntryPoint)(int,TCHAR**);
const char * Synopsis; TCHAR Synopsis[RC_STRING_MAX_SIZE];
const char * Description; TCHAR Description[RC_STRING_MAX_SIZE];
} SM_CMD_DESCRIPTOR, *PSM_CMD_DESCRIPTOR; } SM_CMD_DESCRIPTOR, *PSM_CMD_DESCRIPTOR;
@ -55,16 +57,19 @@ SM_CMD_DECL(shutdown);
/* internal commands directory */ /* internal commands directory */
SM_CMD_DESCRIPTOR Command [] = SM_CMD_DESCRIPTOR Command [] =
{ {
{"boot", SM_CMD(boot), "boot subsystem_name", "bootstrap an optional environment subsystem;"}, {"boot", SM_CMD(boot), _T("boot subsystem_name"), _T("bootstrap an optional environment subsystem;")},
{"help", SM_CMD(help), "help [command]", "print help for command;"}, {"help", SM_CMD(help), _T("help [command]"), _T("print help for command;")},
{"info", SM_CMD(info), "info [subsystem_id]", "print information about a booted subsystem\n" {"info", SM_CMD(info), _T("info [subsystem_id]"), _T("print information about a booted subsystem\n"
"if subsystem_id is omitted, a list of booted\n" "if subsystem_id is omitted, a list of booted\n"
"environment subsystems is printed."}, "environment subsystems is printed.")},
{"reboot", SM_CMD(reboot), "reboot subsystem_id", "reboot an optional environment subsystem;"}, {"reboot", SM_CMD(reboot), _T("reboot subsystem_id"), _T("reboot an optional environment subsystem;")},
{"shutdown", SM_CMD(shutdown), "shutdown subsystem_id", "shutdown an optional environment subsystem;"}, {"shutdown", SM_CMD(shutdown), _T("shutdown subsystem_id"), _T("shutdown an optional environment subsystem;")},
}; };
PSM_CMD_DESCRIPTOR LookupCommand (const char * CommandName) TCHAR UsageMessage[RC_STRING_MAX_SIZE];
void loadlang(PSM_CMD_DESCRIPTOR );
PSM_CMD_DESCRIPTOR LookupCommand (const TCHAR * CommandName)
{ {
int i; int i;
const int command_count = (sizeof Command / sizeof Command[0]); const int command_count = (sizeof Command / sizeof Command[0]);
@ -73,14 +78,16 @@ PSM_CMD_DESCRIPTOR LookupCommand (const char * CommandName)
for (i=0; (i < command_count); i ++) for (i=0; (i < command_count); i ++)
{ {
if (0 == strcmp(CommandName, Command[i].Name)) if (0 == _tcscmp(CommandName, Command[i].Name))
{ {
break; break;
} }
} }
if (i == command_count) if (i == command_count)
{ {
fprintf(stderr, "Unknown command '%s'.\n", CommandName); LoadString( GetModuleHandle(NULL), IDS_Unknown, (LPTSTR) UsageMessage,RC_STRING_MAX_SIZE);
_ftprintf(stderr, _T("%s '%s'.\n"), UsageMessage, CommandName);
return NULL; return NULL;
} }
return & Command [i]; return & Command [i];
@ -97,18 +104,26 @@ SM_CMD_DECL(boot)
if (3 == argc) if (3 == argc)
{ {
#ifndef _UNICODE
RtlInitAnsiString (& ProgramA, argv[2]); RtlInitAnsiString (& ProgramA, argv[2]);
RtlAnsiStringToUnicodeString (& ProgramW, & ProgramA, TRUE); RtlAnsiStringToUnicodeString (& ProgramW, & ProgramA, TRUE);
Status = SmExecuteProgram (hSmApiPort, & ProgramW); Status = SmExecuteProgram (hSmApiPort, & ProgramW);
RtlFreeUnicodeString (& ProgramW); RtlFreeUnicodeString (& ProgramW);
#else
ProgramW = &argv[2];
Status = SmExecuteProgram (hSmApiPort, & ProgramW);
#endif
if (STATUS_SUCCESS != Status) if (STATUS_SUCCESS != Status)
{ {
printf ("Status 0x%08lx\n", Status); LoadString( GetModuleHandle(NULL), IDS_Status, (LPTSTR) UsageMessage,RC_STRING_MAX_SIZE);
_tprintf(UsageMessage, Status);
} }
} }
else else
{ {
argv[2]="boot"; argv[2]=_T("boot");
return SM_CMD_CALL(help,3,argv); return SM_CMD_CALL(help,3,argv);
} }
return rc; return rc;
@ -125,7 +140,7 @@ SM_CMD_DECL(help)
case 2: case 2:
for (i=0; (i < (sizeof Command / sizeof Command[0])); i ++) for (i=0; (i < (sizeof Command / sizeof Command[0])); i ++)
{ {
printf("%s\n", Command[i].Synopsis); _tprintf(_T("%s\n"), Command[i].Synopsis);
} }
break; break;
case 3: case 3:
@ -135,7 +150,7 @@ SM_CMD_DECL(help)
rc = EXIT_FAILURE; rc = EXIT_FAILURE;
break; break;
} }
printf("%s\n%s\n\n%s\n", _tprintf(_T("%s\n%s\n\n%s\n"),
cmd->Name, cmd->Name,
cmd->Synopsis, cmd->Synopsis,
cmd->Description); cmd->Description);
@ -180,27 +195,29 @@ SM_CMD_DECL(info)
& ReturnDataLength); & ReturnDataLength);
if (STATUS_SUCCESS != Status) if (STATUS_SUCCESS != Status)
{ {
printf ("Status 0x%08lx\n", Status); LoadString( GetModuleHandle(NULL), IDS_Status, (LPTSTR) UsageMessage,RC_STRING_MAX_SIZE);
_tprintf(UsageMessage, Status);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
switch (argc) switch (argc)
{ {
case 2: case 2:
printf ("SM SubSystem Directory\n\n"); LoadString( GetModuleHandle(NULL), IDS_SM1, (LPTSTR) UsageMessage,RC_STRING_MAX_SIZE);
printf ("SSID PID Flags\n"); _tprintf(UsageMessage);
printf ("---- -------- ------------\n");
LoadString( GetModuleHandle(NULL), IDS_SM2, (LPTSTR) UsageMessage,RC_STRING_MAX_SIZE);
for (i = 0; i < Info.bi.SubSystemCount; i ++) for (i = 0; i < Info.bi.SubSystemCount; i ++)
{ {
printf ("%04x %08lx %04x\n", _tprintf(UsageMessage,
Info.bi.SubSystem[i].Id, Info.bi.SubSystem[i].Id,
Info.bi.SubSystem[i].ProcessId, Info.bi.SubSystem[i].ProcessId,
Info.bi.SubSystem[i].Flags); Info.bi.SubSystem[i].Flags);
} }
break; break;
case 3: case 3:
printf ("SubSystem ID: %d\n", Info.ssi.SubSystemId); LoadString( GetModuleHandle(NULL), IDS_ID, (LPTSTR) UsageMessage,RC_STRING_MAX_SIZE);
printf (" Flags: %04x\n", Info.ssi.Flags);
printf (" Process ID: %ld\n", Info.ssi.ProcessId); _tprintf (UsageMessage, Info.ssi.SubSystemId, Info.ssi.Flags, Info.ssi.ProcessId);
wprintf(L" NSRootNode: '%s'\n", Info.ssi.NameSpaceRootNode); wprintf(L" NSRootNode: '%s'\n", Info.ssi.NameSpaceRootNode);
break; break;
default: default:
@ -212,8 +229,10 @@ SM_CMD_DECL(info)
SM_CMD_DECL(shutdown) SM_CMD_DECL(shutdown)
{ {
int rc = EXIT_SUCCESS; int rc = EXIT_SUCCESS;
fprintf(stderr,"not implemented\n"); LoadString( GetModuleHandle(NULL), IDS_Not_Imp, (LPTSTR) UsageMessage,RC_STRING_MAX_SIZE);
_ftprintf(stderr,UsageMessage);
return rc; return rc;
} }
@ -228,19 +247,18 @@ SM_CMD_DECL(reboot)
} }
/* print command's synopsys */ /* print command's synopsys */
int print_synopsys (int argc, char *argv[]) int print_synopsys (int argc, TCHAR *argv[])
{ {
fprintf (stderr, "ReactOS/Win32 Session Manager Control Tool\n\n"); LoadString( GetModuleHandle(NULL), IDS_Mangers, (LPTSTR) UsageMessage,RC_STRING_MAX_SIZE);
printf ("Usage:\n" _ftprintf (stderr, UsageMessage);
"\tsm\n"
"\tsm help [command]\n" LoadString( GetModuleHandle(NULL), IDS_USING, (LPTSTR) UsageMessage,RC_STRING_MAX_SIZE);
"\tsm command [arguments]\n\n" _tprintf (UsageMessage);
"'sm help' will print the list of valid commands.\n");
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
/* parse and execute */ /* parse and execute */
int pande (int argc, char *argv[]) int pande (int argc, TCHAR *argv[])
{ {
PSM_CMD_DESCRIPTOR Command = NULL; PSM_CMD_DESCRIPTOR Command = NULL;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
@ -258,12 +276,26 @@ int pande (int argc, char *argv[])
/* ...and execute it */ /* ...and execute it */
return Command->EntryPoint (argc, argv); return Command->EntryPoint (argc, argv);
} }
fprintf (stderr, "Failed to connect to the Session Manager! (Status=0x%08lx)\n", Status); LoadString( GetModuleHandle(NULL), IDS_FAILS_MNG, (LPTSTR) UsageMessage,RC_STRING_MAX_SIZE);
_ftprintf (stderr, UsageMessage, Status);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
int main (int argc, char *argv[]) void loadlang(PSM_CMD_DESCRIPTOR cmd)
{ {
int i=0;
if (cmd==NULL) return;
for (i=0;i < 5; i++)
{
LoadString( GetModuleHandle(NULL), IDS_boot+i, (LPTSTR) &cmd->Synopsis[i],RC_STRING_MAX_SIZE);
}
}
int _tmain (int argc, TCHAR *argv[])
{
loadlang(Command);
return (1==argc) return (1==argc)
? print_synopsys (argc, argv) ? print_synopsys (argc, argv)
: pande (argc, argv); : pande (argc, argv);

View file

@ -1,4 +1,8 @@
#include <windows.h>
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS/Win32 Session Manager Control Tool\0" #define REACTOS_STR_FILE_DESCRIPTION "ReactOS/Win32 Session Manager Control Tool\0"
#define REACTOS_STR_INTERNAL_NAME "sm\0" #define REACTOS_STR_INTERNAL_NAME "sm\0"
#define REACTOS_STR_ORIGINAL_FILENAME "sm.exe\0" #define REACTOS_STR_ORIGINAL_FILENAME "sm.exe\0"
#include <reactos/version.rc> #include <reactos/version.rc>
#include "En.rc"