| /* | |
| * 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 GWT_DEV_PREFS_PREFIX "gwt-dev-plugin." | |
| #define GWT_DEV_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(GWT_DEV_PREFS_PREFIX, getter_AddRefs(branch)); | |
| if (!branch) { | |
| Debug::log(Debug::Error) << "Unable to get " GWT_DEV_PREFS_PREFIX | |
| " preference branch" << Debug::flush; | |
| return; | |
| } | |
| prefs = do_QueryInterface(branch); | |
| if (!prefs) { | |
| Debug::log(Debug::Error) << "Unable to get nsIPrefBranch2" << Debug::flush; | |
| return; | |
| } | |
| prefs->AddObserver(GWT_DEV_ACCESS_LIST, this, PR_FALSE); | |
| nsCString prefValue; | |
| if (branch->GetCharPref(GWT_DEV_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(GWT_DEV_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(GWT_DEV_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(GWT_DEV_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(GWT_DEV_ACCESS_LIST, this); | |
| } | |
| } |