Updates and bug fixes based on feedback of initial prefservice and prefbranch feedback.

This commit is contained in:
bnesse%netscape.com 2001-03-29 00:48:30 +00:00
Родитель b70c603830
Коммит 9564dfc0a3
5 изменённых файлов: 232 добавлений и 85 удалений

Просмотреть файл

@ -28,16 +28,16 @@
[scriptable, uuid(56c35506-f14b-11d3-99d3-ddbfac2ccf65)]
interface nsIPrefBranch : nsISupports
{
const long ePrefInvalid = 0;
const long ePrefLocked = 1;
const long ePrefUserset = 2;
const long ePrefConfig = 4;
const long ePrefRemote = 8;
const long ePrefLilocal = 16;
const long ePrefString = 32;
const long ePrefInt = 64;
const long ePrefBool = 128;
const long ePrefValuetypeMask = (ePrefString | ePrefInt | ePrefBool);
const long PREF_INVALID = 0;
const long PREF_LOCKED = 1;
const long PREF_USER_SET = 2;
const long PREF_CONFIG = 4;
const long PREF_REMOTE = 8;
const long PREF_LI_LOCAL = 16;
const long PREF_STRING = 32;
const long PREF_INT = 64;
const long PREF_BOOL = 128;
const long PREF_VALUE_TYPE_MASK = (PREF_STRING | PREF_INT | PREF_BOOL);
/*
* the root of this branch, such as "browser."
@ -77,14 +77,6 @@ interface nsIPrefBranch : nsISupports
* branch-level operations
*/
/*
* clearBranch
*
* clears all user preferences starting at the given preference prefix
* pass in null or "" to clear this branch
*/
void clearBranch(in string aStartingAt);
/*
* deleteBranch
*
@ -106,43 +98,20 @@ interface nsIPrefBranch : nsISupports
out unsigned long aCount,
[array, size_is(aCount), retval] out string aChildArray);
/*
* Listeners
* resetBranch
*
* clears all user preferences starting at the given preference prefix
* pass in null or "" to clear this branch
*/
/*
* The observers have their |Observe| methods called with
* ([the observer], "nsPref:changed", [pref name]).
*/
void addObserver(in string aDomain, in nsIObserver aObserver);
void removeObserver(in string aDomain, in nsIObserver aObserver);
void resetBranch(in string aStartingAt);
};
/*
* nsIPrefLocalizedString is simply a wrapper for nsISupportsWString so we can have a unique
* identifier to distinguish between requests for normal wstrings and localized wstrings
*/
[scriptable, uuid(ae419e24-1dd1-11b2-b39a-d3e5e7073802)]
interface nsIPrefLocalizedString : nsISupports
{
attribute wstring data;
wstring toString();
// do not include space for null termination in |length|. It is handled
// internally. |length| is in characters, not in bytes.
void setDataWithLength(in unsigned long length,
[size_is(length)] in wstring data);
};
%{C++
#define NS_PREFBRANCH_CONTRACTID "@mozilla.org/preferencesbranch;1"
#define NS_PREFBRANCH_CLASSNAME "Preferences Branch"
#define NS_SUPPORTS_PREFLOCALIZEDSTRING_CONTRACTID "@mozilla.org/supports-preflocalizedstring;1"
#define NS_SUPPORTS_PREFLOCALIZEDSTRING_CLASSNAME "Supports PrefLocalizedString"
%}

Просмотреть файл

@ -30,11 +30,11 @@
interface nsIPrefService : nsISupports
{
/*
* ReadCFGFile
* readConfigFile
*
* identify and read the configuration (.cfg) file
*/
void readCFGFile();
void readConfigFile();
/*
* readUserPrefs
@ -75,6 +75,14 @@ interface nsIPrefService : nsISupports
%{C++
#define NS_PREFSERVICE_CID \
{ /* {1cd91b88-1dd2-11b2-92e1-ed22ed298000} */ \
0x1cd91b88, \
0x1dd2, \
0x11b2, \
{ 0x92, 0xe1, 0xed, 0x22, 0xed, 0x29, 0x80, 0x00 } \
}
#define NS_PREFSERVICE_CONTRACTID "@mozilla.org/preferences-service;1"
#define NS_PREFSERVICE_CLASSNAME "Preferences Server"

