--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/controlpanelui/src/cpprofilewrapper/src/cpprofilemodel_p.cpp Tue Aug 31 15:15:28 2010 +0300
@@ -0,0 +1,703 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "cpprofilemodel_p.h"
+#include "cpprofilemodel.h"
+#include <cplogger.h>
+#include <e32base.h>
+#include <QString>
+#include <QMap>
+#include <MProfileEngineExtended2.h>
+#include <MProfileExtended.h>
+#include <MProfileName.h>
+#include <MProfileTones.h>
+#include <MProfileSetTones.h>
+#include <MProfileExtraTones.h>
+#include <MProfileSetExtraTones.h>
+#include <MProfileExtraSettings.h>
+#include <MProfileSetExtraSettings.h>
+#include <MProfileFeedbackSettings.h>
+#include <MProfileSetFeedbackSettings.h>
+#include <MProfilesNamesArray.h>
+#include <settingsinternalcrkeys.h>
+#include <hbglobal.h>
+#include <QtCore/QStringList>
+#include <MProfileExtended2.h>
+#include <MProfileSetExtraTones2.h>
+#include <MProfileExtraTones2.h>
+#include <MProfileVibraSettings.h>
+#include <MProfileSetVibraSettings.h>
+#include <TProfileToneSettings.h>
+#include <hwrmvibrasdkcrkeys.h>
+#include <centralrepository.h>
+#include <XQConversions>
+#include <profile.hrh>
+/*
+ * Constructor
+ */
+CpProfileModelPrivate::CpProfileModelPrivate()
+ : mEngine(0),
+ mProfileNames(0),
+ q_ptr(0)
+{
+
+}
+
+/*
+ * Initialize the profile engine and available profile list for profile wrapper.
+ */
+void CpProfileModelPrivate::initialize(CpProfileModel *parent)
+{
+ q_ptr = parent;
+ CPFW_LOG("CpProfileModelPrivate::CpProfileModelPrivate(), START.");
+ TRAP_IGNORE(
+ mEngine = CreateProfileEngineExtended2L();
+ mProfileNames = mEngine->ProfilesNamesArrayLC();
+ CleanupStack::Pop(); // pop the pointer of mProfileNames
+ /*
+ * Currently, engine part will return all previous version of profile
+ * so some invalid profile will be added in the new list, to avoid this
+ * use hard code to get the right list of profile.
+ */
+ /*MProfilesNamesArray* nameList = mEngine->ProfilesNamesArrayLC();
+ int profileCount = nameList->MdcaCount();
+ for (int i = 0; i<profileCount; i++) {
+ MProfileName *profileName = nameList->ProfileName(i);
+ mProfileList.insert(profileName->Id(), mEngine->Profile2L(profileName->Id()));
+ }
+ CleanupStack::PopAndDestroy(*nameList);*/
+ );
+ mProfileList.append(static_cast<int>(EProfileWrapperGeneralId)); // general id
+ mProfileList.append(static_cast<int>(EProfileWrapperMeetingId)); // meeting id
+ CPFW_LOG("CpProfileModelPrivate::CpProfileModelPrivate(), END");
+}
+
+/*
+ * Destructor
+ */
+CpProfileModelPrivate::~CpProfileModelPrivate()
+{
+ if (mEngine!=0) {
+ mEngine->Release();
+ }
+ if (mProfileNames) {
+ delete mProfileNames;
+ }
+ mProfileList.clear();
+}
+
+/*
+ * Get profile name with its id
+ */
+QString CpProfileModelPrivate::profileName(int profileId) const
+{
+ CPFW_LOG("CpProfileModelPrivate::profileName(), START.");
+ // Return an empty string if id is not valid.
+ if (!isValidProfile(profileId)) {
+ return QString();
+ }
+
+ const MProfileName* name = mProfileNames->ProfileName(profileId);
+ QString profileName;
+ if (name != 0) {
+ profileName = XQConversions::s60DescToQString(name->Name());
+ }
+ CPFW_LOG("CpProfileModelPrivate::profileName(), END.");
+ return profileName;
+}
+
+/*
+ * Get available profiles' name list.
+ */
+QStringList CpProfileModelPrivate::profileNames() const
+{
+ CPFW_LOG("CpProfileModelPrivate::profileNames(), START.");
+ QStringList nameList;
+
+ foreach(int profileId, mProfileList) {
+ const MProfileName *name = mProfileNames->ProfileName(profileId);
+ if (name != 0) {
+ nameList.append(XQConversions::s60DescToQString(name->Name()));
+ }
+ }
+
+ CPFW_LOG("CpProfileModelPrivate::profileNames(), END.");
+ return nameList;
+}
+
+
+/*
+ * Activate a profile with its id, return the result.
+ */
+int CpProfileModelPrivate::activateProfile(int profileId)
+{
+ CPFW_LOG("CpProfileModelPrivate::activateProfile(), START.");
+ // currently, only two profile remains: general and meeting,
+ // But profile engine also support the old profile like:
+ // silence, out ...
+ // so filter the invalid profile id first.
+ if (!isValidProfile(profileId)) {
+ return KErrNotFound;
+ }
+ TRAPD( err,
+ mEngine->SetActiveProfileL( profileId );
+ );
+ CPFW_LOG("CpProfileModelPrivate::activateProfile(), END.");
+ return err;
+}
+
+/*
+ * Get active profile's id
+ */
+int CpProfileModelPrivate::activeProfileId() const
+{
+ return mEngine->ActiveProfileId();
+}
+
+/*
+ * Return all profile settings according to profile's id
+ */
+void CpProfileModelPrivate::profileSettings(int profileId,
+ CpProfileSettings& profileSettings)
+{
+ if (!isValidProfile(profileId)) {
+ return;
+ }
+ QT_TRAP_THROWING(
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(profileId);
+ CleanupStack::PushL(profileExtend);
+
+ const MProfileTones &setTones = profileExtend->ProfileTones();
+ const TProfileToneSettings &toneSettings = setTones.ToneSettings();
+ const MProfileExtraTones2 &extTones = profileExtend->ProfileExtraTones2();
+ const MProfileVibraSettings &vibraSettings =
+ profileExtend->ProfileVibraSettings();
+ const MProfileExtraSettings &extraSettings =
+ profileExtend->ProfileExtraSettings();
+ const MProfileFeedbackSettings &feedbackSettings =
+ extraSettings.ProfileFeedbackSettings();
+
+ profileSettings.mRingTone = XQConversions::s60DescToQString(setTones.RingingTone1());
+ profileSettings.mMessageTone = XQConversions::s60DescToQString(setTones.MessageAlertTone());
+ profileSettings.mEmailTone = XQConversions::s60DescToQString(extTones.EmailAlertTone());
+ profileSettings.mReminderTone = XQConversions::s60DescToQString(extTones.ReminderTone());
+ profileSettings.mNotificationTone = toneSettings.iWarningAndGameTones;
+
+ // only use Keypad Volume as a base value for display in key & touch screen setting option
+ profileSettings.mKeyTouchScreenTone = toneSettings.iKeypadVolume;
+ profileSettings.mKeyTouchScreenVibra = feedbackSettings.TactileFeedback();
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ );
+}
+/*
+ * set profile settings
+ */
+void CpProfileModelPrivate::setProfileSettings(int profileId, CpProfileSettings& profileSettings)
+{
+ if (!isValidProfile(profileId)) {
+ return;
+ }
+
+ QT_TRAP_THROWING (
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(profileId);
+ CleanupStack::PushL(profileExtend);
+
+ MProfileSetTones &setTones = profileExtend->ProfileSetTones();
+ TProfileToneSettings &toneSettings = setTones.SetToneSettings();
+ MProfileSetExtraTones2 &setExtTones =
+ profileExtend->ProfileSetExtraTones2();
+ MProfileSetVibraSettings &setVibraSettings =
+ profileExtend->ProfileSetVibraSettings();
+ MProfileSetExtraSettings &extraSettings =
+ profileExtend->ProfileSetExtraSettings();
+ MProfileSetFeedbackSettings &setFeedbackSettings =
+ extraSettings.ProfileSetFeedbackSettings();
+
+
+ setTones.SetRingingTone1L(*XQConversions::qStringToS60Desc(
+ profileSettings.mRingTone));
+ setTones.SetMessageAlertToneL(*XQConversions::qStringToS60Desc(
+ profileSettings.mMessageTone));
+ setExtTones.SetEmailAlertToneL(*XQConversions::qStringToS60Desc(
+ profileSettings.mEmailTone));
+ setExtTones.SetReminderToneL(*XQConversions::qStringToS60Desc(
+ profileSettings.mReminderTone));
+
+ toneSettings.iWarningAndGameTones
+ = profileSettings.mNotificationTone;
+ // Change the keypad volume and touch screen tone together
+ toneSettings.iKeypadVolume
+ = static_cast<TProfileKeypadVolume> (profileSettings.mKeyTouchScreenTone);
+ setFeedbackSettings.SetAudioFeedback(
+ static_cast<TProfileAudioFeedback> (profileSettings.mKeyTouchScreenTone));
+ setFeedbackSettings.SetTactileFeedback(
+ static_cast<TProfileTactileFeedback> (profileSettings.mKeyTouchScreenVibra));
+
+ mEngine->CommitChangeL(*profileExtend);
+ CleanupStack::Pop(); // profileExtend
+ )
+}
+
+/*
+ * Get the active profile's ring tone name
+ */
+QString CpProfileModelPrivate::ringTone() const
+{
+ // return empty string when active profile id is invalid,
+ // some old application still set the profile which is not available now,
+ // this check can be removed when every application use a correct profile id
+
+ QString ringTone;
+ if (!isValidProfile(activeProfileId())) {
+ return ringTone;
+ }
+ QT_TRAP_THROWING(
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(activeProfileId());
+ CleanupStack::PushL(profileExtend);
+ const MProfileTones &setTones = profileExtend->ProfileTones();
+
+ ringTone = XQConversions::s60DescToQString(setTones.RingingTone1());
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ )
+
+ return ringTone;
+}
+
+/*
+ * Set the ring tone for all profiles
+ */
+void CpProfileModelPrivate::setRingTone(const QString& filePath)
+{
+ for (TInt i = 0; i < mProfileList.count(); ++i) {
+ QT_TRAP_THROWING(
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(mProfileList.at(i));
+ CleanupStack::PushL(profileExtend);
+
+ MProfileSetTones &setTones = profileExtend->ProfileSetTones();
+
+ setTones.SetRingingTone1L( *XQConversions::qStringToS60Desc(filePath) );
+ mEngine ->CommitChangeL(*profileExtend);
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ )
+ }
+}
+
+/*
+ * Get the ringing volume value
+ */
+int CpProfileModelPrivate::masterVolume() const
+{
+ int masterVolume = 0;
+ QT_TRAP_THROWING(masterVolume = mEngine->MasterVolumeL();)
+ return masterVolume;
+}
+
+/*
+ * Set the ringing volume
+ */
+void CpProfileModelPrivate::setMasterVolume(int volume)
+{
+ // the volume range 1-10
+ if (volume >= EProfileRingingVolumeLevel1 && volume <= EProfileRingingVolumeLevel10) {
+ QT_TRAP_THROWING(mEngine->SetMasterVolumeL( volume );)
+ }
+}
+/*
+ * Get the master vibra's status
+ */
+bool CpProfileModelPrivate::masterVibra() const
+{
+ bool masterVibra = false;
+ QT_TRAP_THROWING(masterVibra = mEngine->MasterVibraL();)
+ return masterVibra;
+}
+
+/*
+ * Set master vibra's status
+ */
+void CpProfileModelPrivate::setMasterVibra(bool isVibra)
+{
+ QT_TRAP_THROWING(mEngine->SetMasterVibraL( isVibra );)
+}
+
+/*
+ * Get the status of silence mode.
+ */
+bool CpProfileModelPrivate::silenceMode() const
+{
+ bool isSlience = false;
+ QT_TRAP_THROWING(isSlience = mEngine->SilenceModeL();)
+ return isSlience;
+}
+
+/*
+ * Set the status of silence mode
+ */
+void CpProfileModelPrivate::setSilenceMode(bool isSilence)
+{
+ QT_TRAP_THROWING(mEngine->SetSilenceModeL( isSilence );)
+}
+
+/*
+ * Return the ring tone of a profile, if the profile id is invalid, always
+ * return an empty string
+ */
+QString CpProfileModelPrivate::ringTone(int profileId) const
+{
+ QString ringTone;
+ if(!isValidProfile(profileId)) {
+ return ringTone;
+ }
+ QT_TRAP_THROWING(
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(profileId);
+ CleanupStack::PushL(profileExtend);
+
+ const MProfileTones &setTones = profileExtend->ProfileTones();
+
+ ringTone = XQConversions::s60DescToQString(setTones.RingingTone1());
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ )
+ return ringTone;
+}
+
+/*
+ * Set the ring tone for a profile, if the profile id is invalid, nothing happens
+ */
+void CpProfileModelPrivate::setRingTone(int profileId, const QString& filePath)
+{
+ if(!isValidProfile(profileId)) {
+ return;
+ }
+ QT_TRAP_THROWING(
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(profileId);
+ CleanupStack::PushL(profileExtend);
+
+ MProfileSetTones &setTones = profileExtend->ProfileSetTones();
+
+ setTones.SetRingingTone1L(*XQConversions::qStringToS60Desc(filePath));
+ mEngine->CommitChangeL(*profileExtend);
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ )
+}
+
+/*
+ * Get the message tone of a profile, if the profile id is invalid, always return
+ * an empty string
+ */
+QString CpProfileModelPrivate::messageTone(int profileId) const
+{
+ QString messageTone;
+ if(!isValidProfile(profileId)) {
+ return messageTone;
+ }
+ QT_TRAP_THROWING(
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(profileId);
+ CleanupStack::PushL(profileExtend);
+
+ const MProfileTones &setTones = profileExtend->ProfileTones();
+
+ messageTone = XQConversions::s60DescToQString(setTones.MessageAlertTone());
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ )
+
+ return messageTone;
+}
+
+/*
+ * Set the message tone of a profile, if the profile id is invalid, nothing happens
+ */
+void CpProfileModelPrivate::setMessageTone(int profileId, const QString& filePath)
+{
+ if(!isValidProfile(profileId)) {
+ return;
+ }
+ QT_TRAP_THROWING(
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(profileId);
+ CleanupStack::PushL(profileExtend);
+ MProfileSetTones &setTones =
+ profileExtend->ProfileSetTones();
+ setTones.SetMessageAlertToneL(*XQConversions::qStringToS60Desc(filePath));
+ mEngine->CommitChangeL(*profileExtend);
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ )
+}
+
+/*
+ * Get the email tone of a profile, if profile id is invalid, return an empty string
+ */
+QString CpProfileModelPrivate::emailTone(int profileId) const
+{
+ QString emailTone;
+
+ if(!isValidProfile(profileId)) {
+ return emailTone;
+ }
+ QT_TRAP_THROWING(
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(profileId);
+ CleanupStack::PushL(profileExtend);
+ const MProfileExtraTones2 &extTones =
+ profileExtend->ProfileExtraTones2();
+
+ emailTone = XQConversions::s60DescToQString(extTones.EmailAlertTone());
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ )
+ return emailTone;
+}
+
+/*
+ * Set the email tone for a profile, if the profile id is invalid, nothing happens
+ */
+void CpProfileModelPrivate::setEmailTone(int profileId, const QString& filePath)
+{
+ if(!isValidProfile(profileId)) {
+ return ;
+ }
+ QT_TRAP_THROWING(
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(profileId);
+ CleanupStack::PushL(profileExtend);
+ MProfileSetExtraTones2 &setExtTones =
+ profileExtend->ProfileSetExtraTones2();
+ setExtTones.SetEmailAlertToneL(*XQConversions::qStringToS60Desc(filePath));
+ mEngine->CommitChangeL(*profileExtend);
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ )
+}
+
+/*
+ * Get a reminder tone for a profile, if the profile id is invalid,
+ * always return an emtpy string
+ */
+QString CpProfileModelPrivate::reminderTone(int profileId) const
+{
+ QString reminderTone;
+ if(!isValidProfile(profileId)) {
+ return reminderTone;
+ }
+ QT_TRAP_THROWING(
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(profileId);
+ CleanupStack::PushL(profileExtend);
+ const MProfileExtraTones2 &extTones = profileExtend->ProfileExtraTones2();
+
+ reminderTone = XQConversions::s60DescToQString(extTones.ReminderTone());
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ )
+ return reminderTone;
+}
+
+/*
+ * Set a reminder tone for a profile, if the profile id is invalid,
+ * nothing happens
+ */
+void CpProfileModelPrivate::setReminderTone(int profileId, const QString& filePath)
+{
+ if(!isValidProfile(profileId)) {
+ return;
+ }
+ QT_TRAP_THROWING(
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(profileId);
+ CleanupStack::PushL(profileExtend);
+
+ MProfileSetExtraTones2 &setExtTones = profileExtend->ProfileSetExtraTones2();
+ setExtTones.SetReminderToneL( *XQConversions::qStringToS60Desc(filePath) );
+ mEngine->CommitChangeL(*profileExtend);
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ )
+}
+
+/*
+ * Get the status of notification tone, if the profile id is invalid,
+ * always return false
+ */
+bool CpProfileModelPrivate::notificationTone(int profileId) const
+{
+ bool ret = false;
+ if(!isValidProfile(profileId)) {
+ return false;
+ }
+ QT_TRAP_THROWING(
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(profileId);
+ CleanupStack::PushL(profileExtend);
+
+ const MProfileTones &setTones = profileExtend->ProfileTones();
+ const TProfileToneSettings &toneSettings = setTones.ToneSettings();
+ ret = toneSettings.iWarningAndGameTones;
+
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ )
+ return ret;
+}
+
+/*
+ * Set the status of notification tone, if the profile id is
+ * invalid, nothing happens
+ */
+void CpProfileModelPrivate::setNotificationTone(int profileId, bool isActive)
+{
+ if(!isValidProfile(profileId)) {
+ return ;
+ }
+ QT_TRAP_THROWING(
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(profileId);
+ CleanupStack::PushL(profileExtend);
+ MProfileSetTones &setTones = profileExtend->ProfileSetTones();
+ TProfileToneSettings &toneSettings = setTones.SetToneSettings();
+
+ toneSettings.iWarningAndGameTones = isActive;
+
+ mEngine->CommitChangeL(*profileExtend);
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ )
+}
+/*
+ * Get key & touch screen tone's value, if the profile id
+ * is invalid, always return 0
+ */
+int CpProfileModelPrivate::keyTouchScreenTone(int profileId) const
+{
+ int level = 0;
+ if(!isValidProfile(profileId)) {
+ return level;
+ }
+
+ QT_TRAP_THROWING(
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(profileId);
+ CleanupStack::PushL(profileExtend);
+
+ const MProfileTones &setTones = profileExtend->ProfileTones();
+ const TProfileToneSettings &toneSettings = setTones.ToneSettings();
+
+ // Return only keypad volume, but touch tone volume will be synchronized in
+ // SetKeyTouchScreenTone(), these two settings also have the same default value
+ // in cenrep key
+ level = toneSettings.iKeypadVolume;
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ )
+ return level;
+}
+/*
+ * set key & touch screen tone, if the profile id
+ * is invalid, nothing happens
+ */
+void CpProfileModelPrivate::setKeyTouchScreenTone(int profileId, int level)
+{
+ if(!isValidProfile(profileId)) {
+ return ;
+ }
+ QT_TRAP_THROWING(
+
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(profileId);
+ CleanupStack::PushL(profileExtend);
+ MProfileSetTones &setTones =
+ profileExtend->ProfileSetTones();
+ TProfileToneSettings &toneSettings =
+ setTones.SetToneSettings();
+
+ MProfileSetExtraSettings &extraSettings =
+ profileExtend->ProfileSetExtraSettings();
+ MProfileSetFeedbackSettings &setFeedbackSettings =
+ extraSettings.ProfileSetFeedbackSettings();
+
+ // Update the key pad volume and touch tone volume together
+ toneSettings.iKeypadVolume
+ = static_cast<TProfileKeypadVolume> (level);
+
+ setFeedbackSettings.SetAudioFeedback(
+ static_cast<TProfileAudioFeedback> (level));
+
+ mEngine->CommitChangeL(*profileExtend);
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ )
+}
+
+/*
+ * Get key touch screen vibra's value of a profile, return 0 if the
+ * profile id is invalid
+ */
+int CpProfileModelPrivate::keyTouchScreenVibra(int profileId)const
+{
+ int level = 0;
+ if(!isValidProfile(profileId)) {
+ return level;
+ }
+ QT_TRAP_THROWING(
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(profileId);
+ CleanupStack::PushL(profileExtend);
+ const MProfileExtraSettings &extraSettings =
+ profileExtend->ProfileExtraSettings();
+ const MProfileFeedbackSettings &feedbackSettings =
+ extraSettings.ProfileFeedbackSettings();
+ level = feedbackSettings.TactileFeedback();
+
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ )
+
+ return level;
+}
+
+/*
+ * Set key & touch screen vibra for a profile,
+ * if the profile id is invalid, nothing happens
+ */
+void CpProfileModelPrivate::setKeyTouchScreenVibra(int profileId, int level)
+{
+ if(!isValidProfile(profileId)) {
+ return ;
+ }
+ QT_TRAP_THROWING(
+ MProfileExtended2 *profileExtend = mEngine->Profile2L(profileId);
+ CleanupStack::PushL(profileExtend);
+
+ MProfileSetExtraSettings &extraSettings =
+ profileExtend->ProfileSetExtraSettings();
+ MProfileSetFeedbackSettings &setFeedbackSettings =
+ extraSettings.ProfileSetFeedbackSettings();
+ setFeedbackSettings.SetTactileFeedback(
+ static_cast<TProfileTactileFeedback> (level));
+ mEngine->CommitChangeL(*profileExtend);
+ CleanupStack::Pop(); // profileExtend
+ profileExtend->Release();
+ )
+}
+
+/*
+ * Judge the profile is valid or not
+ */
+
+bool CpProfileModelPrivate::isValidProfile(int profileId) const
+{
+ return mProfileList.contains(profileId);
+}
+
+// End of file
+
+