From 6c39ea6ef7c3e285a93baedea4dfb811a017bbcd Mon Sep 17 00:00:00 2001 From: Date: Mon, 7 Jan 2008 08:38:12 -0800 Subject: [PATCH] Bug 410610 - Can't open a local HTML file that has accents (special unicode characters) in its filename, r=luser+Neil --- .../profile/src/nsToolkitProfileService.cpp | 25 +----- toolkit/xre/Makefile.in | 2 +- toolkit/xre/nsAppRunner.cpp | 2 +- toolkit/xre/nsNativeAppSupportWin.cpp | 77 +++++++++---------- toolkit/xre/nsWindowsRestart.cpp | 2 +- toolkit/xre/nsWindowsWMain.cpp | 2 +- xpfe/bootstrap/showOSAlert.cpp | 2 +- 7 files changed, 44 insertions(+), 68 deletions(-) diff --git a/toolkit/profile/src/nsToolkitProfileService.cpp b/toolkit/profile/src/nsToolkitProfileService.cpp index 13b910e9b568..959b3d376155 100644 --- a/toolkit/profile/src/nsToolkitProfileService.cpp +++ b/toolkit/profile/src/nsToolkitProfileService.cpp @@ -686,30 +686,7 @@ nsToolkitProfileService::CreateProfile(nsILocalFile* aRootDir, return NS_ERROR_FILE_NOT_DIRECTORY; } else { - nsCOMPtr profileDefaultsDir; - nsCOMPtr profileDirParent; - nsCAutoString profileDirName; - - rv = rootDir->GetParent(getter_AddRefs(profileDirParent)); - NS_ENSURE_SUCCESS(rv, rv); - - rv = rootDir->GetNativeLeafName(profileDirName); - NS_ENSURE_SUCCESS(rv, rv); - - PRBool dummy; - rv = gDirServiceProvider->GetFile(NS_APP_PROFILE_DEFAULTS_50_DIR, &dummy, - getter_AddRefs(profileDefaultsDir)); - - if (NS_SUCCEEDED(rv)) - rv = profileDefaultsDir->CopyToNative(profileDirParent, - profileDirName); - if (NS_FAILED(rv)) { - // if copying failed, lets just ensure that the profile directory exists. - rv = rootDir->Create(nsIFile::DIRECTORY_TYPE, 0700); - NS_ENSURE_SUCCESS(rv, rv); - } - - rv = rootDir->SetPermissions(0700); + rv = rootDir->Create(nsIFile::DIRECTORY_TYPE, 0700); NS_ENSURE_SUCCESS(rv, rv); } diff --git a/toolkit/xre/Makefile.in b/toolkit/xre/Makefile.in index 9da7c3f6bf5a..d104fa2d63f6 100644 --- a/toolkit/xre/Makefile.in +++ b/toolkit/xre/Makefile.in @@ -131,7 +131,7 @@ endif ifeq ($(MOZ_WIDGET_TOOLKIT),windows) CPPSRCS += nsNativeAppSupportWin.cpp -DEFINES += -DWIN32_LEAN_AND_MEAN +DEFINES += -DWIN32_LEAN_AND_MEAN -DUNICODE -D_UNICODE else ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa) CMMSRCS = nsNativeAppSupportCocoa.mm diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp index 438434bd1b83..88ae4c0a45a7 100644 --- a/toolkit/xre/nsAppRunner.cpp +++ b/toolkit/xre/nsAppRunner.cpp @@ -392,7 +392,7 @@ static void Output(PRBool isError, const char *fmt, ... ) flags |= MB_ICONERROR; else flags |= MB_ICONINFORMATION; - MessageBox(NULL, msg, "XULRunner", flags); + MessageBoxA(NULL, msg, "XULRunner", flags); PR_smprintf_free(msg); } #else diff --git a/toolkit/xre/nsNativeAppSupportWin.cpp b/toolkit/xre/nsNativeAppSupportWin.cpp index 879ceb4576b2..df2846447c2f 100644 --- a/toolkit/xre/nsNativeAppSupportWin.cpp +++ b/toolkit/xre/nsNativeAppSupportWin.cpp @@ -129,7 +129,7 @@ struct Mutex { : mName( name ), mHandle( 0 ), mState( -1 ) { - mHandle = CreateMutex( 0, FALSE, mName.get() ); + mHandle = CreateMutexA( 0, FALSE, mName.get() ); #if MOZ_DEBUG_DDE printf( "CreateMutex error = 0x%08X\n", (int)GetLastError() ); #endif @@ -328,8 +328,8 @@ class nsNativeAppSupportWin : public nsNativeAppSupportBase, ULONG dwData1, ULONG dwData2 ); static void HandleCommandLine(const char* aCmdLineString, nsIFile* aWorkingDir, PRUint32 aState); - static void ParseDDEArg( HSZ args, int index, nsCString& string); - static void ParseDDEArg( const char* args, int index, nsCString& aString); + static void ParseDDEArg( HSZ args, int index, nsString& string); + static void ParseDDEArg( const WCHAR* args, int index, nsString& aString); static void ActivateLastWindow(); static HDDEDATA CreateDDEData( DWORD value ); static HDDEDATA CreateDDEData( LPBYTE value, DWORD len ); @@ -487,7 +487,7 @@ struct MessageWindow { // ctor/dtor are simplistic MessageWindow() { // Try to find window. - mHandle = ::FindWindow( className(), 0 ); + mHandle = ::FindWindowA( className(), 0 ); } // Act like an HWND. @@ -512,7 +512,7 @@ struct MessageWindow { // Create: Register class and create window. NS_IMETHOD Create() { - WNDCLASS classStruct = { 0, // style + WNDCLASSA classStruct = { 0, // style &MessageWindow::WindowProc, // lpfnWndProc 0, // cbClsExtra 0, // cbWndExtra @@ -524,10 +524,10 @@ struct MessageWindow { className() }; // lpszClassName // Register the window class. - NS_ENSURE_TRUE( ::RegisterClass( &classStruct ), NS_ERROR_FAILURE ); + NS_ENSURE_TRUE( ::RegisterClassA( &classStruct ), NS_ERROR_FAILURE ); // Create the window. - NS_ENSURE_TRUE( ( mHandle = ::CreateWindow( className(), + NS_ENSURE_TRUE( ( mHandle = ::CreateWindowA(className(), 0, // title WS_CAPTION, // style 0,0,0,0, // x, y, cx, cy @@ -721,7 +721,7 @@ nsNativeAppSupportWin::Start( PRBool *aResult ) { PRBool nsNativeAppSupportWin::InitTopicStrings() { for ( int i = 0; i < topicCount; i++ ) { - if ( !( mTopics[ i ] = DdeCreateStringHandle( mInstance, const_cast(topicNames[ i ]), CP_WINANSI ) ) ) { + if ( !( mTopics[ i ] = DdeCreateStringHandleA( mInstance, const_cast(topicNames[ i ]), CP_WINANSI ) ) ) { return PR_FALSE; } } @@ -761,7 +761,7 @@ nsNativeAppSupportWin::StartDDE() { NS_ERROR_FAILURE ); // Allocate DDE strings. - NS_ENSURE_TRUE( ( mApplication = DdeCreateStringHandle( mInstance, (char*) gAppData->name, CP_WINANSI ) ) && InitTopicStrings(), + NS_ENSURE_TRUE( ( mApplication = DdeCreateStringHandleA( mInstance, (char*) gAppData->name, CP_WINANSI ) ) && InitTopicStrings(), NS_ERROR_FAILURE ); // Next step is to register a DDE service. @@ -992,26 +992,26 @@ nsNativeAppSupportWin::HandleDDENotification( UINT uType, // transaction t // Open a given URL... // Get the URL from the first argument in the command. - nsCAutoString url; + nsAutoString url; ParseDDEArg(hsz2, 0, url); // Read the 3rd argument in the command to determine if a // new window is to be used. - nsCAutoString windowID; + nsAutoString windowID; ParseDDEArg(hsz2, 2, windowID); // "" means to open the URL in a new window. - if ( windowID.Equals( "" ) ) { - url.Insert("mozilla -new-window ", 0); + if ( windowID.IsEmpty() ) { + url.Insert(NS_LITERAL_STRING("mozilla -new-window "), 0); } else { - url.Insert("mozilla -url ", 0); + url.Insert(NS_LITERAL_STRING("mozilla -url "), 0); } #if MOZ_DEBUG_DDE - printf( "Handling dde XTYP_REQUEST request: [%s]...\n", url.get() ); + printf( "Handling dde XTYP_REQUEST request: [%s]...\n", NS_ConvertUTF16toUTF8(url).get() ); #endif // Now handle it. - HandleCommandLine(url.get(), nsnull, nsICommandLine::STATE_REMOTE_EXPLICIT); + HandleCommandLine(NS_ConvertUTF16toUTF8(url).get(), nsnull, nsICommandLine::STATE_REMOTE_EXPLICIT); // Return pseudo window ID. result = CreateDDEData( 1 ); @@ -1109,12 +1109,12 @@ nsNativeAppSupportWin::HandleDDENotification( UINT uType, // transaction t } case topicActivate: { // Activate a Nav window... - nsCAutoString windowID; + nsAutoString windowID; ParseDDEArg(hsz2, 0, windowID); // 4294967295 is decimal for 0xFFFFFFFF which is also a // correct value to do that Activate last window stuff - if ( windowID.Equals( "-1" ) || - windowID.Equals( "4294967295" ) ) { + if ( windowID.EqualsLiteral( "-1" ) || + windowID.EqualsLiteral( "4294967295" ) ) { // We only support activating the most recent window (or a new one). ActivateLastWindow(); // Return pseudo window ID. @@ -1163,26 +1163,26 @@ nsNativeAppSupportWin::HandleDDENotification( UINT uType, // transaction t // Default is to open in current window. PRBool new_window = PR_FALSE; - nsCAutoString url; - ParseDDEArg((const char*) request, 0, url); + nsAutoString url; + ParseDDEArg((const WCHAR*) request, 0, url); // Read the 3rd argument in the command to determine if a // new window is to be used. - nsCAutoString windowID; - ParseDDEArg((const char*) request, 2, windowID); + nsAutoString windowID; + ParseDDEArg((const WCHAR*) request, 2, windowID); // "" means to open the URL in a new window. - if ( windowID.Equals( "" ) ) { - url.Insert("mozilla -new-window ", 0); + if ( windowID.IsEmpty() ) { + url.Insert(NS_LITERAL_STRING("mozilla -new-window "), 0); } else { - url.Insert("mozilla -url ", 0); + url.Insert(NS_LITERAL_STRING("mozilla -url "), 0); } #if MOZ_DEBUG_DDE - printf( "Handling dde XTYP_REQUEST request: [%s]...\n", url.get() ); + printf( "Handling dde XTYP_REQUEST request: [%s]...\n", NS_ConvertUTF16toUTF8(url).get() ); #endif // Now handle it. - HandleCommandLine(url.get(), nsnull, nsICommandLine::STATE_REMOTE_EXPLICIT); + HandleCommandLine(NS_ConvertUTF16toUTF8(url).get(), nsnull, nsICommandLine::STATE_REMOTE_EXPLICIT); // Release the data. DdeUnaccessData( hdata ); @@ -1204,7 +1204,7 @@ nsNativeAppSupportWin::HandleDDENotification( UINT uType, // transaction t // if the closing '"' is missing) if the arg is quoted. If the arg // is not quoted, then p+result will point to the first character // of the arg. -static PRInt32 advanceToEndOfQuotedArg( const char *p, PRInt32 offset, PRInt32 len ) { +static PRInt32 advanceToEndOfQuotedArg( const WCHAR *p, PRInt32 offset, PRInt32 len ) { // Check whether the current arg is quoted. if ( p[++offset] == '"' ) { // Advance past the closing quote. @@ -1219,17 +1219,16 @@ static PRInt32 advanceToEndOfQuotedArg( const char *p, PRInt32 offset, PRInt32 l return offset; } -void nsNativeAppSupportWin::ParseDDEArg( const char* args, int index, nsCString& aString) { +void nsNativeAppSupportWin::ParseDDEArg( const WCHAR* args, int index, nsString& aString) { if ( args ) { - int argLen = strlen(args); - nsDependentCString temp(args, argLen); + nsDependentString temp(args); // offset points to the comma preceding the desired arg. PRInt32 offset = -1; // Skip commas till we get to the arg we want. while( index-- ) { // If this arg is quoted, then go to closing quote. - offset = advanceToEndOfQuotedArg( args, offset, argLen); + offset = advanceToEndOfQuotedArg( args, offset, temp.Length()); // Find next comma. offset = temp.FindChar( ',', offset ); if ( offset == kNotFound ) { @@ -1246,12 +1245,12 @@ void nsNativeAppSupportWin::ParseDDEArg( const char* args, int index, nsCString& // deal with that before searching for the terminating comma. // We advance offset so it ends up pointing to the start of // the argument we want. - PRInt32 end = advanceToEndOfQuotedArg( args, offset++, argLen ); + PRInt32 end = advanceToEndOfQuotedArg( args, offset++, temp.Length() ); // Find next comma (or end of string). end = temp.FindChar( ',', end ); if ( end == kNotFound ) { // Arg is the rest of the string. - end = argLen; + end = temp.Length(); } // Extract result. aString.Assign( args + offset, end - offset ); @@ -1260,15 +1259,15 @@ void nsNativeAppSupportWin::ParseDDEArg( const char* args, int index, nsCString& } // Utility to parse out argument from a DDE item string. -void nsNativeAppSupportWin::ParseDDEArg( HSZ args, int index, nsCString& aString) { - DWORD argLen = DdeQueryString( mInstance, args, NULL, NULL, CP_WINANSI ); +void nsNativeAppSupportWin::ParseDDEArg( HSZ args, int index, nsString& aString) { + DWORD argLen = DdeQueryStringW( mInstance, args, NULL, NULL, CP_WINUNICODE ); // there wasn't any string, so return empty string if ( !argLen ) return; - nsCAutoString temp; + nsAutoString temp; // Ensure result's buffer is sufficiently big. temp.SetLength( argLen ); // Now get the string contents. - DdeQueryString( mInstance, args, temp.BeginWriting(), temp.Length(), CP_WINANSI ); + DdeQueryString( mInstance, args, temp.BeginWriting(), temp.Length(), CP_WINUNICODE ); // Parse out the given arg. ParseDDEArg(temp.get(), index, aString); return; diff --git a/toolkit/xre/nsWindowsRestart.cpp b/toolkit/xre/nsWindowsRestart.cpp index 6273c1d38fa4..2fa6ae7a54ee 100755 --- a/toolkit/xre/nsWindowsRestart.cpp +++ b/toolkit/xre/nsWindowsRestart.cpp @@ -235,7 +235,7 @@ AllocConvertUTF8toUTF16(const char *arg) ConvertUTF8toUTF16 convert(s); convert.write(arg, len); - s[len] = '\0'; + convert.write_terminator(); return s; } diff --git a/toolkit/xre/nsWindowsWMain.cpp b/toolkit/xre/nsWindowsWMain.cpp index 17307f2648bc..1f66e7dfa98f 100644 --- a/toolkit/xre/nsWindowsWMain.cpp +++ b/toolkit/xre/nsWindowsWMain.cpp @@ -23,7 +23,7 @@ AllocConvertUTF16toUTF8(const WCHAR *arg) ConvertUTF16toUTF8 convert(s); convert.write(arg, len); - s[len] = '\0'; + convert.write_terminator(); return s; } diff --git a/xpfe/bootstrap/showOSAlert.cpp b/xpfe/bootstrap/showOSAlert.cpp index 9067065ea005..7d0d70b02a48 100644 --- a/xpfe/bootstrap/showOSAlert.cpp +++ b/xpfe/bootstrap/showOSAlert.cpp @@ -70,7 +70,7 @@ printf("\n****Inside ShowOSAlert ***\n"); message_copy[copy_len] = 0; #if defined (XP_WIN) - MessageBox(NULL, message_copy, NULL, MB_OK | MB_ICONERROR | MB_SETFOREGROUND ); + MessageBoxA(NULL, message_copy, NULL, MB_OK | MB_ICONERROR | MB_SETFOREGROUND ); #elif (XP_MAC) short buttonClicked; StandardAlert(kAlertStopAlert, c2pstr(message_copy), nil, nil, &buttonClicked);