blob: 095171186d7afd91f68f3b7e76b89b83bbd20e17 [file] [log] [blame]
/*
* Copyright 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
#include "Preferences.h"
#include "Debug.h"
#include "AllowedConnections.h"
#include "nsCOMPtr.h"
#include "nsStringAPI.h"
#include "nsISupportsImpl.h"
#include "nsIObserver.h"
#include "nsIPrefService.h"
#include "nsIPrefBranch.h"
#include "nsIPrefBranch2.h"
#include "nsServiceManagerUtils.h"
#define DMP_PREFS_PREFIX "gwt-dmp."
#define DMP_ACCESS_LIST "accessList"
NS_IMPL_ADDREF(Preferences)
NS_IMPL_RELEASE(Preferences)
NS_IMPL_QUERY_INTERFACE1(Preferences, nsIObserver)
Preferences::Preferences() {
nsCOMPtr<nsIPrefService> prefService = do_GetService(
NS_PREFSERVICE_CONTRACTID);
if (!prefService) {
Debug::log(Debug::Error) << "Unable to get preference service" << Debug::flush;
return;
}
nsCOMPtr<nsIPrefBranch> branch;
prefService->GetBranch(DMP_PREFS_PREFIX, getter_AddRefs(branch));
if (!branch) {
Debug::log(Debug::Error) << "Unable to get gwt-dmp. preference branch"
<< Debug::flush;
return;
}
prefs = do_QueryInterface(branch);
if (!prefs) {
Debug::log(Debug::Error) << "Unable to get nsIPrefBranch2" << Debug::flush;
return;
}
prefs->AddObserver(DMP_ACCESS_LIST, this, PR_FALSE);
nsCString prefValue;
if (branch->GetCharPref(DMP_ACCESS_LIST, getter_Copies(prefValue)) == NS_OK) {
loadAccessList(prefValue.get());
}
}
// implements nsIObserver
NS_IMETHODIMP
Preferences::Observe(nsISupports *aSubject, const char* aTopic,
const PRUnichar *aData) {
nsresult rv = NS_OK;
Debug::log(Debug::Spam) << "Preferences::Observe(subject="
<< aSubject << ", topic=" << aTopic << ", data=" << aData << Debug::flush;
if (strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID)) {
return NS_ERROR_UNEXPECTED;
}
// TODO(jat): check preference name in aData if we ever add another one
nsCOMPtr<nsIPrefBranch> prefs(do_QueryInterface(aSubject, &rv));
NS_ENSURE_SUCCESS(rv, rv);
nsCString prefValue;
if (prefs->GetCharPref(DMP_ACCESS_LIST, getter_Copies(prefValue)) == NS_OK) {
loadAccessList(prefValue.get());
}
return NS_OK;
}
void Preferences::addNewRule(const std::string& pattern, bool exclude) {
nsCString prefValue;
if (prefs->GetCharPref(DMP_ACCESS_LIST, getter_Copies(prefValue)) != NS_OK) {
Debug::log(Debug::Error) << "Unable to retrieve access list preference"
<< Debug::flush;
return;
}
// TODO(jat): see if the same rule already exists
std::string pref(prefValue.get());
if (pref.length() > 0) {
pref += ',';
}
if (exclude) {
pref += '!';
}
pref += pattern;
if (prefs->SetCharPref(DMP_ACCESS_LIST, pref.c_str()) != NS_OK) {
Debug::log(Debug::Error) << "Unable to save modified access list preference"
<< Debug::flush;
return;
}
}
void Preferences::loadAccessList(const char* prefValue) {
if (!prefValue) {
return;
}
Debug::log(Debug::Spam) << "loadFromAccessList(prefValue=" << prefValue << ")"
<< Debug::flush;
AllowedConnections::initFromAccessList(prefValue);
}
Preferences::~Preferences() {
if (prefs) {
prefs->RemoveObserver(DMP_ACCESS_LIST, this);
}
}