// Copyright (c) 1998-1999 Microsoft Corporation /*************************************************************************** * * ACINIUPD.C * * Utility to update INI files * * ****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "aciniupd.h" #include "tsappcmp.h" #define WININI L"win.ini" /* * Global Data */ WCHAR file_name[MAX_IDS_LEN+1]; // ini file name WCHAR section_name[MAX_IDS_LEN+1]; // section name WCHAR key_name[MAX_IDS_LEN+1]; // key name WCHAR new_string[MAX_IDS_LEN+1]; // new string USHORT help_flag = FALSE; // User wants help USHORT fEditValue = FALSE; // Update the value associated with the key USHORT fEditKey = FALSE; // Update the key name USHORT fUserIni = FALSE; // Make change to the user's windows directory USHORT fVerbose = FALSE; // Verbose mode for debugging TOKMAP ptm[] = { {L"/?", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &help_flag}, {L"/e", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fEditValue}, {L"/k", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fEditKey}, {L"/u", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fUserIni}, {L"/v", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fVerbose}, {L" ", TMFLAG_OPTIONAL, TMFORM_STRING, MAX_IDS_LEN, file_name}, {L" ", TMFLAG_OPTIONAL, TMFORM_STRING, MAX_IDS_LEN, section_name}, {L" ", TMFLAG_OPTIONAL, TMFORM_STRING, MAX_IDS_LEN, key_name}, {L" ", TMFLAG_OPTIONAL, TMFORM_STRING, MAX_IDS_LEN, new_string}, {0, 0, 0, 0, 0} }; /* * Local functions */ void Usage(BOOLEAN bError); int UpdateValue(PWCHAR fileName, PWCHAR sectionName, PWCHAR keyName, PWCHAR newString); int UpdateKey(PWCHAR fileName, PWCHAR sectionName, PWCHAR keyName, PWCHAR newString); /****************************************************************************** * * main * ******************************************************************************/ int __cdecl main( INT argc, CHAR **argv ) { WCHAR **argvW; WCHAR wcSrcPort[MAX_PATH], wcDestPort[MAX_PATH]; ULONG ulSrcPort, ulDestPort, rc; BOOLEAN State, Changed = FALSE; int result = SUCCESS; BOOL InstallState; setlocale(LC_ALL, ".OCP"); /* * Massage the command line. */ argvW = MassageCommandLine((DWORD)argc); if (argvW == NULL) { ErrorPrintf(IDS_ERROR_MALLOC); return(FAILURE); } /* * parse the cmd line without parsing the program name (argc-1, argv+1) */ rc = ParseCommandLine(argc-1, argvW+1, ptm, 0); /* * Check for error from ParseCommandLine */ if ( help_flag || (rc && !(rc & PARSE_FLAG_NO_PARMS)) ) { if ( !help_flag ) { Usage(TRUE); return(FAILURE); } else { Usage(FALSE); return(SUCCESS); } } if (wcscmp( file_name, L"" ) == 0 || wcscmp( section_name, L"" ) == 0 || wcscmp( key_name, L"" ) == 0) { Usage( TRUE ); return (FAILURE); } rc = 1; #if 0 State = CtxGetIniMapping(); /* * Change the INI mapping mode if necessary */ if (!State && fUserIni) { rc = CtxSetIniMapping( TRUE ); Changed = TRUE; } else if (State && !fUserIni) { rc = CtxSetIniMapping( FALSE ); Changed = TRUE; } #else InstallState = TermsrvAppInstallMode(); if( InstallState && fUserIni ) { rc = SetTermsrvAppInstallMode( FALSE ); Changed = TRUE; } else if( !InstallState && !fUserIni ) { rc = SetTermsrvAppInstallMode( TRUE ); Changed = TRUE; } #endif // 0 /* * Exit if failed to change user mode */ if (!rc) { if (fVerbose) ErrorPrintf(IDS_ERROR_CHANGE_MODE, GetLastError()); return (FAILURE); } if (fEditValue) { result = UpdateValue(file_name, section_name, key_name, new_string); } else if (fEditKey) { result = UpdateKey(file_name, section_name, key_name, new_string); } else { Usage(FALSE); result = FAILURE; } /* * Change back to the original mode if necessary. Assume it always successes. */ if (Changed) { // rc = CtxSetIniMapping( State ); rc = SetTermsrvAppInstallMode( InstallState ); } return (result); } /* main */ /******************************************************************************* * * Usage * * Output the usage message for this utility. * * ENTRY: * bError (input) * TRUE if the 'invalid parameter(s)' message should preceed the usage * message and the output go to stderr; FALSE for no such error * string and output goes to stdout. * * EXIT: * * ******************************************************************************/ void Usage( BOOLEAN bError ) { if ( bError ) { ErrorPrintf(IDS_ERROR_INVALID_PARAMETERS); } ErrorPrintf(IDS_HELP_USAGE1); ErrorPrintf(IDS_HELP_USAGE2); ErrorPrintf(IDS_HELP_USAGE3); ErrorPrintf(IDS_HELP_USAGE4); ErrorPrintf(IDS_HELP_USAGE6); } /* Usage() */ /****************************************************************************** * * UpdateValue * * Update the associated value for the key * * ENTRY: * PWCHAR fileName * Ini file name * PWCHAR sectionName * Section name * PWCHAR keyName * Key name * pwchar newString * New value * * EXIT: * FAILURE / SUCCESS * *******************************************************************************/ int UpdateValue( PWCHAR fileName, PWCHAR sectionName, PWCHAR keyName, PWCHAR newString ) { BOOLEAN isWinIni; WCHAR value[5]; UINT result = 0; isWinIni = wcscmp( fileName, WININI ) == 0 ? TRUE : FALSE; /* * If change is made to win.ini, call WriteProfileString API */ if (isWinIni) { result = WriteProfileString( sectionName, keyName, newString ); } /* * Otherwise, call WritePrivateProfileString API */ else { result = WritePrivateProfileString( sectionName, keyName, newString, fileName ); } if (result == 0) { if (fVerbose) { StringDwordErrorPrintf(IDS_ERROR_UPDATE_VALUE, keyName, GetLastError()); } return (FAILURE); } return (SUCCESS); } /* UpdateValue */ /****************************************************************************** * * UpdateKey * * Update the key name * * ENTRY: * PWCHAR fileName * Ini file name * PWCHAR sectionName * Section name * PWCHAR keyName * Key name * PWCHAR newString * New key name * * EXIT: * FAILURE / SUCCESS * *******************************************************************************/ int UpdateKey( PWCHAR fileName, PWCHAR sectionName, PWCHAR keyName, PWCHAR newString ) { BOOLEAN isWinIni; PWCHAR value; UINT result; value = (WCHAR *)malloc( sizeof(WCHAR) * (MAX_IDS_LEN + 1) ); if (value == NULL) { if (fVerbose) ErrorPrintf(IDS_ERROR_MALLOC); return (FAILURE); } __try { isWinIni = wcscmp( fileName, WININI ) == 0 ? TRUE : FALSE; /* * Get the value string */ if (isWinIni) { result = GetProfileString( sectionName, keyName, L"", value, MAX_IDS_LEN+1 ); } else { result = GetPrivateProfileString( sectionName, keyName, L"", value, MAX_IDS_LEN+1, fileName ); } if (result == 0) { if (fVerbose) { StringErrorPrintf(IDS_ERROR_GET_VALUE, keyName); } return (FAILURE); } /* * Delete the old key */ if (isWinIni) { result = WriteProfileString( sectionName, keyName, NULL ); } else { result = WritePrivateProfileString( sectionName, keyName, NULL, fileName ); } if (result == 0) { if (fVerbose) { StringDwordErrorPrintf(IDS_ERROR_DEL_KEY, keyName, GetLastError()); } return (FAILURE); } /* * Add the new key */ if (isWinIni) { result = WriteProfileString( sectionName, newString, value ); } else { result = WritePrivateProfileString( sectionName, newString, value, fileName ); } if (result == 0) { if (fVerbose) { StringDwordErrorPrintf(IDS_ERROR_UPDATE_KEY, keyName, GetLastError()); } return (FAILURE); } return (SUCCESS); } __finally { free( value ); } } /* UpdateKey */