nsresult PREF_GetCharPref(const char *pref_name, char * return_buffer, int * length, PRBool get_default) { if (!gHashTable.ops) return NS_ERROR_NOT_INITIALIZED; nsresult rv = NS_ERROR_UNEXPECTED; char* stringVal; PrefHashEntry* pref = pref_HashTableLookup(pref_name); if (pref) { if (get_default || PREF_IS_LOCKED(pref) || !PREF_HAS_USER_VALUE(pref)) stringVal = pref->defaultPref.stringVal; else stringVal = pref->userPref.stringVal; if (stringVal) { if (*length <= 0) *length = PL_strlen(stringVal) + 1; else { PL_strncpy(return_buffer, stringVal, NS_MIN<size_t>(*length - 1, PL_strlen(stringVal) + 1)); return_buffer[*length - 1] = '\0'; } rv = NS_OK; } } return rv; }
nsresult PREF_GetBoolPref(const char *pref_name, bool * return_value, bool get_default) { if (!gHashTable.ops) return NS_ERROR_NOT_INITIALIZED; nsresult rv = NS_ERROR_UNEXPECTED; PrefHashEntry* pref = pref_HashTableLookup(pref_name); //NS_ASSERTION(pref, pref_name); if (pref && (pref->flags & PREF_BOOL)) { if (get_default || PREF_IS_LOCKED(pref) || !PREF_HAS_USER_VALUE(pref)) { bool tempBool = pref->defaultPref.boolVal; /* check to see if we even had a default */ if (pref->flags & PREF_HAS_DEFAULT) { *return_value = tempBool; rv = NS_OK; } } else { *return_value = pref->userPref.boolVal; rv = NS_OK; } } return rv; }
void pref_GetTupleFromEntry(PrefHashEntry *aHashEntry, PrefTuple *aTuple) { aTuple->key = aHashEntry->key; PrefValue *value = PREF_HAS_USER_VALUE(aHashEntry) ? &(aHashEntry->userPref) : &(aHashEntry->defaultPref); switch (aHashEntry->flags & PREF_VALUETYPE_MASK) { case PREF_STRING: aTuple->stringVal = value->stringVal; aTuple->type = PrefTuple::PREF_STRING; return; case PREF_INT: aTuple->intVal = value->intVal; aTuple->type = PrefTuple::PREF_INT; return; case PREF_BOOL: aTuple->boolVal = !!value->boolVal; aTuple->type = PrefTuple::PREF_BOOL; return; } }
nsresult PREF_ClearUserPref(const char *pref_name) { if (!gHashTable.ops) return NS_ERROR_NOT_INITIALIZED; nsresult rv = NS_ERROR_UNEXPECTED; PrefHashEntry* pref = pref_HashTableLookup(pref_name); if (pref && PREF_HAS_USER_VALUE(pref)) { pref->flags &= ~PREF_USERSET; if ((pref->flags & PREF_INT && pref->defaultPref.intVal == ((PRInt32) BOGUS_DEFAULT_INT_PREF_VALUE)) || (pref->flags & PREF_BOOL && pref->defaultPref.boolVal == ((PRBool) BOGUS_DEFAULT_BOOL_PREF_VALUE)) || (pref->flags & PREF_STRING && !pref->defaultPref.stringVal)) { PL_DHashTableOperate(&gHashTable, pref_name, PL_DHASH_REMOVE); } if (gCallbacksEnabled) pref_DoCallback(pref_name); gDirty = PR_TRUE; rv = NS_OK; } return rv; }
PLDHashOperator pref_savePref(PLDHashTable *table, PLDHashEntryHdr *heh, PRUint32 i, void *arg) { pref_saveArgs *argData = static_cast<pref_saveArgs *>(arg); PrefHashEntry *pref = static_cast<PrefHashEntry *>(heh); PR_ASSERT(pref); if (!pref) return PL_DHASH_NEXT; nsCAutoString prefValue; nsCAutoString prefPrefix; prefPrefix.Assign(NS_LITERAL_CSTRING("user_pref(\"")); // where we're getting our pref from PrefValue* sourcePref; if (PREF_HAS_USER_VALUE(pref) && (pref_ValueChanged(pref->defaultPref, pref->userPref, (PrefType) PREF_TYPE(pref)) || !(pref->flags & PREF_HAS_DEFAULT))) { sourcePref = &pref->userPref; } else { if (argData->saveTypes == SAVE_ALL_AND_DEFAULTS) { prefPrefix.Assign(NS_LITERAL_CSTRING("pref(\"")); sourcePref = &pref->defaultPref; } else // do not save default prefs that haven't changed return PL_DHASH_NEXT; } // strings are in quotes! if (pref->flags & PREF_STRING) { prefValue = '\"'; str_escape(sourcePref->stringVal, prefValue); prefValue += '\"'; } else if (pref->flags & PREF_INT) prefValue.AppendInt(sourcePref->intVal); else if (pref->flags & PREF_BOOL) prefValue = (sourcePref->boolVal) ? "true" : "false"; nsCAutoString prefName; str_escape(pref->key, prefName); argData->prefArray[i] = ToNewCString(prefPrefix + prefName + NS_LITERAL_CSTRING("\", ") + prefValue + NS_LITERAL_CSTRING(");")); return PL_DHASH_NEXT; }
PLDHashOperator pref_savePref(PLDHashTable *table, PLDHashEntryHdr *heh, PRUint32 i, void *arg) { pref_saveArgs *argData = static_cast<pref_saveArgs *>(arg); PrefHashEntry *pref = static_cast<PrefHashEntry *>(heh); PR_ASSERT(pref); if (!pref) return PL_DHASH_NEXT; nsCAutoString prefValue; // where we're getting our pref from PrefValue* sourcePref; if (PREF_HAS_USER_VALUE(pref) && pref_ValueChanged(pref->defaultPref, pref->userPref, (PrefType) PREF_TYPE(pref))) sourcePref = &pref->userPref; else if (PREF_IS_LOCKED(pref)) sourcePref = &pref->defaultPref; else // do not save default prefs that haven't changed return PL_DHASH_NEXT; #if MOZ_PROFILESHARING if ((argData->saveTypes == SAVE_SHARED && !gSharedPrefHandler->IsPrefShared(pref->key)) || (argData->saveTypes == SAVE_NONSHARED && gSharedPrefHandler->IsPrefShared(pref->key))) return PL_DHASH_NEXT; #endif // strings are in quotes! if (pref->flags & PREF_STRING) { prefValue = '\"'; str_escape(sourcePref->stringVal, prefValue); prefValue += '\"'; } else if (pref->flags & PREF_INT) prefValue.AppendInt(sourcePref->intVal); else if (pref->flags & PREF_BOOL) prefValue = (sourcePref->boolVal) ? "true" : "false"; nsCAutoString prefName; str_escape(pref->key, prefName); argData->prefArray[i] = ToNewCString(NS_LITERAL_CSTRING("user_pref(\"") + prefName + NS_LITERAL_CSTRING("\", ") + prefValue + NS_LITERAL_CSTRING(");")); return PL_DHASH_NEXT; }
bool PREF_HasUserPref(const char *pref_name) { if (!gHashTable.ops) return false; PrefHashEntry *pref = pref_HashTableLookup(pref_name); if (!pref) return false; /* convert PREF_HAS_USER_VALUE to bool */ return (PREF_HAS_USER_VALUE(pref) != 0); }
static PLDHashOperator pref_ClearUserPref(PLDHashTable *table, PLDHashEntryHdr *he, PRUint32, void *arg) { PrefHashEntry *pref = static_cast<PrefHashEntry*>(he); PLDHashOperator nextOp = PL_DHASH_NEXT; if (PREF_HAS_USER_VALUE(pref)) { pref->flags &= ~PREF_USERSET; if (!(pref->flags & PREF_HAS_DEFAULT)) { nextOp = PL_DHASH_REMOVE; } pref_DoCallback(pref->key); } return nextOp; }
nsresult PREF_ClearUserPref(const char *pref_name) { if (!gHashTable.ops) return NS_ERROR_NOT_INITIALIZED; PrefHashEntry* pref = pref_HashTableLookup(pref_name); if (pref && PREF_HAS_USER_VALUE(pref)) { pref->flags &= ~PREF_USERSET; if (!(pref->flags & PREF_HAS_DEFAULT)) { PL_DHashTableOperate(&gHashTable, pref_name, PL_DHASH_REMOVE); } pref_DoCallback(pref_name); gDirty = true; } return NS_OK; }
nsresult PREF_GetIntPref(const char *pref_name,PRInt32 * return_int, bool get_default) { if (!gHashTable.ops) return NS_ERROR_NOT_INITIALIZED; nsresult rv = NS_ERROR_UNEXPECTED; PrefHashEntry* pref = pref_HashTableLookup(pref_name); if (pref && (pref->flags & PREF_INT)) { if (get_default || PREF_IS_LOCKED(pref) || !PREF_HAS_USER_VALUE(pref)) { PRInt32 tempInt = pref->defaultPref.intVal; /* check to see if we even had a default */ if (!(pref->flags & PREF_HAS_DEFAULT)) return NS_ERROR_UNEXPECTED; *return_int = tempInt; } else *return_int = pref->userPref.intVal; rv = NS_OK; } return rv; }
nsresult PREF_CopyCharPref(const char *pref_name, char ** return_buffer, bool get_default) { if (!gHashTable.ops) return NS_ERROR_NOT_INITIALIZED; nsresult rv = NS_ERROR_UNEXPECTED; char* stringVal; PrefHashEntry* pref = pref_HashTableLookup(pref_name); if (pref && (pref->flags & PREF_STRING)) { if (get_default || PREF_IS_LOCKED(pref) || !PREF_HAS_USER_VALUE(pref)) stringVal = pref->defaultPref.stringVal; else stringVal = pref->userPref.stringVal; if (stringVal) { *return_buffer = NS_strdup(stringVal); rv = NS_OK; } } return rv; }
pref_ClearUserPref(PLDHashTable *table, PLDHashEntryHdr *he, PRUint32, void *arg) { PrefHashEntry *pref = static_cast<PrefHashEntry*>(he); PLDHashOperator nextOp = PL_DHASH_NEXT; if (PREF_HAS_USER_VALUE(pref)) { pref->flags &= ~PREF_USERSET; if ((pref->flags & PREF_INT && pref->defaultPref.intVal == ((PRInt32) BOGUS_DEFAULT_INT_PREF_VALUE)) || (pref->flags & PREF_BOOL && pref->defaultPref.boolVal == ((PRBool) BOGUS_DEFAULT_BOOL_PREF_VALUE)) || (pref->flags & PREF_STRING && !pref->defaultPref.stringVal)) { nextOp = PL_DHASH_REMOVE; } if (gCallbacksEnabled) pref_DoCallback(pref->key); } return nextOp; }
nsresult pref_HashPref(const char *key, PrefValue value, PrefType type, PRUint32 flags) { if (!gHashTable.ops) return NS_ERROR_OUT_OF_MEMORY; PrefHashEntry* pref = static_cast<PrefHashEntry*>(PL_DHashTableOperate(&gHashTable, key, PL_DHASH_ADD)); if (!pref) return NS_ERROR_OUT_OF_MEMORY; // new entry, better intialize if (!pref->key) { // initialize the pref entry pref->flags = type; pref->key = ArenaStrDup(key, &gPrefNameArena); memset(&pref->defaultPref, 0, sizeof(pref->defaultPref)); memset(&pref->userPref, 0, sizeof(pref->userPref)); } else if ((((PrefType)(pref->flags)) & PREF_VALUETYPE_MASK) != (type & PREF_VALUETYPE_MASK)) { NS_WARNING(nsPrintfCString(192, "Trying to set pref %s to with the wrong type!", key).get()); return NS_ERROR_UNEXPECTED; } bool valueChanged = false; if (flags & kPrefSetDefault) { if (!PREF_IS_LOCKED(pref)) { /* ?? change of semantics? */ if (pref_ValueChanged(pref->defaultPref, value, type) || !(pref->flags & PREF_HAS_DEFAULT)) { pref_SetValue(&pref->defaultPref, value, type); pref->flags |= PREF_HAS_DEFAULT; if (!PREF_HAS_USER_VALUE(pref)) valueChanged = true; } } } else { /* If new value is same as the default value, then un-set the user value. Otherwise, set the user value only if it has changed */ if (!pref_ValueChanged(pref->defaultPref, value, type) && (pref->flags & PREF_HAS_DEFAULT) && !(flags & kPrefForceSet)) { if (PREF_HAS_USER_VALUE(pref)) { pref->flags &= ~PREF_USERSET; if (!PREF_IS_LOCKED(pref)) valueChanged = true; } } else if ( !PREF_HAS_USER_VALUE(pref) || pref_ValueChanged(pref->userPref, value, type) ) { pref_SetValue(&pref->userPref, value, type); pref->flags |= PREF_USERSET; if (!PREF_IS_LOCKED(pref)) valueChanged = true; } } nsresult rv = NS_OK; if (valueChanged) { gDirty = true; nsresult rv2 = pref_DoCallback(key); if (NS_FAILED(rv2)) rv = rv2; } return rv; }
nsresult pref_HashPref(const char *key, PrefValue value, PrefType type, PRBool set_default) { if (!gHashTable.ops) return NS_ERROR_OUT_OF_MEMORY; PrefHashEntry* pref = static_cast<PrefHashEntry*>(PL_DHashTableOperate(&gHashTable, key, PL_DHASH_ADD)); if (!pref) return NS_ERROR_OUT_OF_MEMORY; // new entry, better intialize if (!pref->key) { // initialize the pref entry pref->flags = type; pref->key = ArenaStrDup(key, &gPrefNameArena); memset(&pref->defaultPref, 0, sizeof(pref->defaultPref)); memset(&pref->userPref, 0, sizeof(pref->userPref)); /* ugly hack -- define it to a default that no pref will ever default to this should really get fixed right by some out of band data */ if (pref->flags & PREF_BOOL) pref->defaultPref.boolVal = (PRBool) BOGUS_DEFAULT_BOOL_PREF_VALUE; if (pref->flags & PREF_INT) pref->defaultPref.intVal = (PRInt32) BOGUS_DEFAULT_INT_PREF_VALUE; } else if ((((PrefType)(pref->flags)) & PREF_VALUETYPE_MASK) != (type & PREF_VALUETYPE_MASK)) { NS_WARNING(nsPrintfCString(192, "Trying to set pref %s to with the wrong type!", key).get()); return NS_ERROR_UNEXPECTED; } PRBool valueChanged = PR_FALSE; if (set_default) { if (!PREF_IS_LOCKED(pref)) { /* ?? change of semantics? */ if (pref_ValueChanged(pref->defaultPref, value, type)) { pref_SetValue(&pref->defaultPref, value, type); if (!PREF_HAS_USER_VALUE(pref)) valueChanged = PR_TRUE; } } } else { /* If new value is same as the default value, then un-set the user value. Otherwise, set the user value only if it has changed */ if ( !pref_ValueChanged(pref->defaultPref, value, type) ) { if (PREF_HAS_USER_VALUE(pref)) { pref->flags &= ~PREF_USERSET; if (!PREF_IS_LOCKED(pref)) valueChanged = PR_TRUE; } } else if ( !PREF_HAS_USER_VALUE(pref) || pref_ValueChanged(pref->userPref, value, type) ) { pref_SetValue(&pref->userPref, value, type); pref->flags |= PREF_USERSET; if (!PREF_IS_LOCKED(pref)) valueChanged = PR_TRUE; } } nsresult rv = NS_OK; if (valueChanged) { gDirty = PR_TRUE; if (gCallbacksEnabled) { nsresult rv2 = pref_DoCallback(key); if (NS_FAILED(rv2)) rv = rv2; } #ifdef MOZ_PROFILESHARING if (gSharedPrefHandler) gSharedPrefHandler->OnPrefChanged(set_default, pref, value); #endif } return rv; }