Просмотреть файл

@ -76,7 +76,9 @@ static nsresult _convertRes(int res)
#pragma mark -
NS_IMPL_ISUPPORTS1(nsPrefBranch, nsIPrefBranch)
/*
* Constructor/Destructor
*/
nsPrefBranch::nsPrefBranch(const char *aPrefRoot, PRBool aDefaultBranch)
: mObservers(nsnull)
@ -118,6 +120,25 @@ nsPrefBranch::~nsPrefBranch()
}
}
/*
* nsISupports Implementation
*/
NS_IMPL_THREADSAFE_ADDREF(nsPrefBranch)
NS_IMPL_THREADSAFE_RELEASE(nsPrefBranch)
NS_INTERFACE_MAP_BEGIN(nsPrefBranch)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIPrefBranch)
NS_INTERFACE_MAP_ENTRY(nsIPrefBranch)
NS_INTERFACE_MAP_ENTRY(nsIPrefBranchInternal)
NS_INTERFACE_MAP_END
/*
* nsIPrefBranch Implementation
*/
NS_IMETHODIMP nsPrefBranch::GetRoot(char * *aRoot)
{
NS_ENSURE_ARG_POINTER(aRoot);
@ -135,53 +156,99 @@ NS_IMETHODIMP nsPrefBranch::GetPrefType(const char *aPrefName, PRInt32 *_retval)
NS_IMETHODIMP nsPrefBranch::GetBoolPref(const char *aPrefName, PRBool *_retval)
{
return _convertRes(PREF_GetBoolPref(getPrefName(aPrefName), _retval, mIsDefault));
const char *pref = getPrefName(aPrefName);
nsresult rv;
rv = QueryObserver(pref);
if (NS_SUCCEEDED(rv)) {
rv = _convertRes(PREF_GetBoolPref(pref, _retval, mIsDefault));
}
return rv;
}
NS_IMETHODIMP nsPrefBranch::SetBoolPref(const char *aPrefName, PRInt32 aValue)
{
if (PR_FALSE == mIsDefault) {
return _convertRes(PREF_SetBoolPref(getPrefName(aPrefName), aValue));
} else {
return _convertRes(PREF_SetDefaultBoolPref(getPrefName(aPrefName), aValue));
const char *pref = getPrefName(aPrefName);
nsresult rv;
rv = QueryObserver(pref);
if (NS_SUCCEEDED(rv)) {
if (PR_FALSE == mIsDefault) {
rv = _convertRes(PREF_SetBoolPref(pref, aValue));
} else {
rv = _convertRes(PREF_SetDefaultBoolPref(pref, aValue));
}
}
return rv;
}
NS_IMETHODIMP nsPrefBranch::GetCharPref(const char *aPrefName, char **_retval)
{
return _convertRes(PREF_CopyCharPref(getPrefName(aPrefName), _retval, mIsDefault));
const char *pref = getPrefName(aPrefName);
nsresult rv;
rv = QueryObserver(pref);
if (NS_SUCCEEDED(rv)) {
rv = _convertRes(PREF_CopyCharPref(pref, _retval, mIsDefault));
}
return rv;
}
NS_IMETHODIMP nsPrefBranch::SetCharPref(const char *aPrefName, const char *aValue)
{
if (PR_FALSE == mIsDefault) {
return _convertRes(PREF_SetCharPref(getPrefName(aPrefName), aValue));
} else {
return _convertRes(PREF_SetDefaultCharPref(getPrefName(aPrefName), aValue));
const char *pref = getPrefName(aPrefName);
nsresult rv;
rv = QueryObserver(pref);
if (NS_SUCCEEDED(rv)) {
if (PR_FALSE == mIsDefault) {
rv = _convertRes(PREF_SetCharPref(pref, aValue));
} else {
rv = _convertRes(PREF_SetDefaultCharPref(pref, aValue));
}
}
return rv;
}
NS_IMETHODIMP nsPrefBranch::GetIntPref(const char *aPrefName, PRInt32 *_retval)
{
return _convertRes(PREF_GetIntPref(getPrefName(aPrefName), _retval, mIsDefault));
const char *pref = getPrefName(aPrefName);
nsresult rv;
rv = QueryObserver(pref);
if (NS_SUCCEEDED(rv)) {
rv = _convertRes(PREF_GetIntPref(pref, _retval, mIsDefault));
}
return rv;
}
NS_IMETHODIMP nsPrefBranch::SetIntPref(const char *aPrefName, PRInt32 aValue)
{
if (PR_FALSE == mIsDefault) {
return _convertRes(PREF_SetIntPref(getPrefName(aPrefName), aValue));
} else {
return _convertRes(PREF_SetDefaultIntPref(getPrefName(aPrefName), aValue));
const char *pref = getPrefName(aPrefName);
nsresult rv;
rv = QueryObserver(pref);
if (NS_SUCCEEDED(rv)) {
if (PR_FALSE == mIsDefault) {
rv = _convertRes(PREF_SetIntPref(pref, aValue));
} else {
rv = _convertRes(PREF_SetDefaultIntPref(pref, aValue));
}
}
return rv;
}
NS_IMETHODIMP nsPrefBranch::GetComplexValue(const char *aPrefName, const nsIID & aType, void * *_retval)
{
const char *pref = getPrefName(aPrefName);
nsresult rv;
nsXPIDLCString utf8String;
// if we can't get the pref, there's no point in being here
rv = GetCharPref(getPrefName(aPrefName), getter_Copies(utf8String));
rv = QueryObserver(pref);
if (NS_SUCCEEDED(rv)) {
rv = GetCharPref(pref, getter_Copies(utf8String));
}
if (NS_FAILED(rv)) {
return rv;
}
@ -260,7 +327,14 @@ NS_IMETHODIMP nsPrefBranch::GetComplexValue(const char *aPrefName, const nsIID &
NS_IMETHODIMP nsPrefBranch::SetComplexValue(const char *aPrefName, const nsIID & aType, nsISupports *aValue)
{
nsresult rv;
const char *pref = getPrefName(aPrefName);
nsresult rv;
// if we can't get the pref, there's no point in being here
rv = QueryObserver(pref);
if (NS_FAILED(rv)) {
return rv;
}
if (aType.Equals(NS_GET_IID(nsILocalFile))) {
nsCOMPtr<nsILocalFile> file = do_QueryInterface(aValue);
@ -268,7 +342,7 @@ NS_IMETHODIMP nsPrefBranch::SetComplexValue(const char *aPrefName, const nsIID &
rv = file->GetPersistentDescriptor(getter_Copies(descriptorString));
if (NS_SUCCEEDED(rv)) {
rv = SetCharPref(getPrefName(aPrefName), descriptorString);
rv = SetCharPref(pref, descriptorString);
}
return rv;
}
@ -281,7 +355,7 @@ NS_IMETHODIMP nsPrefBranch::SetComplexValue(const char *aPrefName, const nsIID &
rv = theString->GetData(getter_Copies(wideString));
if (NS_SUCCEEDED(rv)) {
rv = SetCharPref(getPrefName(aPrefName), NS_ConvertUCS2toUTF8(wideString).get());
rv = SetCharPref(pref, NS_ConvertUCS2toUTF8(wideString).get());
}
}
return rv;
@ -295,7 +369,7 @@ NS_IMETHODIMP nsPrefBranch::SetComplexValue(const char *aPrefName, const nsIID &
rv = theString->GetData(getter_Copies(wideString));
if (NS_SUCCEEDED(rv)) {
rv = SetCharPref(getPrefName(aPrefName), NS_ConvertUCS2toUTF8(wideString).get());
rv = SetCharPref(pref, NS_ConvertUCS2toUTF8(wideString).get());
}
}
return rv;
@ -308,7 +382,7 @@ NS_IMETHODIMP nsPrefBranch::SetComplexValue(const char *aPrefName, const nsIID &
rv = file->GetPersistentDescriptorString(getter_Copies(descriptorString));
if (NS_SUCCEEDED(rv)) {
rv = SetCharPref(getPrefName(aPrefName), descriptorString);
rv = SetCharPref(pref, descriptorString);
}
return rv;
}
@ -319,31 +393,58 @@ NS_IMETHODIMP nsPrefBranch::SetComplexValue(const char *aPrefName, const nsIID &
NS_IMETHODIMP nsPrefBranch::ClearUserPref(const char *aPrefName)
{
return _convertRes(PREF_ClearUserPref(getPrefName(aPrefName)));
const char *pref = getPrefName(aPrefName);
nsresult rv;
rv = QueryObserver(pref);
if (NS_SUCCEEDED(rv)) {
rv = _convertRes(PREF_ClearUserPref(pref));
}
return rv;
}
NS_IMETHODIMP nsPrefBranch::LockPref(const char *aPrefName)
{
return _convertRes(PREF_LockPref(getPrefName(aPrefName)));
const char *pref = getPrefName(aPrefName);
nsresult rv;
rv = QueryObserver(pref);
if (NS_SUCCEEDED(rv)) {
rv = _convertRes(PREF_LockPref(pref));
}
return rv;
}
NS_IMETHODIMP nsPrefBranch::PrefIsLocked(const char *aPrefName, PRBool *_retval)
{
const char *pref = getPrefName(aPrefName);
nsresult rv;
NS_ENSURE_ARG_POINTER(_retval);
*_retval = PREF_PrefIsLocked(getPrefName(aPrefName));
return NS_OK;
rv = QueryObserver(pref);
if (NS_SUCCEEDED(rv)) {
*_retval = PREF_PrefIsLocked(pref);
}
return rv;
}
NS_IMETHODIMP nsPrefBranch::UnlockPref(const char *aPrefName)
{
return _convertRes(pref_UnlockPref(getPrefName(aPrefName)));
const char *pref = getPrefName(aPrefName);
nsresult rv;
rv = QueryObserver(pref);
if (NS_SUCCEEDED(rv)) {
rv = _convertRes(pref_UnlockPref(pref));
}
return rv;
}
/* void clearBranch (in string startingAt); */
NS_IMETHODIMP nsPrefBranch::ClearBranch(const char *aStartingAt)
/* void resetBranch (in string startingAt); */
NS_IMETHODIMP nsPrefBranch::ResetBranch(const char *aStartingAt)
{
return NS_ERROR_NOT_IMPLEMENTED;
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP nsPrefBranch::DeleteBranch(const char *aStartingAt)

Просмотреть файл

@ -24,16 +24,19 @@
#include "nsCOMPtr.h"
#include "nsIPrefBranch.h"
#include "nsIPrefBranchInternal.h"
#include "nsIPrefLocalizedString.h"
#include "nsISupportsArray.h"
#include "nsISupportsPrimitives.h"
#include "nsString.h"
#include "nsVoidArray.h"
class nsPrefBranch : public nsIPrefBranch
class nsPrefBranch : public nsIPrefBranchInternal
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIPREFBRANCH
NS_DECL_NSIPREFBRANCHINTERNAL
nsPrefBranch(const char *aPrefRoot, PRBool aDefaultBranch);
virtual ~nsPrefBranch();

Просмотреть файл

@ -23,7 +23,6 @@
#include "nsPrefService.h"
#include "jsapi.h"
#include "nsIGenericFactory.h"
#include "nsIObserverService.h"
#include "nsIProfileChangeStatus.h"
#include "nsISignatureVerifier.h"
@ -65,9 +64,12 @@ static nsresult savePrefFile(nsIFile* aFile);
NS_IMPL_ISUPPORTS3(nsPrefService, nsIPrefService, nsIObserver, nsIPrefBranch);
/*
* Constructor/Destructor
*/
nsPrefService::nsPrefService()
: mCurrentFile(nsnull)
{
nsPrefBranch *rootBranch;
@ -93,11 +95,31 @@ nsPrefService::~nsPrefService()
}
}
/*
* nsISupports Implementation
*/
NS_IMPL_THREADSAFE_ADDREF(nsPrefService)
NS_IMPL_THREADSAFE_RELEASE(nsPrefService)
NS_INTERFACE_MAP_BEGIN(nsPrefService)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIPrefService)
NS_INTERFACE_MAP_ENTRY(nsIPrefService)
NS_INTERFACE_MAP_ENTRY(nsIObserver)
NS_INTERFACE_MAP_ENTRY(nsIPrefBranch)
NS_INTERFACE_MAP_END
/*
* nsIPrefService Implementation
*/
NS_IMETHODIMP nsPrefService::Init()
{
nsresult rv;
nsresult rv = NS_OK;
if (PREF_Init(nsnull) == NS_OK) {
if (PREF_Init(nsnull) == PR_TRUE) {
NS_WITH_SERVICE(nsIObserverService, observerService, NS_OBSERVERSERVICE_CONTRACTID, &rv);
if (observerService) {
// Our refcnt must be > 0 when we call this, or we'll get deleted!
@ -134,7 +156,7 @@ NS_IMETHODIMP nsPrefService::Observe(nsISupports *aSubject, const PRUnichar *aTo
return rv;
}
NS_IMETHODIMP nsPrefService::ReadCFGFile()
NS_IMETHODIMP nsPrefService::ReadConfigFile()
{
nsresult rv = NS_OK;
PRUint32 fileNameLen;
@ -263,6 +285,51 @@ NS_IMETHODIMP nsPrefService::GetDefaultBranch(const char *aPrefRoot, nsIPrefBran
#pragma mark -
nsresult nsPrefService::useDefaultPrefFile()
{
nsresult rv;
nsCOMPtr<nsIFile> aFile;
// Anything which calls NS_InitXPCOM will have this
rv = NS_GetSpecialDirectory(NS_APP_PREFS_50_FILE, getter_AddRefs(aFile));
if (!aFile) {
// We know we have XPCOM directory services, but we might not have a provider which
// knows about NS_APP_PREFS_50_FILE. Put the file in NS_XPCOM_CURRENT_PROCESS_DIR.
rv = NS_GetSpecialDirectory(NS_XPCOM_CURRENT_PROCESS_DIR, getter_AddRefs(aFile));
if (NS_FAILED(rv)) return rv;
rv = aFile->Append("default_prefs.js");
if (NS_FAILED(rv)) return rv;
}
rv = ReadUserPrefs(aFile);
if (NS_SUCCEEDED(rv)) {
return rv;
}
// need to save the prefs now
rv = SavePrefFile(aFile);
return rv;
}
nsresult nsPrefService::useUserPrefFile()
{
nsresult rv = NS_OK;
nsCOMPtr<nsIFile> aFile;
static const char* userFiles[] = {"user.js"};
rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(aFile));
if (NS_SUCCEEDED(rv) && aFile) {
rv = aFile->Append(userFiles[0]);
if (NS_SUCCEEDED(rv)) {
rv = openPrefFile(mCurrentFile, PR_FALSE, PR_FALSE, PR_FALSE, PR_TRUE);
}
}
return rv;
}
static nsresult openPrefFile(nsIFile* aFile, PRBool aIsErrorFatal, PRBool aVerifyHash,
PRBool aIsGlobalContext, PRBool aSkipFirstLine)
{
@ -689,4 +756,3 @@ extern "C" JSRuntime* PREF_GetJSRuntime()
return nsnull;
}
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrefService, Init)