static char *DIR_GetStringPref(const char *prefRoot, const char *prefLeaf, const char *defaultValue) { nsresult rv; nsCOMPtr<nsIPrefBranch> pPref(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); if (NS_FAILED(rv)) return nsnull; nsCString value; nsCAutoString prefLocation(prefRoot); prefLocation.Append('.'); prefLocation.Append(prefLeaf); if (NS_SUCCEEDED(pPref->GetCharPref(prefLocation.get(), getter_Copies(value)))) { /* unfortunately, there may be some prefs out there which look like this */ if (value.EqualsLiteral("(null)")) { if (defaultValue) value = defaultValue; else value.Truncate(); } if (value.IsEmpty()) { rv = pPref->GetCharPref(prefLocation.get(), getter_Copies(value)); } } else value = defaultValue; return ToNewCString(value); }
static char *DIR_GetLocalizedStringPref (const char *prefRoot, const char *prefLeaf, const char *defaultValue) { nsresult rv; nsCOMPtr<nsIPrefBranch> pPref(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); if (NS_FAILED(rv)) return nsnull; nsCAutoString prefLocation(prefRoot); prefLocation.Append('.'); prefLocation.Append(prefLeaf); nsString wvalue; nsCOMPtr<nsIPrefLocalizedString> locStr; rv = pPref->GetComplexValue(prefLocation.get(), NS_GET_IID(nsIPrefLocalizedString), getter_AddRefs(locStr)); if (NS_SUCCEEDED(rv)) rv = locStr->ToString(getter_Copies(wvalue)); char *value = nsnull; if (!wvalue.IsEmpty()) { NS_ConvertUTF16toUTF8 utf8str(wvalue.get()); value = ToNewCString(utf8str); } else value = defaultValue ? strdup(defaultValue) : nsnull; return value; }
static char *DIR_GetDescription(const char *prefRoot) { nsresult rv; nsCOMPtr<nsIPrefBranch> pPref(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); if (NS_FAILED(rv)) return nsnull; nsCAutoString prefLocation(prefRoot); prefLocation.AppendLiteral(".description"); nsString wvalue; nsCOMPtr<nsIPrefLocalizedString> locStr; rv = pPref->GetComplexValue(prefLocation.get(), NS_GET_IID(nsIPrefLocalizedString), getter_AddRefs(locStr)); if (NS_SUCCEEDED(rv)) rv = locStr->ToString(getter_Copies(wvalue)); char *value = nsnull; if (!wvalue.IsEmpty()) { NS_ConvertUTF16toUTF8 utf8str(wvalue.get()); value = ToNewCString(utf8str); } else { // In TB 2 only some prefs had chrome:// URIs. We had code in place that would // only get the localized string pref for the particular address books that // were built-in. // Additionally, nsIPrefBranch::getComplexValue will only get a non-user-set, // non-locked pref value if it is a chrome:// URI and will get the string // value at that chrome URI. This breaks extensions/autoconfig that want to // set default pref values and allow users to change directory names. // // Now we have to support this, and so if for whatever reason we fail to get // the localized version, then we try and get the non-localized version // instead. If the string value is empty, then we'll just get the empty value // back here. rv = pPref->GetCharPref(prefLocation.get(), &value); if (NS_FAILED(rv)) value = nsnull; } return value; }
static void DIR_SetStringPref(const char *prefRoot, const char *prefLeaf, const char *value, const char *defaultValue) { nsresult rv; nsCOMPtr<nsIPrefBranch> pPref(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); if (NS_FAILED(rv)) return; nsCString defaultPref; nsCAutoString prefLocation(prefRoot); prefLocation.Append('.'); prefLocation.Append(prefLeaf); if (NS_SUCCEEDED(pPref->GetCharPref(prefLocation.get(), getter_Copies(defaultPref)))) { /* If there's a default pref, just set ours in and let libpref worry * about potential defaults in all.js */ if (value) /* added this check to make sure we have a value before we try to set it..*/ rv = pPref->SetCharPref (prefLocation.get(), value); else rv = pPref->ClearUserPref(prefLocation.get()); } else { /* If there's no default pref, look for a user pref, and only set our value in * if the user pref is different than one of them. */ nsCString userPref; if (NS_SUCCEEDED(pPref->GetCharPref (prefLocation.get(), getter_Copies(userPref)))) { if (value && (defaultValue ? PL_strcasecmp(value, defaultValue) : value != defaultValue)) rv = pPref->SetCharPref (prefLocation.get(), value); else rv = pPref->ClearUserPref(prefLocation.get()); } else { if (value && (defaultValue ? PL_strcasecmp(value, defaultValue) : value != defaultValue)) rv = pPref->SetCharPref (prefLocation.get(), value); } } NS_ASSERTION(NS_SUCCEEDED(rv), "Could not set pref in DIR_SetStringPref"); }
static PRInt32 DIR_GetIntPref(const char *prefRoot, const char *prefLeaf, PRInt32 defaultValue) { nsresult rv; nsCOMPtr<nsIPrefBranch> pPref(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); if (NS_FAILED(rv)) return defaultValue; PRInt32 value; nsCAutoString prefLocation(prefRoot); prefLocation.Append('.'); prefLocation.Append(prefLeaf); if (NS_FAILED(pPref->GetIntPref(prefLocation.get(), &value))) value = defaultValue; return value; }
static void DIR_SetIntPref(const char *prefRoot, const char *prefLeaf, PRInt32 value, PRInt32 defaultValue) { nsresult rv; nsCOMPtr<nsIPrefBranch> pPref(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); if (NS_FAILED(rv)) return; PRInt32 defaultPref; nsCAutoString prefLocation(prefRoot); prefLocation.Append('.'); prefLocation.Append(prefLeaf); if (NS_SUCCEEDED(pPref->GetIntPref(prefLocation.get(), &defaultPref))) { /* solve the problem where reordering user prefs must override default prefs */ rv = pPref->SetIntPref(prefLocation.get(), value); } else { PRInt32 userPref; if (NS_SUCCEEDED(pPref->GetIntPref(prefLocation.get(), &userPref))) { if (value != defaultValue) rv = pPref->SetIntPref(prefLocation.get(), value); else rv = pPref->ClearUserPref(prefLocation.get()); } else { if (value != defaultValue) rv = pPref->SetIntPref(prefLocation.get(), value); } } NS_ASSERTION(NS_SUCCEEDED(rv), "Could not set pref in DIR_SetIntPref"); }
static void DIR_SetLocalizedStringPref (const char *prefRoot, const char *prefLeaf, const char *value) { nsresult rv; nsCOMPtr<nsIPrefService> prefSvc(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); if (NS_FAILED(rv)) return; nsCAutoString prefLocation(prefRoot); prefLocation.Append('.'); nsCOMPtr<nsIPrefBranch> prefBranch; rv = prefSvc->GetBranch(prefLocation.get(), getter_AddRefs(prefBranch)); if (NS_FAILED(rv)) return; nsString wvalue; nsCOMPtr<nsIPrefLocalizedString> newStr( do_CreateInstance(NS_PREFLOCALIZEDSTRING_CONTRACTID, &rv)); if (NS_FAILED(rv)) { NS_ASSERTION(NS_SUCCEEDED(rv), "Could not createInstance in DIR_SetLocalizedStringPref"); return; } NS_ConvertUTF8toUTF16 newValue(value); rv = newStr->SetData(newValue.get()); if (NS_FAILED(rv)) { NS_ASSERTION(NS_SUCCEEDED(rv), "Could not set pref data in DIR_SetLocalizedStringPref"); return; } nsCOMPtr<nsIPrefLocalizedString> locStr; if (NS_SUCCEEDED(prefBranch->GetComplexValue(prefLeaf, NS_GET_IID(nsIPrefLocalizedString), getter_AddRefs(locStr)))) { nsString data; locStr->GetData(getter_Copies(data)); // Only set the pref if the data values aren't the same (i.e. don't change // unnecessarily, but also, don't change in the case that its a chrome // string pointing to the value we want to set the pref to). if (newValue != data) rv = prefBranch->SetComplexValue(prefLeaf, NS_GET_IID(nsIPrefLocalizedString), newStr); } else { // No value set, but check the default pref branch (i.e. user may have // cleared the pref) nsCOMPtr<nsIPrefBranch> dPB; rv = prefSvc->GetDefaultBranch(prefLocation.get(), getter_AddRefs(dPB)); if (NS_SUCCEEDED(dPB->GetComplexValue(prefLeaf, NS_GET_IID(nsIPrefLocalizedString), getter_AddRefs(locStr)))) { // Default branch has a value nsString data; locStr->GetData(getter_Copies(data)); if (newValue != data) // If the vales aren't the same, set the data on the main pref branch rv = prefBranch->SetComplexValue(prefLeaf, NS_GET_IID(nsIPrefLocalizedString), newStr); else // Else if they are, kill the user pref rv = prefBranch->ClearUserPref(prefLeaf); } else // No values set anywhere, so just set the pref rv = prefBranch->SetComplexValue(prefLeaf, NS_GET_IID(nsIPrefLocalizedString), newStr); } NS_ASSERTION(NS_SUCCEEDED(rv), "Could not set pref in DIR_SetLocalizedStringPref"); }