/* * Copyright (C) 2008 The Android Open Source Project * * 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. */ #define LOG_TAG "PropertyManager" #include #include "PropertyManager.h" PropertyManager::PropertyManager() { mPropertyPairs = new PropertyPairCollection(); pthread_mutex_init(&mLock, NULL); } PropertyManager::~PropertyManager() { delete mPropertyPairs; } int PropertyManager::registerProperty(const char *name, IPropertyProvider *pp) { PropertyPairCollection::iterator it; // LOGD("registerProperty(%s)", name); pthread_mutex_lock(&mLock); for (it = mPropertyPairs->begin(); it != mPropertyPairs->end(); ++it) { if (!strcmp(name, (*it)->getName())) { errno = EADDRINUSE; LOGE("Failed to register property %s (%s)", name, strerror(errno)); pthread_mutex_unlock(&mLock); return -1; } } mPropertyPairs->push_back(new PropertyPair(name, pp)); pthread_mutex_unlock(&mLock); return 0; } int PropertyManager::unregisterProperty(const char *name) { PropertyPairCollection::iterator it; // LOGD("unregisterProperty(%s)", name); pthread_mutex_lock(&mLock); for (it = mPropertyPairs->begin(); it != mPropertyPairs->end(); ++it) { if (!strcmp(name, (*it)->getName())) { delete ((*it)); mPropertyPairs->erase(it); pthread_mutex_unlock(&mLock); return 0; } } pthread_mutex_unlock(&mLock); errno = ENOENT; return -1; } /* * IPropertyManager methods */ int PropertyManager::set(const char *name, const char *value) { PropertyPairCollection::iterator it; pthread_mutex_lock(&mLock); for (it = mPropertyPairs->begin(); it != mPropertyPairs->end(); ++it) { if (!strcmp(name, (*it)->getName())) { pthread_mutex_unlock(&mLock); return (*it)->getProvider()->set(name, value); } } pthread_mutex_unlock(&mLock); errno = ENOENT; return -1; } const char *PropertyManager::get(const char *name, char *buffer, size_t max) { PropertyPairCollection::iterator it; memset(buffer, 0, max); pthread_mutex_lock(&mLock); for (it = mPropertyPairs->begin(); it != mPropertyPairs->end(); ++it) { if (!strcmp(name, (*it)->getName())) { pthread_mutex_unlock(&mLock); return (*it)->getProvider()->get(name, buffer, max); } } pthread_mutex_unlock(&mLock); errno = ENOENT; return NULL; } android::List *PropertyManager::createPropertyList() { android::List *c = new android::List(); PropertyPairCollection::iterator it; pthread_mutex_lock(&mLock); for (it = mPropertyPairs->begin(); it != mPropertyPairs->end(); ++it) c->push_back(strdup((*it)->getName())); pthread_mutex_unlock(&mLock); return c; } PropertyPair::PropertyPair(const char *name, IPropertyProvider *pp) { mName = strdup(name); mPp = pp; } PropertyPair::~PropertyPair() { free(mName); }