diff --git a/mozilla/cmd/winfe/dialog.cpp b/mozilla/cmd/winfe/dialog.cpp index dbbd3a6b635..762ff97c701 100755 --- a/mozilla/cmd/winfe/dialog.cpp +++ b/mozilla/cmd/winfe/dialog.cpp @@ -23,6 +23,9 @@ #include "helper.h" #include "nethelp.h" +#include "nsIDefaultBrowser.h" +#include "prefapi.h" + #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; @@ -775,15 +778,35 @@ END_MESSAGE_MAP() * ****************************************************************************/ -CDefaultBrowserDlg::CDefaultBrowserDlg(CWnd* pParent /*=NULL*/) +CDefaultBrowserDlg::CDefaultBrowserDlg(CWnd* pParent /*=NULL*/, nsIDefaultBrowser* pDefaultBrowser /*=NULL*/) : CDefaultBrowserDlgBase(CDefaultBrowserDlg::IDD, pParent) { //{{AFX_DATA_INIT(CDefaultBrowserDlg) - m_bIgnore = FALSE; + m_bPerformCheck = TRUE; // If false, we wouldn't be here, now would we? + m_pDefaultBrowser = pDefaultBrowser; + if ( m_pDefaultBrowser ) { + m_pDefaultBrowser->AddRef(); + } //}}AFX_DATA_INIT } // END OF FUNCTION CDefaultBrowserDlg::CDefaultBrowserDlg() +CDefaultBrowserDlg::CDefaultBrowserDlg(nsIDefaultBrowser* pDefaultBrowser) + : CDefaultBrowserDlgBase(CDefaultBrowserDlg::IDD, NULL) +{ + m_bPerformCheck = TRUE; // If false, we wouldn't be here, now would we? + m_pDefaultBrowser = pDefaultBrowser; + if ( m_pDefaultBrowser ) { + m_pDefaultBrowser->AddRef(); + } +} + +CDefaultBrowserDlg::~CDefaultBrowserDlg() { + if ( m_pDefaultBrowser ) { + m_pDefaultBrowser->Release(); + } +} + /**************************************************************************** * * CDefaultBrowserDlg::DoDataExchange @@ -804,7 +827,7 @@ void CDefaultBrowserDlg::DoDataExchange(CDataExchange* pDX) CDefaultBrowserDlgBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDefaultBrowserDlg) - DDX_Check(pDX, IDC_IGNORE, m_bIgnore); + DDX_Check(pDX, IDC_IGNORE, m_bPerformCheck); DDX_Control(pDX, IDC_LIST1, m_Listbox); //}}AFX_DATA_MAP @@ -831,6 +854,12 @@ void CDefaultBrowserDlg::OnNo() if (UpdateData(TRUE)) { EndDialog(ID_NO); + + // Update "perform check" preference per check-box setting. + if ( !m_bPerformCheck ) { + PREF_SetBoolPref("browser.wfe.ignore_def_check",TRUE); + } + } /* end if */ } // END OF FUNCTION CDefaultBrowserDlg::OnNo() @@ -856,6 +885,7 @@ void CDefaultBrowserDlg::OnDetails() if (UpdateData(TRUE)) { EndDialog(IDC_SHOW_DESKTOP_PREFS); + } /* end if */ } // END OF FUNCTION CDefaultBrowserDlg::OnDetails() @@ -937,6 +967,21 @@ static BOOL IsListItemSelected(int* selArray, int count, int i) void CDefaultBrowserDlg::OnOK() { + // Dismiss the dialog. + CDefaultBrowserDlgBase::OnOK(); + + // Update "perform check" preference per check-box setting. + if ( !m_bPerformCheck ) { + PREF_SetBoolPref("browser.wfe.ignore_def_check",TRUE); + } + + if ( m_pDefaultBrowser ) { + // synchronize registry with these preferences. + nsresult result = m_pDefaultBrowser->HandlePerPreferences(); + ASSERT( result == NS_OK ); + } + +#if 0 // Old code. // Let's do it. Selected items become owned. // Unselected items become ignored (if the checkbox is checked) CDefaultBrowserDlgBase::OnOK(); @@ -968,6 +1013,7 @@ void CDefaultBrowserDlg::OnOK() theItem->SetIgnored(TRUE); } } +#endif } /* CCheckConfirmDialog: a generic "confirm" dialog including a checkbox. diff --git a/mozilla/cmd/winfe/dialog.h b/mozilla/cmd/winfe/dialog.h index a40f636c60d..6e9b9263e08 100755 --- a/mozilla/cmd/winfe/dialog.h +++ b/mozilla/cmd/winfe/dialog.h @@ -305,15 +305,19 @@ protected: #define CDefaultBrowserDlgBase CDialog +class nsIDefaultBrowser; + class CDefaultBrowserDlg : public CDefaultBrowserDlgBase { public: - CDefaultBrowserDlg(CWnd* pParent = NULL); + CDefaultBrowserDlg(CWnd* pParent = NULL, nsIDefaultBrowser* pDefaultBrowser = NULL); + CDefaultBrowserDlg(nsIDefaultBrowser* pDefaultBrowser); + ~CDefaultBrowserDlg(); // Dialog Data //{{AFX_DATA(CDefaultBrowserDlg) enum { IDD = IDD_DEFAULT_BROWSER }; - BOOL m_bIgnore; + BOOL m_bPerformCheck; CListBox m_Listbox; //}}AFX_DATA @@ -339,6 +343,9 @@ class CDefaultBrowserDlg : public CDefaultBrowserDlgBase DECLARE_MESSAGE_MAP() + private: + nsIDefaultBrowser* m_pDefaultBrowser; // nsIDefaultBrowser interface pointer. + }; // END OF CLASS CDefaultBrowserDlg() diff --git a/mozilla/cmd/winfe/nsIDefaultBrowser.cpp b/mozilla/cmd/winfe/nsIDefaultBrowser.cpp index a2ebe9aa8cb..bdf60d14426 100644 --- a/mozilla/cmd/winfe/nsIDefaultBrowser.cpp +++ b/mozilla/cmd/winfe/nsIDefaultBrowser.cpp @@ -32,6 +32,12 @@ class nsWinDefaultBrowser : public nsIDefaultBrowser { // Functions to be implemented in this class. NS_IMETHOD_(PRBool) IsDefaultBrowser(); NS_IMETHOD_(int) DisplayDialog(); + NS_IMETHOD GetPreferences( Prefs &prefs ); + NS_IMETHOD SetPreferences( const Prefs &prefs ); + NS_IMETHOD_(PRBool) IsHandling( Thing thing ); + NS_IMETHOD StartHandling( Thing extOrProtocol ); + NS_IMETHOD StopHandling( Thing extOrProtocol ); + NS_IMETHOD HandlePerPreferences(); private: // Constructor (private; use nsIDefaultBrowser::GetInterface). @@ -58,7 +64,44 @@ nsWinDefaultBrowser::nsWinDefaultBrowser() { * For now, use old logic. */ PRBool nsWinDefaultBrowser::IsDefaultBrowser() { - PRBool result = !theApp.m_OwnedAndLostList.NonemptyLostIgnoredIntersection(); + //PRBool result = !theApp.m_OwnedAndLostList.NonemptyLostIgnoredIntersection(); + PRBool result = TRUE; + + // Get user desktop integration preferences. + Prefs prefs; + if ( this->GetPreferences( prefs ) == NS_OK ) { + // Check that all desired options are still in effect. + if ( prefs.bHandleShortcuts ) { + if ( ( prefs.bHandleHTTP && !IsHandling(kHTTP) ) + || ( prefs.bHandleHTTPS && !IsHandling(kHTTPS) ) + || ( prefs.bHandleFTP && !IsHandling(kFTP) ) ) { + result = FALSE; + } + } + // Next, check files. + if ( result && prefs.bHandleFiles ) { + if ( ( prefs.bHandleHTML && !IsHandling(kHTML) ) + || ( prefs.bHandleJPEG && !IsHandling(kJPEG) ) + || ( prefs.bHandleGIF && !IsHandling(kGIF) ) + || ( prefs.bHandleJS && !IsHandling(kJS) ) + || ( prefs.bHandleXBM && !IsHandling(kXBM) ) + || ( prefs.bHandleTXT && !IsHandling(kTXT) ) ) { + result = FALSE; + } + } + // Lastly, check Active Desktop stuff. + if ( result && prefs.bIntegrateWithActiveDesktop ) { + if ( ( prefs.bUseInternetKeywords && !IsHandling(kInternetKeywords) ) + || ( prefs.bUseNetcenterSearch && !IsHandling(kNetcenterSearch) ) + || ( prefs.bDisableActiveDesktop && !IsHandling(kActiveDesktop) ) ) { + result = FALSE; + } + } + } else { + // Error getting preferences, return FALSE so we + // have chance to rectify the error. + result = FALSE; + } return result; } @@ -68,7 +111,7 @@ PRBool nsWinDefaultBrowser::IsDefaultBrowser() { * Display dialog and return the user response. */ int nsWinDefaultBrowser::DisplayDialog() { - CDefaultBrowserDlg dialog; + CDefaultBrowserDlg dialog(this); int result = dialog.DoModal(); return result; } @@ -82,3 +125,1087 @@ nsIDefaultBrowser *nsIDefaultBrowser::GetInterface() { pSingleton->AddRef(); return pSingleton; } + +/* getPRBoolFromRegistry + * + * Utility to fetch registry value as PRBool. + */ +static PRBool getPRBoolFromRegistry( HKEY key, const char* valueName ) { + DWORD value = FALSE; + DWORD len = sizeof value; + DWORD type; + ::RegQueryValueEx( key, valueName, NULL, &type, (LPBYTE)&value, &len ); + return !!value; +} + +/* putPRBoolIntoRegistry + * + * Utility to set PRBool registry value. + */ +static void putPRBoolIntoRegistry( HKEY key, const char* valueName, PRBool value ) { + ::RegSetValueEx( key, valueName, NULL, REG_DWORD, (LPBYTE)&value, sizeof value ); +} + +/* getRegistryPrefsKeyName + * + * Utility to obtain name of registry key for desktop preferences. + */ +static CString getRegistryPrefsKeyName() { + // Build registry key name. + CString keyName; + keyName.LoadString(IDS_NETHELP_REGISTRY); // Software\Netscape\Netscape Navigator + keyName += "Desktop Integration Preferences"; + + // Return it. + return keyName; +} + +/* getRegistryPrefsKey + * + * Utility to open desktop preferences registry key. + */ +static HKEY getRegistryPrefsKey() { + // Try to open registry key. + HKEY key = NULL; + ::RegOpenKey( HKEY_CURRENT_USER, getRegistryPrefsKeyName(), &key ); + + return key; +} + +/* nsWinDefaultBrowser::GetPreferences + * + * Returns Prefs structure filled in with user's preferences. + */ +nsresult nsWinDefaultBrowser::GetPreferences( Prefs &prefs ) { + nsresult result = NS_ERROR_FAILURE; + + // Try to open registry key. + HKEY key = getRegistryPrefsKey(); + + // See if registry key exists. + if ( !key ) { + // Probably not created yet. Populate key with default values. + prefs.bHandleFiles = TRUE; + prefs.bHandleShortcuts = TRUE; + prefs.bIntegrateWithActiveDesktop = TRUE; + prefs.bHandleHTTP = TRUE; + prefs.bHandleHTTPS = TRUE; + prefs.bHandleFTP = TRUE; + prefs.bHandleHTML = TRUE; + prefs.bHandleJPEG = TRUE; + prefs.bHandleGIF = TRUE; + prefs.bHandleJS = TRUE; + prefs.bHandleXBM = TRUE; + prefs.bHandleTXT = TRUE; + prefs.bUseInternetKeywords = TRUE; + prefs.bUseNetcenterSearch = TRUE; + prefs.bDisableActiveDesktop = TRUE; + result = this->SetPreferences( prefs ); + } else { + // Get each registry value and copy to prefs structure. + prefs.bHandleFiles = getPRBoolFromRegistry( key, "bHandleFiles" ); + prefs.bHandleShortcuts = getPRBoolFromRegistry( key, "bHandleShortcuts" ); + prefs.bIntegrateWithActiveDesktop = getPRBoolFromRegistry( key, "bIntegrateWithActiveDesktop" ); + prefs.bHandleHTTP = getPRBoolFromRegistry( key, "bHandleHTTP" ); + prefs.bHandleHTTPS = getPRBoolFromRegistry( key, "bHandleHTTPS" ); + prefs.bHandleFTP = getPRBoolFromRegistry( key, "bHandleFTP" ); + prefs.bHandleHTML = getPRBoolFromRegistry( key, "bHandleHTML" ); + prefs.bHandleJPEG = getPRBoolFromRegistry( key, "bHandleJPEG" ); + prefs.bHandleGIF = getPRBoolFromRegistry( key, "bHandleGIF" ); + prefs.bHandleJS = getPRBoolFromRegistry( key, "bHandleJS" ); + prefs.bHandleXBM = getPRBoolFromRegistry( key, "bHandleXBM" ); + prefs.bHandleTXT = getPRBoolFromRegistry( key, "bHandleTXT" ); + prefs.bUseInternetKeywords = getPRBoolFromRegistry( key, "bUseInternetKeywords" ); + prefs.bUseNetcenterSearch = getPRBoolFromRegistry( key, "bUseNetcenterSearch" ); + prefs.bDisableActiveDesktop = getPRBoolFromRegistry( key, "bDisableActiveDesktop" ); + result = NS_OK; + ::RegCloseKey( key ); + } + + return result; +} + +/* nsWinDefaultBrowser::SetPreferences + * + * Sets user preferences from Prefs structure contents. + */ +nsresult nsWinDefaultBrowser::SetPreferences( const Prefs &prefs ) { + nsresult result = NS_ERROR_FAILURE; + + HKEY key = getRegistryPrefsKey(); + + // If key not created yet, do so now. + if ( !key ) { + ::RegCreateKey( HKEY_CURRENT_USER, getRegistryPrefsKeyName(), &key ); + } + + // If everything's hunky-dory, populate key with values. + if ( key ) { + putPRBoolIntoRegistry( key, "bHandleFiles", prefs.bHandleFiles ); + putPRBoolIntoRegistry( key, "bHandleShortcuts", prefs.bHandleShortcuts ); + putPRBoolIntoRegistry( key, "bIntegrateWithActiveDesktop", prefs.bIntegrateWithActiveDesktop ); + putPRBoolIntoRegistry( key, "bHandleHTTP", prefs.bHandleHTTP ); + putPRBoolIntoRegistry( key, "bHandleHTTPS", prefs.bHandleHTTPS ); + putPRBoolIntoRegistry( key, "bHandleFTP", prefs.bHandleFTP ); + putPRBoolIntoRegistry( key, "bHandleHTML", prefs.bHandleHTML ); + putPRBoolIntoRegistry( key, "bHandleJPEG", prefs.bHandleJPEG ); + putPRBoolIntoRegistry( key, "bHandleGIF", prefs.bHandleGIF ); + putPRBoolIntoRegistry( key, "bHandleJS", prefs.bHandleJS ); + putPRBoolIntoRegistry( key, "bHandleXBM", prefs.bHandleXBM ); + putPRBoolIntoRegistry( key, "bHandleTXT", prefs.bHandleTXT ); + putPRBoolIntoRegistry( key, "bUseInternetKeywords", prefs.bUseInternetKeywords ); + putPRBoolIntoRegistry( key, "bUseNetcenterSearch", prefs.bUseNetcenterSearch ); + putPRBoolIntoRegistry( key, "bDisableActiveDesktop", prefs.bDisableActiveDesktop ); + result = NS_OK; + } + + return result; +} + +/* Registry keys + * + * These are all the registry keys/values we twiddle with in this code. + */ +struct RegistryEntry { + HKEY baseKey; // e.g., HKEY_CURRENT_USER + CString keyName; // Key name. + CString valueName; // Value name (can be empty, which implies NULL). + CString setting; // What we set it to. + + RegistryEntry( HKEY baseKey, const char* keyName, const char* valueName, const char* setting ) + : baseKey( baseKey ), keyName( keyName ), valueName( valueName ), setting( setting ) { + } + + PRBool isAlreadySet() const; + nsresult set(); + nsresult reset(); + CString currentSetting() const; + + const char* valueNameArg() const; + + CString savedValueName() const; +}; + +const char* RegistryEntry::valueNameArg() const { + const char *result = valueName; + if ( valueName.IsEmpty() ) + result = NULL; + return result; +} + +CString RegistryEntry::savedValueName() const { + CString result = valueName; + if ( result.IsEmpty() ) { + result = "pre-mozilla"; + } else { + result += " pre-mozilla"; + } + return result; +} + +static CString thisApplication(); + +struct ProtocolRegistryEntry : public RegistryEntry { + CString protocol; + ProtocolRegistryEntry( const char* protocol, const char* setting ) + : RegistryEntry( HKEY_LOCAL_MACHINE, "", "", setting ), + protocol( protocol ) { + keyName = "Software\\Classes\\"; + keyName += protocol; + keyName += "\\shell\\open\\command"; + } + nsresult set(); + nsresult reset(); + CString currentSetting() { + // Special case NetscapeMarkup. + if ( protocol == "NetscapeMarkup" ) { + return thisApplication(); + } else { + return RegistryEntry::currentSetting(); + } + } +}; + +static RegistryEntry + findOnTheInternet( HKEY_CURRENT_USER, + "Software\\Microsoft\\Internet Explorer\\Main", + "Search Page", + "http://home.netscape.com/home/winsearch.html" ), + + internetKeywords1( HKEY_CURRENT_USER, + "Software\\Microsoft\\Internet Explorer\\SearchURL", + "", + "http://keyword.netscape.com/keyword/%s" ), + + internetKeywords2( HKEY_LOCAL_MACHINE, + "Software\\Microsoft\\Windows\\CurrentVersion\\URL\\DefaultPrefix", + "", + "http://keyword.netscape.com/keyword/" ); + +// Special case for this one. +static struct ActiveDesktopRegistryEntry : public RegistryEntry { + ActiveDesktopRegistryEntry() + : RegistryEntry( HKEY_CURRENT_USER, + "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer", + "ShellState", + "" ) { + } + PRBool isAlreadySet() const; + nsresult set(); + nsresult reset(); +} activeDesktop; + +/* Registryentry::isAlreadySet + * + * Tests whether registry entry already has desired setting. + */ +PRBool RegistryEntry::isAlreadySet() const { + PRBool result = FALSE; + + CString current = currentSetting(); + + result = ( current == setting ); + + return result; +} + +PRBool ActiveDesktopRegistryEntry::isAlreadySet() const { + PRBool result = FALSE; + HKEY key; + LONG rc = ::RegOpenKey( baseKey, keyName, &key ); + if ( rc == ERROR_SUCCESS ) { + char buffer[4096]; + DWORD len = sizeof buffer; + rc = ::RegQueryValueEx( key, valueNameArg(), NULL, NULL, (LPBYTE)buffer, &len ); + if ( rc == ERROR_SUCCESS ) { + if ( !( buffer[4] & 0x40 ) ) { + result = TRUE; + } + } + ::RegCloseKey( key ); + } + + return result; +} + +/* Registryentry::set + * + * Gives registry entry the desired setting. + */ +nsresult RegistryEntry::set() { + nsresult result = NS_ERROR_FAILURE; + HKEY key; + LONG rc = ::RegOpenKey( baseKey, keyName, &key ); + if ( rc == ERROR_SUCCESS ) { + char buffer[4096]; + DWORD len = sizeof buffer; + rc = ::RegQueryValueEx( key, valueNameArg(), NULL, NULL, (LPBYTE)buffer, &len ); + if ( rc == ERROR_SUCCESS ) { + if ( XP_STRCMP( setting, buffer ) != 0 ) { + rc = ::RegSetValueEx( key, valueNameArg(), NULL, REG_SZ, (LPBYTE)(const char*)setting, XP_STRLEN(setting) ); + if ( rc == ERROR_SUCCESS ) { + // Save old value. + rc = ::RegSetValueEx( key, savedValueName(), NULL, REG_SZ, (LPBYTE)buffer, len ); + result = NS_OK; + } + } else { + // Already has desired setting. + result = NS_OK; + } + } + ::RegCloseKey( key ); + } + + return result; +} + +nsresult ProtocolRegistryEntry::set() { + // First, set main keyName to proper setting. + nsresult result = RegistryEntry::set(); + + // If that worked, change DDE stuff. + if ( result == NS_OK ) { + CString ddeKey = "Software\\Classes\\"; + ddeKey += protocol; + ddeKey += "\\shell\\open\\ddeexec"; + RegistryEntry entry( HKEY_LOCAL_MACHINE, ddeKey, NULL, "\"%1\"" ); + result = entry.set(); + if ( result == NS_OK ) { + entry.keyName = ddeKey + "\\Application"; + entry.setting = "NSShell"; + result = entry.set(); + if ( result == NS_OK ) { + entry.keyName = ddeKey + "\\Topic"; + entry.setting = "WWW_OpenURL"; + result = entry.set(); + } + } + // DDE isn't crucial, so ignore errors. + result = NS_OK; + } + + return result; +} + +nsresult ActiveDesktopRegistryEntry::set() { + nsresult result = NS_ERROR_FAILURE; + HKEY key; + LONG rc = ::RegOpenKey( baseKey, keyName, &key ); + if ( rc == ERROR_SUCCESS ) { + char buffer[4096]; + DWORD len = sizeof buffer; + rc = ::RegQueryValueEx( key, valueNameArg(), NULL, NULL, (LPBYTE)buffer, &len ); + if ( rc == ERROR_SUCCESS ) { + if ( buffer[4] & 0x40 ) { + buffer[4] &= ~0x40; // Turn off Active Desktop bit. + rc = ::RegSetValueEx( key, valueNameArg(), NULL, REG_BINARY, (LPBYTE)buffer, len ); + if ( rc == ERROR_SUCCESS ) { + // Note fact that on reset() we must turn it back on. + rc = ::RegSetValueEx( key, savedValueName(), NULL, REG_BINARY, (LPBYTE)"\x40", 1 ); + result = NS_OK; + } + } else { + // Already has desired setting. + result = NS_OK; + } + } + ::RegCloseKey( key ); + } + + return result; +} + +/* Registryentry::reset + * + * Restores registry entry to its value prior to us giving it our desired setting. + */ +nsresult RegistryEntry::reset() { + nsresult result = NS_ERROR_FAILURE; + HKEY key; + LONG rc = ::RegOpenKey( baseKey, keyName, &key ); + if ( rc == ERROR_SUCCESS ) { + char buffer[4096]; + DWORD len = sizeof buffer; + rc = ::RegQueryValueEx( key, valueNameArg(), NULL, NULL, (LPBYTE)buffer, &len ); + if ( rc == ERROR_SUCCESS ) { + if ( XP_STRCMP( setting, buffer ) == 0 ) { + // Get previous value. + len = sizeof buffer; + rc = ::RegQueryValueEx( key, savedValueName(), NULL, NULL, (LPBYTE)buffer, &len ); + if ( rc == ERROR_SUCCESS ) { + rc = ::RegSetValueEx( key, valueNameArg(), NULL, REG_SZ, (LPBYTE)buffer, len ); + result = NS_OK; + } else { + // No saved value? Reset to null and hope for the best. + rc = ::RegSetValueEx( key, valueNameArg(), NULL, REG_SZ, (LPBYTE)"", 0 ); + result = NS_OK; + } + } else { + // Wasn't set by us. + result = NS_OK; + } + // Clean up "pre-mozilla" value. + rc = ::RegDeleteValue( key, savedValueName() ); + } + ::RegCloseKey( key ); + } + + return result; +} + +nsresult ProtocolRegistryEntry::reset() { + // First, reset main keyName. + nsresult result = RegistryEntry::reset(); + + // If that worked, change DDE stuff. + if ( result == NS_OK ) { + CString ddeKey = "Software\\Classes\\"; + ddeKey += protocol; + ddeKey += "\\shell\\open\\ddeexec"; + RegistryEntry entry( HKEY_LOCAL_MACHINE, ddeKey, NULL, "%1" ); + result = entry.reset(); + if ( result == NS_OK ) { + entry.keyName = ddeKey + "\\Application"; + entry.setting = "NSShell"; + result = entry.reset(); + if ( result == NS_OK ) { + entry.keyName = ddeKey + "\\Topic"; + entry.setting = "WWW_OpenURL"; + result = entry.reset(); + } + } + } + + return result; +} + +nsresult ActiveDesktopRegistryEntry::reset() { + nsresult result = NS_ERROR_FAILURE; + HKEY key; + LONG rc = ::RegOpenKey( baseKey, keyName, &key ); + if ( rc == ERROR_SUCCESS ) { + char buffer[4096]; + DWORD len = sizeof buffer; + rc = ::RegQueryValueEx( key, valueNameArg(), NULL, NULL, (LPBYTE)buffer, &len ); + if ( rc == ERROR_SUCCESS ) { + if ( !( buffer[4] & 0x40 ) ) { + // It's off now, see if we turned it off. + char preMozilla; + DWORD len2 = sizeof preMozilla; + rc = ::RegQueryValueEx( key, savedValueName(), NULL, NULL, (LPBYTE)&preMozilla, &len2 ); + if ( rc == ERROR_SUCCESS ) { + // Previously was on, so turn it back on now. + buffer[4] |= 0x40; + rc = ::RegSetValueEx( key, valueNameArg(), NULL, REG_BINARY, (LPBYTE)buffer, len ); + result = NS_OK; + } else { + // No saved value means we didn't toggle it; so leave it off. + result = NS_OK; + } + } else { + // Couldn't have been turned off by us; reset is nop. + result = NS_OK; + } + // Clear saved value. + rc = ::RegDeleteValue( key, savedValueName() ); + } + ::RegCloseKey( key ); + } + + return result; +} + +/* RegistryEntry::currentSetting + * + * Return current setting for this registry entry. + */ +CString RegistryEntry::currentSetting() const { + CString result; + + HKEY key; + LONG rc = ::RegOpenKey( baseKey, keyName, &key ); + if ( rc == ERROR_SUCCESS ) { + char buffer[4096]; + DWORD len = sizeof buffer; + rc = ::RegQueryValueEx( key, valueNameArg(), NULL, NULL, (LPBYTE)buffer, &len ); + if ( rc == ERROR_SUCCESS ) { + result = buffer; + } + ::RegCloseKey( key ); + } + + return result; +} + + +/* handlerForProtocol + * + * Returns name of application handling a given Internet shortcut protocol. + */ +static CString handlerForProtocol( const char *protocol ) { + ProtocolRegistryEntry entry( protocol, NULL ); + + CString result = entry.currentSetting(); + + return result; +} + +/* handlerForExtension + * + * Returns name of application handling a given file extension. + */ +static CString handlerForExtension( const char *ext ) { + CString result; + + // Get file type for given extension. + CString extKeyName = "Software\\Classes\\"; + extKeyName += ext; + RegistryEntry entry( HKEY_LOCAL_MACHINE, extKeyName, NULL, NULL ); + CString fileType = entry.currentSetting(); + + if ( !fileType.IsEmpty() ) { + // Now get application for that type. + result = handlerForProtocol( fileType ); + } + + return result; +} + +/* areInternetKeywordsActivated/isNetcenterSearchActivated + * + * Returns whether Mozilla has set the registry its way for a given feature. + */ +static PRBool areInternetKeywordsActivated() { + PRBool result = internetKeywords1.isAlreadySet() && internetKeywords2.isAlreadySet(); + + return result; +} + +static PRBool isNetcenterSearchActivated() { + PRBool result = findOnTheInternet.isAlreadySet(); + + return result; +} + +/* activateInternetKeywords/activateNetcenterSearch + * + * Set registry so these things are in effect. + */ +static nsresult activateInternetKeywords() { + nsresult result = internetKeywords1.set(); + + if ( result == NS_OK ) { + result = internetKeywords2.set(); + } + + ASSERT( result == NS_OK ); + + return result; +} + +static nsresult activateNetcenterSearch() { + nsresult result = findOnTheInternet.set(); + + return result; +} + +/* deactivateInternetKeywords/deactivateNetcenterSearch + * + * Set registry so these things are in effect. + */ +static nsresult deactivateInternetKeywords() { + nsresult result = internetKeywords1.reset(); + + if ( result == NS_OK ) { + result = internetKeywords2.reset(); + } + + ASSERT( result == NS_OK ); + + return result; +} + +static nsresult deactivateNetcenterSearch() { + nsresult result = findOnTheInternet.reset(); + + ASSERT( result == NS_OK ); + + return result; +} + +/* isActiveDesktopDisabled + * + * Returns whether the Active Desktop has been disabled. + */ + +static PRBool isActiveDesktopDisabled() { + PRBool result = activeDesktop.isAlreadySet(); + + return result; +} + +/* resetActiveDesktop + * + * Set registry entries to reset Active Desktop. + */ +static nsresult resetActiveDesktop() { + nsresult result = activeDesktop.reset(); + + ASSERT( result == NS_OK ); + + return result; +} + +/* disableActiveDesktop + * + * Set registry entries to disable Active Desktop. + */ +static nsresult disableActiveDesktop() { + nsresult result = activeDesktop.set(); + + ASSERT( result == NS_OK ); + + return result; +} + +static const char shortcutSuffix[] = " -h \"%1\""; + +/* thisApplication + * + * Returns the (fully-qualified) name of this executable (plus the suffix). + */ +static CString thisApplication() { + static CString result; + + if ( result.IsEmpty() ) { + char buffer[MAX_PATH] = { 0 }; + DWORD len = ::GetModuleFileName( theApp.m_hInstance, buffer, sizeof buffer ); + len = ::GetShortPathName( buffer, buffer, sizeof buffer ); + + result = buffer; + result += shortcutSuffix; + result.MakeUpper(); + } + + return result; +} + +/* File extensions for each file type. */ +static const char * const HTMLExtensions[] = { ".htm", ".html", 0 }; +static const char * const JPEGExtensions[] = { ".jpg", ".jpeg", ".jpe", ".jfif", ".pjpeg", ".pjp", 0 }; +static const char * const GIFExtensions[] = { ".gif", 0 }; +static const char * const JSExtensions[] = { ".js", 0 }; +static const char * const XBMExtensions[] = { ".xbm", 0 }; +static const char * const TXTExtensions[] = { ".txt", 0 }; + +/* isHandlingExtensions + * + * Return whether this application is handling each of a set of extensions. + */ +PRBool isHandlingExtensions( const char * const ext[] ) { + PRBool result = TRUE; + for ( int i = 0; result && ext[i]; i++ ) { + CString handler = handlerForExtension( ext[i] ); + result = ( handler.IsEmpty() || (handler.MakeUpper(), handler) == thisApplication() ); + } + return result; +} + +/* nsWinDefaultBrowser::IsHandling + * + * Returns whether Mozilla is handling a given thing. + */ +PRBool nsWinDefaultBrowser::IsHandling( Thing thing ) { + PRBool result = TRUE; + + switch ( thing ) { + case kHTTP: + result = ( handlerForProtocol("http") == thisApplication() ); + break; + + case kHTTPS: + result = ( handlerForProtocol("https") == thisApplication() ); + break; + + case kFTP: + result = ( handlerForProtocol("ftp") == thisApplication() ); + break; + + case kHTML: + result = isHandlingExtensions( HTMLExtensions ); + break; + + case kJPEG: + result = isHandlingExtensions( JPEGExtensions ); + break; + + case kGIF: + result = isHandlingExtensions( GIFExtensions ); + break; + + case kJS: + result = isHandlingExtensions( JSExtensions ); + break; + + case kXBM: + result = isHandlingExtensions( XBMExtensions ); + break; + + case kTXT: + result = isHandlingExtensions( TXTExtensions ); + break; + + case kInternetKeywords: + result = areInternetKeywordsActivated(); + break; + + case kNetcenterSearch: + result = isNetcenterSearchActivated(); + break; + + case kActiveDesktop: + result = isActiveDesktopDisabled(); + break; + + default: + // we certainly aren't handling thing we don't even know about! + result = FALSE; + break; + } + + return result; +} + +/* startHandlingProtocol + * + * Set registry so that this application handles argument protocol. + */ +static nsresult startHandlingProtocol( const char *protocol ) { + nsresult result = NS_ERROR_FAILURE; + + ProtocolRegistryEntry entry( protocol, thisApplication() ); + + result = entry.set(); + + ASSERT( result == NS_OK ); + + return result; +} + +/* stopHandlingProtocol + * + * Set registry so that this application doesn't handle the argument protocol. + */ +static nsresult stopHandlingProtocol( const char *protocol ) { + nsresult result = NS_ERROR_FAILURE; + + ProtocolRegistryEntry entry( protocol, thisApplication() ); + + result = entry.reset(); + + ASSERT( result == NS_OK ); + + return result; +} + +/* setupNetscapeMarkup + * + * Set up registry entries for "NetscapeMarkup" file type (our replacement for "htmlfile"). + */ +static void setupNetscapeMarkup() { + //TBD +} + +/* startHandlingExtension + * + * Set up this application to handle the given file extension. + */ +static nsresult startHandlingExtension( const char *ext ) { + nsresult result = NS_ERROR_FAILURE; + + // Handle .htm/.html differently. + CString strExt = ext; + CString keyName = "Software\\Classes\\"; + keyName += ext; + if ( strExt == ".htm" || strExt == ".html" ) { + // Give these extensions type "NetscapeMarkup". + RegistryEntry entry( HKEY_LOCAL_MACHINE, + keyName, + "", + "NetscapeMarkup" ); + + setupNetscapeMarkup(); + + result = entry.set(); + + ASSERT( result == NS_OK ); + } else { + // Get file type. + RegistryEntry extEntry( HKEY_LOCAL_MACHINE, + keyName, + "", + "" ); + CString fileType = extEntry.currentSetting(); + if ( !fileType.IsEmpty() ) { + ProtocolRegistryEntry entry( fileType, thisApplication() ); + + result = entry.set(); + + ASSERT( result == NS_OK ); + } else { + // Extension missing from registry; ignore it. + result = NS_OK; + } + } + + return result; +} + +/* stopHandlingExtension + * + * Restore registry so this application isn't handling the give extension. + */ +static nsresult stopHandlingExtension( const char *ext ) { + nsresult result = NS_ERROR_FAILURE; + + // Handle .htm/.html differently. + CString strExt = ext; + CString keyName = "Software\\Classes\\"; + keyName += ext; + if ( strExt == ".htm" || strExt == ".html" ) { + // Reset type of .htm/.html files. + RegistryEntry entry( HKEY_LOCAL_MACHINE, + keyName, + "", + "NetscapeMarkup" ); + + result = entry.reset(); + + ASSERT( result == NS_OK ); + } else { + // Get file type. + RegistryEntry extEntry( HKEY_LOCAL_MACHINE, + keyName, + "", + "" ); + CString fileType = extEntry.currentSetting(); + if ( !fileType.IsEmpty() ) { + ProtocolRegistryEntry entry( fileType, thisApplication() ); + + result = entry.reset(); + + ASSERT( result == NS_OK ); + } else { + // Extension missing from registry; ignore it. + result = NS_OK; + } + } + + return result; +} + +/* startHandlingExtensions + * + * Set up this application to handle the argument set of file extensions. + */ +static nsresult startHandlingExtensions( const char *const ext[] ) { + nsresult result = NS_OK; + + for ( int i = 0; ext[i] && result == NS_OK; i++ ) { + result = startHandlingExtension( ext[i] ); + } + + return result; +} + +/* stopHandlingExtensions + * + * Restore registry for argument set of file extensions. + */ +static nsresult stopHandlingExtensions( const char *const ext[] ) { + nsresult result = NS_OK; + + for ( int i = 0; ext[i] && result == NS_OK; i++ ) { + result = stopHandlingExtension( ext[i] ); + } + + return result; +} + +/* nsWinDefaultBrowser::StartHandling + * + * Does necessary stuff to have Mozilla take over handling of a given thing. + */ +nsresult nsWinDefaultBrowser::StartHandling( Thing extOrProtocol ) { + nsresult result = NS_ERROR_FAILURE; + + switch ( extOrProtocol ) { + case kHTTP: + result = startHandlingProtocol( "http" ); + break; + + case kHTTPS: + result = startHandlingProtocol( "https" ); + break; + + case kFTP: + result = startHandlingProtocol( "ftp" ); + break; + + case kHTML: + result = startHandlingExtensions( HTMLExtensions ); + break; + + case kJPEG: + result = startHandlingExtensions( JPEGExtensions ); + break; + + case kGIF: + result = startHandlingExtensions( GIFExtensions ); + break; + + case kJS: + result = startHandlingExtensions( JSExtensions ); + break; + + case kXBM: + result = startHandlingExtensions( XBMExtensions ); + break; + + case kTXT: + result = startHandlingExtensions( TXTExtensions ); + break; + + case kInternetKeywords: + result = activateInternetKeywords(); + break; + + case kNetcenterSearch: + result = activateNetcenterSearch(); + break; + + case kActiveDesktop: + result = disableActiveDesktop(); + break; + + default: + break; + } + + return result; +} + +/* nsWinDefaultBrowser::StopHandling + * + * Vice versa + */ +nsresult nsWinDefaultBrowser::StopHandling( Thing extOrProtocol ) { + nsresult result = NS_ERROR_FAILURE; + + switch ( extOrProtocol ) { + case kHTTP: + result = stopHandlingProtocol( "http" ); + break; + + case kHTTPS: + result = stopHandlingProtocol( "https" ); + break; + + case kFTP: + result = stopHandlingProtocol( "ftp" ); + break; + + case kHTML: + result = stopHandlingExtensions( HTMLExtensions ); + break; + + case kJPEG: + result = stopHandlingExtensions( JPEGExtensions ); + break; + + case kGIF: + result = stopHandlingExtensions( GIFExtensions ); + break; + + case kJS: + result = stopHandlingExtensions( JSExtensions ); + break; + + case kXBM: + result = stopHandlingExtensions( XBMExtensions ); + break; + + case kTXT: + result = stopHandlingExtensions( TXTExtensions ); + break; + + case kInternetKeywords: + result = deactivateInternetKeywords(); + break; + + case kNetcenterSearch: + result = deactivateNetcenterSearch(); + break; + + case kActiveDesktop: + result = resetActiveDesktop(); + break; + + default: + break; + } + + return result; +} + +/* nsWinDefaultBrowser::HandlePerPreferences + * + * Get preferences and start handling everything selected. + */ +nsresult nsWinDefaultBrowser::HandlePerPreferences() { + nsresult result = NS_OK; + + Prefs prefs; + result = GetPreferences( prefs ); + + ASSERT( result == NS_OK ); + + // Don't apply bogus preferences! + if ( result == NS_OK ) { + if ( prefs.bHandleFiles && prefs.bHandleHTML ) { + result = StartHandling( kHTML ); + } else { + result = StopHandling( kHTML ); + } + ASSERT( result == NS_OK ); + if ( prefs.bHandleFiles && prefs.bHandleJPEG ) { + result = StartHandling( kJPEG ); + } else { + result = StopHandling( kJPEG ); + } + ASSERT( result == NS_OK ); + if ( prefs.bHandleFiles && prefs.bHandleGIF ) { + result = StartHandling( kGIF ); + } else { + result = StopHandling( kGIF ); + } + ASSERT( result == NS_OK ); + if ( prefs.bHandleFiles && prefs.bHandleJS ) { + result = StartHandling( kJS ); + } else { + result = StopHandling( kJS ); + } + ASSERT( result == NS_OK ); + if ( prefs.bHandleFiles && prefs.bHandleXBM ) { + result = StartHandling( kXBM ); + } else { + result = StopHandling( kXBM ); + } + ASSERT( result == NS_OK ); + if ( prefs.bHandleFiles && prefs.bHandleTXT ) { + result = StartHandling( kTXT ); + } else { + result = StopHandling( kTXT ); + } + ASSERT( result == NS_OK ); + if ( prefs.bHandleShortcuts && prefs.bHandleHTTP ) { + result = StartHandling( kHTTP ); + } else { + result = StopHandling( kHTTP ); + } + ASSERT( result == NS_OK ); + if ( prefs.bHandleShortcuts && prefs.bHandleHTTPS ) { + result = StartHandling( kHTTPS ); + } else { + result = StopHandling( kHTTPS ); + } + ASSERT( result == NS_OK ); + if ( prefs.bHandleShortcuts && prefs.bHandleFTP ) { + result = StartHandling( kFTP ); + } else { + result = StopHandling( kFTP ); + } + ASSERT( result == NS_OK ); + if ( prefs.bIntegrateWithActiveDesktop && prefs.bUseInternetKeywords ) { + result = StartHandling( kInternetKeywords ); + } else { + result = StopHandling( kInternetKeywords ); + } + ASSERT( result == NS_OK ); + if ( prefs.bIntegrateWithActiveDesktop && prefs.bUseNetcenterSearch ) { + result = StartHandling( kNetcenterSearch ); + } else { + result = StopHandling( kNetcenterSearch ); + } + ASSERT( result == NS_OK ); + if ( prefs.bIntegrateWithActiveDesktop && prefs.bDisableActiveDesktop ) { + result = StartHandling( kActiveDesktop ); + } else { + result = StopHandling( kActiveDesktop ); + } + ASSERT( result == NS_OK ); + } + + return result; +} + diff --git a/mozilla/cmd/winfe/nsIDefaultBrowser.h b/mozilla/cmd/winfe/nsIDefaultBrowser.h index 221f9ebeaf6..b812116f519 100644 --- a/mozilla/cmd/winfe/nsIDefaultBrowser.h +++ b/mozilla/cmd/winfe/nsIDefaultBrowser.h @@ -41,6 +41,60 @@ class nsIDefaultBrowser : public nsISupports { // DisplayDialog - displays the "default browser" dialog (intended for browser startup). NS_IMETHOD_(int) DisplayDialog() = 0; + + // Prefs - nested structure defining default-browser related prefs. + struct Prefs { + PRBool bHandleFiles; + PRBool bHandleShortcuts; + PRBool bIntegrateWithActiveDesktop; + // Internet shortcut protocols. + struct { + PRBool bHandleHTTP; + PRBool bHandleHTTPS; + PRBool bHandleFTP; + }; + // File types. + struct { + PRBool bHandleHTML; + PRBool bHandleJPEG; + PRBool bHandleGIF; + PRBool bHandleJS; + PRBool bHandleXBM; + PRBool bHandleTXT; + }; + // "Active desktop" stuff. + struct { + PRBool bUseInternetKeywords; + PRBool bUseNetcenterSearch; + PRBool bDisableActiveDesktop; + }; + }; + + // GetPreferences - Returns Prefs structure filled in with user's preferences. + NS_IMETHOD GetPreferences( Prefs &prefs ) = 0; + + // SetPreferences - Sets user preferences from Prefs structure contents. + NS_IMETHOD SetPreferences( const Prefs &prefs ) = 0; + + // Things - enumeration of protocols/files that Mozilla can handle. + enum Thing { + kHTTP, kHTTPS, kFTP, kMaxProtocol = kFTP, + kHTML, kJPEG, kGIF, kJS, kXBM, kTXT, kMaxFileType = kTXT, + kInternetKeywords, kNetcenterSearch, kActiveDesktop + }; + + // IsHandling - returns whether Mozilla is handling a given thing. + NS_IMETHOD_(PRBool) IsHandling( Thing thing ) = 0; + + // StartHandling - does necessary stuff to have Mozilla take over handling of a + // given thing. + NS_IMETHOD StartHandling( Thing extOrProtocol ) = 0; + + // StopHandling - vice versa + NS_IMETHOD StopHandling( Thing extOrProtocol ) = 0; + + // HandlePerPreferences - Apply preferences to registry. + NS_IMETHOD HandlePerPreferences() = 0; }; #endif // _NSIDEFAULTBROWSER_H_ diff --git a/mozilla/cmd/winfe/nsapp.cpp b/mozilla/cmd/winfe/nsapp.cpp index 9ea63be890d..8b56f8a3030 100644 --- a/mozilla/cmd/winfe/nsapp.cpp +++ b/mozilla/cmd/winfe/nsapp.cpp @@ -642,15 +642,14 @@ void CNetscapeApp::CheckDefaultBrowser() { // We're only worrying about this for Win32 #ifdef XP_WIN32 - - // Construct the App's owned and lost list. Used to determine exactly which - // file types were lost. This construction should perform the comparison and - // update the lost list. The result will be written out to the registry. - m_OwnedAndLostList.ConstructLists(); + + XP_Bool prefBool = FALSE; + + PREF_GetBoolPref("browser.wfe.ignore_def_check",&prefBool); - MakeDefaultBrowser(); - - m_OwnedAndLostList.WriteLists(); + if ( !prefBool ) { + MakeDefaultBrowser(); + } #endif // XP_WIN32 } // END OF FUNCTION CNetscapeApp::CheckDefaultBrowser() diff --git a/mozilla/cmd/winfe/prefs.cpp b/mozilla/cmd/winfe/prefs.cpp index 49497a02f05..38075bb0792 100644 --- a/mozilla/cmd/winfe/prefs.cpp +++ b/mozilla/cmd/winfe/prefs.cpp @@ -26,6 +26,7 @@ #include "winprefs/isppageo.h" #include "winprefs/brprefid.h" #include "winprefs/wprefid.h" +#include "nsIDefaultBrowser.h" #ifdef MOZ_LOC_INDEP #include "winprefs/liprefid.h" #include "winprefs/iliprefs.h" @@ -2370,7 +2371,12 @@ wfe_DisplayPreferences(CGenericFrame *pFrame) CLSCTX_INPROC_SERVER, IID_ISpecifyPropertyPageObjects, (LPVOID *)&categories[nCategories]))) { - nDesktopCategory = nCategories++; + IWindowsPrefs *pWinPrefs; + if( SUCCEEDED( categories[nCategories]->QueryInterface( IID_IWindowsPrefs, (LPVOID*)&pWinPrefs ) ) ) { + pWinPrefs->SetDefaultBrowser( nsIDefaultBrowser::GetInterface() ); + pWinPrefs->Release(); + nDesktopCategory = nCategories++; + } } else { // Register DLL and try again. RegisterCLSIDForDll( "winpref.dll" ); @@ -2379,7 +2385,12 @@ wfe_DisplayPreferences(CGenericFrame *pFrame) CLSCTX_INPROC_SERVER, IID_ISpecifyPropertyPageObjects, (LPVOID *)&categories[nCategories]))) { - nDesktopCategory = nCategories++; + IWindowsPrefs *pWinPrefs; + if( SUCCEEDED( categories[nCategories]->QueryInterface( IID_IWindowsPrefs, (LPVOID*)&pWinPrefs ) ) ) { + pWinPrefs->SetDefaultBrowser( nsIDefaultBrowser::GetInterface() ); + pWinPrefs->Release(); + nDesktopCategory = nCategories++; + } } } diff --git a/mozilla/cmd/winfe/prefs/winpref/public/wprefid.h b/mozilla/cmd/winfe/prefs/winpref/public/wprefid.h index dc08683acfe..130f9dcf760 100644 --- a/mozilla/cmd/winfe/prefs/winpref/public/wprefid.h +++ b/mozilla/cmd/winfe/prefs/winpref/public/wprefid.h @@ -19,8 +19,6 @@ #ifndef __WPREFID_H_ #define __WPREFID_H_ -#ifndef MOZ_COMMUNICATOR_IIDS - // {464DC700-2727-11d2-8043-00600811A9C3} DEFINE_GUID(IID_IWindowsPrefs, 0x464dc700, 0x2727, 0x11d2, 0x80, 0x43, 0x0, 0x60, 0x8, 0x11, 0xa9, 0xc3); @@ -29,16 +27,18 @@ DEFINE_GUID(IID_IWindowsPrefs, DEFINE_GUID(CLSID_WindowsPrefs, 0x464dc701, 0x2727, 0x11d2, 0x80, 0x43, 0x0, 0x60, 0x8, 0x11, 0xa9, 0xc3); -#else /* MOZ_COMMUNICATOR_IIDS */ +class nsIDefaultBrowser; -// {464DC700-2727-11d2-8043-00600811A9C3} -DEFINE_GUID(IID_IWindowsPrefs, -0x464dc700, 0x2727, 0x11d2, 0x80, 0x43, 0x0, 0x60, 0x8, 0x11, 0xa9, 0xc3); +// IWindowsPrefs +DECLARE_INTERFACE_(IWindowsPrefs, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; -// {464DC701-2727-11d2-8043-00600811A9C3} -DEFINE_GUID(CLSID_WindowsPrefs, -0x464dc701, 0x2727, 0x11d2, 0x80, 0x43, 0x0, 0x60, 0x8, 0x11, 0xa9, 0xc3); - -#endif /* MOZ_COMMUNICATOR_IIDS */ + // IWindowsPrefs methods + STDMETHOD(SetDefaultBrowser)(THIS_ nsIDefaultBrowser* pDefaultBrowser) PURE; +}; #endif /* __WPREFID_H_ */ diff --git a/mozilla/cmd/winfe/prefs/winpref/src/makefile.win b/mozilla/cmd/winfe/prefs/winpref/src/makefile.win index 98a98310b7a..f8969e33514 100644 --- a/mozilla/cmd/winfe/prefs/winpref/src/makefile.win +++ b/mozilla/cmd/winfe/prefs/winpref/src/makefile.win @@ -50,7 +50,7 @@ CPP_OBJS=.\$(OBJDIR)\winpref.obj .\$(OBJDIR)\winpages.obj LINCS=-I$(XPDIST)\public\dllcom -I$(XPDIST)\public\winprefs \ -I$(XPDIST)\public\pref -I$(XPDIST)\public\dbm \ -I$(XPDIST)\public\nspr -I$(XPDIST)\public\js \ - -I$(XPDIST)\public\libreg + -I$(XPDIST)\public\libreg -I$(DEPTH)\cmd\winfe -I$(XPDIST)\public\xpcom !include "$(DEPTH)\config\rules.mak" diff --git a/mozilla/cmd/winfe/prefs/winpref/src/pages.h b/mozilla/cmd/winfe/prefs/winpref/src/pages.h index 595298ae91a..2d02313f4de 100644 --- a/mozilla/cmd/winfe/prefs/winpref/src/pages.h +++ b/mozilla/cmd/winfe/prefs/winpref/src/pages.h @@ -22,6 +22,8 @@ #include "cppageex.h" #include "xp_list.h" +#include "nsIDefaultBrowser.h" + //also in brpref\src\advpages.cpp, winfe\mnprefs.cpp #define WINPREF_PrefIsLocked(pPrefName) PREF_PrefIsLocked(pPrefName) @@ -37,7 +39,8 @@ PREF_GetStringPref(LPCSTR lpszPref, CString &str); class CBasicWindowsPrefs : public CPropertyPageEx { public: - CBasicWindowsPrefs(); + CBasicWindowsPrefs(nsIDefaultBrowser *pDefaultBrowser); + ~CBasicWindowsPrefs(); protected: BOOL InitDialog(); @@ -50,7 +53,10 @@ class CBasicWindowsPrefs : public CPropertyPageEx { BOOL OnCommand(int id, HWND hwndCtl, UINT notifyCode); private: - + nsIDefaultBrowser* m_pDefaultBrowser; + BOOL m_bCheckOnStart; + nsIDefaultBrowser::Prefs m_originalPrefs; + nsIDefaultBrowser::Prefs m_currentPrefs; }; #endif /* __PAGES_H_ */ diff --git a/mozilla/cmd/winfe/prefs/winpref/src/winpages.cpp b/mozilla/cmd/winfe/prefs/winpref/src/winpages.cpp index 4e1ffd5c67e..24b99870b99 100644 --- a/mozilla/cmd/winfe/prefs/winpref/src/winpages.cpp +++ b/mozilla/cmd/winfe/prefs/winpref/src/winpages.cpp @@ -26,23 +26,38 @@ #include "structs.h" #include "xp_help.h" +#include "nsIDefaultBrowser.h" + ///////////////////////////////////////////////////////////////////////////// // CBasicWindowsPrefs implementation -CBasicWindowsPrefs::CBasicWindowsPrefs() - : CPropertyPageEx(CComDll::m_hInstance, IDD_BASICWINPREFS, "" ) { +CBasicWindowsPrefs::CBasicWindowsPrefs(nsIDefaultBrowser*pDefaultBrowser) + : CPropertyPageEx(CComDll::m_hInstance, IDD_BASICWINPREFS, "" ), + m_pDefaultBrowser( pDefaultBrowser ) { // Set member data using XP preferences + assert( m_pDefaultBrowser ); +} + +CBasicWindowsPrefs::~CBasicWindowsPrefs() { + m_pDefaultBrowser->Release(); } BOOL CBasicWindowsPrefs::InitDialog() { - // Check for locked preferences - return CPropertyPageEx::InitDialog(); } STDMETHODIMP CBasicWindowsPrefs::Activate(HWND hwndParent, LPCRECT lprc, BOOL bModal) { if (!m_bHasBeenActivated) { + // Get user preferences and remember them. + nsresult result = m_pDefaultBrowser->GetPreferences( m_originalPrefs ); + assert( result == NS_OK ); + + BOOL bIgnore = FALSE; + PREF_GetBoolPref( "browser.wfe.ignore_def_check", &bIgnore ); + m_bCheckOnStart = !bIgnore; + + m_currentPrefs = m_originalPrefs; } return CPropertyPageEx::Activate(hwndParent, lprc, bModal); @@ -50,11 +65,32 @@ STDMETHODIMP CBasicWindowsPrefs::Activate(HWND hwndParent, LPCRECT lprc, BOOL bM BOOL CBasicWindowsPrefs::DoTransfer(BOOL bSaveAndValidate) { + // Synchronize dialog checkboxes from current preferences. + CheckBoxTransfer( IDC_HANDLEFILES, m_currentPrefs.bHandleFiles, bSaveAndValidate ); + CheckBoxTransfer( IDC_HANDLESHORTCUTS, m_currentPrefs.bHandleShortcuts, bSaveAndValidate ); + CheckBoxTransfer( IDC_INTEGRATEWITHACTIVEDESKTOP, m_currentPrefs.bIntegrateWithActiveDesktop, bSaveAndValidate ); + CheckBoxTransfer( IDC_CHECKONSTART, m_bCheckOnStart, bSaveAndValidate ); + return TRUE; } BOOL CBasicWindowsPrefs::ApplyChanges() { + // Set "ignore on start" pref based on "check on start" status. + BOOL bIgnore = !m_bCheckOnStart; + PREF_SetBoolPref( "browser.wfe.ignore_def_check", bIgnore ); + + // If other prefs changed, store them. + if ( XP_MEMCMP( &m_currentPrefs, &m_originalPrefs, sizeof( nsIDefaultBrowser::Prefs ) ) != 0 ) { + // Store them in registry. + nsresult result = m_pDefaultBrowser->SetPreferences( m_currentPrefs ); + assert( result == NS_OK ); + + // Apply those preferences. + result = m_pDefaultBrowser->HandlePerPreferences(); + assert( result == NS_OK ); + } + return TRUE; } @@ -65,20 +101,46 @@ LRESULT CBasicWindowsPrefs::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam) class CWinPrefDialog : public CDialog { public: - CWinPrefDialog( int id ); + CWinPrefDialog( int id, nsIDefaultBrowser::Prefs &prefs ); protected: - BOOL InitDialog() { return TRUE; } - BOOL DoTransfer(BOOL bSaveAndValidate) { return TRUE; } + BOOL DoTransfer(BOOL bSaveAndValidate); - // Event processing - void OnOK() { return; } - private: + nsIDefaultBrowser::Prefs &m_prefs; }; -CWinPrefDialog::CWinPrefDialog( int id ) - : CDialog( CComDll::m_hInstance, id ) { +CWinPrefDialog::CWinPrefDialog( int id, nsIDefaultBrowser::Prefs &prefs ) + : CDialog( CComDll::m_hInstance, id ), m_prefs( prefs ) { +} + +CWinPrefDialog::DoTransfer( BOOL bSaveAndValidate ) { + switch( m_nTemplateID ) { + case IDD_WINFILETYPES: + CheckBoxTransfer( IDC_HANDLEHTML, m_prefs.bHandleHTML, bSaveAndValidate ); + CheckBoxTransfer( IDC_HANDLEJPEG, m_prefs.bHandleJPEG, bSaveAndValidate ); + CheckBoxTransfer( IDC_HANDLEGIF, m_prefs.bHandleGIF, bSaveAndValidate ); + CheckBoxTransfer( IDC_HANDLEJS, m_prefs.bHandleJS, bSaveAndValidate ); + CheckBoxTransfer( IDC_HANDLEXBM, m_prefs.bHandleXBM, bSaveAndValidate ); + CheckBoxTransfer( IDC_HANDLETXT, m_prefs.bHandleTXT, bSaveAndValidate ); + break; + + case IDD_WINSHORTCUTTYPES: + CheckBoxTransfer( IDC_HANDLEHTTP, m_prefs.bHandleHTTP, bSaveAndValidate ); + CheckBoxTransfer( IDC_HANDLESHTTP, m_prefs.bHandleHTTPS, bSaveAndValidate ); + CheckBoxTransfer( IDC_HANDLEFTP, m_prefs.bHandleFTP, bSaveAndValidate ); + break; + + case IDD_WINACTIVEDESKTOPSETTINGS: + CheckBoxTransfer( IDC_USEINTERNETKEYWORDS, m_prefs.bUseInternetKeywords, bSaveAndValidate ); + CheckBoxTransfer( IDC_USENETCENTERSEARCH, m_prefs.bUseNetcenterSearch, bSaveAndValidate ); + CheckBoxTransfer( IDC_DISABLEACTIVEDESKTOP, m_prefs.bDisableActiveDesktop, bSaveAndValidate ); + break; + + default: + break; + } + return TRUE; } BOOL CBasicWindowsPrefs::OnCommand(int id, HWND hwndCtl, UINT notifyCode) @@ -90,7 +152,7 @@ BOOL CBasicWindowsPrefs::OnCommand(int id, HWND hwndCtl, UINT notifyCode) case IDD_WINSHORTCUTTYPES: case IDD_WINACTIVEDESKTOPSETTINGS: { - CWinPrefDialog dialog( id ); + CWinPrefDialog dialog( id, m_currentPrefs ); dialog.DoModal(GetParent(m_hwndDlg)); } break; diff --git a/mozilla/cmd/winfe/prefs/winpref/src/winpref.cpp b/mozilla/cmd/winfe/prefs/winpref/src/winpref.cpp index 5688d9e7670..9fb21f5bc74 100644 --- a/mozilla/cmd/winfe/prefs/winpref/src/winpref.cpp +++ b/mozilla/cmd/winfe/prefs/winpref/src/winpref.cpp @@ -22,6 +22,7 @@ #include "wprefid.h" #include "prefuiid.h" #include "isppageo.h" +#include "nsIDefaultBrowser.h" #include // Create a new instance of our derived class and return it. @@ -35,7 +36,7 @@ DLL_ConsumerCreateInstance() // CSpecifyPropertyPageObjects // Abstract class that supports aggregation as an inner object -class CCategory : public IUnknown { +class CCategory : public IWindowsPrefs { public: CCategory(); @@ -44,6 +45,9 @@ class CCategory : public IUnknown { STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); + // IWindowsPrefs methods. + STDMETHODIMP SetDefaultBrowser(nsIDefaultBrowser* pDefaultBrowser) PURE; + public: // Abstract nested class that implements ISpecifyPropertyPageObjects class CSpecifyPageObjects : public ISpecifyPropertyPageObjects { @@ -136,27 +140,42 @@ CCategory::CSpecifyPageObjects::Release() class CWindowsCategory : public CCategory { public: CWindowsCategory(LPUNKNOWN pUnkOuter); + ~CWindowsCategory(); // IUnknown methods. Doesn't delegate (explicit IUnknown) STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR* ppvObj); + // IwindowsPrefs methods. + STDMETHODIMP SetDefaultBrowser(nsIDefaultBrowser* pDefaultBrowser); + private: class CSpecifyWindowsPageObjects : public CCategory::CSpecifyPageObjects { public: CSpecifyWindowsPageObjects(CCategory *pBackObj, LPUNKNOWN pUnkOuter); + ~CSpecifyWindowsPageObjects(); // ISpecifyPropertyPageObjects methods STDMETHODIMP GetPageObjects(CAPPAGE *pPages); + + // nsIDefaultBrowser interface pointer. + nsIDefaultBrowser* m_pDefaultBrowser; }; CSpecifyWindowsPageObjects m_innerObj; + nsIDefaultBrowser* m_pDefaultBrowser; }; CWindowsCategory::CWindowsCategory(LPUNKNOWN pUnkOuter) - : m_innerObj(this, pUnkOuter) + : m_innerObj(this, pUnkOuter), m_pDefaultBrowser(NULL) { } +CWindowsCategory::~CWindowsCategory() { + if ( m_pDefaultBrowser ) { + m_pDefaultBrowser->Release(); + } +} + STDMETHODIMP CWindowsCategory::QueryInterface(REFIID riid, LPVOID FAR* ppvObj) { @@ -164,6 +183,11 @@ CWindowsCategory::QueryInterface(REFIID riid, LPVOID FAR* ppvObj) *ppvObj = (LPVOID)this; AddRef(); return NOERROR; + + } else if (riid == IID_IWindowsPrefs) { + *ppvObj = (LPVOID)(IWindowsPrefs*)this; + AddRef(); + return NOERROR; } else if (riid == IID_ISpecifyPropertyPageObjects) { *ppvObj = (LPVOID)&m_innerObj; @@ -176,11 +200,30 @@ CWindowsCategory::QueryInterface(REFIID riid, LPVOID FAR* ppvObj) } } +STDMETHODIMP +CWindowsCategory::SetDefaultBrowser(nsIDefaultBrowser* pDefaultBrowser) { + m_pDefaultBrowser = pDefaultBrowser; + if ( m_pDefaultBrowser ) { + // Once for me. + m_pDefaultBrowser->AddRef(); + // Once for my inner 'self'. + m_innerObj.m_pDefaultBrowser = m_pDefaultBrowser; + m_innerObj.m_pDefaultBrowser->AddRef(); + } + return NOERROR; +} + CWindowsCategory::CSpecifyWindowsPageObjects::CSpecifyWindowsPageObjects(CCategory *pBackObj, LPUNKNOWN pUnkOuter) - : CSpecifyPageObjects(pBackObj, pUnkOuter) + : CSpecifyPageObjects(pBackObj, pUnkOuter), m_pDefaultBrowser(NULL) { } +CWindowsCategory::CSpecifyWindowsPageObjects::~CSpecifyWindowsPageObjects() { + if ( m_pDefaultBrowser ) { + m_pDefaultBrowser->Release(); + } +} + STDMETHODIMP CWindowsCategory::CSpecifyWindowsPageObjects::GetPageObjects(CAPPAGE *pPages) { @@ -192,7 +235,9 @@ CWindowsCategory::CSpecifyWindowsPageObjects::GetPageObjects(CAPPAGE *pPages) if (!pPages->pElems) return ResultFromScode(E_OUTOFMEMORY); - pPages->pElems[0] = new CBasicWindowsPrefs; + assert( m_pDefaultBrowser ); + + pPages->pElems[0] = new CBasicWindowsPrefs(m_pDefaultBrowser); for (ULONG i = 0; i < pPages->cElems; i++) pPages->pElems[i]->AddRef();