diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraxui/cxengine/src/cxesettingsimp.cpp --- a/camerauis/cameraxui/cxengine/src/cxesettingsimp.cpp Tue Aug 31 15:03:46 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,535 +0,0 @@ -/* -* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* -*/ -/* -* Symbian specific settings handling -*/ - -#include -#include -#include -#include -#include - -#include "cxesettingsimp.h" -#include "cxutils.h" -#include "cxenamespace.h" -#include "cxeerror.h" -#include "cxesettingsstore.h" -#include "cxeexception.h" - -#ifdef Q_OS_SYMBIAN -#include "OstTraceDefinitions.h" -#ifdef OST_TRACE_COMPILER_IN_USE -#include "cxesettingsimpTraces.h" -#endif -#endif // Q_OS_SYMBIAN - - -// signatures for setting listener slots -const char *SETTING_LISTENER_SIGNATURE1 = "settingChanged(const QString &, const QVariant &)"; -const char *SETTING_LISTENER_SIGNATURE2 = "settingChanged(const QVariant &)"; - - -/* -* CxeSettingsImp::CxeSettingsImp -*/ -CxeSettingsImp::CxeSettingsImp(CxeSettingsStore *settingStore) -: mSettingStore(settingStore), - mVariationSettings(), - mSceneModeStore(), - mCameraMode(Cxe::ImageMode) -{ - CX_DEBUG_ENTER_FUNCTION(); - loadVariationSettings(); - - CX_DEBUG_EXIT_FUNCTION(); -} - -/* -* CxeSettingsImp::close -*/ -CxeSettingsImp::~CxeSettingsImp() -{ - CX_DEBUG_ENTER_FUNCTION(); - delete mSettingStore; - - mVariationSettings.clear(); - mSettingListeners.clear(); - CX_DEBUG_EXIT_FUNCTION(); -} - -/* -* Reads a value from cenrep -* @param key - setting key -* @param uid - setting UID of the component that owns the setting key -* @param type - the type of key cr key or P&S key (constantly monitoring value) -* @param value - setting value read from cenrep -*/ - -void CxeSettingsImp::get(long int uid, - unsigned long int key, - Cxe::SettingKeyType type, - QVariant &value) const -{ - CX_DEBUG_ENTER_FUNCTION(); - CX_DEBUG_ASSERT(mSettingStore); - - mSettingStore->startMonitoring(uid, key, type, value); - - CX_DEBUG_EXIT_FUNCTION(); - -} - - -/*! - Reset static settings (persistent settings) -*/ -void CxeSettingsImp::reset() -{ - CX_DEBUG_ENTER_FUNCTION(); - - CX_DEBUG_ASSERT(mSettingStore); - mSettingStore->reset(); - - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! -* Get the configured run-time value associated with the key. -* @Param key - Setting key Id ( refer to CxeSettingIds in cxenums.h ) -* @Param value - contains the value associated with the key. -* @returns CxeError::None if successful or any CxeError specific error code. -*/ -CxeError::Id CxeSettingsImp::getVariationValue(const QString &key, QVariant &value) -{ - CX_DEBUG_ENTER_FUNCTION(); - - CxeError::Id err = CxeError::None; - - // read run-time configuration value - if ( mVariationSettings.contains(key) ) { - value = qVariantFromValue (mVariationSettings.value(key)); - } else { - err = CxeError::NotFound; - } - - CX_DEBUG_EXIT_FUNCTION(); - - return err; -} - - -/*! - * Add listener for changes in one setting. When the value of the setting changes, the given - * slot is invoked on given object. - * The validity of the settingKey is not checked. - * - * @param settingKey Setting to listen to - * @param target Object that the slot will be invoked for - * @param slot Slot that will be invoked. The slot can have either of these two signatures: - * slotName(const QVariant&) only new value of setting is passed as parameter - * slotName(const QString&, const QVariant&) both setting key and new value are passed as parameter - * - * @return boolean to indicate success - * - */ -bool CxeSettingsImp::listenForSetting(const QString &settingKey, QObject *target, const char *slot) -{ - - CX_DEBUG_ENTER_FUNCTION(); - CX_DEBUG_ASSERT(target && slot); - - // SLOT() macro adds '1' to the beginning of string so we use slot+1 to get the name of the slot - CX_DEBUG(("Adding listener %s::%s for key %s", target->metaObject()->className(), slot+1, settingKey.toAscii().data())); - QByteArray normalizedSlotName = QMetaObject::normalizedSignature(slot+1); - - int slotIndex = target->metaObject()->indexOfSlot(normalizedSlotName); - - bool ok = false; - if (slotIndex > -1) { - CX_DEBUG(("Slot found, checking signature")); - // verify that slot is correct type - if (QMetaObject::checkConnectArgs(QMetaObject::normalizedSignature(SETTING_LISTENER_SIGNATURE1), normalizedSlotName) || - QMetaObject::checkConnectArgs(QMetaObject::normalizedSignature(SETTING_LISTENER_SIGNATURE2), normalizedSlotName)) { - - CX_DEBUG(("Slot signature ok, adding listener")); - - // check if list for given key already exists - if (!mSettingListeners.contains(settingKey)) { - mSettingListeners.insert(settingKey, CxeSettingListenerList()); - } - - // get QMetaMethod object - QMetaMethod method = target->metaObject()->method(slotIndex); - // add listener to the list - CxeSettingListenerList& list = mSettingListeners[settingKey]; - list.append(CxeSettingListener(target, method)); - - // connect to destroyed() signal so we can remove listener if it's deleted - connect(target, SIGNAL(destroyed(QObject*)), this, SLOT(handleListenerDestroyed(QObject*))); - - ok = true; - } else { - CX_DEBUG(("Slot signature doesn't match, can't add listener")); - } - - } else { - CX_DEBUG(("Slot not found, can't add listener")); - } - - CX_DEBUG_EXIT_FUNCTION(); - return ok; -} - -/*! - Load image/video specific settings during mode change or startup -*/ -void CxeSettingsImp::loadSettings(Cxe::CameraMode mode) -{ - CX_DEBUG_ENTER_FUNCTION(); - OstTrace0(camerax_performance, CXESETTINGSIMP_LOADSETTINGS_IN, "msg: e_CX_SETTINGS_LOADSETTINGS 1"); - - mCameraMode = mode; - - // inform the settings model for the change in mode. - if (mode == Cxe::ImageMode) { - restoreImageSettings(); - notifyListeners(CxeSettingIds::IMAGE_SCENE_DATA, mSceneModeStore.currentScene(Cxe::ImageMode)); - notifyListeners(CxeSettingIds::IMAGE_SCENE, mSceneModeStore.currentSceneId(Cxe::ImageMode)); - emit settingValueChanged(CxeSettingIds::IMAGE_SCENE, mSceneModeStore.currentSceneId(Cxe::ImageMode)); - } else { - restoreVideoSettings(); - notifyListeners(CxeSettingIds::VIDEO_SCENE_DATA, mSceneModeStore.currentScene(Cxe::VideoMode)); - notifyListeners(CxeSettingIds::VIDEO_SCENE, mSceneModeStore.currentSceneId(Cxe::VideoMode)); - emit settingValueChanged(CxeSettingIds::VIDEO_SCENE, mSceneModeStore.currentSceneId(Cxe::VideoMode)); - } - - OstTrace0(camerax_performance, CXESETTINGSIMP_LOADSETTINGS_OUT, "msg: e_CX_SETTINGS_LOADSETTINGS 0"); - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! -* Get setting value associated with the key. -* @Param key - Setting key Id ( refer to CxeSettingIds in cxenums.h ) -* @Param value - contains the value associated with the key. -* @returns CxeError::None if successful or any CxeError specific error code. -*/ -void CxeSettingsImp::getValue(const QString &key, QVariant &value) const -{ - CX_DEBUG_ENTER_FUNCTION(); - CX_DEBUG_ASSERT(mSettingStore); - - - CxeError::Id err = CxeError::None; - - // check if getting scene mode - if(key == CxeSettingIds::IMAGE_SCENE_DATA) { - value = mSceneModeStore.currentScene(Cxe::ImageMode); - } else if(key == CxeSettingIds::VIDEO_SCENE_DATA) { - value = mSceneModeStore.currentScene(Cxe::VideoMode); - } else { - // Try first to find the item from cenrep store. - err = mSettingStore->get(key, value); - - // If setting is not in cenrep store, try fetching it from scene settings. - if (!err) { - CX_DEBUG(("Got value %s from settings store", value.toString().toAscii().data())); - } else { - // setting not found in setting store, try finding if its scene specific setting. - CX_DEBUG(( "fetching value from scene settings" )); - err = mSceneModeStore.sceneSettingValue(mCameraMode, key, value); - } - if (err) { - throw CxeException(err); - } - } - - CX_DEBUG_EXIT_FUNCTION(); - -} - -/*! -* Set a value to the key. -* @Param key - Setting key Id ( refer to CxeSettingIds in cxenums.h ) -* @Param value - contains the value associated with the key. -* @returns CxeError::None if successful or any CxeError specific error code. -*/ -void CxeSettingsImp::setValue(const QString &key, const QVariant &newValue) -{ - CX_DEBUG_ENTER_FUNCTION(); - CX_DEBUG_ASSERT(mSettingStore); - - CxeError::Id err; - // check if setting scene mode - if(key == CxeSettingIds::IMAGE_SCENE) { - setImageScene(newValue.toString()); - } else if(key == CxeSettingIds::VIDEO_SCENE) { - setVideoScene(newValue.toString()); - } else if(key == CxeSettingIds::IMAGE_SCENE_DATA || key == CxeSettingIds::VIDEO_SCENE_DATA) { - // setting whole scene by value is not supported - throw CxeException(CxeError::NotSupported); - } else { - // Try storing new value to cenrep - err = mSettingStore->set(key, newValue); - - if (err) { - CX_DEBUG(( "Key not found in cenrepstore, writing value to scene settings" )); - err = mSceneModeStore.setSceneSettingValue(mCameraMode, key, newValue); - } - - if (err) { - throw CxeException(err); - } - - // send notifications - emit settingValueChanged(key, newValue); - notifyListeners(key, newValue); - } - - CX_DEBUG_EXIT_FUNCTION(); - -} - -/*! -* Restores image settings, during mode change or during startup. -*/ -void CxeSettingsImp::restoreImageSettings() -{ - CX_DEBUG_ENTER_FUNCTION(); - - QString currentSceneInUse = mSceneModeStore.currentSceneId(Cxe::ImageMode); - - // get the image scene value from cenrep and load the scene settings - QString key(CxeSettingIds::IMAGE_SCENE); - QString cenrepSceneValue = CxeSettings::get(key); - - bool ok2LoadSceneSettings = (cenrepSceneValue != currentSceneInUse); - - if (ok2LoadSceneSettings) { - // loading scene settings - mSceneModeStore.setCurrentScene(Cxe::ImageMode, cenrepSceneValue); - } - - // Updating Flash setting from cenrep - key = CxeSettingIds::FLASH_MODE; - int flashMode = CxeSettings::get(key); - - // update local datastructure with flash setting value from cenrep. - CX_DEBUG(( "flash setting value %d", flashMode)); - mSceneModeStore.setSceneSettingValue(Cxe::ImageMode, key, flashMode); - - // Updating Face Tracking setting from cenrep - key = CxeSettingIds::FACE_TRACKING; - int faceTracking = CxeSettings::get(key); - - // update local datastructure with flash setting value from cenrep. - CX_DEBUG(( "Face Tracking setting value %d", faceTracking)); - mSceneModeStore.setSceneSettingValue(Cxe::ImageMode, key, faceTracking); - - - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! -* Restores video settings, during mode change or during startup. -*/ -void CxeSettingsImp::restoreVideoSettings() -{ - CX_DEBUG_ENTER_FUNCTION(); - - QString currentSceneInUse = mSceneModeStore.currentSceneId(Cxe::VideoMode); - - // get the video scene value from cenrep and load the scene settings - QString cenrepSceneValue = CxeSettings::get(CxeSettingIds::VIDEO_SCENE); - - bool ok2LoadSceneSettings = (cenrepSceneValue != currentSceneInUse); - - if (ok2LoadSceneSettings) { - // loading video scene settings - mSceneModeStore.setCurrentScene(Cxe::VideoMode, cenrepSceneValue); - } - - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! -* Set new Image scene mode. -* @returns CxeError::None if successful or any CxeError specific error code. -*/ -void CxeSettingsImp::setImageScene(const QString &newScene) -{ - CX_DEBUG_ENTER_FUNCTION(); - - // load scene specific settings - mSceneModeStore.setCurrentScene(Cxe::ImageMode, newScene); - - // saving current image scene to cenrep - CxeError::Id err = mSettingStore->set(CxeSettingIds::IMAGE_SCENE, newScene); - CxeException::throwIfError(err); - - // saving flash value from scene to cenrep - // call CxeSettingStore::set directly because we don't want to send notifications - // about these changes - QString key(CxeSettingIds::FLASH_MODE); - err = mSettingStore->set(key, mSceneModeStore.currentScene(Cxe::ImageMode)[key].toInt()); - - CxeException::throwIfError(err); - // saving face tracking value from scene to cenrep - key = CxeSettingIds::FACE_TRACKING; - err = mSettingStore->set(key, mSceneModeStore.currentScene(Cxe::ImageMode)[key].toInt()); - CxeException::throwIfError(err); - - // send notifications - emit settingValueChanged(CxeSettingIds::IMAGE_SCENE, mSceneModeStore.currentSceneId(Cxe::ImageMode)); - notifyListeners(CxeSettingIds::IMAGE_SCENE, mSceneModeStore.currentSceneId(Cxe::ImageMode)); - notifyListeners(CxeSettingIds::IMAGE_SCENE_DATA, mSceneModeStore.currentScene(Cxe::ImageMode)); - - CX_DEBUG_EXIT_FUNCTION(); - -} - -/*! -* Set new video scene mode. -* @returns CxeError::None if successful or any CxeError specific error code. -*/ -void CxeSettingsImp::setVideoScene(const QString &newScene) -{ - CX_DEBUG_ENTER_FUNCTION(); - - mSceneModeStore.setCurrentScene(Cxe::VideoMode, newScene); - - // video scene set successfully, store the scene value to cenrep - CxeError::Id err = mSettingStore->set(CxeSettingIds::VIDEO_SCENE, newScene); - CxeException::throwIfError(err); - - emit settingValueChanged(CxeSettingIds::VIDEO_SCENE, mSceneModeStore.currentSceneId(Cxe::VideoMode)); - notifyListeners(CxeSettingIds::VIDEO_SCENE, mSceneModeStore.currentSceneId(Cxe::VideoMode)); - notifyListeners(CxeSettingIds::VIDEO_SCENE_DATA, mSceneModeStore.currentScene(Cxe::VideoMode)); - - CX_DEBUG_EXIT_FUNCTION(); - -} - -/*! -* Loads all run-time variation settings -*/ -void CxeSettingsImp::loadVariationSettings() -{ - CX_DEBUG_ENTER_FUNCTION(); - CX_DEBUG_ASSERT( mSettingStore ); - - QList variationKeys; - // all supported runtime variation keys are fetched from here. - variationKeys.append(CxeVariationKeys::FREE_MEMORY_LEVELS); - variationKeys.append(CxeVariationKeys::STILL_MAX_ZOOM_LIMITS); - variationKeys.append(CxeVariationKeys::VIDEO_MAX_ZOOM_LIMITS); - - // load all run-time setting values from cenrep. - mVariationSettings = mSettingStore->loadVariationSettings(variationKeys); - - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! - * Notify setting listeners that setting has changed - * @param settingKey Setting that has changed - * @param newValue New value of the setting - */ -void CxeSettingsImp::notifyListeners(const QString &settingKey, const QVariant &newValue) -{ - CX_DEBUG_ENTER_FUNCTION(); - - CX_DEBUG(("CxeSettingsImp::notifyListeners settingKey=%s", settingKey.toAscii().data())); - - if (mSettingListeners.contains(settingKey)) { - CX_DEBUG(("Listeners found")); - // get list of listener - CxeSettingListenerList& list = mSettingListeners[settingKey]; - - // iterate through the list and call all listeners - CxeSettingListenerList::const_iterator i = list.constBegin(); - for(; i != list.constEnd(); ++i) { - - QObject *object = (*i).first; - QMetaMethod slot = (*i).second; - - CX_DEBUG_ASSERT(object); - - // invoke the slot - CX_DEBUG(("Calling slot %s::%s", object->metaObject()->className(), slot.signature())); - - bool ok = false; - if (slot.parameterTypes().size() == 2) { - // slot has two parameters, send settingKey as well - ok = slot.invoke(object, - Qt::AutoConnection, - Q_ARG(QString, settingKey), - Q_ARG(QVariant, newValue)); - } else { - // don't send settingKey as parameter - ok = slot.invoke(object, - Qt::AutoConnection, - Q_ARG(QVariant, newValue)); - } - - if (!ok) { - CX_DEBUG(("QMetaMethod::invoke() failed, listener not notified")) - } - - } - - } else { - CX_DEBUG(("NO listeners found")); - } - - - - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! - * Handle deletion of registered listener. - */ -void CxeSettingsImp::handleListenerDestroyed(QObject *object) -{ - CX_DEBUG_ENTER_FUNCTION(); - - QList keyList = mSettingListeners.keys(); - - for (int i = 0; i < keyList.size(); i++) { - - QString key = keyList[i]; - CxeSettingListenerList& list = mSettingListeners[key]; - - for (int j = 0; j < list.size(); j++) { - CxeSettingListener &listener = list[j]; - if (listener.first == object) { - list.removeAt(j--); - } - } - - // removed last listener for this key - if (list.size() == 0) { - mSettingListeners.remove(key); - } - } - - CX_DEBUG_EXIT_FUNCTION(); -} - -// end of file