# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1271418798 -10800 # Node ID 76a2435edfd45a84437dbf3dd89c26f028726d51 # Parent 0ba2181d7c28cd8ba1c7c45a7cd83f92d050804e Revision: 201011 Kit: 201015 diff -r 0ba2181d7c28 -r 76a2435edfd4 contacts.pro --- a/contacts.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/contacts.pro Fri Apr 16 14:53:18 2010 +0300 @@ -15,11 +15,5 @@ # TEMPLATE = subdirs -SUBDIRS += phonebookengines/cntfindplugin -SUBDIRS += phonebookengines/cntsortplugin -SUBDIRS += phonebookengines/contactsmodel -SUBDIRS += qtcontactsmobility -SUBDIRS += logsui -SUBDIRS += phonebookengines -SUBDIRS += phonebookui +SUBDIRS = phonebookengines logsui phonebookui CONFIG += ordered \ No newline at end of file diff -r 0ba2181d7c28 -r 76a2435edfd4 contacts_info/contacts_metadata/contacts_metadata.mrp --- a/contacts_info/contacts_metadata/contacts_metadata.mrp Fri Mar 19 09:27:18 2010 +0200 +++ b/contacts_info/contacts_metadata/contacts_metadata.mrp Fri Apr 16 14:53:18 2010 +0300 @@ -1,3 +1,19 @@ +# +# 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: +# + component contacts_metadata source \sf\app\contacts\contacts_info\contacts_metadata source \sf\app\contacts\package_definition.xml diff -r 0ba2181d7c28 -r 76a2435edfd4 contacts_plat/qt_mobility_contacts_api/qt_mobility_contacts_api.metaxml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contacts_plat/qt_mobility_contacts_api/qt_mobility_contacts_api.metaxml Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,15 @@ + + + Qt Mobility Contacts API + Qt Mobility Contacts API for managing contacts data. + c++ + phonebookengines + + + + + + no + no + + diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/inc/logsbaseview.h --- a/logsui/logsapp/inc/logsbaseview.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/inc/logsbaseview.h Fri Apr 16 14:53:18 2010 +0300 @@ -70,6 +70,7 @@ protected slots: virtual void handleBackSoftkey(); + virtual void dialpadOpened(); virtual void dialpadClosed(); virtual void dialpadEditorTextChanged(); virtual void updateEmptyListWidgetsVisibility(); @@ -87,11 +88,11 @@ void initiateCallback(const QModelIndex &listIndex); void initiateCall(int callType); void createMessage(); + void saveContact(); void updateEmptyListLabelVisibility(); void showCallDetails(); void deleteEvent(); - void handleAboutToChangeOrientation(); void handleOrientationChanged(); protected: @@ -116,9 +117,8 @@ void updateListLayoutName( HbListView& list, bool ignoreDialpad = false ); /** * Loads appropriate section from *.docml to resize list widget - * @param name of currently loaded section, will be updated after the call */ - void updateListSize( QString& currentSection ); + void updateListSize(); protected: @@ -146,12 +146,8 @@ void deactivateEmptyListIndicator(QAbstractItemModel* model); void addViewSwitchingEffects(); + void toggleActionAvailability( HbAction* action, bool available ); -private: - - void clearSoftKey(); - void activateSoftKey(); - protected: LogsAppViewId mViewId; @@ -166,7 +162,6 @@ QMap mActionMap; bool mInitialized; - bool mForceDialpadOpened; LogsCall* mCall; //owned LogsMessage* mMessage; //owned @@ -174,6 +169,7 @@ LogsDetailsModel* mDetailsModel; //owned QSignalMapper* mCallTypeMapper; + QString mLayoutSectionName; }; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/inc/logscomponentrepository.h --- a/logsui/logsapp/inc/logscomponentrepository.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/inc/logscomponentrepository.h Fri Apr 16 14:53:18 2010 +0300 @@ -24,6 +24,7 @@ class LogsDetailsView; class LogsMatchesView; class Dialpad; +class DialpadKeyHandler; class LogsAbstractViewManager; class LogsModel; @@ -80,6 +81,7 @@ QObjectList mMatchesViewComponents; Dialpad* mDialpad; + DialpadKeyHandler* mDialpadKeyHandler; LogsModel* mModel; }; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/inc/logsdefs.h --- a/logsui/logsapp/inc/logsdefs.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/inc/logsdefs.h Fri Apr 16 14:53:18 2010 +0300 @@ -37,12 +37,14 @@ const char logsShowFilterMenuId[] = "logs_show_filter_menu"; const char logsLabelEmptyListId[] = "logs_label_empty_list"; const char logsToolbarId[] = "logs_toolbar"; +const char logsButtonAddToContactsId[] = "logs_button_addtocontacts"; //action ids +const char logsCommonVideoCallMenuActionId[] = "logs_act_video_call"; +const char logsCommonMessageMenuActionId[] = "logs_act_create_message"; + const char logsDetailsViewVoiceCallMenuActionId[] = "logs_act_voice_call"; -const char logsDetailsViewVideoCallMenuActionId[] = "logs_act_video_call"; const char logsDetailsViewInternetCallMenuActionId[] = "logs_act_internet_call"; -const char logsDetailsMessageMenuActionId[] = "logs_act_create_message"; const char logsDetailsAddToContactsMenuActionId[] = "logs_act_add_to_contacts"; const char logsDetailsOpenContactMenuActionId[] = "logs_act_open_contact"; const char logsRecentViewClearListMenuActionId[] = "logs_act_clear_list"; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/inc/logsdetailsview.h --- a/logsui/logsapp/inc/logsdetailsview.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/inc/logsdetailsview.h Fri Apr 16 14:53:18 2010 +0300 @@ -42,6 +42,7 @@ public: // From LogsBaseView virtual void activated(bool showDialer, QVariant args); + virtual void deactivated(); public slots: @@ -70,7 +71,6 @@ void initListWidget(); void updateMenu(); - void toggleActionAvailability( HbAction* action, bool available ); private: diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/inc/logsmatchesview.h --- a/logsui/logsapp/inc/logsmatchesview.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/inc/logsmatchesview.h Fri Apr 16 14:53:18 2010 +0300 @@ -18,9 +18,11 @@ #define LOGSMATCHESVIEW_H #include "logsbaseview.h" +#include "logscall.h" class HbListView; class HbAction; +class HbPushButton; class LogsComponentRepository; class LogsAbstractViewManager; class LogsMatchesModel; @@ -46,13 +48,17 @@ public slots: void callKeyPressed(); - + void saveNumberInDialpadToContacts(); + void videoCallToCurrentNum(); + void sendMessageToCurrentNum(); protected slots: //from LogsBaseView virtual void dialpadEditorTextChanged(); + virtual void dialpadOpened(); virtual void dialpadClosed(); virtual void updateWidgetsSizeAndLayout(); + virtual void updateEmptyListWidgetsVisibility(); private: //from LogsBaseView @@ -63,12 +69,15 @@ void initListWidget(); void updateModel(LogsMatchesModel* model); - + void updateMenu(); + void callToCurrentNum( LogsCall::CallType callType ); + void updateAddContactButton(); + private: HbListView* mListView; //not owned LogsMatchesModel* mModel; //owned - QString mLayoutSectionName; + HbPushButton* mAddToContactsButton; // not owned }; #endif // LOGSMATCHESVIEW_H diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/inc/logsrecentcallsview.h --- a/logsui/logsapp/inc/logsrecentcallsview.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/inc/logsrecentcallsview.h Fri Apr 16 14:53:18 2010 +0300 @@ -19,6 +19,7 @@ #include "logsfilter.h" #include "logsbaseview.h" +#include class HbListView; class HbLabel; @@ -26,7 +27,6 @@ class LogsModel; class HbAbstractViewItem; class LogsAbstractViewManager; -class HbGestureSceneFilter; class LogsEffectHandler; class HbGroupBox; class LogsMatchesModel; @@ -71,9 +71,8 @@ void clearList(); void updateView(LogsServices::LogsView view); - void initializeGestures(HbGestureSceneFilter* filter); - void leftFlick(int value); - void rightFlick(int value); + void leftFlick(); + void rightFlick(); void dissappearByFadingComplete(); void dissappearByMovingComplete(); bool markMissedCallsSeen(); @@ -95,7 +94,12 @@ void changeView(LogsServices::LogsView view, bool rollOver = false); void updateMenu(); void handleMissedCallsMarking(); - + + //from HbWidget + void gestureEvent(QGestureEvent *event); + + QSwipeGesture::SwipeDirection swipeAngleToDirection(int angle, int delta); + private: HbGroupBox* mViewName; //not owned @@ -104,7 +108,6 @@ QMap mTitleMap; QMap mConversionMap; - QString mLayoutSectionName; LogsModel* mModel; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/inc/logsviewmanager.h --- a/logsui/logsapp/inc/logsviewmanager.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/inc/logsviewmanager.h Fri Apr 16 14:53:18 2010 +0300 @@ -64,6 +64,10 @@ virtual HbMainWindow& mainWindow(); virtual void exitApplication(); +private slots: + + void handleOrientationChanged(); + private: void initViews(); diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/resources/hblistviewitem.css --- a/logsui/logsapp/resources/hblistviewitem.css Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/resources/hblistviewitem.css Fri Apr 16 14:53:18 2010 +0300 @@ -3,13 +3,36 @@ } HbListViewItem[layoutName="logsLandscapeDialpad"]{ - layout:logs-landscape-dialpad; + layout:logs-landscape; } HbListViewItem::text-1[layoutName="logsLandscape"]{ - pref-width: 30.0un; + fixed-width: 40.0un; + text-height: var(hb-param-text-height-primary); } HbListViewItem::text-2[layoutName="logsLandscape"]{ - pref-width: 30.0un; + + fixed-width: 40.0un; + text-height: var(hb-param-text-height-secondary); +} + +HbListViewItem::text-1[layoutName="logsLandscapeDialpad"]{ + fixed-width: 38.0un; + text-height: var(hb-param-text-height-primary); } + +HbListViewItem::text-2[layoutName="logsLandscapeDialpad"]{ + fixed-width: 0.0un; + text-height: 0.0un; +} + +HbListViewItem::text-1[layoutName="default"]{ + fixed-width: 40.0un; + text-height: var(hb-param-text-height-primary); +} + +HbListViewItem::text-2[layoutName="default"]{ + fixed-width: 40.0un; + text-height: var(hb-param-text-height-secondary); +} diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/resources/hblistviewitem.widgetml --- a/logsui/logsapp/resources/hblistviewitem.widgetml Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/resources/hblistviewitem.widgetml Fri Apr 16 14:53:18 2010 +0300 @@ -1,5 +1,5 @@ - + - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/src/logsbaseview.cpp --- a/logsui/logsapp/src/logsbaseview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/src/logsbaseview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -28,7 +28,7 @@ //SYSTEM #include -#include +#include #include #include #include @@ -40,6 +40,9 @@ #include #include #include +#include +#include + Q_DECLARE_METATYPE(LogsCall*) Q_DECLARE_METATYPE(LogsMessage*) @@ -49,7 +52,7 @@ const int contextMenuTimeout = 5000000; //5 secs // ----------------------------------------------------------------------------- -// LogsBaseView::LogsBaseView +// // ----------------------------------------------------------------------------- // LogsBaseView::LogsBaseView( @@ -63,7 +66,6 @@ mShowFilterMenu(0), mEmptyListLabel(0), mInitialized(false), - mForceDialpadOpened(false), mCall(0), mMessage(0), mContact(0), @@ -72,40 +74,34 @@ { LOGS_QDEBUG( "logs [UI] -> LogsBaseView::LogsBaseView()" ); - mSoftKeyBackAction = new HbAction(Hb::BackAction, this); - connect( mSoftKeyBackAction, SIGNAL( triggered() ), this, - SLOT( handleBackSoftkey() ) ); + mSoftKeyBackAction = new HbAction(Hb::BackNaviAction, this); + connect(mSoftKeyBackAction, SIGNAL(triggered()), this, + SLOT(handleBackSoftkey())); mDialpad = mRepository.dialpad(); - //mDialpad->setDismissPolicy(Dialpad::NoDismiss); - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::LogsBaseView()" ); } // ----------------------------------------------------------------------------- -// LogsBaseView::~LogsBaseView +// // ----------------------------------------------------------------------------- // LogsBaseView::~LogsBaseView() { LOGS_QDEBUG( "logs [UI] -> LogsBaseView::~LogsBaseView()" ); - clearSoftKey(); - delete mSoftKeyBackAction; - delete mCall; delete mMessage; delete mContact; - delete mDetailsModel; - + delete mDetailsModel; delete mCallTypeMapper; LOGS_QDEBUG( "logs [UI] <- LogsBaseView::~LogsBaseView()" ); } // ----------------------------------------------------------------------------- -// LogsBaseView::viewId +// // ----------------------------------------------------------------------------- // LogsAppViewId LogsBaseView::viewId() const @@ -114,7 +110,7 @@ } // ----------------------------------------------------------------------------- -// LogsBaseView::isExitAllowed +// // ----------------------------------------------------------------------------- // bool LogsBaseView::isExitAllowed() @@ -123,7 +119,7 @@ } // ----------------------------------------------------------------------------- -// LogsBaseView::activated +// // ----------------------------------------------------------------------------- // void LogsBaseView::activated(bool showDialer, QVariant args) @@ -133,24 +129,22 @@ //we have to set object tree of the repository to the current view mRepository.setObjectTreeToView( mViewId ); - if ( !mInitialized ) { + if (!mInitialized) { initView(); } connect( mDialpad, SIGNAL( aboutToClose() ), this, SLOT( dialpadClosed() ), Qt::QueuedConnection ); + connect( mDialpad, SIGNAL( aboutToOpen() ), this, + SLOT( dialpadOpened() ), Qt::QueuedConnection ); connect( &mDialpad->editor(), SIGNAL( contentsChanged() ), this, SLOT( dialpadEditorTextChanged() ) ); - - connect( &mViewManager.mainWindow(), SIGNAL(aboutToChangeOrientation()), - this, SLOT(handleAboutToChangeOrientation()) ); + + if ( navigationAction() != mSoftKeyBackAction ) { + setNavigationAction(mSoftKeyBackAction); + } - connect( &mViewManager.mainWindow(), SIGNAL(orientationChanged(Qt::Orientation)), - this, SLOT(handleOrientationChanged()) ); - - activateSoftKey(); - - if ( showDialer && !mDialpad->isVisible() ) { + if (showDialer && !mDialpad->isOpen()) { openDialpad(); } @@ -159,7 +153,7 @@ } // ----------------------------------------------------------------------------- -// LogsBaseView::deactivated +// // ----------------------------------------------------------------------------- // void LogsBaseView::deactivated() @@ -167,18 +161,14 @@ LOGS_QDEBUG( "logs [UI] <-> LogsBaseView::deactivated()" ); disconnect( mDialpad, SIGNAL( aboutToClose() ), this, SLOT( dialpadClosed() ) ); + disconnect( mDialpad, SIGNAL( aboutToOpen() ), this, + SLOT( dialpadOpened() ) ); disconnect( &mDialpad->editor(), SIGNAL( contentsChanged() ), this, SLOT( dialpadEditorTextChanged() ) ); - - disconnect( &mViewManager.mainWindow(), SIGNAL(aboutToChangeOrientation()), - this, SLOT(handleAboutToChangeOrientation()) ); - disconnect( &mViewManager.mainWindow(), SIGNAL(orientationChanged(Qt::Orientation)), - this, SLOT(handleOrientationChanged()) ); - clearSoftKey(); } // ----------------------------------------------------------------------------- -// LogsBaseView::notSupported +// // ----------------------------------------------------------------------------- // void LogsBaseView::notSupported() @@ -190,13 +180,15 @@ } // ----------------------------------------------------------------------------- -// LogsBaseView::handleBackSoftkey +// // ----------------------------------------------------------------------------- // void LogsBaseView::handleBackSoftkey() { + LOGS_QDEBUG( "logs [UI] -> LogsBaseView::handleBackSoftkey()" ); //mViewManager.activatePreviousView(); mViewManager.activateView( LogsRecentViewId, false, QVariant() ); + LOGS_QDEBUG( "logs [UI] <- LogsBaseView::handleBackSoftkey()" ); } // ----------------------------------------------------------------------------- @@ -245,7 +237,7 @@ } // ----------------------------------------------------------------------------- -// LogsBaseView::handleExit +// // ----------------------------------------------------------------------------- // void LogsBaseView::handleExit() @@ -256,7 +248,7 @@ } // ----------------------------------------------------------------------------- -// LogsBaseView::showFilterMenu +// // ----------------------------------------------------------------------------- // void LogsBaseView::showFilterMenu() @@ -270,10 +262,9 @@ QPointF pos( toolbarGeometry.bottomRight().x(), toolbarGeometry.topRight().y() ); - if ( !hbInstance->allMainWindows().isEmpty() ){ - pos.setX(toolbarGeometry.bottomRight().x()); - pos.setY(toolbarGeometry.topRight().y()); - } + pos.setX(toolbarGeometry.bottomRight().x()); + pos.setY(toolbarGeometry.topRight().y()); + mShowFilterMenu->setPreferredPos(pos,HbPopup::BottomRightCorner); LOGS_QDEBUG_2("logs [UI] menupos:", pos) mShowFilterMenu->exec(); @@ -282,7 +273,7 @@ } // ----------------------------------------------------------------------------- -// LogsBaseView::openDialpad +// // ----------------------------------------------------------------------------- // void LogsBaseView::openDialpad() @@ -291,12 +282,11 @@ updateCallButton(); setDialpadPosition(); mDialpad->openDialpad(); - updateWidgetsSizeAndLayout(); LOGS_QDEBUG( "logs [UI] <- LogsBaseView::openDialpad()" ); } // ----------------------------------------------------------------------------- -// LogsBaseView::openContactsApp +// // ----------------------------------------------------------------------------- // void LogsBaseView::openContactsApp() @@ -313,7 +303,7 @@ } // ----------------------------------------------------------------------------- -// LogsBaseView::setDialpadPosition +// // ----------------------------------------------------------------------------- // void LogsBaseView::setDialpadPosition() @@ -334,12 +324,23 @@ mDialpad->setPos(QPointF(0, screenHeight/2.25)); mDialpad->setPreferredSize(screenRect.width(), screenHeight-screenHeight/2.25); - } + } LOGS_QDEBUG( "logs [UI] <- LogsBaseView::setDialpadPosition()" ); } // ----------------------------------------------------------------------------- -// LogsBaseView::dialpadClosed +// +// ----------------------------------------------------------------------------- +// +void LogsBaseView::dialpadOpened() +{ + LOGS_QDEBUG( "logs [UI] -> LogsBaseView::dialpadOpened()" ); + updateWidgetsSizeAndLayout(); + LOGS_QDEBUG( "logs [UI] <- LogsBaseView::dialpadOpened()" ); +} + +// ----------------------------------------------------------------------------- +// // ----------------------------------------------------------------------------- // void LogsBaseView::dialpadClosed() @@ -351,7 +352,7 @@ } // ----------------------------------------------------------------------------- -// LogsBaseView::dialpadEditorTextChanged +// // ----------------------------------------------------------------------------- // void LogsBaseView::dialpadEditorTextChanged() @@ -366,7 +367,7 @@ } // ----------------------------------------------------------------------------- -// LogsBaseView::changeFilter +// // ----------------------------------------------------------------------------- // void LogsBaseView::changeFilter(HbAction* action) @@ -380,7 +381,7 @@ } // ----------------------------------------------------------------------------- -// LogsBaseView::showListItemMenu +// // ----------------------------------------------------------------------------- // void LogsBaseView::showListItemMenu( @@ -392,14 +393,17 @@ updateListItemData(item->modelIndex()); populateListItemMenu(itemContextMenu); - + + if (mDialpad->isOpen()) { + mDialpad->closeDialpad(); + } if (itemContextMenu.actions().count() > 0) { itemContextMenu.exec(coords); } } // ----------------------------------------------------------------------------- -// LogsBaseView::populateListItemMenu +// // ----------------------------------------------------------------------------- // void LogsBaseView::populateListItemMenu(HbMenu& menu) @@ -409,32 +413,38 @@ if (mCall) { mCallTypeMapper = new QSignalMapper(); + foreach(LogsCall::CallType callType, mCall->allowedCallTypes()){ - if (callType != mCall->defaultCallType()) { - HbAction* callAction = new HbAction; - if (callType == LogsCall::TypeLogsVoiceCall){ - callAction->setText(tr("Voice call")); - } - else if (callType == LogsCall::TypeLogsVideoCall){ - callAction->setText(tr("Video call")); - } - else if (callType == LogsCall::TypeLogsVoIPCall){ - callAction->setText(tr("VoIP call")); - } - - connect(callAction, SIGNAL(triggered()), - mCallTypeMapper, SLOT( map()) ); - mCallTypeMapper->setMapping(callAction, callType); - + HbAction* callAction = new HbAction; + if (callType == LogsCall::TypeLogsVoiceCall){ + callAction->setText(hbTrId("txt_common_menu_voice_call")); + } + else if (callType == LogsCall::TypeLogsVideoCall){ + callAction->setText(hbTrId("txt_common_menu_video_call")); + } + else if (callType == LogsCall::TypeLogsVoIPCall){ + callAction->setText(hbTrId("txt_common_menu_internet_call")); + } + + connect(callAction, SIGNAL(triggered()), + mCallTypeMapper, SLOT( map()) ); + mCallTypeMapper->setMapping(callAction, callType); + + // Default call type must be the first item in context menu + if (callType != mCall->defaultCallType() || + menu.actions().count() == 0){ menu.addAction(callAction); - } - } + } else { + menu.insertAction(menu.actions().at(0), callAction); + } + } connect(mCallTypeMapper, SIGNAL(mapped(int)), this, SLOT( initiateCall(int)) ); } + if (mMessage) { HbAction* messageAction = new HbAction; - messageAction->setText(tr("Create message")); + messageAction->setText(hbTrId("txt_common_menu_create_message")); menu.addAction(messageAction); QObject::connect( messageAction, SIGNAL(triggered()), this, SLOT( createMessage() ) ); @@ -443,27 +453,27 @@ HbAction* contactAction = new HbAction; if (mContact->allowedRequestType() == LogsContact::TypeLogsContactOpen) { - contactAction->setText(tr("Open contact")); + contactAction->setText(hbTrId("txt_dialer_ui_menu_open_contact")); QObject::connect( contactAction, SIGNAL(triggered()), mContact, SLOT(open()) ); } else { - contactAction->setText(tr("Add to contacts")); + contactAction->setText(hbTrId("txt_common_menu_add_to_contacts")); QObject::connect( contactAction, SIGNAL(triggered()), - mContact, SLOT(save()) ); + this, SLOT(saveContact()) ); } menu.addAction(contactAction); } if (mDetailsModel) { HbAction* callDetailsAction = new HbAction; - callDetailsAction->setText(tr("Call details")); + callDetailsAction->setText(hbTrId("txt_dialer_ui_menu_call_details")); menu.addAction(callDetailsAction); QObject::connect(callDetailsAction, SIGNAL(triggered()), this, SLOT(showCallDetails())); HbAction* deleteAction = new HbAction; - deleteAction->setText(tr("Delete")); + deleteAction->setText(hbTrId("txt_common_menu_delete")); menu.addAction(deleteAction); QObject::connect(deleteAction, SIGNAL(triggered()), this, SLOT(deleteEvent())); @@ -471,7 +481,7 @@ } // ----------------------------------------------------------------------------- -// LogsBaseView::updateListItemData +// // ----------------------------------------------------------------------------- // void LogsBaseView::updateListItemData(const QModelIndex& listIndex) @@ -525,13 +535,64 @@ // void LogsBaseView::createMessage() { - //TODO: replace following 'Not supported' -popup - // code with real message sending implementation - notSupported(); + LOGS_QDEBUG( "logs [UI] -> LogsBaseView::createMessage()" ); + if (mMessage) { + mMessage->sendMessage(); + } + LOGS_QDEBUG( "logs [UI] -> LogsBaseView::createMessage()" ); } // ----------------------------------------------------------------------------- -// LogsBaseView::updateCall +// +// ----------------------------------------------------------------------------- +// +void LogsBaseView::saveContact() +{ + LOGS_QDEBUG( "logs [UI] -> LogsBaseView::saveContact()" ); + + if (mContact){ + HbDialog* popup = new HbDialog(); + popup->setDismissPolicy(HbDialog::NoDismiss); + popup->setHeadingWidget( + new HbLabel(hbTrId("txt_dial_title_add_to_contacts"), popup)); + popup->setAttribute(Qt::WA_DeleteOnClose); + popup->setTimeout( HbPopup::NoTimeout ); + popup->setSecondaryAction( + new HbAction(hbTrId("txt_dial_button_cancel"), popup)); + + HbWidget* buttonWidget = new HbWidget(popup); + QGraphicsLinearLayout* layout = new QGraphicsLinearLayout(Qt::Vertical); + + HbPushButton* addButton = new HbPushButton(buttonWidget); + addButton->setOrientation(Qt::Horizontal); + addButton->setText(hbTrId("txt_dial_list_save_as_a_new_contact")); + HbIcon plusIcon("qtg_mono_plus"); + addButton->setIcon(plusIcon); + connect(addButton, SIGNAL(clicked()), popup, SLOT(close())); + connect(addButton, SIGNAL(clicked()), mContact, SLOT(addNew())); + + HbPushButton* updateButton = new HbPushButton(buttonWidget); + updateButton->setOrientation(Qt::Horizontal); + updateButton->setText(hbTrId("txt_dial_list_update_existing_contact")); + updateButton->setIcon(plusIcon); + connect(updateButton, SIGNAL(clicked()), popup, SLOT(close())); + connect(updateButton, SIGNAL(clicked()), + mContact, SLOT(updateExisting())); + + layout->addItem(addButton); + layout->addItem(updateButton); + + buttonWidget->setLayout(layout); + popup->setContentWidget(buttonWidget); + + popup->exec(); + } + + LOGS_QDEBUG( "logs [UI] <- LogsBaseView::saveContact()" ); +} + +// ----------------------------------------------------------------------------- +// // ----------------------------------------------------------------------------- // void LogsBaseView::updateCall(const QModelIndex &listIndex) @@ -545,7 +606,7 @@ } // ----------------------------------------------------------------------------- -// LogsBaseView::updateMessage +// // ----------------------------------------------------------------------------- // void LogsBaseView::updateMessage(const QModelIndex &listIndex) @@ -559,7 +620,7 @@ } // ----------------------------------------------------------------------------- -// LogsBaseView::updateContact +// // ----------------------------------------------------------------------------- // void LogsBaseView::updateContact(const QModelIndex &listIndex) @@ -573,7 +634,7 @@ } // ----------------------------------------------------------------------------- -// LogsBaseView::updateDetailsModel +// // ----------------------------------------------------------------------------- // void LogsBaseView::updateDetailsModel(const QModelIndex &listIndex) @@ -587,32 +648,6 @@ } // ----------------------------------------------------------------------------- -// LogsBaseView::clearSoftKey -// ----------------------------------------------------------------------------- -// -void LogsBaseView::clearSoftKey() -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::clearSoftKey()" ); - if ( !hbInstance->allMainWindows().isEmpty() ){ - hbInstance->allMainWindows().at(0)->removeSoftKeyAction( - Hb::SecondarySoftKey, mSoftKeyBackAction ); - } - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::clearSoftKey()" ); -} - -// ----------------------------------------------------------------------------- -// LogsBaseView::activateSoftKey -// ----------------------------------------------------------------------------- -// -void LogsBaseView::activateSoftKey() -{ - if ( !hbInstance->allMainWindows().isEmpty() ){ - hbInstance->allMainWindows().at(0)->addSoftKeyAction( - Hb::SecondarySoftKey, mSoftKeyBackAction ); - } -} - -// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- // @@ -729,7 +764,7 @@ // ----------------------------------------------------------------------------- // void LogsBaseView::updateWidgetsSizeAndLayout() -{ +{ } // ----------------------------------------------------------------------------- @@ -741,9 +776,13 @@ LOGS_QDEBUG( "logs [UI] -> LogsBaseView::updateListLayoutName()" ); QString newLayout( logsListDefaultLayout ); Qt::Orientation orientation = mViewManager.mainWindow().orientation(); - if ( orientation == Qt::Horizontal ) { - if ( mDialpad->isVisible() && !ignoreDialpad ) { - newLayout = QString( logsListLandscapeDialpadLayout ); + if (orientation == Qt::Horizontal) { + if (mDialpad->isOpen()) { + if (ignoreDialpad) { + newLayout = QString( logsListDefaultLayout ); + } else { + newLayout = QString( logsListLandscapeDialpadLayout ); + } } else { newLayout = QString( logsListLandscapeLayout ); } @@ -751,10 +790,11 @@ newLayout = QString( logsListDefaultLayout ); } - if ( newLayout != listView.layoutName() ) { + if (newLayout != listView.layoutName()) { LOGS_QDEBUG_2( "logs [UI] setting new list layout name: ", newLayout ); listView.setLayoutName( newLayout ); } + LOGS_QDEBUG( "logs [UI] <- LogsBaseView::updateListLayoutName()" ); } @@ -762,14 +802,14 @@ // Loads appropriate section from *.docml to resize list widget // ----------------------------------------------------------------------------- // -void LogsBaseView::updateListSize( QString& currentSection ) +void LogsBaseView::updateListSize() { LOGS_QDEBUG( "logs [UI] -> LogsBaseView::updateListSize()" ); QString newSection( logsViewDefaultSection ); Qt::Orientation orientation = mViewManager.mainWindow().orientation(); - if ( mDialpad->isVisible() ) { - if ( orientation == Qt::Horizontal ) { + if (mDialpad->isOpen()) { + if (orientation == Qt::Horizontal) { newSection = QString( logsViewLandscapeDialpadSection ); } else { newSection = QString( logsViewPortraitDialpadSection ); @@ -778,50 +818,34 @@ newSection = QString( logsViewDefaultSection ); } - if ( newSection != currentSection ) { - currentSection = newSection; + if (newSection != mLayoutSectionName) { + mLayoutSectionName = newSection; + LOGS_QDEBUG_2( "logs [UI] loading new section: ", newSection ); mRepository.loadSection( viewId(), newSection ); } + LOGS_QDEBUG( "logs [UI] <- LogsBaseView::updateListSize()" ); } - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::handleAboutToChangeOrientation() -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::handleAboutToChangeOrientation()" ); - //we close dialpad until orientation switching is done, - //otherwise dialpad widget is visible on top of orientation switch effect - if ( mDialpad->isVisible() ) { - mForceDialpadOpened = true; - //temporary disconnect from the aboutToClose signal, since we don't want to - //do widgets size and layout update now, it will be done once orientation - //switch is finnished - disconnect( mDialpad, SIGNAL( aboutToClose() ), this, - SLOT( dialpadClosed() ) ); - mDialpad->closeDialpad(); - connect( mDialpad, SIGNAL( aboutToClose() ), this, - SLOT( dialpadClosed() ), Qt::QueuedConnection ); - } - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::handleAboutToChangeOrientation()" ); -} - // ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- // void LogsBaseView::handleOrientationChanged() { - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::handleOrientationChanged()" ); - //view switching animation is over, now we have to reopen dialpad, if needed - if ( mForceDialpadOpened ) { - setDialpadPosition(); - mDialpad->openDialpad(); + LOGS_QDEBUG( "logs [UI] -> LogsBaseView::handleOrientationChanged()!" ); + setDialpadPosition(); + updateWidgetsSizeAndLayout(); + LOGS_QDEBUG( "logs [UI] <- LogsBaseView::handleOrientationChanged()"); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsBaseView::toggleActionAvailability( HbAction* action, bool available ) +{ + if ( action ){ + action->setVisible( available ); } - mForceDialpadOpened = false; - updateWidgetsSizeAndLayout(); - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::handleOrientationChanged()" ); } diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/src/logscomponentrepository.cpp --- a/logsui/logsapp/src/logscomponentrepository.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/src/logscomponentrepository.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,10 +21,12 @@ #include "logsdetailsview.h" #include "logslogger.h" #include "logsmodel.h" +#include "logsabstractviewmanager.h" //SYSTEM #include #include +#include #include // ----------------------------------------------------------------------------- @@ -37,7 +39,8 @@ mRecentCallsView(0), mDetailsView(0), mMatchesView(0), - mDialpad(0) + mDialpad(0), + mDialpadKeyHandler(0) { mModel = new LogsModel(); } @@ -52,6 +55,7 @@ mRecentViewComponents.clear(); mDetailsViewComponents.clear(); mMatchesViewComponents.clear(); + delete mDialpadKeyHandler; delete mDialpad; delete mModel; @@ -159,7 +163,9 @@ Dialpad* LogsComponentRepository::dialpad() { if ( !mDialpad ) { - mDialpad = new Dialpad; + mDialpad = new Dialpad(mViewManager.mainWindow()); + mDialpadKeyHandler = + new DialpadKeyHandler(mDialpad, mViewManager.mainWindow()); } return mDialpad; } diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/src/logsdetailsview.cpp --- a/logsui/logsapp/src/logsdetailsview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/src/logsdetailsview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -83,7 +83,7 @@ mDetailsModel = model; if (mViewName){ - mViewName->setTitleText(mDetailsModel->headerData(0, Qt::Vertical).toString()); + mViewName->setHeading(mDetailsModel->headerData(0, Qt::Vertical).toString()); } if ( mListView ){ @@ -96,6 +96,21 @@ } // ----------------------------------------------------------------------------- +// LogsDetailsView::deactivated +// ----------------------------------------------------------------------------- +// +void LogsDetailsView::deactivated() +{ + //base class handling first + LogsBaseView::deactivated(); + if ( mListView ){ + mListView->setModel( 0 ); + } + delete mDetailsModel; + mDetailsModel = 0; +} + +// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- // @@ -147,7 +162,7 @@ QObject::connect(mContact, SIGNAL(saveCompleted(bool)), this, SLOT(contactActionCompleted(bool)), Qt::QueuedConnection); - mContact->save(); + this->saveContact(); } LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::addToContacts()" ); } @@ -181,7 +196,7 @@ if (modified){ updateMenu(); if (mViewName){ - mViewName->setTitleText( + mViewName->setHeading( mDetailsModel->headerData(0, Qt::Vertical).toString()); } } @@ -286,11 +301,11 @@ HbAction* voiceCallAction = qobject_cast( mRepository.findObject( logsDetailsViewVoiceCallMenuActionId ) ); HbAction* videoCallAction = qobject_cast( - mRepository.findObject( logsDetailsViewVideoCallMenuActionId ) ); + mRepository.findObject( logsCommonVideoCallMenuActionId ) ); HbAction* internetCallAction = qobject_cast( mRepository.findObject( logsDetailsViewInternetCallMenuActionId ) ); HbAction* messageAction = qobject_cast( - mRepository.findObject( logsDetailsMessageMenuActionId ) ); + mRepository.findObject( logsCommonMessageMenuActionId ) ); HbAction* addToContactsAction = qobject_cast( mRepository.findObject( logsDetailsAddToContactsMenuActionId ) ); HbAction* openContactAction = qobject_cast( @@ -331,17 +346,6 @@ } // ----------------------------------------------------------------------------- -// LogsDetailsView::toggleActionAvailability -// ----------------------------------------------------------------------------- -// -void LogsDetailsView::toggleActionAvailability( HbAction* action, bool available ) -{ - if ( action ){ - action->setVisible( available ); - } -} - -// ----------------------------------------------------------------------------- // LogsDetailsView::updateWidgetsSizeAndLayout // ----------------------------------------------------------------------------- // @@ -350,6 +354,7 @@ LOGS_QDEBUG( "logs [UI] -> LogsDetailsView::updateWidgetsSizeAndLayout()" ); if ( mListView ) { updateListLayoutName(*mListView, true); + updateListSize(); } LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::updateWidgetsSizeAndLayout()" ); } diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/src/logsmainwindow.cpp --- a/logsui/logsapp/src/logsmainwindow.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/src/logsmainwindow.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -27,7 +27,9 @@ // LogsMainWindow::LogsMainWindow() : HbMainWindow() { - + if ( viewport() ){ + viewport()->grabGesture(Qt::SwipeGesture); + } } // ----------------------------------------------------------------------------- @@ -36,7 +38,9 @@ // LogsMainWindow::~LogsMainWindow() { - + if ( viewport() ){ + viewport()->ungrabGesture(Qt::SwipeGesture); + } } // ----------------------------------------------------------------------------- diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/src/logsmatchesview.cpp --- a/logsui/logsapp/src/logsmatchesview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/src/logsmatchesview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -23,6 +23,8 @@ #include "logsmodel.h" #include "logsmatchesmodel.h" #include "logscall.h" +#include "logscontact.h" +#include "logsmessage.h" //SYSTEM #include @@ -31,6 +33,7 @@ #include #include #include +#include Q_DECLARE_METATYPE(LogsMatchesModel*) @@ -42,7 +45,8 @@ LogsComponentRepository& repository, LogsAbstractViewManager& viewManager ) : LogsBaseView(LogsMatchesViewId, repository, viewManager), mListView(0), - mModel(0) + mModel(0), + mAddToContactsButton(0) { LOGS_QDEBUG( "logs [UI] <-> LogsMatchesView::LogsMatchesView()" ); } @@ -100,6 +104,10 @@ LogsBaseView::initView(); initListWidget(); + + mAddToContactsButton = qobject_cast( + mRepository.findWidget( logsButtonAddToContactsId ) ); + LOGS_QDEBUG( "logs [UI] <- LogsMatchesView::initView()" ); } @@ -112,7 +120,6 @@ return mModel; } - // ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- @@ -121,15 +128,53 @@ { LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::callKeyPressed()" ); - if ( mDialpad->editor().text().length() > 0 ){ - // Call to inputted number - LogsCall::callToNumber( LogsCall::TypeLogsVoiceCall, mDialpad->editor().text() ); - } + callToCurrentNum( LogsCall::TypeLogsVoiceCall ); LOGS_QDEBUG( "logs [UI] <- LogsMatchesView::callKeyPressed()" ); } // ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsMatchesView::videoCallToCurrentNum() +{ + callToCurrentNum( LogsCall::TypeLogsVideoCall ); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsMatchesView::sendMessageToCurrentNum() +{ + LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::sendMessageToCurrentNum()" ); + if ( mDialpad->editor().text().length() > 0 ){ + // Message to inputted number + LogsMessage::sendMessageToNumber( mDialpad->editor().text() ); + } + LOGS_QDEBUG( "logs [UI] <- LogsMatchesView::sendMessageToCurrentNum()" ); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsMatchesView::saveNumberInDialpadToContacts() +{ + if (mDialpad->editor().text().length() > 0){ + delete mContact; + mContact = 0; + mContact = mModel->createContact(mDialpad->editor().text()); + // Simulate text change in order to do new matching after saving + // number in dialpad + connect(mContact, SIGNAL(saveCompleted(bool)), + this, SLOT(dialpadEditorTextChanged())); + this->saveContact(); + } +} + +// ----------------------------------------------------------------------------- // LogsMatchesView::initListWidget // ----------------------------------------------------------------------------- // @@ -144,13 +189,13 @@ mListView->setFrictionEnabled(true); mListView->listItemPrototype()->setTextFormat(Qt::RichText); - connect( mListView, SIGNAL(activated(const QModelIndex)), - this, SLOT(initiateCallback(const QModelIndex)) ); - - connect( mListView, - SIGNAL(longPressed(HbAbstractViewItem*, const QPointF&)), - this, - SLOT(showListItemMenu(HbAbstractViewItem*, const QPointF&)) ); + connect(mListView, SIGNAL(activated(const QModelIndex)), + this, SLOT(initiateCallback(const QModelIndex))); + + connect(mListView, + SIGNAL(longPressed(HbAbstractViewItem*, const QPointF&)), + this, + SLOT(showListItemMenu(HbAbstractViewItem*, const QPointF&))); LOGS_QDEBUG( "logs [UI] <- LogsMatchesView::initListWidget() " ); } @@ -189,6 +234,7 @@ void LogsMatchesView::dialpadEditorTextChanged() { updateCallButton(); + updateMenu(); QString pattern = mDialpad->editor().text(); if ( pattern.isEmpty() ){ @@ -199,6 +245,15 @@ } } +// ----------------------------------------------------------------------------- +// LogsMatchesView::dialpadOpened +// ----------------------------------------------------------------------------- +// +void LogsMatchesView::dialpadOpened() +{ + LogsBaseView::dialpadOpened(); + updateAddContactButton(); +} // ----------------------------------------------------------------------------- // LogsMatchesView::dialpadClosed @@ -206,7 +261,10 @@ // void LogsMatchesView::dialpadClosed() { + LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::dialpadClosed()" ); updateWidgetsSizeAndLayout(); + updateAddContactButton(); + LOGS_QDEBUG( "logs [UI] <- LogsMatchesView::dialpadClosed()" ); } // ----------------------------------------------------------------------------- @@ -217,8 +275,65 @@ { LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::updateWidgetsSizeAndLayout()" ); if ( mListView ) { + updateMenu(); updateListLayoutName(*mListView); - updateListSize(mLayoutSectionName); + updateListSize(); } LOGS_QDEBUG( "logs [UI] <- LogsMatchesView::updateWidgetsSizeAndLayout()" ); } + +// ----------------------------------------------------------------------------- +// LogsMatchesView::updateEmptyListWidgetsVisibility +// ----------------------------------------------------------------------------- +// +void LogsMatchesView::updateEmptyListWidgetsVisibility() +{ + updateEmptyListLabelVisibility(); + updateAddContactButton(); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsMatchesView::updateMenu() +{ + LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::updateMenu()" ); + HbAction* videoCallAction = qobject_cast( + mRepository.findObject( logsCommonVideoCallMenuActionId ) ); + HbAction* sendMessageAction = qobject_cast( + mRepository.findObject( logsCommonMessageMenuActionId ) ); + + bool visible( mDialpad->isOpen() && !mDialpad->editor().text().isEmpty() ); + + toggleActionAvailability( videoCallAction, visible ); + toggleActionAvailability( sendMessageAction, visible ); + LOGS_QDEBUG( "logs [UI] <- LogsMatchesView::updateMenu()" ); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsMatchesView::callToCurrentNum( LogsCall::CallType callType ) +{ + if ( mDialpad->editor().text().length() > 0 ){ + // Call to inputted number + LogsCall::callToNumber( callType, mDialpad->editor().text() ); + } +} + +// ----------------------------------------------------------------------------- +// LogsMatchesView::updateAddContactButton +// ----------------------------------------------------------------------------- +// +void LogsMatchesView::updateAddContactButton() +{ + if (mAddToContactsButton) { + LOGS_QDEBUG( "logs [UI] <-> LogsMatchesView::updateAddContactButton()" ); + bool matchesFound(model() && (model()->rowCount() > 0)); + mAddToContactsButton->setVisible(!matchesFound + && mDialpad->isOpen() + && !mDialpad->editor().text().isEmpty()); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/src/logsrecentcallsview.cpp --- a/logsui/logsapp/src/logsrecentcallsview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/src/logsrecentcallsview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -36,16 +36,16 @@ #include #include #include -#include -#include #include #include +#include +#include #include -#include Q_DECLARE_METATYPE(LogsMatchesModel*) const int logsMissedCallsMarkingDelayMs = 1000; +const int logsSwipeAngleDelta = 30; // angle is from 0 to 360 // ----------------------------------------------------------------------------- // LogsRecentCallsView::LogsRecentCallsView @@ -263,7 +263,7 @@ HbAction *selected = note->exec(); if (selected == note->primaryAction()){ - mModel->clearList( mFilter->clearType() ); + mModel->clearList( mFilter->clearType() ); } delete note; } @@ -317,10 +317,10 @@ // void LogsRecentCallsView::addStringsToMap() { - mTitleMap.insert(LogsBaseView::ViewAll, tr("Recent calls")); - mTitleMap.insert(LogsBaseView::ViewCalled, tr("Dialled calls")); - mTitleMap.insert(LogsBaseView::ViewReceived, tr("Received calls")); - mTitleMap.insert(LogsBaseView::ViewMissed, tr("Missed calls")); + mTitleMap.insert(LogsBaseView::ViewAll, hbTrId("txt_dialer_subhead_recent_calls")); + mTitleMap.insert(LogsBaseView::ViewCalled, hbTrId("txt_dialer_subhead_dialled_calls")); + mTitleMap.insert(LogsBaseView::ViewReceived, hbTrId("txt_dial_subhead_received_calls")); + mTitleMap.insert(LogsBaseView::ViewMissed, hbTrId("txt_dialer_subhead_missed_calls")); } // ----------------------------------------------------------------------------- @@ -338,9 +338,6 @@ // Optimize memory usage, list reserves only memory for visible items mListView->setItemRecycling(true); - // Optimizes speed as we know that list items have always the same size - mListView->setUniformItemSizes(true); - connect(mListView, SIGNAL(activated(const QModelIndex)), this, SLOT(initiateCallback(const QModelIndex))); connect(mListView, @@ -348,16 +345,12 @@ this, SLOT(showListItemMenu(HbAbstractViewItem*, const QPointF&))); - connect(mListView,SIGNAL(gestureSceneFilterChanged(HbGestureSceneFilter*)), - this,SLOT(initializeGestures(HbGestureSceneFilter*))); - - // Need to set scrolling style back and forth to force - // gestureSceneFilterChanged signal inside which we can - // add additional gestures. - mListView->setScrollingStyle(HbScrollArea::Pan); mListView->setScrollingStyle(HbScrollArea::PanOrFlick); + mListView->setFrictionEnabled(true); mListViewX = mListView->pos().x(); + + grabGesture(Qt::SwipeGesture); LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::initListWidget() " ); } @@ -401,7 +394,7 @@ void LogsRecentCallsView::updateViewName() { if ( mViewName ) { - mViewName->setTitleText( mTitleMap.value(mConversionMap.value(mCurrentView))); + mViewName->setHeading( mTitleMap.value(mConversionMap.value(mCurrentView))); } } @@ -449,39 +442,69 @@ } // ----------------------------------------------------------------------------- -// LogsRecentCallsView::initializeGestures -// Gestures are added a bit ackwardly as scene (of list) needs to be present -// at gesture addition phase and we need to add gestures each time list -// changes its gesture filter. +// LogsRecentCallsView::gestureEvent // ----------------------------------------------------------------------------- // -void LogsRecentCallsView::initializeGestures(HbGestureSceneFilter* filter) +void LogsRecentCallsView::gestureEvent(QGestureEvent *event) { - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::initializeGestures()" ); - if (filter && mListView){ - LOGS_QDEBUG( "logs [UI] Adding flick gestures" ); - HbGesture* gesture = new HbGesture(HbGesture::left, 50); - filter->addGesture(gesture); - QObject::connect(gesture, SIGNAL(triggered(int)), this, SLOT(leftFlick(int))); - - gesture = new HbGesture(HbGesture::right, 50); - filter->addGesture(gesture); - QObject::connect(gesture, SIGNAL(triggered(int)), this, SLOT(rightFlick(int))); - - mListView->installSceneEventFilter(filter); + LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::gestureEvent()" ); + QGesture* gesture = event->gesture(Qt::SwipeGesture); + if (gesture) { + QSwipeGesture* swipe = static_cast(gesture); + if (swipe->state() == Qt::GestureFinished) { + QSwipeGesture::SwipeDirection direction = swipeAngleToDirection( + swipe->swipeAngle(), logsSwipeAngleDelta); + if (mViewManager.mainWindow().orientation() == Qt::Vertical) { + if (direction == QSwipeGesture::Left) { + leftFlick(); + event->accept(Qt::SwipeGesture); + } else if (direction == QSwipeGesture::Right) { + rightFlick(); + event->accept(Qt::SwipeGesture); + } + } else { + if (direction == QSwipeGesture::Down) { + rightFlick(); + event->accept(Qt::SwipeGesture); + } else if (direction == QSwipeGesture::Up) { + leftFlick(); + event->accept(Qt::SwipeGesture); + } + } + } } - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::initializeGestures()" ); } +// ----------------------------------------------------------------------------- +// LogsRecentCallsView::swipeAngleToDirection +// ----------------------------------------------------------------------------- +// +QSwipeGesture::SwipeDirection LogsRecentCallsView::swipeAngleToDirection( + int angle, int delta) +{ + QSwipeGesture::SwipeDirection direction(QSwipeGesture::NoDirection); + if ((angle > 90-delta) && (angle < 90+delta)) { + direction = QSwipeGesture::Up; + } else if ((angle > 270-delta) && (angle < 270+delta)) { + direction = QSwipeGesture::Down; + } else if (((angle >= 0) && (angle < delta)) + || ((angle > 360-delta) && (angle <= 360))) { + direction = QSwipeGesture::Right; + } else if ((angle > 180-delta) && (angle < 180+delta)) { + direction = QSwipeGesture::Left; + } + LOGS_QDEBUG_4( "logs [UI] LogsRecentCallsView::swipeAngleToDirection() angle: ", + angle, " direction: ", direction ); + return direction; +} // ----------------------------------------------------------------------------- // LogsRecentCallsView::leftFlick // ----------------------------------------------------------------------------- // -void LogsRecentCallsView::leftFlick(int value) +void LogsRecentCallsView::leftFlick() { LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::leftFlick()" ); - Q_UNUSED(value); if ( mConversionMap.value(mCurrentView) + 1 < mTitleMap.count() ){ LogsBaseView::LogsViewMap viewmap = static_cast(mConversionMap.value(mCurrentView) +1); @@ -497,10 +520,9 @@ // LogsRecentCallsView::rightFlick // ----------------------------------------------------------------------------- // -void LogsRecentCallsView::rightFlick(int value) +void LogsRecentCallsView::rightFlick() { LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::rightFlick()" ); - Q_UNUSED(value); if ( mConversionMap.value(mCurrentView) > 0 ){ LogsBaseView::LogsViewMap viewmap = static_cast(mConversionMap.value(mCurrentView) - 1); @@ -552,7 +574,7 @@ // Previous view name has dissappeared by fading, set new view name // as it is brought visible by effect - mViewName->setTitleText( mTitleMap.value(mConversionMap.value(mAppearingView)) ); + mViewName->setHeading( mTitleMap.value(mConversionMap.value(mAppearingView)) ); LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::dissappearByFadingComplete()" ) } @@ -566,7 +588,7 @@ LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::dissappearByMovingComplete()" ) updateView( mAppearingView ); - + LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::dissappearByMovingComplete()" ) } @@ -606,7 +628,7 @@ LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::updateWidgetsSizeAndLayout()" ); if ( mListView ) { updateListLayoutName(*mListView); - updateListSize(mLayoutSectionName); + updateListSize(); } LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::updateWidgetsSizeAndLayout()" ); } diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/src/logsviewmanager.cpp --- a/logsui/logsapp/src/logsviewmanager.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/src/logsviewmanager.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -41,7 +41,12 @@ QObject( 0 ), mMainWindow( mainWindow ), mService( service ) { LOGS_QDEBUG( "logs [UI] -> LogsViewManager::LogsViewManager()" ); - + + //It is important that we always handle orientation change first, before + //dialpad widget. If connection is moved to a view, then it's not guarantied. + connect( &mainWindow, SIGNAL(orientationChanged(Qt::Orientation)), + this, SLOT(handleOrientationChanged()) ); + mComponentsRepository = new LogsComponentRepository(*this); initViews(); @@ -254,3 +259,15 @@ return activated; } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsViewManager::handleOrientationChanged() +{ + LOGS_QDEBUG( "logs [UI] -> LogsViewManager::handleOrientationChanged()" ); + QMetaObject::invokeMethod(mMainWindow.currentView(), "handleOrientationChanged"); + LOGS_QDEBUG( "logs [UI] <- LogsViewManager::handleOrientationChanged()" ); +} diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/src/main.cpp --- a/logsui/logsapp/src/main.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/src/main.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -37,13 +37,22 @@ LogsMainWindow window; QString lang = QLocale::system().name(); - QString path = "c:/epoc32/data/Z/resource/qt/translations/"; + QString path = "z:/resource/qt/translations/"; + //Load common translator + QTranslator commontranslator; + bool returncode = false; + LOGS_QDEBUG("logs [UI] loading common strings translator"); + returncode = commontranslator.load( path + "common_" + lang + ".qm"); + if (returncode==false) { + LOGS_QDEBUG("logs [UI] unable to open file: " + path + "common_" + lang + ".qm"); + } else { + app.installTranslator(&commontranslator); + } - //TODO: put correct path path to translation file & check filename + //Load application-specific translator QTranslator translator; + LOGS_QDEBUG("logs [UI] loading application strings translator"); LOGS_QDEBUG("logs [UI] translation filename dialer_" + lang + ".qm"); - - bool returncode = false; returncode = translator.load( path + "dialer_" + lang + ".qm"); if (returncode==false) { LOGS_QDEBUG("logs [UI] .qm file not found from "+path); diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsbaseview.h --- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsbaseview.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsbaseview.h Fri Apr 16 14:53:18 2010 +0300 @@ -53,8 +53,6 @@ void testConstructor(); void testActivated(); void testDeactivated(); - void testActivateSoftKey(); - void testClearSoftKey(); void testShowFilterMenu(); void testOpenDialpad(); void testSetDialpadPostion(); @@ -67,6 +65,7 @@ void testInitiateCallback(); void testShowListItemMenu(); void testPopulateListItemMenu(); + void testSaveContact(); void testUpdateCall(); void testUpdateMessage(); void testUpdateContact(); @@ -75,7 +74,6 @@ void testUpdateEmptyListLabelVisibility(); void testUpdateListLayoutName(); void testUpdateListSize(); - void testHandleAboutToChangeOrientation(); void testHandleOrientationChanged(); void testHandleExit(); void testIsExitAllowed(); diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsdetailsview.h --- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsdetailsview.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsdetailsview.h Fri Apr 16 14:53:18 2010 +0300 @@ -52,6 +52,7 @@ void testConstructor(); void testActivated(); + void testDeactivated(); void testHandleBackSoftkey(); void testCallKeyPressed(); void testInitiateVoiceCall(); diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsmatchesview.h --- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsmatchesview.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsmatchesview.h Fri Apr 16 14:53:18 2010 +0300 @@ -54,10 +54,17 @@ void testActivated(); void testDeactivated(); void testCallKeyPressed(); + void testVideoCallToCurrentNum(); + void testSendMessageToCurrentNum(); + void testSaveNumberInDialpadToContacts(); void testDialpadEditorTextChanged(); void testDialpadClosed(); + void testDialpadOpened(); void testModel(); void testUpdateWidgetsSizeAndLayout(); + void testHandleOrientationChanged(); + void testUpdateEmptyListWidgetsVisibility(); + void testUpdateAddContactButton(); private: diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsrecentcallsview.h --- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsrecentcallsview.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsrecentcallsview.h Fri Apr 16 14:53:18 2010 +0300 @@ -64,7 +64,8 @@ void testShowCallDetails(); void testOpenDialpad(); void testDialpadEditorTextChanged(); - void testInitializeGestures(); + void testGestureEvent(); + void testSwipeAngleToDirection(); void testViewChangeByFlicking(); void testModel(); void testShowListItemMenu(); diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsviewmanager.h --- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsviewmanager.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsviewmanager.h Fri Apr 16 14:53:18 2010 +0300 @@ -53,6 +53,7 @@ void testExitApplication(); void testAppFocusGained(); void testStartingWithService(); + void testHandleOrientationChanged(); private: diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscall.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscall.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscall.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -65,7 +65,10 @@ // Stub constructor // ----------------------------------------------------------------------------- // -LogsCall::LogsCall() +LogsCall::LogsCall() : + mDefaultCall( TypeLogsCallNotAvailable ), + mEventType(LogsEvent::TypeVoiceCall), + mTestLastCallType(-1) { } diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscall.h --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscall.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscall.h Fri Apr 16 14:53:18 2010 +0300 @@ -39,7 +39,7 @@ enum CallType { TypeLogsCallNotAvailable = 0, - TypeLogsVoiceCall = 0, + TypeLogsVoiceCall, TypeLogsVideoCall, TypeLogsVoIPCall }; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscontact.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscontact.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscontact.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -30,6 +30,14 @@ } // ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +LogsContact::LogsContact(const QString& number): mNumber(number) +{ +} + +// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- // @@ -59,8 +67,16 @@ // // ---------------------------------------------------------------------------- // -bool LogsContact::save() +bool LogsContact::addNew() { return false; } +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +bool LogsContact::updateExisting() +{ + return false; +} diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscontact.h --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscontact.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscontact.h Fri Apr 16 14:53:18 2010 +0300 @@ -21,7 +21,7 @@ #include //forward declarations - +class LogsDbConnector; /** * LogsContact can be used to modify or create a contact in phonebook @@ -41,6 +41,7 @@ //explicit LogsContact(LogsEvent& event, LogsDbConnector& dbConnector); explicit LogsContact(); // Stub constructor + explicit LogsContact(const QString& number); // Stub constructor ~LogsContact(); /** @@ -60,14 +61,22 @@ /** * Launch phonebook view for creation of a new contact. - * Emits openCompeted() signal, when contact saving is done. + * Emits openCompleted() signal, when contact saving is done. * @return true if saving was called successfully */ - bool save(); + bool addNew(); -private: //data + /** + * Launch phonebook view for creation of a new contact. + * Emits openCompleted() signal, when contact saving is done. + * @return true if saving was called successfully + */ + bool updateExisting(); + +public: //stub data //LogsEvent& mEvent; + QString mNumber; }; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmatchesmodel.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmatchesmodel.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmatchesmodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -20,6 +20,7 @@ #include "logsdbconnector.h" #include "logscall.h" #include "logsdetailsmodel.h" +#include "logscontact.h" Q_DECLARE_METATYPE(LogsCall*) Q_DECLARE_METATYPE(LogsDetailsModel*) @@ -94,6 +95,15 @@ // // ----------------------------------------------------------------------------- // +LogsContact* LogsMatchesModel::createContact(const QString& number) +{ + return new LogsContact(number); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// QString LogsMatchesModel::lastCall() { return mLastCall; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmatchesmodel.h --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmatchesmodel.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmatchesmodel.h Fri Apr 16 14:53:18 2010 +0300 @@ -26,6 +26,7 @@ class LogsEvent; class LogsDbConnector; class HbIcon; +class LogsContact; /** * Model for log event details. @@ -44,6 +45,11 @@ ~LogsMatchesModel(); void logsMatches( const QString& pattern ); + /** + * Factory method for creating a new contact object. Transfers ownership. + */ + LogsContact* createContact(const QString& number); + public: // From QAbstractItemModel virtual int rowCount(const QModelIndex &parent) const; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmessage.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmessage.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmessage.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -20,6 +20,7 @@ #include "logsmessage.h" //SYSTEM +bool logsTestMessageSent = false; // ----------------------------------------------------------------------------- // @@ -57,5 +58,28 @@ } +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +bool LogsMessage::sendMessageToNumber( + const QString& number, const QString& displayName, unsigned int contactId) +{ + Q_UNUSED(number); + Q_UNUSED(displayName); + Q_UNUSED(contactId); + logsTestMessageSent = true; +} + +bool LogsMessage::isMessageSent() +{ + return logsTestMessageSent; +} + +void LogsMessage::resetTestData() +{ + logsTestMessageSent = false; +} + // End of file diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmessage.h --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmessage.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmessage.h Fri Apr 16 14:53:18 2010 +0300 @@ -43,9 +43,15 @@ * @return true if sent succesfully */ bool sendMessage(); + static bool sendMessageToNumber( + const QString& number, const QString& displayName = QString(), unsigned int contactId = 0); private: //data LogsEvent mEvent; + +public: // test helpers + static bool isMessageSent(); + static void resetTestData(); private: friend class UT_LogsMessage; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/src/ut_logsbaseview.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsbaseview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsbaseview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -76,7 +76,6 @@ QVERIFY( !mBaseView->mMessage ); QVERIFY( !mBaseView->mContact ); QVERIFY( !mBaseView->mCallTypeMapper ); - QVERIFY( !mBaseView->mForceDialpadOpened ); } void UT_LogsBaseView::testActivated() @@ -87,9 +86,8 @@ QVERIFY( !mBaseView->mShowFilterMenu ); QVERIFY( mBaseView->mActionMap.count() == 4 ); - mBaseView->clearSoftKey(); mBaseView->activated(true, QVariant()); - QVERIFY( mBaseView->mDialpad->isVisible() ); + QVERIFY( mBaseView->mDialpad->isOpen() ); } void UT_LogsBaseView::testDeactivated() @@ -97,23 +95,6 @@ mBaseView->deactivated(); // NOP } -void UT_LogsBaseView::testActivateSoftKey() -{ - QVERIFY( !hbInstance->allMainWindows().isEmpty() ); - mBaseView->activateSoftKey(); - QVERIFY( mBaseView->mSoftKeyBackAction == - hbInstance->allMainWindows().at(0)->softKeyAction(Hb::SecondarySoftKey) ); -} - -void UT_LogsBaseView::testClearSoftKey() -{ - QVERIFY( !hbInstance->allMainWindows().isEmpty() ); - mBaseView->clearSoftKey(); - QVERIFY( mBaseView->mSoftKeyBackAction != - hbInstance->allMainWindows().at(0)->softKeyAction(Hb::SecondarySoftKey) ); -} - - void UT_LogsBaseView::testShowFilterMenu() { HbStubHelper::reset(); @@ -133,23 +114,22 @@ void UT_LogsBaseView::testOpenDialpad() { - QVERIFY( !mBaseView->mDialpad->isVisible() ); - mBaseView->mDialpad->openDialpad(); - QVERIFY( mBaseView->mDialpad->isVisible() ); + QVERIFY( !mBaseView->mDialpad->isOpen() ); + mBaseView->openDialpad(); + QVERIFY( mBaseView->mDialpad->isOpen() ); } void UT_LogsBaseView::testSetDialpadPostion() { QPointF pos = mBaseView->mDialpad->pos(); - HbMainWindow* window = hbInstance->allMainWindows().at(0); - QVERIFY(window); + HbMainWindow& window = mBaseView->mViewManager.mainWindow(); - window->setOrientation( Qt::Horizontal ); + window.setOrientation( Qt::Horizontal ); mBaseView->setDialpadPosition(); QVERIFY( pos != mBaseView->mDialpad->pos() ); pos = mBaseView->mDialpad->pos(); - window->setOrientation( Qt::Vertical ); + window.setOrientation( Qt::Vertical ); mBaseView->setDialpadPosition(); QVERIFY( pos != mBaseView->mDialpad->pos() ); } @@ -229,14 +209,18 @@ void UT_LogsBaseView::testShowListItemMenu() { HbStubHelper::reset(); + + mBaseView->mDialpad->openDialpad(); //menu doen't have any actions HbListViewItem* item = new HbListViewItem(); mBaseView->showListItemMenu( item, QPointF() ); QVERIFY( HbStubHelper::widgetActionsCount() == 0 ); QVERIFY( !HbStubHelper::menuShown() ); + //check that dialpad has closed + QVERIFY( !mBaseView->mDialpad->isVisible() ); //menu has actions and can be executed should be tested in derived class -} + } void UT_LogsBaseView::testPopulateListItemMenu() { @@ -254,6 +238,16 @@ QVERIFY( HbStubHelper::widgetActionsCount() == 5 ); } +void UT_LogsBaseView::testSaveContact() +{ + //no contact, no actions + mBaseView->saveContact(); + + //contact exists, popup would be shown + mBaseView->mContact = new LogsContact(); + mBaseView->saveContact(); +} + void UT_LogsBaseView::testUpdateCall() { mBaseView->mCall = new LogsCall(); @@ -335,64 +329,53 @@ QVERIFY( list.layoutName() == logsListLandscapeLayout ); //landscape with dialpad - mBaseView->mDialpad->setVisible(true); + mBaseView->mDialpad->openDialpad(); mBaseView->updateListLayoutName(list); QVERIFY( list.layoutName() == logsListLandscapeDialpadLayout ); //landscape with dialpad, ignoreDialpad is true mBaseView->updateListLayoutName(list, true); - QVERIFY( list.layoutName() == logsListLandscapeLayout ); + QVERIFY( list.layoutName() == logsListDefaultLayout ); + + //landscape without dialpad, ignoreDialpad is true + mBaseView->mDialpad->closeDialpad(); + mBaseView->updateListLayoutName(list, true); + QVERIFY( list.layoutName() == logsListLandscapeLayout ); } void UT_LogsBaseView::testUpdateListSize() { - QString currentSection("dummy"); + mBaseView->mLayoutSectionName = "dummy"; //default section is loaded mBaseView->mViewManager.mainWindow().setOrientation( Qt::Vertical ); - mBaseView->mDialpad->setVisible(false); - mBaseView->updateListSize(currentSection); - QVERIFY( currentSection == logsViewDefaultSection ); + mBaseView->mDialpad->closeDialpad(); + mBaseView->updateListSize(); + QVERIFY( mBaseView->mLayoutSectionName == logsViewDefaultSection ); //same section again, not loaded - mBaseView->updateListSize(currentSection); - QVERIFY( currentSection == logsViewDefaultSection ); + mBaseView->updateListSize(); + QVERIFY( mBaseView->mLayoutSectionName == logsViewDefaultSection ); //portrait with dialpad - mBaseView->mDialpad->setVisible(true); - mBaseView->updateListSize(currentSection); - QVERIFY( currentSection == logsViewPortraitDialpadSection ); + mBaseView->mDialpad->openDialpad(); + mBaseView->updateListSize(); + QVERIFY( mBaseView->mLayoutSectionName == logsViewPortraitDialpadSection ); //landscape with dialpad mBaseView->mViewManager.mainWindow().setOrientation( Qt::Horizontal ); - mBaseView->updateListSize(currentSection); - QVERIFY( currentSection == logsViewLandscapeDialpadSection ); -} - -void UT_LogsBaseView::testHandleAboutToChangeOrientation() -{ - mBaseView->mDialpad->openDialpad(); - QVERIFY( mBaseView->mDialpad->isVisible() ); - QVERIFY( !mBaseView->mForceDialpadOpened ); - mBaseView->handleAboutToChangeOrientation(); - QVERIFY( !mBaseView->mDialpad->isVisible() ); - QVERIFY( mBaseView->mForceDialpadOpened ); + mBaseView->updateListSize(); + QVERIFY( mBaseView->mLayoutSectionName == logsViewLandscapeDialpadSection ); } void UT_LogsBaseView::testHandleOrientationChanged() { - //dialpad won't be opened after orientation change - QVERIFY( !mBaseView->mForceDialpadOpened ); - QVERIFY( !mBaseView->mDialpad->isVisible() ); + //dialpad position recalculated + QPointF pos; + mBaseView->mDialpad->setPos(pos); + mBaseView->mViewManager.mainWindow().setOrientation( Qt::Horizontal ); mBaseView->handleOrientationChanged(); - QVERIFY( !mBaseView->mForceDialpadOpened ); - QVERIFY( !mBaseView->mDialpad->isVisible() ); - - //dialpad will be opened after orientation change - mBaseView->mForceDialpadOpened = true; - mBaseView->handleOrientationChanged(); - QVERIFY( !mBaseView->mForceDialpadOpened ); - QVERIFY( mBaseView->mDialpad->isVisible() ); + QVERIFY( pos != mBaseView->mDialpad->pos() ); } void UT_LogsBaseView::testHandleExit() diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/src/ut_logscomponentrepository.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logscomponentrepository.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logscomponentrepository.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -57,6 +57,7 @@ QVERIFY( !mRepository->mDetailsView ); QVERIFY( !mRepository->mMatchesView ); QVERIFY( !mRepository->mDialpad ); + QVERIFY( !mRepository->mDialpadKeyHandler ); QVERIFY( mRepository->mModel ); } @@ -107,14 +108,17 @@ void UT_LogsComponentRepository::testDialpad() { - //first call, dialer created as a result of the call + //first call, dialpad and dialpadkeyhandler created as a result of the call QVERIFY( !mRepository->mDialpad ); + QVERIFY( !mRepository->mDialpadKeyHandler ); Dialpad* dialpad = mRepository->dialpad(); QVERIFY( dialpad ); QVERIFY( dialpad == mRepository->mDialpad ); - + QVERIFY( mRepository->mDialpadKeyHandler ); + DialpadKeyHandler* prevKeyHandler = mRepository->mDialpadKeyHandler; //all the next calls, return the same instance of the dialer QVERIFY( dialpad == mRepository->dialpad() ); + QVERIFY( prevKeyHandler == mRepository->mDialpadKeyHandler ); } void UT_LogsComponentRepository::testLoadSection() @@ -126,7 +130,9 @@ QVERIFY( mRepository->loadSection(LogsDetailsViewId, "dummy") ); //loading of existing section is ok + mRepository->matchesView(); QVERIFY( mRepository->loadSection(LogsMatchesViewId, "default") ); + mRepository->recentCallsView(); QVERIFY( mRepository->loadSection(LogsRecentViewId, "default") ); } diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/src/ut_logsdetailsview.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsdetailsview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsdetailsview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -100,6 +100,25 @@ //QT_NO_DEBUG_OUTPUT } +void UT_LogsDetailsView::testDeactivated() +{ + // Deactivation of not properly activated view + LogsDetailsView* view = mRepository->detailsView(); + QVERIFY( !view->mListView ); + view->deactivated(); + QVERIFY( !view->mListView ); + QVERIFY( !view->mDetailsModel ); + + // Deactivation of properly activated view + LogsDetailsModel* model = new LogsDetailsModel; + QVariant arg = qVariantFromValue( model ); + view->activated(false, arg); + QVERIFY( view->mListView ); + view->deactivated(); + QVERIFY( view->mListView ); + QVERIFY( !view->mDetailsModel ); +} + void UT_LogsDetailsView::testHandleBackSoftkey() { mViewManager->reset(); @@ -164,9 +183,9 @@ mDetailsView->updateMenu(); QObject* obj = mRepository->findObject( logsDetailsViewVoiceCallMenuActionId ); HbAction* voiceCallAction = qobject_cast( obj ); - QObject* obj2 = mRepository->findObject( logsDetailsViewVideoCallMenuActionId ); + QObject* obj2 = mRepository->findObject( logsCommonVideoCallMenuActionId ); HbAction* videoCallAction = qobject_cast( obj2 ); - QObject* obj3 = mRepository->findObject( logsDetailsMessageMenuActionId ); + QObject* obj3 = mRepository->findObject( logsCommonMessageMenuActionId ); HbAction* messageAction = qobject_cast( obj3 ); QVERIFY( !voiceCallAction->isVisible() ); QVERIFY( !videoCallAction->isVisible() ); @@ -233,7 +252,7 @@ QVERIFY( mDetailsView->mViewName->titleText().length() > 0 ); // No effect if no contact modify occurred - mDetailsView->mViewName->setTitleText(""); + mDetailsView->mViewName->setHeading(""); mDetailsView->contactActionCompleted(false); QVERIFY( mDetailsView->mViewName->titleText().length() == 0 ); } @@ -252,11 +271,13 @@ mDetailsView->updateWidgetsSizeAndLayout(); HbListView list; - //listView exists, layout updated + //listView exists, layout and size updated mDetailsView->mViewManager.mainWindow().setOrientation( Qt::Horizontal ); - mDetailsView->mDialpad->setVisible(true); + mDetailsView->mDialpad->openDialpad(); mDetailsView->mListView = &list; mDetailsView->mListView->setLayoutName("dummy"); + mDetailsView->mLayoutSectionName = "dummy"; mDetailsView->updateWidgetsSizeAndLayout(); - QVERIFY( mDetailsView->mListView->layoutName() == logsListLandscapeLayout ); + QVERIFY( mDetailsView->mListView->layoutName() == logsListDefaultLayout ); + QVERIFY( mDetailsView->mLayoutSectionName == logsViewLandscapeDialpadSection ); } diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/src/ut_logsmatchesview.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsmatchesview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsmatchesview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -23,6 +23,8 @@ #include "logsmatchesmodel.h" #include "logscall.h" #include "logsmodel.h" +#include "logscontact.h" +#include "logsmessage.h" //SYSTEM #include @@ -30,6 +32,7 @@ #include #include #include +#include Q_DECLARE_METATYPE(LogsMatchesModel*) @@ -66,6 +69,7 @@ QVERIFY( !mMatchesView->mModel ); QVERIFY( mMatchesView->mActionMap.count() == 0 ); QVERIFY( mMatchesView->mLayoutSectionName == "" ); + QVERIFY( !mMatchesView->mAddToContactsButton ); } void UT_LogsMatchesView::testActivated() @@ -84,6 +88,7 @@ QVERIFY( mMatchesView->mActionMap.count() == 4 ); QVERIFY( mMatchesView->mListView->layoutName() == logsListDefaultLayout ); QVERIFY( mMatchesView->mLayoutSectionName == logsViewDefaultSection ); + QVERIFY( mMatchesView->mAddToContactsButton ); //activate once again, model recreated mMatchesView->mViewManager.mainWindow().setOrientation( Qt::Horizontal ); @@ -154,6 +159,43 @@ QVERIFY( LogsCall::isCallToNumberCalled() ); } +void UT_LogsMatchesView::testVideoCallToCurrentNum() +{ + LogsCall::resetTestData(); + QString dial("12345"); + mMatchesView->mDialpad->editor().setText( dial ); + mMatchesView->videoCallToCurrentNum(); + QVERIFY( LogsCall::isCallToNumberCalled() ); +} + +void UT_LogsMatchesView::testSendMessageToCurrentNum() +{ + LogsMessage::resetTestData(); + mMatchesView->mDialpad->editor().setText( "" ); + mMatchesView->sendMessageToCurrentNum(); + QVERIFY( !LogsMessage::isMessageSent() ); + + QString dial("12345"); + mMatchesView->mDialpad->editor().setText( dial ); + mMatchesView->sendMessageToCurrentNum(); + QVERIFY( LogsMessage::isMessageSent() ); +} + +void UT_LogsMatchesView::testSaveNumberInDialpadToContacts() +{ + // Nothing happens if there is no text in dialpad + QVERIFY(!mMatchesView->mContact); + QCOMPARE(mMatchesView->mDialpad->editor().text().length(), 0); + mMatchesView->saveNumberInDialpadToContacts(); + QVERIFY(!mMatchesView->mContact); + + // If there is a number, new contact will be created + mMatchesView->mDialpad->editor().setText("123"); + mMatchesView->saveNumberInDialpadToContacts(); + QVERIFY(mMatchesView->mContact); + QCOMPARE(mMatchesView->mContact->mNumber, QString("123")); +} + void UT_LogsMatchesView::testDialpadEditorTextChanged() { //no model, call button gets enabled @@ -172,22 +214,52 @@ //text erased from input, view changed to recent calls mMatchesView->mDialpad->editor().setText( QString("") ); - QVERIFY( mViewManager->mViewId == LogsRecentViewId ); - + QVERIFY( mViewManager->mViewId == LogsRecentViewId ); } void UT_LogsMatchesView::testDialpadClosed() { - HbListView list; mMatchesView->mViewManager.mainWindow().setOrientation( Qt::Horizontal ); - mMatchesView->mDialpad->setVisible(false); - mMatchesView->mListView = &list; + mMatchesView->mListView = new HbListView(); mMatchesView->mLayoutSectionName = QString("landscape_dialpad"); QString hello("hello"); mMatchesView->mDialpad->editor().setText( hello ); + mMatchesView->mAddToContactsButton = new HbPushButton(); + mMatchesView->mAddToContactsButton->setVisible(true); + mMatchesView->dialpadClosed(); + QVERIFY( mMatchesView->mDialpad->editor().text() == hello ); QVERIFY( mMatchesView->mLayoutSectionName == logsViewDefaultSection ); + QVERIFY( !mMatchesView->mAddToContactsButton->isVisible() ); + delete mMatchesView->mListView; + mMatchesView->mListView = 0; + delete mMatchesView->mAddToContactsButton; + mMatchesView->mAddToContactsButton = 0; +} + +void UT_LogsMatchesView::testDialpadOpened() +{ + //widgets size and layout updated + mMatchesView->mViewManager.mainWindow().setOrientation( Qt::Vertical ); + mMatchesView->mListView = new HbListView(); + mMatchesView->mLayoutSectionName = QString("dummy"); + mMatchesView->mListView->setLayoutName("dummy"); + mMatchesView->mDialpad->mIsOpen = true; + mMatchesView->mAddToContactsButton = new HbPushButton(); + mMatchesView->mAddToContactsButton->setVisible(false); + mMatchesView->mDialpad->editor().setText( "hello" ); + mMatchesView->mDialpad->mIsOpen = true; + + mMatchesView->dialpadOpened(); + + QVERIFY( mMatchesView->mListView->layoutName() == logsListDefaultLayout ); + QVERIFY( mMatchesView->mLayoutSectionName == logsViewPortraitDialpadSection ); + QVERIFY( mMatchesView->mAddToContactsButton->isVisible() ); + delete mMatchesView->mListView; + mMatchesView->mListView = 0; + delete mMatchesView->mAddToContactsButton; + mMatchesView->mAddToContactsButton = 0; } void UT_LogsMatchesView::testModel() @@ -205,16 +277,115 @@ QVERIFY( !mMatchesView->mListView ); mMatchesView->updateWidgetsSizeAndLayout(); - //listView exists, layout and size updated + //listView exists, layout and size updated, dialpad not visible + mRepository->matchesView(); mMatchesView->mViewManager.mainWindow().setOrientation( Qt::Vertical ); - mMatchesView->mDialpad->setVisible(false); + mMatchesView->mDialpad->closeDialpad(); mMatchesView->mListView = new HbListView(); mMatchesView->mListView->setLayoutName("dummy"); mMatchesView->updateWidgetsSizeAndLayout(); QVERIFY( mMatchesView->mListView->layoutName() == logsListDefaultLayout ); QVERIFY( mMatchesView->mLayoutSectionName == logsViewDefaultSection ); + QObject* obj = mRepository->findObject( logsCommonVideoCallMenuActionId ); + HbAction* videoCallAction = qobject_cast( obj ); + QObject* obj2 = mRepository->findObject( logsCommonMessageMenuActionId ); + HbAction* messageAction = qobject_cast( obj2 ); + QVERIFY( !videoCallAction->isVisible() ); + QVERIFY( !messageAction->isVisible() ); + + //listView exists, layout and size updated, dialpad visible + mMatchesView->mDialpad->openDialpad(); + QString hello("hello"); + mMatchesView->mDialpad->editor().setText( hello ); + mMatchesView->mListView->setLayoutName("dummy"); + mMatchesView->updateWidgetsSizeAndLayout(); + QVERIFY( mMatchesView->mListView->layoutName() == logsListDefaultLayout ); + QVERIFY( mMatchesView->mLayoutSectionName == logsViewPortraitDialpadSection ); + QVERIFY( videoCallAction->isVisible() ); + QVERIFY( messageAction->isVisible() ); delete mMatchesView->mListView; mMatchesView->mListView = 0; } +void UT_LogsMatchesView::testHandleOrientationChanged() +{ + //dialpad position recalculated and layout/size updated + QPointF pos; + mMatchesView->mListView = new HbListView(); + mMatchesView->mListView->setLayoutName("dummy"); + mMatchesView->mLayoutSectionName = "dummy"; + mMatchesView->mDialpad->setPos(pos); + mMatchesView->mViewManager.mainWindow().setOrientation( Qt::Horizontal ); + + mMatchesView->handleOrientationChanged(); + + QVERIFY( pos != mMatchesView->mDialpad->pos() ); + QVERIFY( mMatchesView->mListView->layoutName() == logsListLandscapeLayout ); + QVERIFY( mMatchesView->mLayoutSectionName == logsViewDefaultSection ); + delete mMatchesView->mListView; + mMatchesView->mListView = 0; +} + +void UT_LogsMatchesView::testUpdateEmptyListWidgetsVisibility() +{ + LogsDbConnector* dbConnector = 0; + mMatchesView->mModel = new LogsMatchesModel(*dbConnector); + mMatchesView->mModel->mTextData.clear(); + mMatchesView->mDialpad->openDialpad(); + mMatchesView->mDialpad->editor().setText( "hello" ); + mMatchesView->mEmptyListLabel = new HbLabel(); + mMatchesView->mAddToContactsButton = new HbPushButton(); + mMatchesView->mEmptyListLabel->setVisible(false); + mMatchesView->mAddToContactsButton->setVisible(false); + + mMatchesView->updateEmptyListWidgetsVisibility(); + + QVERIFY( mMatchesView->mEmptyListLabel->isVisible() ); + QVERIFY( mMatchesView->mAddToContactsButton->isVisible() ); + delete mMatchesView->mEmptyListLabel; + mMatchesView->mEmptyListLabel = 0; + delete mMatchesView->mAddToContactsButton; + mMatchesView->mAddToContactsButton = 0; +} + + +void UT_LogsMatchesView::testUpdateAddContactButton() +{ + //no button, nothing happens + QVERIFY( !mMatchesView->mAddToContactsButton ); + mMatchesView->updateAddContactButton(); + + //dialpad closed => button set invisible + mMatchesView->mAddToContactsButton = new HbPushButton(); + mMatchesView->mAddToContactsButton->setVisible(true); + QVERIFY( !mMatchesView->mDialpad->isOpen() ); + mMatchesView->updateAddContactButton(); + QVERIFY( !mMatchesView->mAddToContactsButton->isVisible() ); + + //no matches, dialpad open and has some text => button set visible + QVERIFY( !mMatchesView->mModel ); + mMatchesView->mDialpad->openDialpad(); + mMatchesView->mDialpad->editor().setText( "hello" ); + mMatchesView->updateAddContactButton(); + QVERIFY( mMatchesView->mAddToContactsButton->isVisible() ); + + //no matches, dialpad open and no text => button set invisible + mMatchesView->mDialpad->editor().setText( "" ); + QVERIFY( mMatchesView->mDialpad->isOpen() ); + mMatchesView->updateAddContactButton(); + QVERIFY( !mMatchesView->mAddToContactsButton->isVisible() ); + + //matches found => button set invisible + LogsDbConnector* dbConnector = 0; + mMatchesView->mModel = new LogsMatchesModel(*dbConnector); + mMatchesView->mModel->mTextData.append("item1"); + mMatchesView->mDialpad->editor().setText( "hello" ); + mMatchesView->mAddToContactsButton->setVisible(true); + QVERIFY( mMatchesView->mDialpad->isOpen() ); + mMatchesView->updateAddContactButton(); + QVERIFY( !mMatchesView->mAddToContactsButton->isVisible() ); + + delete mMatchesView->mAddToContactsButton; + mMatchesView->mAddToContactsButton = 0; +} diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/src/ut_logsrecentcallsview.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsrecentcallsview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsrecentcallsview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -32,6 +32,7 @@ //SYSTEM #include +#include #include #include #include @@ -39,7 +40,6 @@ #include #include #include -#include #include #include @@ -218,8 +218,9 @@ mRecentCallsView->addStringsToMap(); mRecentCallsView->mViewName = new HbGroupBox(); mRecentCallsView->updateViewName(); - QVERIFY( mRecentCallsView->mViewName->titleText() - == mRecentCallsView->mTitleMap.value(mRecentCallsView->mConversionMap.value(LogsServices::ViewMissed)) ); + QVERIFY( mRecentCallsView->mViewName->heading() + == mRecentCallsView->mTitleMap.value( + mRecentCallsView->mConversionMap.value(LogsServices::ViewMissed))); delete mRecentCallsView->mViewName; mRecentCallsView->mViewName = 0; } @@ -296,17 +297,17 @@ void UT_LogsRecentCallsView::testOpenDialpad() { QVERIFY( !mRecentCallsView->mFilter ); - QVERIFY( !mRecentCallsView->mDialpad->isVisible() ); + QVERIFY( !mRecentCallsView->mDialpad->isOpen() ); mRecentCallsView->openDialpad(); QVERIFY( mRecentCallsView->mMatchesModel ); - QVERIFY( mRecentCallsView->mDialpad->isVisible() ); + QVERIFY( mRecentCallsView->mDialpad->isOpen() ); mRecentCallsView->mFilter = new LogsFilter( LogsFilter::Missed ); LogsMatchesModel* oldmatchesModel = mRecentCallsView->mMatchesModel; mRecentCallsView->openDialpad(); QVERIFY( mRecentCallsView->mMatchesModel == oldmatchesModel ); - QVERIFY( mRecentCallsView->mDialpad->isVisible() ); + QVERIFY( mRecentCallsView->mDialpad->isOpen() ); } void UT_LogsRecentCallsView::testDialpadEditorTextChanged() @@ -342,18 +343,111 @@ QVERIFY( mRecentCallsView->mDialpad->mIsCallButtonEnabled ); } -void UT_LogsRecentCallsView::testInitializeGestures() +void UT_LogsRecentCallsView::testGestureEvent() { LogsRecentCallsView* view = mRepository->recentCallsView(); - view->activated( false, QVariant(LogsServices::ViewAll) ); + view->activated( false, QVariant(LogsServices::ViewCalled) ); + view->mCurrentView = LogsServices::ViewCalled; + view->mAppearingView = LogsServices::ViewCalled; + mRecentCallsView->mViewManager.mainWindow().setOrientation( Qt::Vertical ); + + QSwipeGesture* swipe = new QSwipeGesture(); + QList list; + QGestureEvent event(list); + event.ignore(Qt::SwipeGesture); + + //no swipe gesture in event + QVERIFY(!event.isAccepted(Qt::SwipeGesture)); + view->gestureEvent(&event); + QVERIFY(!event.isAccepted(Qt::SwipeGesture)); + QVERIFY(view->mAppearingView == LogsServices::ViewCalled); - view->initializeGestures(0); + //swipe gesture in event, but gesture isn't finished + list.append(swipe); + QGestureEvent event2(list); + event2.ignore(Qt::SwipeGesture); + QVERIFY(!event2.isAccepted(Qt::SwipeGesture)); + QVERIFY(swipe->state() != Qt::GestureFinished); + view->gestureEvent(&event2); + QVERIFY(!event2.isAccepted(Qt::SwipeGesture)); + QVERIFY(view->mAppearingView == LogsServices::ViewCalled); + + //vertical orientation swipe right up + HbStubHelper::setGestureState(Qt::GestureFinished); + event2.setAccepted(Qt::SwipeGesture, false); + swipe->setSwipeAngle(10); + view->gestureEvent(&event2); + QVERIFY( view->mAppearingView == LogsServices::ViewAll ); + QVERIFY( event2.isAccepted(Qt::SwipeGesture) ); + + //vertical orientation swipe left up + event2.setAccepted(Qt::SwipeGesture, false); + swipe->setSwipeAngle(170); + view->gestureEvent(&event2); + QVERIFY(view->mAppearingView == LogsServices::ViewReceived); + QVERIFY(event2.isAccepted(Qt::SwipeGesture)); + + //vertical orientation swipe down, nothing happens + event2.setAccepted(Qt::SwipeGesture, false); + swipe->setSwipeAngle(70); + view->mAppearingView = view->mCurrentView; + view->gestureEvent(&event2); + QVERIFY(view->mAppearingView == LogsServices::ViewCalled); + QVERIFY(!event2.isAccepted(Qt::SwipeGesture)); - HbGestureSceneFilter filter; - QVERIFY(filter.count() == 0); - view->initializeGestures(&filter); - QVERIFY(filter.count() == 2); + //horizontal orientation swipe right up + mRecentCallsView->mViewManager.mainWindow().setOrientation( Qt::Horizontal ); + event2.setAccepted(Qt::SwipeGesture, false); + swipe->setSwipeAngle(80); + view->gestureEvent(&event2); + QVERIFY(view->mAppearingView == LogsServices::ViewReceived); + QVERIFY(event2.isAccepted(Qt::SwipeGesture)); + //horizontal orientation swipe right down + event2.setAccepted(Qt::SwipeGesture, false); + swipe->setSwipeAngle(280); + view->gestureEvent(&event2); + QVERIFY(view->mAppearingView == LogsServices::ViewAll); + QVERIFY(event2.isAccepted(Qt::SwipeGesture)); + + //horizontal orientation swipe left, nothing happens + event2.setAccepted(Qt::SwipeGesture, false); + swipe->setSwipeAngle(200); + view->mAppearingView = view->mCurrentView; + view->gestureEvent(&event2); + QVERIFY(view->mAppearingView == LogsServices::ViewCalled); + QVERIFY(!event2.isAccepted(Qt::SwipeGesture)); +} + +void UT_LogsRecentCallsView::testSwipeAngleToDirection() +{ + int delta = 30; + QCOMPARE(mRecentCallsView->swipeAngleToDirection(61, delta), QSwipeGesture::Up); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(119, delta), QSwipeGesture::Up); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(90, delta), QSwipeGesture::Up); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(60, delta), QSwipeGesture::NoDirection); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(120, delta), QSwipeGesture::NoDirection); + + QCOMPARE(mRecentCallsView->swipeAngleToDirection(241, delta), QSwipeGesture::Down); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(299, delta), QSwipeGesture::Down); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(270, delta), QSwipeGesture::Down); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(300, delta), QSwipeGesture::NoDirection); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(240, delta), QSwipeGesture::NoDirection); + + QCOMPARE(mRecentCallsView->swipeAngleToDirection(29, delta), QSwipeGesture::Right); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(331, delta), QSwipeGesture::Right); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(0, delta), QSwipeGesture::Right); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(360, delta), QSwipeGesture::Right); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(30, delta), QSwipeGesture::NoDirection); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(330, delta), QSwipeGesture::NoDirection); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(361, delta), QSwipeGesture::NoDirection); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(-1, delta), QSwipeGesture::NoDirection); + + QCOMPARE(mRecentCallsView->swipeAngleToDirection(151, delta), QSwipeGesture::Left); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(209, delta), QSwipeGesture::Left); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(180, delta), QSwipeGesture::Left); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(150, delta), QSwipeGesture::NoDirection); + QCOMPARE(mRecentCallsView->swipeAngleToDirection(210, delta), QSwipeGesture::NoDirection); } void UT_LogsRecentCallsView::testViewChangeByFlicking() @@ -362,29 +456,30 @@ LogsRecentCallsView* view = mRepository->recentCallsView(); view->activated( false, QVariant(LogsServices::ViewAll) ); view->mCurrentView = LogsServices::ViewAll; - view->rightFlick(0); + view->rightFlick(); QVERIFY(view->mCurrentView == LogsServices::ViewAll); QVERIFY(view->mAppearingView == LogsServices::ViewMissed); // Moving to right possible - view->leftFlick(0); + view->leftFlick(); QVERIFY(view->mCurrentView == LogsServices::ViewAll); QVERIFY(view->mAppearingView == LogsServices::ViewCalled); // At rightmost list, moving causes going to first list view->mCurrentView = LogsServices::ViewMissed; - view->leftFlick(0); + view->leftFlick(); QVERIFY(view->mCurrentView == LogsServices::ViewMissed); QVERIFY(view->mAppearingView == LogsServices::ViewAll); // Now moving to left is possible - view->rightFlick(0); + view->rightFlick(); QVERIFY(view->mCurrentView == LogsServices::ViewMissed); QVERIFY(view->mAppearingView == LogsServices::ViewReceived); // Simulate effect completion which activates new view view->dissappearByFadingComplete(); - QVERIFY( view->mViewName->titleText() == view->mTitleMap.value(view->mConversionMap.value(LogsServices::ViewReceived)) ); + QVERIFY( view->mViewName->heading() + == view->mTitleMap.value(view->mConversionMap.value(LogsServices::ViewReceived)) ); view->dissappearByMovingComplete(); QVERIFY(view->mCurrentView == LogsServices::ViewReceived); @@ -558,9 +653,10 @@ HbListView list; //listView exists, layout and size updated mRecentCallsView->mViewManager.mainWindow().setOrientation( Qt::Vertical ); - mRecentCallsView->mDialpad->setVisible(false); + mRecentCallsView->mDialpad->closeDialpad(); mRecentCallsView->mListView = &list; mRecentCallsView->mListView->setLayoutName("dummy"); + mRecentCallsView->mLayoutSectionName = "dummy"; mRecentCallsView->updateWidgetsSizeAndLayout(); QVERIFY( mRecentCallsView->mListView->layoutName() == logsListDefaultLayout ); QVERIFY( mRecentCallsView->mLayoutSectionName == logsViewDefaultSection ); @@ -572,7 +668,7 @@ mRecentCallsView->mListView = &list; mRecentCallsView->mViewManager.mainWindow().setOrientation( Qt::Horizontal ); - mRecentCallsView->mDialpad->setVisible(false); + mRecentCallsView->mDialpad->closeDialpad(); mRecentCallsView->mLayoutSectionName = QString(logsViewLandscapeDialpadSection); QString hello("hello"); mRecentCallsView->mDialpad->editor().setText( hello ); diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/src/ut_logsviewmanager.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsviewmanager.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsviewmanager.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -147,3 +147,8 @@ QVERIFY( vm.mMainWindow.currentView() == 0 ); QVERIFY( vm.mViewStack.count() == 3 ); } + +void UT_LogsViewManager::testHandleOrientationChanged() +{ + mLogsViewManager->handleOrientationChanged(); +} diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/stubs/dialpad.h --- a/logsui/logsapp/tsrc/ut_logsapp/stubs/dialpad.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/dialpad.h Fri Apr 16 14:53:18 2010 +0300 @@ -33,16 +33,19 @@ public: explicit Dialpad(); + explicit Dialpad(const HbMainWindow& mainWindow); + virtual ~Dialpad(); - HbLineEdit& editor() const; + bool isOpen() const {return mIsOpen;} + public slots: - void openDialpad() { setVisible(true); } + void openDialpad() { mIsOpen = true; } - void closeDialpad() { setVisible(false); } + void closeDialpad() { mIsOpen = false; } void setCallButtonEnabled(bool enabled); @@ -52,6 +55,7 @@ public: HbLineEdit* mLineEdit; bool mIsCallButtonEnabled; + bool mIsOpen; }; #endif // DIALPAD_H diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/stubs/dialpad_stub.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/stubs/dialpad_stub.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/dialpad_stub.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -23,6 +23,16 @@ mLineEdit = new HbLineEdit(); setVisible(false); mIsCallButtonEnabled = false; + mIsOpen = false; +} + +Dialpad::Dialpad(const HbMainWindow& mainWindow) +{ + Q_UNUSED(mainWindow); + mLineEdit = new HbLineEdit(); + setVisible(false); + mIsCallButtonEnabled = false; + mIsOpen = false; } Dialpad::~Dialpad() diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/stubs/dialpadkeyhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/dialpadkeyhandler.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,49 @@ +/*! +* Copyright (c) 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: Dialpad key handler. +* +*/ + +#ifndef DIALPADKEYHANDLER_H +#define DIALPADKEYHANDLER_H + +#include + +class Dialpad; +class DialpadVoiceMailboxEventFilter; +class DialpadBluetoothEventFilter; +class HbMainWindow; + +/*! + DialpadKeyHandler + Class provides key handling for dialpad component. + + @code + Dialpad *dialpad = new Dialpad(); + DialpadKeyHandler *keyhandler = new DialpadKeyHandler(dialpad, this); + @endcode + +*/ +class DialpadKeyHandler : public QObject +{ + Q_OBJECT + +public: + explicit DialpadKeyHandler(Dialpad *dialPad, HbMainWindow& mainWindow, QObject *parent = 0); + virtual ~DialpadKeyHandler(); + +private: +}; + +#endif // DIALPADKEYHANDLER_H diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/stubs/dialpadkeyhandler_stub.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/dialpadkeyhandler_stub.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,30 @@ +/* +* Copyright (c) 2008-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 "dialpadkeyhandler.h" + +DialpadKeyHandler::DialpadKeyHandler(Dialpad *dialPad, HbMainWindow& mainWindow, QObject *parent) +{ + Q_UNUSED(dialPad); + Q_UNUSED(mainWindow); + Q_UNUSED(parent); +} + +DialpadKeyHandler::~DialpadKeyHandler() +{ +} + diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -24,6 +24,7 @@ #include #include #include +#include int actionCount = 0; Qt::Orientation windowOrientation = Qt::Vertical; @@ -35,6 +36,7 @@ QString selectedActionString = "none"; bool testSingleShotTimer = false; bool testQuitCalled = false; +Qt::GestureState testState = Qt::NoGesture; void HbStubHelper::reset() { @@ -64,6 +66,17 @@ return testQuitCalled; } +void HbStubHelper::setGestureState(int state) +{ + testState = static_cast (state); +} + + +Qt::GestureState QGesture::state() const +{ + return testState; +} + // ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- @@ -128,8 +141,9 @@ testWindow = 0; } -void HbMainWindow::setOrientation(Qt::Orientation orientation) +void HbMainWindow::setOrientation(Qt::Orientation orientation, bool animate) { + Q_UNUSED(animate) windowOrientation = orientation; } @@ -169,9 +183,10 @@ testViewCount++; } -void HbMainWindow::setCurrentView(HbView *view, bool animate) +void HbMainWindow::setCurrentView(HbView *view, bool animate, Hb::ViewSwitchFlags flags) { Q_UNUSED(animate) + Q_UNUSED(flags) testView = view; } @@ -216,7 +231,7 @@ if (string == "Ok") { selectedActionString = "primary"; - } else if (string == "Cancel") { + } else if (string == "Cancel") { selectedActionString = "secondary"; } @@ -225,10 +240,10 @@ HbAction *HbDialog::exec() { - if (selectedActionString == "primary") { - return primaryAction(); - } else { - return 0; + if (selectedActionString == "primary") { + return primaryAction(); + } else { + return 0; } } diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs_helper.h --- a/logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs_helper.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs_helper.h Fri Apr 16 14:53:18 2010 +0300 @@ -29,6 +29,7 @@ static bool menuShown(); static bool singleShotTimerActive(); static bool quitCalled(); + static void setGestureState(int state); }; #endif diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsapp/tsrc/ut_logsapp/ut_logsapp.pro --- a/logsui/logsapp/tsrc/ut_logsapp/ut_logsapp.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsapp/tsrc/ut_logsapp/ut_logsapp.pro Fri Apr 16 14:53:18 2010 +0300 @@ -57,6 +57,7 @@ HEADERS += inc/ut_logsservicehandler.h HEADERS += logsengine_stub/logscontact.h HEADERS += ./stubs/dialpad.h +HEADERS += ./stubs/dialpadkeyhandler.h SOURCES += src/main.cpp SOURCES += src/ut_logsmainwindow.cpp @@ -90,6 +91,7 @@ SOURCES += ./stubs/hbstubs.cpp SOURCES += ./stubs/qthighway_stub.cpp SOURCES += ./stubs/dialpad_stub.cpp +SOURCES += ./stubs/dialpadkeyhandler_stub.cpp symbian: { TARGET.UID2 = 0x100039CE diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logscntfinder/inc/logscntfinder.h --- a/logsui/logscntfinder/inc/logscntfinder.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logscntfinder/inc/logscntfinder.h Fri Apr 16 14:53:18 2010 +0300 @@ -187,11 +187,17 @@ private: void doPredictiveHistoryQuery(); - void doPredictiveContactQuery(); + void doPredictiveContactQuery( LogsCntEntryList& recentResults ); + void doPredictiveCacheQuery(); LogsCntEntry* doGetEntry( const LogsCntEntryList& list, const LogsCntEntryHandle& handle ) const; + void addResult( quint32 cntId, LogsCntEntryList& recentResults ); + void addResult( LogsCntEntry* entry ); + void updateResult( LogsCntEntry* entry ); + + private: @@ -199,6 +205,7 @@ LogsCntEntryList mResults; QContactManager* mContactManager; LogsCntEntryList mHistoryEvents; + int mCachedCounter; friend class UT_LogsCntFinder; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logscntfinder/logscntfinder.pro --- a/logsui/logscntfinder/logscntfinder.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logscntfinder/logscntfinder.pro Fri Apr 16 14:53:18 2010 +0300 @@ -20,7 +20,6 @@ TARGET = logscntfinder CONFIG += dll CONFIG += hb -HB = hbcore hbinput INCLUDEPATH += ./ INCLUDEPATH += ./inc diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logscntfinder/src/logscntfinder.cpp --- a/logsui/logscntfinder/src/logscntfinder.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logscntfinder/src/logscntfinder.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -17,10 +17,10 @@ #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include @@ -28,6 +28,7 @@ #include "logspredictivetranslator.h" #include "logslogger.h" +const int MaxPredSearchPatternLen = 15; // ----------------------------------------------------------------------------- @@ -223,10 +224,8 @@ while( iter.hasNext() ) { LogsCntText txt; txt.mText = iter.next(); - if ( type() == EntryTypeHistory ) { - txt.mTranslatedText = - LogsPredictiveTranslator::instance()->translate( txt.mText ); - } + txt.mTranslatedText = + LogsPredictiveTranslator::instance()->translate( txt.mText ); textlist.append( txt ); } if ( textlist.count() == 0 ) { @@ -435,6 +434,7 @@ // ----------------------------------------------------------------------------- // LogsCntFinder::LogsCntFinder() + : mCachedCounter(0) { LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::LogsCntFinder()" ) @@ -451,6 +451,7 @@ // ----------------------------------------------------------------------------- // LogsCntFinder::LogsCntFinder(QContactManager& contactManager) + : mCachedCounter(0) { LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::LogsCntFinder(), cntmgr from client" ) @@ -484,13 +485,32 @@ LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::predictiveSearchQuery()" ) LOGS_QDEBUG_2( "logs [FINDER] pattern= ", pattern ) - mCurrentPredictivePattern = pattern; + bool canUseCacheQuery = + pattern.length() > 1 && + pattern.length() - mCurrentPredictivePattern.length() > 0; + bool areAllResultsCached = resultsCount() > 0 && + mCachedCounter == resultsCount(); + + LOGS_QDEBUG_2( "logs [FINDER] canUseCacheQuery= ", canUseCacheQuery ) + LOGS_QDEBUG_2( "logs [FINDER] areAllResultsCached= ", areAllResultsCached ) + LOGS_QDEBUG_2( "logs [FINDER] cachedCounter= ", mCachedCounter ) - if ( !mCurrentPredictivePattern.isEmpty() ) { + mCurrentPredictivePattern = pattern.left(MaxPredSearchPatternLen); + + if ( mCurrentPredictivePattern.isEmpty() ) { qDeleteAll( mResults ); mResults.clear(); + mCachedCounter = 0; + } else if ( areAllResultsCached && + canUseCacheQuery ) { + doPredictiveCacheQuery(); + } else { + mCachedCounter = 0; + LogsCntEntryList recentResults = mResults; + mResults.clear(); doPredictiveHistoryQuery(); - doPredictiveContactQuery(); + doPredictiveContactQuery( recentResults ); + qDeleteAll( recentResults ); } emit queryReady(); @@ -511,8 +531,7 @@ LogsCntEntry* e = iter.next(); if ( e->match( mCurrentPredictivePattern ) ) { LogsCntEntry* entry = new LogsCntEntry( *e ); - entry->setHighlights( mCurrentPredictivePattern ); - mResults.append( entry ); + addResult( entry ); } } @@ -523,29 +542,97 @@ // LogsCntFinder::doPredictiveContactQuery // ----------------------------------------------------------------------------- // -void LogsCntFinder::doPredictiveContactQuery() +void LogsCntFinder::doPredictiveContactQuery( LogsCntEntryList& recentResults ) { LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::doPredictiveContactQuery()" ) QContactDetailFilter df; df.setDetailDefinitionName( QContactName::DefinitionName ); - //unofficial - //df.setMatchFlags( QContactFilter::MatchPredictiveSearch ); df.setMatchFlags( QContactFilter::MatchKeypadCollation ); df.setValue( mCurrentPredictivePattern ); QList cntIds; - LOGS_QDEBUG( "logs [FINDER] about to call contacts manager)" ) + LOGS_QDEBUG( "logs [FINDER] about to call contacts manager" ) - cntIds = mContactManager->contacts( df ); - LOGS_QDEBUG_2( "logs [FINDER] number of matched contacts=", cntIds.count() ) + cntIds = mContactManager->contactIds( df ); + LOGS_QDEBUG_2( "logs [FINDER] number of matched contacts =", cntIds.count() ) int index = 0; while( index < cntIds.count() ) { - LogsCntEntry* entry = new LogsCntEntry( cntIds.at( index++ ) ); - mResults.append( entry ); + addResult( cntIds.at( index++ ), recentResults ); } LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::doPredictiveContactQuery()" ) } +// ----------------------------------------------------------------------------- +// LogsCntFinder::doPredictiveCacheQuery() +// ----------------------------------------------------------------------------- +// +void LogsCntFinder::doPredictiveCacheQuery() +{ + LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::doPredictiveCacheQuery()" ) + QMutableListIterator iter(mResults); + while( iter.hasNext() ) { + LogsCntEntry* entry = iter.next(); + if ( !entry->match( mCurrentPredictivePattern ) ) { + mCachedCounter = + entry->isCached() ? mCachedCounter-1 : mCachedCounter; + iter.remove(); + delete entry; + } else { + entry->setHighlights( mCurrentPredictivePattern ); + } + } + LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::doPredictiveCacheQuery()" ) + +} + +// ----------------------------------------------------------------------------- +// LogsCntFinder::addResult() +// ----------------------------------------------------------------------------- +// +void LogsCntFinder::addResult( quint32 cntId, LogsCntEntryList& recentResults ) +{ + QMutableListIterator iter(recentResults); + bool reused = false; + while( iter.hasNext() && !reused ) { + LogsCntEntry* entry = iter.next(); + if ( entry->contactId() == cntId ) { + LOGS_QDEBUG_4( "logs [FINDER] LogsCntFinder::addResult() - \ +re-using entry. contact id ", cntId, "cached=", entry->isCached() ); + iter.remove(); + addResult( entry ); + reused = true; + } + } + + if ( !reused ) { + LogsCntEntry* entry = new LogsCntEntry( cntId ); + addResult( entry ); + } +} + + +// ----------------------------------------------------------------------------- +// LogsCntFinder::addResult() +// ----------------------------------------------------------------------------- +// +void LogsCntFinder::addResult( LogsCntEntry* entry ) +{ + updateResult( entry ); + mResults.append( entry ); +} + +// ----------------------------------------------------------------------------- +// LogsCntFinder::updateResult() +// ----------------------------------------------------------------------------- +// +void LogsCntFinder::updateResult( LogsCntEntry* entry ) +{ + if ( entry->isCached() ) { + entry->setHighlights( mCurrentPredictivePattern ); + mCachedCounter++; + } +} + // ----------------------------------------------------------------------------- // LogsCntFinder::resultsCount @@ -567,24 +654,23 @@ LogsCntEntry* entry = mResults.at( index ); if ( !entry->isCached() ) { - LOGS_QDEBUG_2( "logs [FINDER] caching from DB cid=", entry->contactId() ) - QContact contact = mContactManager->contact( entry->contactId() ); - QContactName contactName = contact.detail( QContactName::DefinitionName ); - entry->setFirstName( contactName.value( QContactName::FieldFirst ) ); - entry->setLastName( contactName.value( QContactName::FieldLast ) ); - QContactPhoneNumber contactPhoneNumber = + LOGS_QDEBUG_2( "logs [FINDER] caching from DB cid=", entry->contactId() ) + QContact contact = mContactManager->contact( entry->contactId() ); + QContactName contactName = contact.detail( QContactName::DefinitionName ); + entry->setFirstName( contactName.value( QContactName::FieldFirst ) ); + entry->setLastName( contactName.value( QContactName::FieldLast ) ); + QContactPhoneNumber contactPhoneNumber = contact.detail( QContactPhoneNumber::DefinitionName ); - entry->setPhoneNumber( + entry->setPhoneNumber( contactPhoneNumber.value( QContactPhoneNumber::FieldNumber ) ); - - entry->setHighlights( mCurrentPredictivePattern ); - QContactAvatar contactAvatar = contact.detail(); - if (contactAvatar.subType().compare( - QLatin1String(QContactAvatar::SubTypeImage)) == 0 && + QContactAvatar contactAvatar = contact.detail(); + if (contactAvatar.subType().compare( + QLatin1String(QContactAvatar::SubTypeImage)) == 0 && !contactAvatar.avatar().isEmpty()) { - entry->setAvatarPath(contactAvatar.avatar()); + entry->setAvatarPath(contactAvatar.avatar()); } - + + updateResult( entry ); } LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::resultAt()" ) return *entry; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logscntfinder/src/logspredictivetranslator.cpp --- a/logsui/logscntfinder/src/logspredictivetranslator.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logscntfinder/src/logspredictivetranslator.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -18,7 +18,7 @@ #include #include #include -#include +#include #include "logspredictivetranslator.h" #include "logslogger.h" @@ -87,8 +87,16 @@ // const QChar LogsPredictiveTranslator::translate( const QChar character ) const { - return mKeyMap->keyForCharacter( HbKeyboardVirtual12Key, - character )->keycode; + const HbMappedKey* mappedKey = mKeyMap->keyForCharacter( HbKeyboardVirtual12Key, + character ); + if (!mappedKey) { + QString decomposed = character.decomposition(); + if (decomposed.isEmpty()) { + return character; + } + return translate (decomposed.at(0)); + } + return mappedKey->keycode; } diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logscntfinder/tsrc/pt_logscntfinder/src/pt_logscntfinder.cpp --- a/logsui/logscntfinder/tsrc/pt_logscntfinder/src/pt_logscntfinder.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logscntfinder/tsrc/pt_logscntfinder/src/pt_logscntfinder.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -40,7 +40,7 @@ //qDebug() << "pt_LogsCntFinder::init remove old contacts"; // Remove all contacts from the database - QList cnt_ids = m_manager->contacts(); + QList cnt_ids = m_manager->contactIds(); qDebug() << "contacts now in db" << cnt_ids.count(); if ( cnt_ids.count() == 600 ) { QString f("Jack"); @@ -48,14 +48,14 @@ createContact_one_Contact( f,l, QString("03432")); } - cnt_ids = m_manager->contacts(); + cnt_ids = m_manager->contactIds(); qDebug() << "contacts now " << cnt_ids.count(); /*if ( cnt_ids.count() != 600 ) { qDebug() << "contacts now before delete" << cnt_ids.count(); m_manager->removeContacts(&cnt_ids); - cnt_ids = m_manager->contacts(); + cnt_ids = m_manager->contactIds(); qDebug() << "contacts now " << cnt_ids.count(); QVERIFY(0 == cnt_ids.count()); @@ -75,9 +75,9 @@ void pt_LogsCntFinder::cleanup() { /*m_manager = new QContactManager("symbian"); - QList cnt_ids = m_manager->contacts(); + QList cnt_ids = m_manager->contactIds(); m_manager->removeContacts(&cnt_ids); - cnt_ids = m_manager->contacts(); + cnt_ids = m_manager->contactIds(); qDebug() << "contacts now " << cnt_ids.count(); QVERIFY(0 == cnt_ids.count());*/ @@ -110,8 +110,8 @@ //QContact empty; //m_manager->saveContact(&empty); /* - QList cnt_ids = m_manager->contacts(); - cnt_ids = m_manager->contacts(); + QList cnt_ids = m_manager->contactIds(); + cnt_ids = m_manager->contactIds(); int j = cnt_ids.count(); QVERIFY( j == 900 ); */ @@ -242,6 +242,32 @@ results = m_finder->resultsCount(); qDebug() << "found " << results << " matches:"; + qDebug() << "-- 205 query starts --"; + t.start(); + m_finder->predictiveSearchQuery( QString("205") ); + qDebug() << "-- 205 query ended --"; + qDebug(" Time elapsed:%d ms", t.elapsed()); + results = m_finder->resultsCount(); + qDebug() << "found " << results << " matches:"; + + qDebug() << "-- 34096 query starts --"; + t.start(); + m_finder->predictiveSearchQuery( QString("34096") ); + qDebug() << "-- 34096 query ended --"; + qDebug(" Time elapsed:%d ms", t.elapsed()); + results = m_finder->resultsCount(); + qDebug() << "found " << results << " matches:"; + + qDebug() << "<=pt_LogsCntFinder::testPredictiveQuery"; + + qDebug() << "-- 30966 query starts --"; + t.start(); + m_finder->predictiveSearchQuery( QString("30966") ); + qDebug() << "-- 30966 query ended --"; + qDebug(" Time elapsed:%d ms", t.elapsed()); + results = m_finder->resultsCount(); + qDebug() << "found " << results << " matches:"; + qDebug() << "<=pt_LogsCntFinder::testPredictiveQuery"; } diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logscntfinder/tsrc/st_logscntfinder/inc/st_logscntfinder.h --- a/logsui/logscntfinder/tsrc/st_logscntfinder/inc/st_logscntfinder.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logscntfinder/tsrc/st_logscntfinder/inc/st_logscntfinder.h Fri Apr 16 14:53:18 2010 +0300 @@ -14,8 +14,8 @@ * Description: * */ -#ifndef UT_CNTPREFILTERING_H -#define UT_CNTPREFILTERING_H +#ifndef ST_LOGSCNTFINDER_H +#define ST_LOGSCNTFINDER_H #include #include @@ -41,35 +41,40 @@ * init() will be called before each testfunction is executed. * cleanup() will be called after every testfunction. */ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); private slots: //test methods - void testPredictiveSearchQuery(); void testKeymap(); void testPredictiveSearchQueryZero(); + void testPredictiveSearchQueryLimit(); void testPredictiveSearchQueryLogs(); - + void testQueryOrder(); + private: - void createContacts_testKeymap(); - void createContact_one_Contact(QString firstname, QString Lastname, - QString phnumber); + + + void createOneContact( + QString firstname, + QString Lastname, + QString phnumber); QContactFilter::MatchFlags flag(int f); void createContacts(); + void createContactsForQueryOrder(); void createHistoryEvents(); - void createLogEvent(QString firstname, QString Lastname, - QString phnumber); - - + void createLogEvent( + QString firstname, + QString Lastname, + QString phnumber); + private: - - QContactManager *m_manager; - LogsCntFinder *m_finder; + QContactManager *m_manager; + LogsCntFinder *m_finder; }; -#endif //UT_CNTSPREFILTERING_H +#endif // ST_LOGSCNTFINDER_H diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logscntfinder/tsrc/st_logscntfinder/src/st_logscntfinder.cpp --- a/logsui/logscntfinder/tsrc/st_logscntfinder/src/st_logscntfinder.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logscntfinder/tsrc/st_logscntfinder/src/st_logscntfinder.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -16,6 +16,7 @@ */ #include "st_logscntfinder.h" #include "logscntfinder.h" +#include "testresultxmlparser.h" #include #include @@ -28,7 +29,6 @@ void st_LogsCntFinder::cleanupTestCase() { - } @@ -37,23 +37,21 @@ m_finder = 0; //open symbian database m_manager = new QContactManager("symbian"); - int err = 0; - - qDebug() << "CContactDatabase::OpenL -> error = " << err ; - QVERIFY(err == 0); + m_finder = new LogsCntFinder(*m_manager); + QVERIFY(m_finder); // Remove all contacts from the database - QList cnt_ids = m_manager->contacts(); - qDebug() << "contacts now before delete" << cnt_ids.count(); + QList cnt_ids = m_manager->contactIds(); + qDebug() << "contacts now before deleting" << cnt_ids.count(); - m_manager->removeContacts(&cnt_ids); - cnt_ids = m_manager->contacts(); - qDebug() << "contacts now " << cnt_ids.count(); - - QVERIFY(0 == cnt_ids.count()); - - m_finder = new LogsCntFinder(); - + QVERIFY(m_manager->removeContacts(&cnt_ids, 0)); + cnt_ids = m_manager->contactIds(); + QCOMPARE(cnt_ids.count(), 0); + + for (int i = 0; i < 10; ++i) { + m_finder->predictiveSearchQuery( QString::number(i) ); + QCOMPARE( m_finder->resultsCount(), 0 ); + } } void st_LogsCntFinder::cleanup() @@ -64,16 +62,15 @@ m_finder = 0; } -void st_LogsCntFinder::createContacts_testKeymap() +void st_LogsCntFinder::createContacts() { - qDebug() << "st_LogsCntFinder::createContacts_testKeymap"; /*Create contacts in Contacts DB for keymap testing Stefann Yadira Jonn Ennon Maria-Zola Jones Levis Augustin Zi Nancy Csoma - Olga Baranik + Olga Baraniktestteste Petter Harhai Queen Fesko Rose Galisin @@ -82,44 +79,27 @@ Wilda Lazar Una Vivi Kantsak */ - createContact_one_Contact( QString("Stefann"), QString("Yadira "), QString("932472398") ); - createContact_one_Contact( QString("Jonn"), QString("Ennon"), QString("932472398") ); - createContact_one_Contact( QString("Maria-Zola"), QString("Jones"), QString("932472398") ); - createContact_one_Contact( QString("Levis"), QString("Augustin Zi"), QString("932472398") ); - createContact_one_Contact( QString("Nancy"), QString("Csoma"), QString("932472398") ); - createContact_one_Contact( QString("Olga"), QString("Baranik"), QString("932472398") ); - createContact_one_Contact( QString("Petter"), QString("Harhai"), QString("932472398") ); - createContact_one_Contact( QString("Queen"), QString("Fesko"), QString("932472398") ); - createContact_one_Contact( QString("Rose"), QString("Galisin"), QString("932472398") ); - createContact_one_Contact( QString("Sasha"), QString("Dofzin"), QString("932472398") ); - createContact_one_Contact( QString("Tisha"), QString("Iatzkovits"), QString("932472398") ); - createContact_one_Contact( QString("Wilda"), QString("Lazar"), QString("932472398") ); - createContact_one_Contact( QString("Una Vivi"), QString("Kantsak"), QString("932472398") ); + createOneContact( QString("Stefann"), QString("Yadira "), QString("932472398") ); + createOneContact( QString("Jonn"), QString("Ennon"), QString("932472398") ); + createOneContact( QString("Maria-Zola"), QString("Jones"), QString("932472398") ); + createOneContact( QString("Levis"), QString("Augustin Zi"), QString("932472398") ); + createOneContact( QString("Nancy"), QString("Csoma"), QString("932472398") ); + createOneContact( QString("Olga"), QString("Baraniktestteste"), QString("932472398") ); + createOneContact( QString("Petter"), QString("Harhai"), QString("932472398") ); + createOneContact( QString("Queen"), QString("Fesko"), QString("932472398") ); + createOneContact( QString("Rose"), QString("Galisin"), QString("932472398") ); + createOneContact( QString("Sasha"), QString("Dofzin"), QString("932472398") ); + createOneContact( QString("Tisha"), QString("Iatzkovits"), QString("932472398") ); + createOneContact( QString("Wilda"), QString("Lazar"), QString("932472398") ); + createOneContact( QString("Una Vivi"), QString("Kantsak"), QString("932472398") ); - QList cnt_ids = m_manager->contacts(); - cnt_ids = m_manager->contacts(); - int j = cnt_ids.count(); - - qDebug() << "st_LogsCntFinder::createContacts_testKeymap. created " << j << " contacts"; + int contactsCount = m_manager->contactIds().count(); + QCOMPARE(contactsCount, 13); + qDebug() << "st_LogsCntFinder::createContacts_testKeymap. created " << contactsCount << " contacts"; } -void st_LogsCntFinder::createContacts() -{ - qDebug() << "st_LogsCntFinder::createContacts"; - - createContact_one_Contact( QString("Aarne Adam"), QString("Bravonen"), QString("932472398") ); - createContact_one_Contact( QString("Daavid Faarao"), QString("Heikkinen"), QString("932472398") ); - createContact_one_Contact( QString("Gideon-Gustav"), QString("Jcholainen"), QString("932472398") ); - createContact_one_Contact( QString("Mike Matti"), QString("Kovemberlainen"), QString("932472398") ); - - QList cnt_ids = m_manager->contacts(); - cnt_ids = m_manager->contacts(); - int j = cnt_ids.count(); - - qDebug() << "st_LogsCntFinder::createContacts. created " << j << " contacts"; -} void st_LogsCntFinder::createHistoryEvents() { @@ -129,14 +109,14 @@ } -void st_LogsCntFinder::createLogEvent(QString firstname, QString Lastname, +void st_LogsCntFinder::createLogEvent(QString firstname, QString lastname, QString phnumber) { LogsCntEntryHandle* dummy = 0; LogsCntEntry* logEvent = new LogsCntEntry( *dummy, 0 ); logEvent->setFirstName( firstname ); - logEvent->setLastName( firstname ); + logEvent->setLastName( lastname ); logEvent->setPhoneNumber( phnumber ); m_finder->insertEntry(0, logEvent ); @@ -145,7 +125,7 @@ } -void st_LogsCntFinder::createContact_one_Contact(QString firstname, QString Lastname, +void st_LogsCntFinder::createOneContact(QString firstname, QString Lastname, QString phnumber) { //Currenlty we can only fetch firstname,lastname,companyname and sip/email/phone from the databse @@ -164,11 +144,8 @@ number.setNumber(phnumber); phonecontact.saveDetail(&number); - qDebug() << "st_LogsCntFinder::createContact_one_Contact about to save.."; - m_manager->saveContact(&phonecontact); - qDebug() << "st_LogsCntFinder::createContact_one_Contact done"; - + qDebug() << "st_LogsCntFinder::createOneContact done"; } @@ -181,15 +158,12 @@ void st_LogsCntFinder::testPredictiveSearchQuery() { createContacts(); - m_finder->predictiveSearchQuery( QString("524") ); - - QVERIFY( m_finder->resultsCount() == 1 ); + + m_finder->predictiveSearchQuery( QString("566") ); + QCOMPARE( m_finder->resultsCount(), 2 ); m_finder->predictiveSearchQuery( QString("5") ); - - QVERIFY( m_finder->resultsCount() == 2 ); - - + QCOMPARE( m_finder->resultsCount(), 5 ); } /* Test itut keymap predictive search, checking that press key "2", records with names starting letters "A, B, C" are matched; @@ -205,104 +179,228 @@ */ void st_LogsCntFinder::testKeymap() { + createContacts(); + const LogsCntEntry* data; - createContacts_testKeymap(); - for (int i = 2; i < 10; i++) { m_finder->predictiveSearchQuery( QString::number(i) ); switch( i ) { - case 2: - QVERIFY( m_finder->resultsCount() == 3 ); - const LogsCntEntry& data = m_finder->resultAt( 0 ); - QVERIFY( data.firstName().count() == 1 ); - //QVERIFY( data.firstName()[0].startsWith()); - //qDebug() << "found " << results << " matches:"; - break; - - case 3: - QVERIFY( m_finder->resultsCount() == 3 ); - QVERIFY( data.firstName().count() == 1 ); - break; + case 2: + QCOMPARE( m_finder->resultsCount(), 3 ); + data = &m_finder->resultAt( 0 ); + QCOMPARE( data->firstName().count(), 1 ); + break; + + case 3: + QCOMPARE( m_finder->resultsCount(), 3 ); + data = &m_finder->resultAt( 0 ); + QCOMPARE( data->firstName().count(), 1 ); + break; - case 4: - QVERIFY( m_finder->resultsCount() == 3 ); - QVERIFY( data.firstName().count() == 1 ); + case 4: + QCOMPARE( m_finder->resultsCount(), 3 ); + data = &m_finder->resultAt( 0 ); + QCOMPARE( data->firstName().count(), 1 ); + break; - break; - - case 5: - QVERIFY( m_finder->resultsCount() == 3 ); - QVERIFY( data.firstName().count() == 1 ); - - break; - - case 6: - QVERIFY( m_finder->resultsCount() == 3 ); - QVERIFY( data.firstName().count() == 1 ); + case 5: + QCOMPARE( m_finder->resultsCount(), 5 ); + data = &m_finder->resultAt( 0 ); + QCOMPARE( data->firstName().count(), 1 ); + break; - break; - - case 7: - QVERIFY( m_finder->resultsCount() == 3 ); - QVERIFY( data.firstName().count() == 1 ); + case 6: + QCOMPARE( m_finder->resultsCount(), 3 ); + data = &m_finder->resultAt( 0 ); + QCOMPARE( data->firstName().count(), 1 ); + break; - break; - - case 8: - QVERIFY( m_finder->resultsCount() == 3 ); - QVERIFY( data.firstName().count() == 1 ); + case 7: + QCOMPARE( m_finder->resultsCount(), 5 ); + data = &m_finder->resultAt( 0 ); + QCOMPARE( data->firstName().count(),1 ); + break; - break; - - - case 9: - QVERIFY( m_finder->resultsCount() == 3 ); - QVERIFY( data.firstName().count() == 1 ); + case 8: + QCOMPARE( m_finder->resultsCount(), 2 ); + data = &m_finder->resultAt( 0 ); + QCOMPARE( data->firstName().count(), 1 ); + break; - break; - - m_finder->predictiveSearchQuery( QString("709") ); - QVERIFY( m_finder->resultsCount() == 1 ); - - } + case 9: + QCOMPARE( m_finder->resultsCount(), 3 ); + data = &m_finder->resultAt( 0 ); + QCOMPARE( data->firstName().count(), 1 ); + break; + } } - } +/* Test zero query search: 1. zero between "1-9" numbers, then first zero works as "AND" statement; +2. (multiple) zero at beginning; 3. (multiple) zero at the end; +4-5. multi-zeros between "1-9" numbers, only the first works as "AND" statement; +6. Query limit is 15, the 16th is ignored, and first 0 works as "AND" statement */ + void st_LogsCntFinder::testPredictiveSearchQueryZero() { - createContacts(); - m_finder->predictiveSearchQuery( QString("52404") ); + createContactsForQueryZero(); + + m_finder->predictiveSearchQuery( QString("56603") ); + QCOMPARE( m_finder->resultsCount(), 1 ); + + m_finder->predictiveSearchQuery( QString("00202") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + + m_finder->predictiveSearchQuery( QString("02010") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + + m_finder->predictiveSearchQuery( QString("2003") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + + m_finder->predictiveSearchQuery( QString("200904") ); + QCOMPARE( m_finder->resultsCount(), 1 ); + + m_finder->predictiveSearchQuery( QString("2272645837883065") ); + QCOMPARE( m_finder->resultsCount(), 1 ); - QVERIFY( m_finder->resultsCount() == 1 ); - - +} + +void st_LogsCntFinder::createContactsForQueryZero() +{ + createContacts(); + createOneContact( QString("Dlice 00202"), QString("Qwerty"), QString("45789348") ); + createOneContact( QString("#Paula 2003"), QString("Augustin Ci"), QString("78945617") ); + createOneContact( QString("Paula 02010"), QString("Ezerty Adam"), QString("78945617") ); + createOneContact( QString("Ced"), QString("Y,g"), QString("78945617") ); + createOneContact( QString("Jari-Pekka"), QString("Baraniktestteste"), QString("78945617") ); + + int contactsCount = m_manager->contactIds().count(); + QCOMPARE(contactsCount, 18); } +// Test query limit is 15, the 16th digit is ignored +void st_LogsCntFinder::testPredictiveSearchQueryLimit() +{ + createContacts(); + + // 9 digits + m_finder->predictiveSearchQuery( QString("227264583") ); + QCOMPARE( m_finder->resultsCount(), 1 ); + // 10 digits + m_finder->predictiveSearchQuery( QString("2272645837") ); + QCOMPARE( m_finder->resultsCount(), 1 ); + // 11 digits + m_finder->predictiveSearchQuery( QString("22726458378") ); + QCOMPARE( m_finder->resultsCount(), 1 ); + // 12 digits + m_finder->predictiveSearchQuery( QString("227264583788") ); + QCOMPARE( m_finder->resultsCount(), 1 ); + // 13 digits + m_finder->predictiveSearchQuery( QString("2272645837883") ); + QCOMPARE( m_finder->resultsCount(), 1 ); + // 14 digits + m_finder->predictiveSearchQuery( QString("22726458378837") ); + QCOMPARE( m_finder->resultsCount(), 1 ); + // 15 digits + m_finder->predictiveSearchQuery( QString("227264583788378") ); + QCOMPARE( m_finder->resultsCount(), 1 ); + + // 16 digits + m_finder->predictiveSearchQuery( QString("2272645837883783") ); + QCOMPARE( m_finder->resultsCount(), 1 ); + QCOMPARE(m_finder->resultAt().firstName().at().text(), QString("Olga")); + QCOMPARE(m_finder->resultAt().lastName().at().text(), QString("Baraniktestteste")); +} + + void st_LogsCntFinder::testPredictiveSearchQueryLogs() { createHistoryEvents(); + m_finder->predictiveSearchQuery( QString("5") ); + QCOMPARE( m_finder->resultsCount(), 2 ); +} + +void st_LogsCntFinder::testQueryOrder() +{ + createContactsForQueryOrder(); + + m_finder->predictiveSearchQuery( QString("7") ); + QCOMPARE( m_finder->resultsCount(), 8 ); - QVERIFY( m_finder->resultsCount() == 2 ); - - + QCOMPARE(m_finder->resultAt(0).firstName().at(0).text(), QString("Anna")); + QCOMPARE(m_finder->resultAt(0).lastName().at(0).text(), QString("Qwerty")); + + QCOMPARE(m_finder->resultAt(1).firstName().at(0).text(), QString("Paula")); + QCOMPARE(m_finder->resultAt(1).lastName().at(0).text(), QString("Azerty")); + + QCOMPARE(m_finder->resultAt(2).firstName().at(0).text(), QString("Paula")); + QCOMPARE(m_finder->resultAt(2).lastName().at(0).text(), QString("Qwerty")); + + QCOMPARE(m_finder->resultAt(3).firstName().at(0).text(), QString("Petter")); + QCOMPARE(m_finder->resultAt(3).lastName().at(0).text(), QString("Harhai")); + + QCOMPARE(m_finder->resultAt(4).firstName().at(0).text(), QString("Queen")); + QCOMPARE(m_finder->resultAt(4).lastName().at(0).text(), QString("Fesko")); + + QCOMPARE(m_finder->resultAt(5).firstName().at(0).text(), QString("Rose")); + QCOMPARE(m_finder->resultAt(5).lastName().at(0).text(), QString("Galisin")); + + QCOMPARE(m_finder->resultAt(6).firstName().at(0).text(), QString("Sasha")); + QCOMPARE(m_finder->resultAt(6).lastName().at(0).text(), QString("Dofzin")); + + QCOMPARE(m_finder->resultAt(7).firstName().at(0).text(), QString("Stefann")); + QCOMPARE(m_finder->resultAt(7).lastName().at(0).text(), QString("Yadira")); } - +void st_LogsCntFinder::createContactsForQueryOrder() +{ + createContacts(); + createOneContact( QString("Anna"), QString("Qwerty"), QString("45789348") ); + createOneContact( QString("Paula"), QString("Qwerty"), QString("78945617") ); + createOneContact( QString("Paula"), QString("Azerty"), QString("78945617") ); -//QTEST_MAIN(st_LogsCntFinder); // on Emulator + int contactsCount = m_manager->contactIds().count(); + QCOMPARE(contactsCount, 16); +} + +//QTEST_MAIN(st_LogsCntFinder); + +int main(int argc, char *argv[]) +{ + bool promptOnExit(true); + bool xmlOutput(false); -int main(int argc, char *argv[]) //on HW -{ + for (int i=0; i QContactManager::contacts( +QList QContactManager::contactIds( const QContactFilter& filter, const QList& /*sortOrders*/) const { @@ -73,14 +76,20 @@ int digits = df.value().toString().length(); QList list; for( int i=0;i<10-digits;i++) { - list.append( 1000+i ); + list.append( 1+i ); } return list; } -QContact QContactManager::contact(const QContactLocalId& /*contactId*/) const +QContact QContactManager::contact( + const QContactLocalId& contactId, + const QStringList& definitionRestrictions ) const { QContact contact; + QContactId id; + id.setLocalId(contactId ); + + contact.setId( id ); return contact; } @@ -138,16 +147,25 @@ { if ( definitionId == QContactName::DefinitionName ){ QContactName name; + QContactLocalId id = localId(); + QString first = QString("first%1").arg( id ); + name.setValue(QContactName::FieldFirst, first ); + QString last = QString("last%1").arg( id ); + name.setValue(QContactName::FieldLast, last ); return name; } if ( definitionId == QContactPhoneNumber::DefinitionName ){ QContactPhoneNumber number; + QString n( "555789987" ); + number.setValue(QContactPhoneNumber::FieldNumber, n ); return number; } -if ( definitionId == QContactAvatar::DefinitionName){ + if ( definitionId == QContactAvatar::DefinitionName){ QContactAvatar avatar; avatar.setSubType(QContactAvatar::SubTypeImage); - avatar.setAvatar("c:\\data\\images\\logstest1.jpg"); + avatar.setAvatar("c:\\data\\images\\logstest1.jpg"); + QString a( "Avatar" ); + avatar.setValue( QContactAvatar::FieldAvatar, a ); return avatar; } QContactDetail detail; @@ -195,20 +213,5 @@ return val; } -QString QContactDetail::value(const QString& key) const -{ - if ( key == QContactName::FieldFirst ){ - return QString( "first" ); - } else if ( key == QContactName::FieldLast ) { - return QString( "last" ); - } else if ( key == QContactPhoneNumber::FieldNumber ) { - return QString( "555789987" ); - } - else if ( key == QContactAvatar::FieldAvatar){ - return QString( "Avatar" ); - } - - return QString(""); -} diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logscntfinder/tsrc/ut_logscntfinder/inc/ut_logspredictivetranslator.h --- a/logsui/logscntfinder/tsrc/ut_logscntfinder/inc/ut_logspredictivetranslator.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logscntfinder/tsrc/ut_logscntfinder/inc/ut_logspredictivetranslator.h Fri Apr 16 14:53:18 2010 +0300 @@ -46,6 +46,7 @@ void testConstructor(); void testTranslate(); + void testTranslateChar(); void testStartsWith(); private: diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logscntfinder/tsrc/ut_logscntfinder/src/main.cpp --- a/logsui/logscntfinder/tsrc/ut_logscntfinder/src/main.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logscntfinder/tsrc/ut_logscntfinder/src/main.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -28,13 +28,19 @@ int main(int argc, char *argv[]) { bool promptOnExit(true); + bool useQApplication(true); for (int i=0; ipredictiveSearchQuery( pattern ); QCOMPARE( spy.count(), 3 ); - QVERIFY( mFinder->mResults[ 0 ] == e ); + QVERIFY( mFinder->resultsCount() == 0 ); + QVERIFY( mFinder->mCachedCounter == 0 ); //--- @@ -125,7 +127,134 @@ QVERIFY( mFinder->resultAt( 0 ).firstName()[0].highlights() == 1 ); QVERIFY( mFinder->resultAt( 0 ).lastName()[0].highlights() == 0 ); QVERIFY( mFinder->resultAt( 0 ).avatarPath() == QString("c:\\data\\images\\logstest1.jpg") ); + + // + // -- reuse results: do not create new entry, if there is already + // entry with same cid as in cid list (from db). + // + qDeleteAll( mFinder->mResults ); + mFinder->mResults.clear(); + qDeleteAll( mFinder->mHistoryEvents ); + mFinder->mHistoryEvents.clear(); + pattern = QString("3"); + mFinder->predictiveSearchQuery( pattern ); + QCOMPARE( spy.count(), 5 ); + QVERIFY( mFinder->resultsCount() ); + QVERIFY( !mFinder->mResults[0]->isCached() ); + const LogsCntEntry* firstE = &mFinder->resultAt( 0 ); + QVERIFY( firstE->isCached()); + QVERIFY( firstE->firstName()[0].highlights() == 1 ); + + pattern = QString("34"); + mFinder->predictiveSearchQuery( pattern ); + QCOMPARE( spy.count(), 6 ); + QVERIFY( mFinder->resultsCount() ); + QVERIFY( &mFinder->resultAt( 0 ) == firstE ); + QVERIFY( firstE->firstName()[0].highlights() == 2 ); + + entry1 = new LogsCntEntry( *handle1,0 ); + entry1->setFirstName( QString("First Beam") ); + mFinder->insertEntry( 0, entry1 ); + + pattern = QString("3"); + mFinder->predictiveSearchQuery( pattern ); + QCOMPARE( spy.count(), 7 ); + QVERIFY( mFinder->resultsCount() ); + const LogsCntEntry* firstHe = &mFinder->resultAt( 0 ); + QVERIFY( firstHe != entry1 ); + QVERIFY( firstHe->firstName()[0].text() == entry1->firstName()[0].text() ); + QVERIFY( &mFinder->resultAt( 1 ) == firstE ); + QVERIFY( firstE->firstName()[0].highlights() == 1 ); + + // + // -- reuse results: do search on results, if all are cached + // + qDeleteAll( mFinder->mResults ); + mFinder->mResults.clear(); + qDeleteAll( mFinder->mHistoryEvents ); + mFinder->mHistoryEvents.clear(); + mFinder->mCachedCounter = 0; + + pattern = QString("3"); + mFinder->predictiveSearchQuery( pattern ); + QCOMPARE( spy.count(), 8 ); + QVERIFY( mFinder->resultsCount() ); + QVERIFY( mFinder->mCachedCounter == 0 ); + + for( int i=0;iresultsCount();i++) { + mFinder->resultAt( i ); + } + QVERIFY( mFinder->mCachedCounter == mFinder->resultsCount() ); + + //stub gives always 10+ results regardless pattern, + //thus, if stub is not used, there should be only one + //match. The match was found from cache. + pattern = QString("347781");//first1 cache + mFinder->predictiveSearchQuery( pattern ); + QCOMPARE( spy.count(), 9 ); + QVERIFY( mFinder->resultsCount() == 2 ); //first1 and first10 + QVERIFY( mFinder->mCachedCounter == 2 ); + QVERIFY( mFinder->mResults[0]->isCached() ); + QVERIFY( mFinder->resultAt( 0 ).type() == LogsCntEntry::EntryTypeContact ); + QVERIFY( mFinder->resultAt( 0 ).firstName()[0].text() == QString("first1") ); + QVERIFY( mFinder->resultAt( 0 ).firstName()[0].highlights() == 6 ); + QVERIFY( mFinder->resultAt( 1 ).firstName()[0].text() == QString("first10") ); + QVERIFY( mFinder->resultAt( 1 ).firstName()[0].highlights() == 6 ); + + + pattern = QString("3477810");//first10 cache + mFinder->predictiveSearchQuery( pattern ); + QCOMPARE( spy.count(), 10 ); + QVERIFY( mFinder->resultsCount() == 1 ); //first10 + QVERIFY( mFinder->mCachedCounter == 1 ); + QVERIFY( mFinder->mResults[0]->isCached() ); + QVERIFY( mFinder->resultAt( 0 ).type() == LogsCntEntry::EntryTypeContact ); + QVERIFY( mFinder->resultAt( 0 ).firstName()[0].text() == QString("first10") ); + QVERIFY( mFinder->resultAt( 0 ).firstName()[0].highlights() == 7 ); + + pattern = QString("34778104");//missmatch cache + mFinder->predictiveSearchQuery( pattern ); + QCOMPARE( spy.count(), 11 ); + QVERIFY( mFinder->resultsCount() == 0 ); + QVERIFY( mFinder->mCachedCounter == 0 ); + + pattern = QString("3477810");//first10 must go to db + mFinder->predictiveSearchQuery( pattern ); + QCOMPARE( spy.count(), 12 ); + QVERIFY( mFinder->resultsCount() ); + QVERIFY( mFinder->mCachedCounter == 0 );//reuse cached cids + + + entry1 = new LogsCntEntry( *handle1,0 ); + entry1->setFirstName( QString("First Beam") ); + mFinder->insertEntry( 0, entry1 ); + + pattern = QString("34778");//first must go to db + mFinder->predictiveSearchQuery( pattern ); + QCOMPARE( spy.count(), 13 ); + QVERIFY( mFinder->resultsCount() > 1 ); + QVERIFY( mFinder->mCachedCounter == 1 );//history event, which is result + QVERIFY( mFinder->mResults[0]->isCached() );//history event is always cached + QVERIFY( !mFinder->mResults[1]->isCached() );//was not cached + + QVERIFY( mFinder->resultAt( 0 ).firstName()[0].highlights() == 5 ); + QVERIFY( mFinder->resultAt( 1 ).firstName()[0].highlights() == 5 ); + + pattern = QString("123456789112345"); //15 digits query + mFinder->predictiveSearchQuery( pattern ); + QCOMPARE( spy.count(), 14 ); + QCOMPARE( mFinder->mCurrentPredictivePattern.length(), 15 ); + + pattern = QString("1234567891123456"); //16 digits query + mFinder->predictiveSearchQuery( pattern ); + QCOMPARE( spy.count(), 15 ); + QCOMPARE( mFinder->mCurrentPredictivePattern.length(), 15 ); + + pattern = QString("12345678911234567891"); //20 digits query + mFinder->predictiveSearchQuery( pattern ); + QCOMPARE( spy.count(), 16 ); + QCOMPARE( mFinder->mCurrentPredictivePattern.length(), 15 ); } void UT_LogsCntFinder::testResultAt() @@ -136,8 +265,8 @@ QVERIFY( mFinder->resultsCount() > 0 ); const LogsCntEntry& e = mFinder->resultAt( 0 ); - QVERIFY( e.firstName()[0].text() == QString("first") );//stub - QVERIFY( e.lastName()[0].text() == QString("last") );//stub + QVERIFY( e.firstName()[0].text() == QString("first1") );//stub + QVERIFY( e.lastName()[0].text() == QString("last1") );//stub QVERIFY( e.speedDial() == QString("") ); QVERIFY( e.phoneNumber().text() == QString("555789987") );//stub QVERIFY( e.phoneNumber().highlights() == 1 ); diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logspredictivetranslator.cpp --- a/logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logspredictivetranslator.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logspredictivetranslator.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -127,12 +127,31 @@ QVERIFY( mTranslator->translate( QString( "Sierra" ) ) == QString( "743772" ) ); QVERIFY( mTranslator->translate( QString( "Tanga" ) ) == QString( "82642" ) ); QVERIFY( mTranslator->translate( QString( "Uniform" ) ) == QString( "8643676" ) ); + QVERIFY( mTranslator->translate( QString( "Vârlan" ) ) == QString( "827526" ) ); QVERIFY( mTranslator->translate( QString( "Victor" ) ) == QString( "842867" ) ); QVERIFY( mTranslator->translate( QString( "Whiskey" ) ) == QString( "9447539" ) ); QVERIFY( mTranslator->translate( QString( "Xray" ) ) == QString( "9729" ) ); QVERIFY( mTranslator->translate( QString( "Yankee" ) ) == QString( "926533" ) ); QVERIFY( mTranslator->translate( QString( "Zulu" ) ) == QString( "9858" ) ); QVERIFY( mTranslator->translate( QString( "1234567890" ) ) == QString( "1234567890" ) ); + + QString uni; + uni.append(QChar(0x0219)); + uni.append(QChar(0x4E0F)); + QString result("7"); + result.append(QChar(0x4E0F)); + QCOMPARE(mTranslator->translate(uni), result); +} + +void UT_LogsPredictiveTranslator::testTranslateChar() +{ + // Romanian unicode character "sh" + QChar rom(0x0219); + QCOMPARE( mTranslator->translate( rom ), QChar('7') ); + + // Chinese unicode character + QChar chn(0x4E0F); + QCOMPARE( mTranslator->translate( chn ), chn ); } diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/bwins/logsengineu.def --- a/logsui/logsengine/bwins/logsengineu.def Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/bwins/logsengineu.def Fri Apr 16 14:53:18 2010 +0300 @@ -4,10 +4,10 @@ ??0LogsCustomFilter@@QAE@XZ @ 3 NONAME ; LogsCustomFilter::LogsCustomFilter(void) ?clearEvents@LogsCustomFilter@@QAE_NXZ @ 4 NONAME ; bool LogsCustomFilter::clearEvents(void) ?ALS@LogsEvent@@QBE_NXZ @ 5 NONAME ; bool LogsEvent::ALS(void) const - ?allowedRequestType@LogsContact@@QAE?AW4RequestType@1@XZ @ 6 NONAME ; enum LogsContact::RequestType LogsContact::allowedRequestType(void) - ??0LogsEvent@@QAE@ABV0@@Z @ 7 NONAME ; LogsEvent::LogsEvent(class LogsEvent const &) - ?markEventsSeen@LogsModel@@QAE_NW4ClearType@1@@Z @ 8 NONAME ; bool LogsModel::markEventsSeen(enum LogsModel::ClearType) - ?save@LogsContact@@QAE_NXZ @ 9 NONAME ; bool LogsContact::save(void) + ?updateExisting@LogsContact@@QAE_NXZ @ 6 NONAME ; bool LogsContact::updateExisting(void) + ?allowedRequestType@LogsContact@@QAE?AW4RequestType@1@XZ @ 7 NONAME ; enum LogsContact::RequestType LogsContact::allowedRequestType(void) + ??0LogsEvent@@QAE@ABV0@@Z @ 8 NONAME ; LogsEvent::LogsEvent(class LogsEvent const &) + ?markEventsSeen@LogsModel@@QAE_NW4ClearType@1@@Z @ 9 NONAME ; bool LogsModel::markEventsSeen(enum LogsModel::ClearType) ?getNumberToClipboard@LogsDetailsModel@@QAEXXZ @ 10 NONAME ; void LogsDetailsModel::getNumberToClipboard(void) ??0LogsFilter@@QAE@W4FilterType@0@@Z @ 11 NONAME ; LogsFilter::LogsFilter(enum LogsFilter::FilterType) ?sendMessage@LogsMessage@@QAE_NXZ @ 12 NONAME ; bool LogsMessage::sendMessage(void) @@ -22,29 +22,32 @@ ?setContactId@LogsCustomFilter@@QAEXI@Z @ 21 NONAME ; void LogsCustomFilter::setContactId(unsigned int) ??1LogsModel@@UAE@XZ @ 22 NONAME ; LogsModel::~LogsModel(void) ?remoteParty@LogsEvent@@QBEABVQString@@XZ @ 23 NONAME ; class QString const & LogsEvent::remoteParty(void) const - ?isRead@LogsEvent@@QBE_NXZ @ 24 NONAME ; bool LogsEvent::isRead(void) const - ?ringDuration@LogsEvent@@QBEHXZ @ 25 NONAME ; int LogsEvent::ringDuration(void) const - ?markEventsSeen@LogsCustomFilter@@QAE_NXZ @ 26 NONAME ; bool LogsCustomFilter::markEventsSeen(void) - ??1LogsDetailsModel@@UAE@XZ @ 27 NONAME ; LogsDetailsModel::~LogsDetailsModel(void) - ?number@LogsEvent@@QBEABVQString@@XZ @ 28 NONAME ; class QString const & LogsEvent::number(void) const - ?logsMatchesModel@LogsModel@@QAEPAVLogsMatchesModel@@XZ @ 29 NONAME ; class LogsMatchesModel * LogsModel::logsMatchesModel(void) - ??1LogsFilter@@UAE@XZ @ 30 NONAME ; LogsFilter::~LogsFilter(void) - ??1LogsMessage@@UAE@XZ @ 31 NONAME ; LogsMessage::~LogsMessage(void) - ?logsMatches@LogsMatchesModel@@QAEXABVQString@@@Z @ 32 NONAME ; void LogsMatchesModel::logsMatches(class QString const &) - ?duplicates@LogsEvent@@QBEHXZ @ 33 NONAME ; int LogsEvent::duplicates(void) const - ?getNumberForCalling@LogsEvent@@QAE?AVQString@@XZ @ 34 NONAME ; class QString LogsEvent::getNumberForCalling(void) - ?direction@LogsEvent@@QBE?AW4LogsDirection@1@XZ @ 35 NONAME ; enum LogsEvent::LogsDirection LogsEvent::direction(void) const - ?clearEvent@LogsDetailsModel@@QAEXXZ @ 36 NONAME ; void LogsDetailsModel::clearEvent(void) - ?clearMissedCallsCounter@LogsModel@@QAEHXZ @ 37 NONAME ; int LogsModel::clearMissedCallsCounter(void) - ?filterType@LogsFilter@@QBE?AW4FilterType@1@XZ @ 38 NONAME ; enum LogsFilter::FilterType LogsFilter::filterType(void) const - ??1LogsEvent@@UAE@XZ @ 39 NONAME ; LogsEvent::~LogsEvent(void) - ?setMaxSize@LogsFilter@@QAEXH@Z @ 40 NONAME ; void LogsFilter::setMaxSize(int) - ?initiateCallback@LogsCall@@QAEXXZ @ 41 NONAME ; void LogsCall::initiateCallback(void) - ??1LogsCustomFilter@@UAE@XZ @ 42 NONAME ; LogsCustomFilter::~LogsCustomFilter(void) - ?defaultCallType@LogsCall@@QAE?AW4CallType@1@XZ @ 43 NONAME ; enum LogsCall::CallType LogsCall::defaultCallType(void) - ?eventType@LogsEvent@@QBE?AW4LogsEventType@1@XZ @ 44 NONAME ; enum LogsEvent::LogsEventType LogsEvent::eventType(void) const - ??1LogsCall@@UAE@XZ @ 45 NONAME ; LogsCall::~LogsCall(void) - ?clearList@LogsModel@@QAE_NW4ClearType@1@@Z @ 46 NONAME ; bool LogsModel::clearList(enum LogsModel::ClearType) - ??1LogsContact@@UAE@XZ @ 47 NONAME ; LogsContact::~LogsContact(void) - ?clearType@LogsFilter@@QBE?AW4ClearType@LogsModel@@XZ @ 48 NONAME ; enum LogsModel::ClearType LogsFilter::clearType(void) const + ?addNew@LogsContact@@QAE_NXZ @ 24 NONAME ; bool LogsContact::addNew(void) + ?isRead@LogsEvent@@QBE_NXZ @ 25 NONAME ; bool LogsEvent::isRead(void) const + ?ringDuration@LogsEvent@@QBEHXZ @ 26 NONAME ; int LogsEvent::ringDuration(void) const + ?markEventsSeen@LogsCustomFilter@@QAE_NXZ @ 27 NONAME ; bool LogsCustomFilter::markEventsSeen(void) + ??1LogsDetailsModel@@UAE@XZ @ 28 NONAME ; LogsDetailsModel::~LogsDetailsModel(void) + ?number@LogsEvent@@QBEABVQString@@XZ @ 29 NONAME ; class QString const & LogsEvent::number(void) const + ?logsMatchesModel@LogsModel@@QAEPAVLogsMatchesModel@@XZ @ 30 NONAME ; class LogsMatchesModel * LogsModel::logsMatchesModel(void) + ??1LogsFilter@@UAE@XZ @ 31 NONAME ; LogsFilter::~LogsFilter(void) + ??1LogsMessage@@UAE@XZ @ 32 NONAME ; LogsMessage::~LogsMessage(void) + ?logsMatches@LogsMatchesModel@@QAEXABVQString@@@Z @ 33 NONAME ; void LogsMatchesModel::logsMatches(class QString const &) + ?duplicates@LogsEvent@@QBEHXZ @ 34 NONAME ; int LogsEvent::duplicates(void) const + ?getNumberForCalling@LogsEvent@@QAE?AVQString@@XZ @ 35 NONAME ; class QString LogsEvent::getNumberForCalling(void) + ?createContact@LogsMatchesModel@@QAEPAVLogsContact@@ABVQString@@@Z @ 36 NONAME ; class LogsContact * LogsMatchesModel::createContact(class QString const &) + ?direction@LogsEvent@@QBE?AW4LogsDirection@1@XZ @ 37 NONAME ; enum LogsEvent::LogsDirection LogsEvent::direction(void) const + ?clearEvent@LogsDetailsModel@@QAEXXZ @ 38 NONAME ; void LogsDetailsModel::clearEvent(void) + ?clearMissedCallsCounter@LogsModel@@QAEHXZ @ 39 NONAME ; int LogsModel::clearMissedCallsCounter(void) + ?filterType@LogsFilter@@QBE?AW4FilterType@1@XZ @ 40 NONAME ; enum LogsFilter::FilterType LogsFilter::filterType(void) const + ??1LogsEvent@@UAE@XZ @ 41 NONAME ; LogsEvent::~LogsEvent(void) + ?setMaxSize@LogsFilter@@QAEXH@Z @ 42 NONAME ; void LogsFilter::setMaxSize(int) + ?initiateCallback@LogsCall@@QAEXXZ @ 43 NONAME ; void LogsCall::initiateCallback(void) + ??1LogsCustomFilter@@UAE@XZ @ 44 NONAME ; LogsCustomFilter::~LogsCustomFilter(void) + ?defaultCallType@LogsCall@@QAE?AW4CallType@1@XZ @ 45 NONAME ; enum LogsCall::CallType LogsCall::defaultCallType(void) + ?eventType@LogsEvent@@QBE?AW4LogsEventType@1@XZ @ 46 NONAME ; enum LogsEvent::LogsEventType LogsEvent::eventType(void) const + ??1LogsCall@@UAE@XZ @ 47 NONAME ; LogsCall::~LogsCall(void) + ?clearList@LogsModel@@QAE_NW4ClearType@1@@Z @ 48 NONAME ; bool LogsModel::clearList(enum LogsModel::ClearType) + ??1LogsContact@@UAE@XZ @ 49 NONAME ; LogsContact::~LogsContact(void) + ?clearType@LogsFilter@@QBE?AW4ClearType@LogsModel@@XZ @ 50 NONAME ; enum LogsModel::ClearType LogsFilter::clearType(void) const + ?sendMessageToNumber@LogsMessage@@SA_NABVQString@@0I@Z @ 51 NONAME ; bool LogsMessage::sendMessageToNumber(class QString const &, class QString const &, unsigned int) diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/eabi/logsengineu.def --- a/logsui/logsengine/eabi/logsengineu.def Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/eabi/logsengineu.def Fri Apr 16 14:53:18 2010 +0300 @@ -5,68 +5,71 @@ _ZN10LogsFilterD0Ev @ 4 NONAME _ZN10LogsFilterD1Ev @ 5 NONAME _ZN10LogsFilterD2Ev @ 6 NONAME - _ZN11LogsContact18allowedRequestTypeEv @ 7 NONAME - _ZN11LogsContact4openEv @ 8 NONAME - _ZN11LogsContact4saveEv @ 9 NONAME - _ZN11LogsContactD0Ev @ 10 NONAME - _ZN11LogsContactD1Ev @ 11 NONAME - _ZN11LogsContactD2Ev @ 12 NONAME - _ZN11LogsMessage11sendMessageEv @ 13 NONAME - _ZN11LogsMessageD0Ev @ 14 NONAME - _ZN11LogsMessageD1Ev @ 15 NONAME - _ZN11LogsMessageD2Ev @ 16 NONAME - _ZN16LogsCustomFilter11clearEventsEv @ 17 NONAME - _ZN16LogsCustomFilter12setContactIdEj @ 18 NONAME - _ZN16LogsCustomFilter14markEventsSeenEv @ 19 NONAME - _ZN16LogsCustomFilterC1Ev @ 20 NONAME - _ZN16LogsCustomFilterC2Ev @ 21 NONAME - _ZN16LogsCustomFilterD0Ev @ 22 NONAME - _ZN16LogsCustomFilterD1Ev @ 23 NONAME - _ZN16LogsCustomFilterD2Ev @ 24 NONAME - _ZN16LogsDetailsModel10clearEventEv @ 25 NONAME - _ZN16LogsDetailsModel20getNumberToClipboardEv @ 26 NONAME - _ZN16LogsDetailsModelD0Ev @ 27 NONAME - _ZN16LogsDetailsModelD1Ev @ 28 NONAME - _ZN16LogsDetailsModelD2Ev @ 29 NONAME - _ZN16LogsMatchesModel11logsMatchesERK7QString @ 30 NONAME - _ZN16LogsMatchesModelD0Ev @ 31 NONAME - _ZN16LogsMatchesModelD1Ev @ 32 NONAME - _ZN16LogsMatchesModelD2Ev @ 33 NONAME - _ZN8LogsCall12callToNumberENS_8CallTypeERK7QStringj @ 34 NONAME - _ZN8LogsCall15defaultCallTypeEv @ 35 NONAME - _ZN8LogsCall16allowedCallTypesEv @ 36 NONAME - _ZN8LogsCall16initiateCallbackEv @ 37 NONAME - _ZN8LogsCall4callENS_8CallTypeE @ 38 NONAME - _ZN8LogsCallD0Ev @ 39 NONAME - _ZN8LogsCallD1Ev @ 40 NONAME - _ZN8LogsCallD2Ev @ 41 NONAME - _ZN9LogsEvent19getNumberForCallingEv @ 42 NONAME - _ZN9LogsEventC1ERKS_ @ 43 NONAME - _ZN9LogsEventC2ERKS_ @ 44 NONAME - _ZN9LogsEventD0Ev @ 45 NONAME - _ZN9LogsEventD1Ev @ 46 NONAME - _ZN9LogsEventD2Ev @ 47 NONAME - _ZN9LogsModel14markEventsSeenENS_9ClearTypeE @ 48 NONAME - _ZN9LogsModel16logsMatchesModelEv @ 49 NONAME - _ZN9LogsModel23clearMissedCallsCounterEv @ 50 NONAME - _ZN9LogsModel9clearListENS_9ClearTypeE @ 51 NONAME - _ZN9LogsModelC1ENS_13LogsModelTypeE @ 52 NONAME - _ZN9LogsModelC2ENS_13LogsModelTypeE @ 53 NONAME - _ZN9LogsModelD0Ev @ 54 NONAME - _ZN9LogsModelD1Ev @ 55 NONAME - _ZN9LogsModelD2Ev @ 56 NONAME - _ZNK10LogsFilter10filterTypeEv @ 57 NONAME - _ZNK10LogsFilter9clearTypeEv @ 58 NONAME - _ZNK9LogsEvent10duplicatesEv @ 59 NONAME - _ZNK9LogsEvent11remotePartyEv @ 60 NONAME - _ZNK9LogsEvent12ringDurationEv @ 61 NONAME - _ZNK9LogsEvent14contactLocalIdEv @ 62 NONAME - _ZNK9LogsEvent3ALSEv @ 63 NONAME - _ZNK9LogsEvent4timeEv @ 64 NONAME - _ZNK9LogsEvent5logIdEv @ 65 NONAME - _ZNK9LogsEvent6isReadEv @ 66 NONAME - _ZNK9LogsEvent6numberEv @ 67 NONAME - _ZNK9LogsEvent8durationEv @ 68 NONAME - _ZNK9LogsEvent9directionEv @ 69 NONAME - _ZNK9LogsEvent9eventTypeEv @ 70 NONAME + _ZN11LogsContact14updateExistingEv @ 7 NONAME + _ZN11LogsContact18allowedRequestTypeEv @ 8 NONAME + _ZN11LogsContact4openEv @ 9 NONAME + _ZN11LogsContact6addNewEv @ 10 NONAME + _ZN11LogsContactD0Ev @ 11 NONAME + _ZN11LogsContactD1Ev @ 12 NONAME + _ZN11LogsContactD2Ev @ 13 NONAME + _ZN11LogsMessage11sendMessageEv @ 14 NONAME + _ZN11LogsMessageD0Ev @ 15 NONAME + _ZN11LogsMessageD1Ev @ 16 NONAME + _ZN11LogsMessageD2Ev @ 17 NONAME + _ZN16LogsCustomFilter11clearEventsEv @ 18 NONAME + _ZN16LogsCustomFilter12setContactIdEj @ 19 NONAME + _ZN16LogsCustomFilter14markEventsSeenEv @ 20 NONAME + _ZN16LogsCustomFilterC1Ev @ 21 NONAME + _ZN16LogsCustomFilterC2Ev @ 22 NONAME + _ZN16LogsCustomFilterD0Ev @ 23 NONAME + _ZN16LogsCustomFilterD1Ev @ 24 NONAME + _ZN16LogsCustomFilterD2Ev @ 25 NONAME + _ZN16LogsDetailsModel10clearEventEv @ 26 NONAME + _ZN16LogsDetailsModel20getNumberToClipboardEv @ 27 NONAME + _ZN16LogsDetailsModelD0Ev @ 28 NONAME + _ZN16LogsDetailsModelD1Ev @ 29 NONAME + _ZN16LogsDetailsModelD2Ev @ 30 NONAME + _ZN16LogsMatchesModel11logsMatchesERK7QString @ 31 NONAME + _ZN16LogsMatchesModel13createContactERK7QString @ 32 NONAME + _ZN16LogsMatchesModelD0Ev @ 33 NONAME + _ZN16LogsMatchesModelD1Ev @ 34 NONAME + _ZN16LogsMatchesModelD2Ev @ 35 NONAME + _ZN8LogsCall12callToNumberENS_8CallTypeERK7QStringj @ 36 NONAME + _ZN8LogsCall15defaultCallTypeEv @ 37 NONAME + _ZN8LogsCall16allowedCallTypesEv @ 38 NONAME + _ZN8LogsCall16initiateCallbackEv @ 39 NONAME + _ZN8LogsCall4callENS_8CallTypeE @ 40 NONAME + _ZN8LogsCallD0Ev @ 41 NONAME + _ZN8LogsCallD1Ev @ 42 NONAME + _ZN8LogsCallD2Ev @ 43 NONAME + _ZN9LogsEvent19getNumberForCallingEv @ 44 NONAME + _ZN9LogsEventC1ERKS_ @ 45 NONAME + _ZN9LogsEventC2ERKS_ @ 46 NONAME + _ZN9LogsEventD0Ev @ 47 NONAME + _ZN9LogsEventD1Ev @ 48 NONAME + _ZN9LogsEventD2Ev @ 49 NONAME + _ZN9LogsModel14markEventsSeenENS_9ClearTypeE @ 50 NONAME + _ZN9LogsModel16logsMatchesModelEv @ 51 NONAME + _ZN9LogsModel23clearMissedCallsCounterEv @ 52 NONAME + _ZN9LogsModel9clearListENS_9ClearTypeE @ 53 NONAME + _ZN9LogsModelC1ENS_13LogsModelTypeE @ 54 NONAME + _ZN9LogsModelC2ENS_13LogsModelTypeE @ 55 NONAME + _ZN9LogsModelD0Ev @ 56 NONAME + _ZN9LogsModelD1Ev @ 57 NONAME + _ZN9LogsModelD2Ev @ 58 NONAME + _ZNK10LogsFilter10filterTypeEv @ 59 NONAME + _ZNK10LogsFilter9clearTypeEv @ 60 NONAME + _ZNK9LogsEvent10duplicatesEv @ 61 NONAME + _ZNK9LogsEvent11remotePartyEv @ 62 NONAME + _ZNK9LogsEvent12ringDurationEv @ 63 NONAME + _ZNK9LogsEvent14contactLocalIdEv @ 64 NONAME + _ZNK9LogsEvent3ALSEv @ 65 NONAME + _ZNK9LogsEvent4timeEv @ 66 NONAME + _ZNK9LogsEvent5logIdEv @ 67 NONAME + _ZNK9LogsEvent6isReadEv @ 68 NONAME + _ZNK9LogsEvent6numberEv @ 69 NONAME + _ZNK9LogsEvent8durationEv @ 70 NONAME + _ZNK9LogsEvent9directionEv @ 71 NONAME + _ZNK9LogsEvent9eventTypeEv @ 72 NONAME + _ZN11LogsMessage19sendMessageToNumberERK7QStringS2_j @ 73 NONAME diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/inc/logscontact.h --- a/logsui/logsengine/inc/logscontact.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/inc/logscontact.h Fri Apr 16 14:53:18 2010 +0300 @@ -45,8 +45,9 @@ public: explicit LogsContact(LogsEvent& event, LogsDbConnector& dbConnector); - explicit LogsContact( - unsigned int contactId, const QString& number, LogsDbConnector& dbConnector); + explicit LogsContact(const QString& number, + LogsDbConnector& dbConnector, + unsigned int contactId = 0); LOGSENGINE_EXPORT ~LogsContact(); /** @@ -61,18 +62,26 @@ /** * Launch phonebook view for modification of the contact. Will proceed * only if allowedRequestType() is TypeLogsContactOpen, otherwise returns false. - * Emits openCompeted() signal, when contact modifications are done. + * Emits openCompleted() signal, when contact modifications are done. * @return true if opening was called successfully */ LOGSENGINE_EXPORT bool open(); /** * Launch phonebook view for creation of a new contact. - * Emits openCompeted() signal, when contact saving is done. - * @return true if saving was called successfully + * Emits saveCompleted() signal, when contact saving is done. + * @return true if adding was called successfully */ - LOGSENGINE_EXPORT bool save(); + LOGSENGINE_EXPORT bool addNew(); + + /** + * Launch phonebook view for updating of existing contact. + * Emits saveCompeted() signal, when contact saving is done. + * @return true if updating was called successfully + */ + LOGSENGINE_EXPORT bool updateExisting(); + signals: /** @@ -107,8 +116,11 @@ */ bool isContactInPhonebook(); - bool requestFetchService( QString message, const QList &arguments, - bool sync = false ); + bool save(QString message); + + bool requestFetchService(QString message, + const QList &arguments, + bool sync = false ); private: //data diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/inc/logsdetailsmodel.h --- a/logsui/logsengine/inc/logsdetailsmodel.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/inc/logsdetailsmodel.h Fri Apr 16 14:53:18 2010 +0300 @@ -20,6 +20,7 @@ #include #include +#include #include "logsengdefs.h" class LogsEvent; @@ -59,6 +60,7 @@ private slots: void contactActionCompleted(bool modified); + void duplicatesRead(); private: @@ -67,20 +69,20 @@ QString getCallerId(const LogsEvent& event) const; QString getHeaderData(const LogsEvent& event) const; QString getRemoteUri(const LogsEvent& event) const; - QString getLocalUri(const LogsEvent& event) const; bool isAddress(QString value) const; bool isOutgoingCall() const; QString getHeaderValue(QString value,bool isremote) const; void initContent(); void initTexts(); void initIcons(); + void addDateAndTimeTextRow(const LogsEvent& event, bool firstOfMultipleDates = false); private: //data LogsEvent* mEvent; - int mDetailItemsCount; - QMap mDetailIcons; - QMap mDetailTexts; + QList mDetailIcons; + QList mDetailTexts; + QList mDuplicates; private: diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/inc/logsengdefs.h --- a/logsui/logsengine/inc/logsengdefs.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/inc/logsengdefs.h Fri Apr 16 14:53:18 2010 +0300 @@ -37,14 +37,17 @@ const char logsDialledVoiceCallIconId[] = "qtg_large_dialled_voice_call"; const char logsMissedVoiceCallIconId[] = "qtg_large_missed_voice_call"; +const char logsMissedVoiceCallUnseenIconId[] = "qtg_large_missed_voice_call_unseen"; const char logsReceivedVoiceCallIconId[] = "qtg_large_received_voice_call"; const char logsDialledVideoCallIconId[] = "qtg_large_video_dialled_call"; const char logsMissedVideoCallIconId[] = "qtg_large_video_missed_call"; +const char logsMissedVideoCallUnseenIconId[] = "qtg_large_missed_video_call_unseen"; const char logsReceivedVideoCallIconId[] = "qtg_large_video_received_call"; const char logsDialledVoipCallIconId[] = "qtg_large_voip_dialled_call"; const char logsMissedVoipCallIconId[] = "qtg_large_voip_missed_call"; +const char logsMissedVoipCallUnseenIconId[] = "qtg_large_missed_voip_call_unseen"; const char logsReceivedVoipCallIconId[] = "qtg_large_voip_received_call"; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/inc/logsmatchesmodel.h --- a/logsui/logsengine/inc/logsmatchesmodel.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/inc/logsmatchesmodel.h Fri Apr 16 14:53:18 2010 +0300 @@ -26,6 +26,7 @@ class LogsDbConnector; class LogsCntFinder; class LogsCntEntry; +class LogsContact; class LogsMatchesModelItemContainer; class LogsThumbIconManager; typedef QObject LogsCntEntryHandle; @@ -40,12 +41,18 @@ public: - explicit LogsMatchesModel( LogsAbstractModel& parentModel, LogsDbConnector& dbConnector ); + explicit LogsMatchesModel( LogsAbstractModel& parentModel, + LogsDbConnector& dbConnector ); public: // The exported API LOGSENGINE_EXPORT ~LogsMatchesModel(); - LOGSENGINE_EXPORT void logsMatches( const QString& pattern ); + LOGSENGINE_EXPORT void logsMatches(const QString& pattern); + + /** + * Factory method for creating a new contact object. Transfers ownership. + */ + LOGSENGINE_EXPORT LogsContact* createContact(const QString& number); public: // From QAbstractItemModel @@ -112,6 +119,7 @@ void setContact(unsigned int contactId); unsigned int contact() const; QString number() const; + QString contactName() const; bool isNull() const; bool isEventMatch() const; QStringList texts(); diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/inc/logsmessage.h --- a/logsui/logsengine/inc/logsmessage.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/inc/logsmessage.h Fri Apr 16 14:53:18 2010 +0300 @@ -23,6 +23,8 @@ #include "logsevent.h" +class XQServiceRequest; + /** * LogsMessage can be used to send message. */ @@ -33,9 +35,12 @@ public: explicit LogsMessage(LogsEvent& aEvent); - explicit LogsMessage(unsigned int contactId, const QString& number); + explicit LogsMessage(unsigned int contactId, const QString& number, const QString& displayName); LOGSENGINE_EXPORT ~LogsMessage(); + LOGSENGINE_EXPORT static bool sendMessageToNumber( + const QString& number, const QString& displayName = QString(), unsigned int contactId = 0); + bool isMessagingAllowed(); public slots: @@ -45,13 +50,23 @@ * @return true if sent succesfully */ LOGSENGINE_EXPORT bool sendMessage(); - + +protected slots: + void requestCompleted(const QVariant& value); + void requestError(int err); + +private: + static bool doSendMessageToNumber( + XQServiceRequest& request, const QString& number, + const QString& displayName, unsigned int contactId); + private: //data bool mIsAllowed; QString mNumber; unsigned int mContactId; - + QString mDisplayName; + XQServiceRequest* mService; private: friend class UT_LogsMessage; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logsengine.qrc --- a/logsui/logsengine/logsengine.qrc Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logsengine.qrc Fri Apr 16 14:53:18 2010 +0300 @@ -9,12 +9,15 @@ themes/icons/hbdefault/scalable/qtg_large_avatar.svg themes/icons/hbdefault/scalable/qtg_large_dialled_voice_call.svg themes/icons/hbdefault/scalable/qtg_large_missed_voice_call.svg + themes/icons/hbdefault/scalable/qtg_large_missed_voice_call_unseen.svg themes/icons/hbdefault/scalable/qtg_large_received_voice_call.svg themes/icons/hbdefault/scalable/qtg_large_video_dialled_call.svg themes/icons/hbdefault/scalable/qtg_large_video_missed_call.svg + themes/icons/hbdefault/scalable/qtg_large_missed_video_call_unseen.svg themes/icons/hbdefault/scalable/qtg_large_video_received_call.svg themes/icons/hbdefault/scalable/qtg_large_voip_dialled_call.svg themes/icons/hbdefault/scalable/qtg_large_voip_missed_call.svg + themes/icons/hbdefault/scalable/qtg_large_missed_voip_call_unseen.svg themes/icons/hbdefault/scalable/qtg_large_voip_received_call.svg diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logssymbianos/inc/logsdbconnector.h --- a/logsui/logsengine/logssymbianos/inc/logsdbconnector.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logssymbianos/inc/logsdbconnector.h Fri Apr 16 14:53:18 2010 +0300 @@ -98,6 +98,11 @@ * @param err, 0 if marking completed succesfully */ void markingCompleted(int err); + + /** + * Signaled once duplicate reading has completed. + */ + void duplicatesRead(); public: @@ -150,6 +155,19 @@ * @return 0 if clearing was success */ int clearMissedCallsCounter(); + + /** + * Read duplicates for specified event + * @param eventId + * @return 0 if reading started succesfully + */ + int readDuplicates(int eventId); + + /** + * Take current duplicates. + * @return list of duplicate events, ownership is transferred + */ + QList takeDuplicates(); protected: // From LogsReaderObserver @@ -157,6 +175,7 @@ virtual void errorOccurred(int err); virtual void temporaryErrorOccurred(int err); virtual void eventModifyingCompleted(); + virtual void duplicatesReadingCompleted(QList duplicates); protected: // From LogsRemoveObserver virtual void removeCompleted(); @@ -181,16 +200,18 @@ CRepository* mRepository; QList mEvents; + QList mDuplicatedEvents; QList mRemovedEventIndexes; QList mUpdatedEventIndexes; QList mAddedEventIndexes; QList mEventsSeen; - + private: // Testing related friend definitions friend class UT_LogsDbConnector; friend class UT_LogsRemove; friend class UT_LogsModel; + friend class UT_LogsDetailsModel; }; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logssymbianos/inc/logsreader.h --- a/logsui/logsengine/logssymbianos/inc/logsreader.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logssymbianos/inc/logsreader.h Fri Apr 16 14:53:18 2010 +0300 @@ -107,6 +107,13 @@ * @return 0 if removing started succesfully */ int markEventSeen(int eventId); + + /** + * Starts reading duplicates of the event + * @param eventId + * @return 0 if removing started succesfully + */ + int readDuplicates(int eventId); protected: // From CActive @@ -145,14 +152,16 @@ inline TRequestStatus& reqStatus(); inline LogsReaderObserver& observer(); inline QHash& contactCache(); - inline int modifyingEventId(); + inline int currentEventId(); inline CLogClient& logClient(); inline bool isRecentView(); + inline QList& duplicatedEvents(); private: void startL(); void markEventSeenL(int eventId); + void readDuplicatesL(int eventId); /** * Cancel all outstanding requests if possible. In case of deleting is @@ -161,11 +170,13 @@ void cancelCurrentRequestL(); LogsReaderStateBase& currentState(); void initializeReadStates(); - void initializeDeleteStates(); + void initializeModifyingStates(); + void initializeDuplicateReadingStates(); void handleViewChange( int totalChangeCount = 1 ); void handleError(int error); void createLogViewL(); LogsReaderStateFiltering* createFilteringState(); + void prepareReadingL(); private: // data @@ -183,12 +194,14 @@ int mIndex; QList mReadStates; QList mModifyingStates; + QList mDuplicateReadingStates; int mCurrentStateIndex; QList* mCurrentStateMachine; QHash mContactCache; + QList mDuplicatedEvents; - int mModifyingEventId; + int mCurrentEventId; }; #endif // LOGSREADER_H diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logssymbianos/inc/logsreaderobserver.h --- a/logsui/logsengine/logssymbianos/inc/logsreaderobserver.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logssymbianos/inc/logsreaderobserver.h Fri Apr 16 14:53:18 2010 +0300 @@ -19,8 +19,10 @@ #define LOGSREADEROBSERVER_H // INCLUDES +#include // FORWARD DECLARATION +class LogsEvent; // CLASS DECLARATION @@ -50,7 +52,16 @@ */ virtual void temporaryErrorOccurred(int err) = 0; + /** + * Reader has completed modifying the event. + */ virtual void eventModifyingCompleted() = 0; + + /** + * Duplicate reading has completed + * @param duplicates, list of read duplicates, onwership is transferred + */ + virtual void duplicatesReadingCompleted(QList duplicates) = 0; }; #endif // LOGSREADER_H diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logssymbianos/inc/logsreaderstatecontext.h --- a/logsui/logsengine/logssymbianos/inc/logsreaderstatecontext.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logssymbianos/inc/logsreaderstatecontext.h Fri Apr 16 14:53:18 2010 +0300 @@ -109,10 +109,10 @@ virtual QHash& contactCache() = 0; /** - * Get ID of the event to be modified + * Get ID of the event to be handled * @return ID of the event */ - virtual int modifyingEventId() = 0; + virtual int currentEventId() = 0; /** * Get log client @@ -125,6 +125,12 @@ * @return true if recent view */ virtual bool isRecentView() = 0; + + /** + * Get event container for duplicated events + * @return duplicated events + */ + virtual QList& duplicatedEvents() = 0; }; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logssymbianos/inc/logsreaderstates.h --- a/logsui/logsengine/logssymbianos/inc/logsreaderstates.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logssymbianos/inc/logsreaderstates.h Fri Apr 16 14:53:18 2010 +0300 @@ -97,10 +97,11 @@ * @param source event * @param dest event, ownership is transferred * @param index, increased if event was added + * @param events, event is possibly added to this list * @return true if dest event was inserted, false if discarded and deleted */ bool constructAndInsertEventL( - const CLogEvent& source, LogsEvent* dest, int &eventIndex ); + const CLogEvent& source, LogsEvent* dest, int &eventIndex, QList& events ); /** * Fill already used dest event with source event data and insert @@ -258,12 +259,10 @@ public: // From LogsReaderStateBase virtual bool enterL(); virtual bool continueL(); - protected: - bool mUpdatingEvent; }; /** - * Finding duplicatates event state + * Finding duplicate events state */ class LogsReaderStateFindingDuplicates : public LogsReaderStateBase { @@ -271,11 +270,49 @@ public: LogsReaderStateFindingDuplicates(LogsReaderStateContext& context); - virtual ~LogsReaderStateFindingDuplicates(){} + virtual ~LogsReaderStateFindingDuplicates(); + + public: // From LogsReaderStateBase + virtual bool enterL(); + virtual bool continueL(); + + protected: + CLogFilter* mDuplicateFilter; +}; + +/** + * Marking duplicate events state + */ +class LogsReaderStateMarkingDuplicates : public LogsReaderStateBase +{ + friend class UT_LogsReaderStates; + + public: + LogsReaderStateMarkingDuplicates(LogsReaderStateContext& context); + virtual ~LogsReaderStateMarkingDuplicates(){} public: // From LogsReaderStateBase virtual bool enterL(); - virtual bool continueL(); + virtual bool continueL(); + + protected: + bool mGettingDuplicates; +}; + +/** + * Marking duplicate events state + */ +class LogsReaderStateReadingDuplicates : public LogsReaderStateBase +{ + friend class UT_LogsReaderStates; + + public: + LogsReaderStateReadingDuplicates(LogsReaderStateContext& context); + virtual ~LogsReaderStateReadingDuplicates(){} + + public: // From LogsReaderStateBase + virtual bool enterL(); + virtual bool continueL(); }; /** @@ -293,6 +330,21 @@ virtual bool enterL(); }; +/** + * Reading duplicates done state + */ +class LogsReaderStateReadingDuplicatesDone : public LogsReaderStateBase +{ + friend class UT_LogsReaderStates; + + public: + LogsReaderStateReadingDuplicatesDone(LogsReaderStateContext& context); + virtual ~LogsReaderStateReadingDuplicatesDone(){} + + public: // From LogsReaderStateBase + virtual bool enterL(); +}; + #endif // LOGSREADERSTATES_H diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logssymbianos/src/logsdbconnector.cpp --- a/logsui/logsengine/logssymbianos/src/logsdbconnector.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logssymbianos/src/logsdbconnector.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -25,7 +25,7 @@ #include #include #include -#include +#include // CONSTANTS @@ -63,9 +63,8 @@ } delete mFsSession; - while ( !mEvents.isEmpty() ){ - delete mEvents.takeFirst(); - } + qDeleteAll( mEvents ); + qDeleteAll( mDuplicatedEvents ); delete mRepository; @@ -265,6 +264,34 @@ } // ---------------------------------------------------------------------------- +// LogsDbConnector::readDuplicates +// ---------------------------------------------------------------------------- +// +int LogsDbConnector::readDuplicates(int eventId) +{ + LOGS_QDEBUG_2( "logs [ENG] -> LogsDbConnector::readDuplicates(), id", eventId ) + if ( !mReader ){ + return -1; + } + qDeleteAll(mDuplicatedEvents); + mDuplicatedEvents.clear(); + return mReader->readDuplicates(eventId); +} + +// ---------------------------------------------------------------------------- +// LogsDbConnector::takeDuplicates +// ---------------------------------------------------------------------------- +// +QList LogsDbConnector::takeDuplicates() +{ + LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::takeDuplicates()" ) + QList duplicates = mDuplicatedEvents; + mDuplicatedEvents.clear(); + LOGS_QDEBUG( "logs [ENG] <- LogsDbConnector::takeDuplicates()" ) + return duplicates; +} + +// ---------------------------------------------------------------------------- // LogsDbConnector::handleTemporaryError // ---------------------------------------------------------------------------- // @@ -416,6 +443,20 @@ } // ---------------------------------------------------------------------------- +// LogsDbConnector::duplicatesReadingCompleted +// ---------------------------------------------------------------------------- +// +void LogsDbConnector::duplicatesReadingCompleted(QList duplicates) +{ + LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::duplicatesReadingCompleted()" ) + qDeleteAll( mDuplicatedEvents ); + mDuplicatedEvents.clear(); + mDuplicatedEvents = duplicates; + emit duplicatesRead(); + LOGS_QDEBUG( "logs [ENG] <- LogsDbConnector::duplicatesReadingCompleted()" ) +} + +// ---------------------------------------------------------------------------- // LogsDbConnector::doMarkEventSeen // ---------------------------------------------------------------------------- // diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logssymbianos/src/logsreader.cpp --- a/logsui/logsengine/logssymbianos/src/logsreader.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logssymbianos/src/logsreader.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -50,7 +50,7 @@ mIndex(0), mCurrentStateIndex(0), mCurrentStateMachine(0), - mModifyingEventId(-1) + mCurrentEventId(-1) { LOGS_QDEBUG( "logs [ENG] -> LogsReader::LogsReader()" ) @@ -71,15 +71,13 @@ LOGS_QDEBUG( "logs [ENG] -> LogsReader::~LogsReader()" ) Cancel(); - while ( !mReadStates.isEmpty() ){ - delete mReadStates.takeFirst(); - } - while ( !mModifyingStates.isEmpty() ){ - delete mModifyingStates.takeFirst(); - } + qDeleteAll( mReadStates ); + qDeleteAll( mModifyingStates ); + qDeleteAll( mDuplicateReadingStates ); delete mLogViewRecent; delete mLogViewEvent; delete mDuplicatesView; + qDeleteAll( mDuplicatedEvents ); LOGS_QDEBUG( "logs [ENG] <- LogsReader::~LogsReader()" ) } @@ -144,6 +142,18 @@ } // ---------------------------------------------------------------------------- +// LogsReader::readDuplicates +// ---------------------------------------------------------------------------- +// +int LogsReader::readDuplicates(int eventId) +{ + LOGS_QDEBUG_2( "logs [ENG] -> LogsReader::readDuplicates(), ids: ", eventId ) + TRAPD( err, readDuplicatesL(eventId) ); + LOGS_QDEBUG_2( "logs [ENG] <- LogsReader::readDuplicates(), err:", err ) + return err; +} + +// ---------------------------------------------------------------------------- // LogsReader::RunL // ---------------------------------------------------------------------------- // @@ -193,15 +203,7 @@ // void LogsReader::startL() { - cancelCurrentRequestL(); - - createLogViewL(); - - if ( !mDuplicatesView ){ - mDuplicatesView = CLogViewDuplicate::NewL( mLogClient, *this ); - } - - mIndex = 0; + prepareReadingL(); initializeReadStates(); @@ -216,17 +218,30 @@ // void LogsReader::markEventSeenL(int eventId) { - cancelCurrentRequestL(); + prepareReadingL(); - createLogViewL(); - if ( !mDuplicatesView ){ - mDuplicatesView = CLogViewDuplicate::NewL( mLogClient, *this ); + mCurrentEventId = eventId; + initializeModifyingStates(); + + if ( currentState().enterL() ){ + SetActive(); } +} + +// ---------------------------------------------------------------------------- +// LogsReader::readDuplicatesL +// ---------------------------------------------------------------------------- +// +void LogsReader::readDuplicatesL(int eventId) +{ + if ( IsActive() && mCurrentStateMachine != &mDuplicateReadingStates ){ + LOGS_QDEBUG( "logs [ENG] <-> LogsReader::readDuplicatesL(), cannot interrupt" ) + User::Leave(KErrInUse); + } + prepareReadingL(); - mModifyingEventId = eventId; - mIndex = 0; - - initializeDeleteStates(); + mCurrentEventId = eventId; + initializeDuplicateReadingStates(); if ( currentState().enterL() ){ SetActive(); @@ -241,7 +256,8 @@ { LOGS_QDEBUG( "logs [ENG] -> LogsReader::cancelCurrentRequestL()" ) if ( IsActive() ) { - if (mCurrentStateMachine == &mReadStates){ + if (mCurrentStateMachine == &mReadStates || + mCurrentStateMachine == &mDuplicateReadingStates){ LOGS_QDEBUG( "logs [ENG] reading is in progress, cancelling" ) Cancel(); } else if (mCurrentStateMachine == &mModifyingStates) { @@ -447,12 +463,12 @@ } // ---------------------------------------------------------------------------- -// LogsReader::modifyingEventId +// LogsReader::currentEventId // ---------------------------------------------------------------------------- // -int LogsReader::modifyingEventId() +int LogsReader::currentEventId() { - return mModifyingEventId; + return mCurrentEventId; } // ---------------------------------------------------------------------------- @@ -474,6 +490,15 @@ } // ---------------------------------------------------------------------------- +// LogsReader::duplicatedEvents +// ---------------------------------------------------------------------------- +// +QList& LogsReader::duplicatedEvents() +{ + return mDuplicatedEvents; +} + +// ---------------------------------------------------------------------------- // LogsReader::currentState // ---------------------------------------------------------------------------- // @@ -483,7 +508,7 @@ } // ---------------------------------------------------------------------------- -// LogsReader::initializeStates +// LogsReader::initializeReadStates // ---------------------------------------------------------------------------- // void LogsReader::initializeReadStates() @@ -507,17 +532,47 @@ } // ---------------------------------------------------------------------------- -// LogsReader::initializeDeleteStates +// LogsReader::initializeDuplicateReadingStates // ---------------------------------------------------------------------------- // -void LogsReader::initializeDeleteStates() +void LogsReader::initializeDuplicateReadingStates() +{ + if ( mDuplicateReadingStates.count() == 0 ){ + LogsReaderStateFiltering* filtering = createFilteringState(); + LogsReaderStateSearchingEvent* searching = + new LogsReaderStateSearchingEvent(*this); + LogsReaderStateFindingDuplicates* findingDuplicates = + new LogsReaderStateFindingDuplicates(*this); + LogsReaderStateReadingDuplicates* readingDuplicates = + new LogsReaderStateReadingDuplicates(*this); + LogsReaderStateReadingDuplicatesDone* done = + new LogsReaderStateReadingDuplicatesDone(*this); + filtering->setNextState(*searching); + searching->setNextState(*findingDuplicates); + findingDuplicates->setNextState(*readingDuplicates); + readingDuplicates->setNextState(*done); + mDuplicateReadingStates.append(filtering); + mDuplicateReadingStates.append(searching); + mDuplicateReadingStates.append(findingDuplicates); + mDuplicateReadingStates.append(readingDuplicates); + mDuplicateReadingStates.append(done); + } + mCurrentStateMachine = &mDuplicateReadingStates; + setCurrentState(*mDuplicateReadingStates.at(0)); +} + +// ---------------------------------------------------------------------------- +// LogsReader::initializeModifyingStates +// ---------------------------------------------------------------------------- +// +void LogsReader::initializeModifyingStates() { if ( mModifyingStates.count() == 0 ){ LogsReaderStateFiltering* filtering = createFilteringState(); LogsReaderStateSearchingEvent* searching = new LogsReaderStateSearchingEvent(*this); - LogsReaderStateFindingDuplicates* duplicates = - new LogsReaderStateFindingDuplicates(*this); + LogsReaderStateMarkingDuplicates* duplicates = + new LogsReaderStateMarkingDuplicates(*this); LogsReaderStateModifyingDone* done = new LogsReaderStateModifyingDone(*this); filtering->setNextState(*searching); searching->setNextState(*duplicates); @@ -590,3 +645,20 @@ } return filtering; } + +// ---------------------------------------------------------------------------- +// LogsReader::prepareReadingL +// ---------------------------------------------------------------------------- +// +void LogsReader::prepareReadingL() +{ + cancelCurrentRequestL(); + + createLogViewL(); + + if ( !mDuplicatesView ){ + mDuplicatesView = CLogViewDuplicate::NewL( mLogClient, *this ); + } + mIndex = 0; +} + diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logssymbianos/src/logsreaderstates.cpp --- a/logsui/logsengine/logssymbianos/src/logsreaderstates.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logssymbianos/src/logsreaderstates.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -131,7 +131,7 @@ // ---------------------------------------------------------------------------- // bool LogsReaderStateBase::constructAndInsertEventL( - const CLogEvent& source, LogsEvent* dest, int& eventIndex) + const CLogEvent& source, LogsEvent* dest, int& eventIndex, QList& events) { Q_ASSERT( dest ); dest->initializeEventL( source, mContext.strings() ); @@ -141,7 +141,7 @@ return false; } dest->setIndex(eventIndex); - mContext.events().insert(eventIndex, dest); + events.insert(eventIndex, dest); eventIndex++; return true; } @@ -389,7 +389,8 @@ else { // Create new entry event = new LogsEvent; - inserted = constructAndInsertEventL( sourceEvent, event, mEventIndex ); + inserted = constructAndInsertEventL( + sourceEvent, event, mEventIndex, mContext.events() ); } if ( inserted ){ @@ -566,7 +567,6 @@ bool LogsReaderStateSearchingEvent::enterL() { LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateSearchingEvent::enterL" ); - mUpdatingEvent = false; if ( viewCountL() > 0 && mContext.logView().FirstL( mContext.reqStatus() ) ){ return true; } @@ -582,18 +582,10 @@ { LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateSearchingEvent::continueL" ); int& index = mContext.index(); - if ( !mUpdatingEvent ) { - if ( event().Id() == mContext.modifyingEventId() ) { - // Mark event read - event().SetFlags( event().Flags() | KLogEventRead ); - mContext.logClient().ChangeEvent(event(), mContext.reqStatus()); - mUpdatingEvent = true; - return true; - } else { - index++; - if ( index < viewCountL() ){ - return mContext.logView().NextL( mContext.reqStatus() ); - } + if ( event().Id() != mContext.currentEventId() ) { + index++; + if ( index < viewCountL() ){ + return mContext.logView().NextL( mContext.reqStatus() ); } } @@ -606,23 +598,41 @@ // LogsReaderStateFindingDuplicates::LogsReaderStateFindingDuplicates( LogsReaderStateContext& context ) - : LogsReaderStateBase(context) + : LogsReaderStateBase(context), + mDuplicateFilter(0) { } // ---------------------------------------------------------------------------- +// LogsReaderStateFindingDuplicates::~LogsReaderStateFindingDuplicates +// ---------------------------------------------------------------------------- +// +LogsReaderStateFindingDuplicates::~LogsReaderStateFindingDuplicates() +{ + delete mDuplicateFilter; +} + +// ---------------------------------------------------------------------------- // LogsReaderStateFindingDuplicates::enterL // ---------------------------------------------------------------------------- // bool LogsReaderStateFindingDuplicates::enterL() { LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateFindingDuplicates::enterL" ); - if ( duplicatesL() ) { + + if ( !mDuplicateFilter ){ + // Interested only about duplicates which are not marked as read + mDuplicateFilter = CLogFilter::NewL(); + mDuplicateFilter->SetFlags(KLogEventRead); + mDuplicateFilter->SetNullFields(ELogFlagsField); + } + + if ( duplicatesL(mDuplicateFilter) ) { LOGS_QDEBUG( "logs [ENG] duplicates exist!"); return true; } - // Not possible to continue with deletion + // Not possible to continue with finding return enterNextStateL(); } @@ -632,13 +642,112 @@ // bool LogsReaderStateFindingDuplicates::continueL() { - LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateFindingDuplicates::continueL" ); + LOGS_QDEBUG( "logs [ENG] <-> LogsReaderStateFindingDuplicates::continueL" ); + + return enterNextStateL(); +} + + +// ---------------------------------------------------------------------------- +// LogsReaderStateMarkingDuplicates::LogsReaderStateMarkingDuplicates +// ---------------------------------------------------------------------------- +// +LogsReaderStateMarkingDuplicates::LogsReaderStateMarkingDuplicates( + LogsReaderStateContext& context ) + : LogsReaderStateBase(context) +{ +} + +// ---------------------------------------------------------------------------- +// LogsReaderStateMarkingDuplicates::enterL +// ---------------------------------------------------------------------------- +// +bool LogsReaderStateMarkingDuplicates::enterL() +{ + LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateMarkingDuplicates::enterL" ); + + mGettingDuplicates = false; + if ( event().Id() == mContext.currentEventId() ) { + // Mark event read + event().SetFlags( event().Flags() | KLogEventRead ); + mContext.logClient().ChangeEvent(event(), mContext.reqStatus()); + return true; + } + + // Not possible to continue with marking + return enterNextStateL(); +} + +// ---------------------------------------------------------------------------- +// LogsReaderStateMarkingDuplicates::continueL +// ---------------------------------------------------------------------------- +// +bool LogsReaderStateMarkingDuplicates::continueL() +{ + LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateMarkingDuplicates::continueL" ); - // Mark duplicate events read - mContext.duplicatesView().SetFlagsL( - mContext.duplicatesView().Event().Flags() | KLogEventRead ); + if ( !mGettingDuplicates ){ + if ( duplicatesL() ) { + LOGS_QDEBUG( "logs [ENG] duplicates exist!"); + mGettingDuplicates = true; + return true; + } + } else { + // Mark duplicate events read + mContext.duplicatesView().SetFlagsL( + mContext.duplicatesView().Event().Flags() | KLogEventRead ); + } + + LOGS_QDEBUG( "logs [ENG] <- LogsReaderStateMarkingDuplicates::continueL" ); + + return enterNextStateL(); +} + +// ---------------------------------------------------------------------------- +// LogsReaderStateReadingDuplicates::LogsReaderStateReadingDuplicates +// ---------------------------------------------------------------------------- +// +LogsReaderStateReadingDuplicates::LogsReaderStateReadingDuplicates( + LogsReaderStateContext& context ) + : LogsReaderStateBase(context) +{ +} - LOGS_QDEBUG( "logs [ENG] <- LogsReaderStateFindingDuplicates::continueL" ); +// ---------------------------------------------------------------------------- +// LogsReaderStateReadingDuplicates::enterL +// ---------------------------------------------------------------------------- +// +bool LogsReaderStateReadingDuplicates::enterL() +{ + LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateReadingDuplicates::enterL" ); + if ( mContext.duplicatesView().CountL() > 0 && + mContext.duplicatesView().FirstL(mContext.reqStatus()) ){ + LOGS_QDEBUG( "logs [ENG] duplicates exist!"); + return true; + } + + // Not possible to continue with deletion + return enterNextStateL(); +} + +// ---------------------------------------------------------------------------- +// LogsReaderStateReadingDuplicates::continueL +// ---------------------------------------------------------------------------- +// +bool LogsReaderStateReadingDuplicates::continueL() +{ + LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateReadingDuplicates::continueL" ); + + int nextIndex = mContext.duplicatedEvents().count(); + const CLogEvent& sourceEvent = mContext.duplicatesView().Event(); + LogsEvent* event = new LogsEvent; + constructAndInsertEventL( + sourceEvent, event, nextIndex, mContext.duplicatedEvents() ); + if ( mContext.duplicatesView().NextL(mContext.reqStatus()) ) { + return true; + } + + LOGS_QDEBUG( "logs [ENG] <- LogsReaderStateReadingDuplicates::continueL" ); return enterNextStateL(); } @@ -661,7 +770,7 @@ { LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateModifyingDone::enterL" ); - LogsEvent* modifiedEvent = eventById(mContext.modifyingEventId()); + LogsEvent* modifiedEvent = eventById(mContext.currentEventId()); if ( modifiedEvent ){ // Update modified event to know that it has been marked. Real // update of the event happens soon when db notifies the change. @@ -673,3 +782,30 @@ return false; } + +// ---------------------------------------------------------------------------- +// LogsReaderStateReadingDuplicatesDone::LogsReaderStateReadingDuplicatesDone +// ---------------------------------------------------------------------------- +// +LogsReaderStateReadingDuplicatesDone::LogsReaderStateReadingDuplicatesDone( + LogsReaderStateContext& context) : LogsReaderStateBase(context) +{ + +} + +// ---------------------------------------------------------------------------- +// LogsReaderStateReadingDuplicatesDone::enterL +// ---------------------------------------------------------------------------- +// +bool LogsReaderStateReadingDuplicatesDone::enterL() +{ + LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateReadingDuplicatesDone::enterL" ); + + QList duplicates = mContext.duplicatedEvents(); + mContext.duplicatedEvents().clear(); + mContext.observer().duplicatesReadingCompleted(duplicates); + + LOGS_QDEBUG( "logs [ENG] <- LogsReaderStateReadingDuplicatesDone::enterL" ); + + return false; +} diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logssymbianos/tsrc/stubs/logclient_stubs.cpp --- a/logsui/logsengine/logssymbianos/tsrc/stubs/logclient_stubs.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logssymbianos/tsrc/stubs/logclient_stubs.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -250,9 +250,11 @@ TBool CLogView::NextL(TRequestStatus& aStatus) { - aStatus = KRequestPending; - User::RequestComplete( &aStatus, KErrNone ); - return ETrue; + if ( stubAsyncCallPossible ){ + aStatus = KRequestPending; + User::RequestComplete( &aStatus, KErrNone ); + } + return stubAsyncCallPossible; } TInt CLogView::CountL() diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logssymbianos/tsrc/stubs/qtcontacts_stubs.cpp --- a/logsui/logsengine/logssymbianos/tsrc/stubs/qtcontacts_stubs.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logssymbianos/tsrc/stubs/qtcontacts_stubs.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -109,8 +109,21 @@ return list; } -QContact QContactManager::contact(const QContactLocalId& contactId) const +QList QContactManager::contactIds( + const QContactFilter& filter, const QList& sortOrders) const { + Q_UNUSED(filter) + Q_UNUSED(sortOrders) + QList list; + if ( QString("11112222").endsWith(logsTestNumber) ){ + list.append( logsTestContactId ); + } + return list; +} + +QContact QContactManager::contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions) const +{ + Q_UNUSED(definitionRestrictions) QContact contact; if ( contactId == logsTestContactId ) { logsTestContactLocalId = logsTestContactId; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsdbconnector.h --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsdbconnector.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsdbconnector.h Fri Apr 16 14:53:18 2010 +0300 @@ -51,6 +51,7 @@ void testClearList(); void testClearEvents(); void testMarkEventsSeen(); + void testReadDuplicates(); void testStart(); void testReadCompleted(); void testErrorOccurred(); diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsreader.h --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsreader.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsreader.h Fri Apr 16 14:53:18 2010 +0300 @@ -55,6 +55,7 @@ void testStart2(); void testStop(); void testMarkEventSeen(); + void testReadDuplicates(); void testRunL(); void testRunError(); void testStateContext(); @@ -67,6 +68,7 @@ void errorOccurred(int err); void temporaryErrorOccurred(int err); void eventModifyingCompleted(); + void duplicatesReadingCompleted(QList duplicates); private: diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsreaderstates.h --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsreaderstates.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsreaderstates.h Fri Apr 16 14:53:18 2010 +0300 @@ -64,6 +64,9 @@ void testStateDone(); void testStateSearchingEvent(); void testStateFindingDuplicates(); + void testStateMarkingDuplicates(); + void testStateReadingDuplicates(); + void testStateReadingDuplicatesDone(); void testStateModifyingDone(); protected: // From LogsReaderStateContext @@ -77,9 +80,10 @@ TRequestStatus& reqStatus(); LogsReaderObserver& observer(); QHash& contactCache(); - int modifyingEventId(); + int currentEventId(); CLogClient& logClient(); bool isRecentView(); + QList& duplicatedEvents(); protected: // From LogsReaderObserver @@ -88,6 +92,7 @@ void errorOccurred(int err); void temporaryErrorOccurred(int err); void eventModifyingCompleted(); + void duplicatesReadingCompleted(QList duplicates); private: @@ -113,10 +118,12 @@ bool mReadCompleted; bool mModifyCompleted; int mReadCount; + int mDuplicatesReadingCompletedCount; QHash mContactCache; - int mModifyingEventId; + int mCurrentEventId; + QList mDuplicatedEvents; }; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsdbconnector.cpp --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsdbconnector.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsdbconnector.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -117,20 +117,20 @@ events.append(1); QVERIFY( mDbConnector->markEventsSeen(events) ); QVERIFY( mDbConnector->mEventsSeen.count() == 2 ); - QVERIFY( mDbConnector->mReader->mModifyingEventId == 0 ); // Started modifying + QVERIFY( mDbConnector->mReader->mCurrentEventId == 0 ); // Started modifying // Trying to clear missed again, id is appended to mark list, old modifying process in ongoing // and is not interrupted events.append(2); QVERIFY( !mDbConnector->markEventsSeen(events) ); QVERIFY( mDbConnector->mEventsSeen.count() == 3 ); - QVERIFY( mDbConnector->mReader->mModifyingEventId == 0 ); // Modifying still previous + QVERIFY( mDbConnector->mReader->mCurrentEventId == 0 ); // Modifying still previous // Completed previous modifying, next one in queue is modified mDbConnector->mReader->Cancel(); mDbConnector->eventModifyingCompleted(); QVERIFY( mDbConnector->mEventsSeen.count() == 2 ); - QVERIFY( mDbConnector->mReader->mModifyingEventId == 1 ); // Started modifying next one + QVERIFY( mDbConnector->mReader->mCurrentEventId == 1 ); // Started modifying next one QVERIFY( spy.count() == 0 ); // Not yet totally completed // Last pending gets completed @@ -149,6 +149,37 @@ QVERIFY( mDbConnector->mEventsSeen.count() == 3 ); } +void UT_LogsDbConnector::testReadDuplicates() +{ + QSignalSpy spy( mDbConnector, SIGNAL(duplicatesRead()) ); + + // Not ready + QVERIFY( mDbConnector->readDuplicates(2) != 0 ); + + // Previous results are cleared when starting ok + LogsEvent* event = new LogsEvent; + mDbConnector->mDuplicatedEvents.append(event); + mDbConnector->init(); + mDbConnector->readDuplicates(2); + QVERIFY( mDbConnector->mDuplicatedEvents.count() == 0 ); + + // Completes + LogsEvent* event2 = new LogsEvent; + LogsEvent* event3 = new LogsEvent; + QList duplicates; + duplicates.append(event2); + duplicates.append(event3); + mDbConnector->duplicatesReadingCompleted(duplicates); + QVERIFY( mDbConnector->mDuplicatedEvents.count() == 2 ); + QVERIFY( spy.count() == 1 ); + + // Client reads those events + QList takenEvents = mDbConnector->takeDuplicates(); + QVERIFY( mDbConnector->mDuplicatedEvents.count() == 0 ); + QVERIFY( takenEvents.count() == 2 ); + +} + void UT_LogsDbConnector::testStart() { // No reader, starting fails diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsreader.cpp --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsreader.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsreader.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -127,6 +127,25 @@ QVERIFY( mReader->markEventSeen(1) == 0 ); } +void UT_LogsReader::testReadDuplicates() +{ + QVERIFY( !mReader->mLogViewRecent ); + QVERIFY( !mReader->mDuplicatesView ); + QVERIFY( mReader->readDuplicates(1) == 0 ); + QVERIFY( mReader->IsActive() ); + QVERIFY( mReader->mLogViewRecent ); + QVERIFY( mReader->mDuplicatesView ); + QVERIFY( mReader->mCurrentStateMachine == &mReader->mDuplicateReadingStates ); + QVERIFY( mReader->mDuplicateReadingStates.count() > 0 ); + + //starting second time is ok + QVERIFY( mReader->readDuplicates(1) == 0 ); + + //starting when reading is in progress is not allowed + mReader->mCurrentStateMachine = &mReader->mReadStates; + QVERIFY( mReader->readDuplicates(1) != 0 ); +} + void UT_LogsReader::testRunL() { mReader->start(); @@ -282,3 +301,12 @@ { } + +// ---------------------------------------------------------------------------- +// From LogsReaderObserver +// ---------------------------------------------------------------------------- +// +void UT_LogsReader::duplicatesReadingCompleted(QList duplicates) +{ + qDeleteAll(duplicates); +} diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsreaderstates.cpp --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsreaderstates.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsreaderstates.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -73,6 +73,9 @@ delete mEvents.takeFirst(); } mContactCache.clear(); + qDeleteAll(mDuplicatedEvents); + mDuplicatedEvents.clear(); + } void UT_LogsReaderStates::reset() @@ -82,6 +85,7 @@ mReadCompleted = false; mModifyCompleted = false; mReadCount = 0; + mDuplicatesReadingCompletedCount = 0; } void UT_LogsReaderStates::testStateBase() @@ -113,7 +117,7 @@ logEvent->SetId( 100 ); LogsEvent* logsEvent = new LogsEvent; int index( 0 ); - QVERIFY( state.constructAndInsertEventL(*logEvent, logsEvent, index ) ); + QVERIFY( state.constructAndInsertEventL(*logEvent, logsEvent, index, mEvents ) ); logsEvent = 0; QVERIFY( mEvents.count() == 1 ); QVERIFY( mEvents.at(0)->number() == "1234" ); @@ -123,7 +127,7 @@ logEvent->SetNumber( _L("2234") ); logEvent->SetId( 101 ); logsEvent = new LogsEvent; - QVERIFY( state.constructAndInsertEventL(*logEvent, logsEvent, index ) ); + QVERIFY( state.constructAndInsertEventL(*logEvent, logsEvent, index, mEvents ) ); logsEvent = 0; QVERIFY( mEvents.count() == 2 ); QVERIFY( mEvents.at(1)->number() == "2234" ); @@ -135,7 +139,7 @@ logEvent->SetNumber( _L("") ); logEvent->SetId( 102 ); logsEvent = new LogsEvent; - QVERIFY( !state.constructAndInsertEventL(*logEvent, logsEvent, index ) ); + QVERIFY( !state.constructAndInsertEventL(*logEvent, logsEvent, index, mEvents ) ); QVERIFY( mEvents.count() == 2 ); QVERIFY( index == 2 ); @@ -414,10 +418,8 @@ { // Searching starts ok LogsReaderStateSearchingEvent state(*this); - state.mUpdatingEvent = true; - mModifyingEventId = 10; + mCurrentEventId = 10; QVERIFY( state.enterL() ); - QVERIFY( !state.mUpdatingEvent ); // Searching doesn't start ok as no items in view LogClientStubsHelper::setViewCount(0); @@ -425,26 +427,18 @@ // Searching event continues mIndex = 0; - mModifyingEventId = -1; + mCurrentEventId = -1; const_cast( mLogView->Event() ).SetId( 100 ); LogClientStubsHelper::setViewCount(2); - state.mUpdatingEvent = false; QVERIFY( state.continueL() ); // Last event handled, no target event found, entering next state mIndex = 2; QVERIFY( !state.continueL() ); - // Target event found, updating event + // Target event found, entering next state mIndex = 0; - mModifyingEventId = 100; - QVERIFY( state.continueL() ); - QVERIFY( state.mUpdatingEvent ); - QVERIFY( mLogView->Event().Flags() & KLogEventRead ); - - // Event updated, entering next state - LogsReaderStateBase state2(*this); - state.setNextState(state2); + mCurrentEventId = 100; QVERIFY( !state.continueL() ); } @@ -458,16 +452,96 @@ // Duplicates cannot be searched for some reason LogClientStubsHelper::reset(); LogClientStubsHelper::setStubAsyncCallPossible(false); - QVERIFY( !(LogClientStubsHelper::stubViewFlags() & KLogEventRead) ); + QVERIFY( !state.enterL() ); + LogClientStubsHelper::setStubAsyncCallPossible(true); + + // Duplicates can be searched + QVERIFY( state.enterL() ); + + // Searching completes, no next state to enter + QVERIFY( !state.continueL() ); +} + +void UT_LogsReaderStates::testStateMarkingDuplicates() +{ + // Marking does not start as no matching event in view + LogsReaderStateMarkingDuplicates state(*this); + mCurrentEventId = 5; + const_cast( mLogView->Event() ).SetId( 100 ); QVERIFY( !state.enterL() ); + QVERIFY( !state.mGettingDuplicates ); + QVERIFY( !(mLogView->Event().Flags() & KLogEventRead) ); + + // Marking can start ok + mCurrentEventId = 100; + QVERIFY( state.enterL() ); + QVERIFY( !state.mGettingDuplicates ); + QVERIFY( mLogView->Event().Flags() & KLogEventRead ); + + // Duplicates cannot be searched for some reason + LogClientStubsHelper::reset(); + LogClientStubsHelper::setStubAsyncCallPossible(false); QVERIFY( !(LogClientStubsHelper::stubViewFlags() & KLogEventRead) ); + QVERIFY( !state.continueL() ); + QVERIFY( !(LogClientStubsHelper::stubViewFlags() & KLogEventRead) ); + QVERIFY( !state.mGettingDuplicates ); LogClientStubsHelper::setStubAsyncCallPossible(true); - // Duplicates found, read flag for view is set, no next state to enter + // Duplicates searching starts ok + QVERIFY( state.continueL() ); + QVERIFY( !(LogClientStubsHelper::stubViewFlags() & KLogEventRead) ); + QVERIFY( state.mGettingDuplicates ); + + // Duplicates searching completes, view flags are set, no next state to enter QVERIFY( !state.continueL() ); QVERIFY( LogClientStubsHelper::stubViewFlags() & KLogEventRead ); } +void UT_LogsReaderStates::testStateReadingDuplicates() +{ + // Duplicates view empty, cannot start + LogClientStubsHelper::setViewCount(0); + LogsReaderStateReadingDuplicates state(*this); + + QVERIFY( !state.enterL() ); + + // Starting ok + LogClientStubsHelper::setViewCount(2); + const_cast( mDuplicatesView->Event() ).SetNumber( _L("12345") ); + const_cast( mDuplicatesView->Event() ).SetId( 100 ); + + QVERIFY( state.enterL() ); + QVERIFY( mDuplicatedEvents.count() == 0 ); + + // Continue reading as more events in view + QVERIFY( state.continueL() ); + QVERIFY( mDuplicatedEvents.count() == 1 ); + + // Don't continue reading as no more events in view + LogClientStubsHelper::setStubAsyncCallPossible(false); + QVERIFY( !state.continueL() ); + QVERIFY( mDuplicatedEvents.count() == 2 ); + +} + +void UT_LogsReaderStates::testStateReadingDuplicatesDone() +{ + LogsReaderStateReadingDuplicatesDone state(*this); + + // No duplicates was found + QVERIFY( !state.enterL() ); + QVERIFY( mDuplicatesReadingCompletedCount == 0 ); + + // Duplicates were found, ownership transferred to observer + LogsEvent* event = new LogsEvent; + mDuplicatedEvents.append(event); + LogsEvent* event2 = new LogsEvent; + mDuplicatedEvents.append(event2); + QVERIFY( !state.enterL() ); + QVERIFY( mDuplicatesReadingCompletedCount == 2 ); + QVERIFY( mDuplicatedEvents.count() == 0 ); +} + void UT_LogsReaderStates::testStateModifyingDone() { LogsReaderStateModifyingDone state(*this); @@ -475,7 +549,7 @@ // Modified event not found for some reason LogsEvent* logsEvent = new LogsEvent; logsEvent->setIsInView(true); - mModifyingEventId = 100; + mCurrentEventId = 100; mEvents.append( logsEvent ); QVERIFY( !mModifyCompleted ); QVERIFY( !state.enterL() ); @@ -546,9 +620,9 @@ return mContactCache; } -int UT_LogsReaderStates::modifyingEventId() +int UT_LogsReaderStates::currentEventId() { - return mModifyingEventId; + return mCurrentEventId; } CLogClient& UT_LogsReaderStates::logClient() @@ -561,6 +635,11 @@ return mIsRecentView; } +QList& UT_LogsReaderStates::duplicatedEvents() +{ + return mDuplicatedEvents; +} + // ---------------------------------------------------------------------------- // From LogsReaderObserver // ---------------------------------------------------------------------------- @@ -582,3 +661,9 @@ { mModifyCompleted = true; } + +void UT_LogsReaderStates::duplicatesReadingCompleted(QList duplicates) +{ + mDuplicatesReadingCompletedCount = duplicates.count(); + qDeleteAll(duplicates); +} diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/src/logsabstractmodel.cpp --- a/logsui/logsengine/src/logsabstractmodel.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/src/logsabstractmodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -160,11 +160,27 @@ } } else if ( event.direction() == LogsEvent::DirMissed ) { if ( event.eventType() == LogsEvent::TypeVoiceCall ) { - direction = logsMissedVoiceCallIconId; + if (!event.isRead()){ + direction = logsMissedVoiceCallUnseenIconId; + } + else { + direction = logsMissedVoiceCallIconId; + } + } else if ( event.eventType() == LogsEvent::TypeVideoCall ) { - direction = logsMissedVideoCallIconId; + if (!event.isRead()){ + direction = logsMissedVideoCallUnseenIconId; + } + else { + direction = logsMissedVideoCallIconId; + } } else if ( event.eventType() == LogsEvent::TypeVoIPCall ) { - direction = logsMissedVoipCallIconId; + if (!event.isRead()){ + direction = logsMissedVoipCallUnseenIconId; + } + else { + direction = logsMissedVoipCallIconId; + } } } diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/src/logscontact.cpp --- a/logsui/logsengine/src/logscontact.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/src/logscontact.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -55,8 +55,9 @@ // // ----------------------------------------------------------------------------- // -LogsContact::LogsContact( - unsigned int contactId, const QString& number, LogsDbConnector& dbConnector) +LogsContact::LogsContact(const QString& number, + LogsDbConnector& dbConnector, + unsigned int contactId) : QObject(), mDbConnector(dbConnector), mService(0), @@ -69,7 +70,7 @@ } // ----------------------------------------------------------------------------- -// LogsContact::~LogsContact +// // ----------------------------------------------------------------------------- // LogsContact::~LogsContact() @@ -79,7 +80,7 @@ } // ---------------------------------------------------------------------------- -// LogsContact::allowedRequestType +// // ---------------------------------------------------------------------------- // LogsContact::RequestType LogsContact::allowedRequestType() @@ -96,7 +97,7 @@ } // ---------------------------------------------------------------------------- -// LogsContact::isContactRequestAllowed +// // ---------------------------------------------------------------------------- // bool LogsContact::isContactRequestAllowed() @@ -105,7 +106,7 @@ } // ---------------------------------------------------------------------------- -// LogsContact::open +// // ---------------------------------------------------------------------------- // bool LogsContact::open() @@ -125,15 +126,41 @@ } // ---------------------------------------------------------------------------- -// LogsContact::save +// +// ---------------------------------------------------------------------------- +// +bool LogsContact::addNew() +{ + LOGS_QDEBUG( "logs [ENG] -> LogsContact::save()" ) + + bool ret = save("editCreateNew(QString,QString)"); + + LOGS_QDEBUG_2( "logs [ENG] <- LogsContact::save(): ", ret ) + return ret; +} + +// ---------------------------------------------------------------------------- +// // ---------------------------------------------------------------------------- // -bool LogsContact::save() +bool LogsContact::updateExisting() { - LOGS_QDEBUG( "logs [ENG] -> LogsContact::save()" ) - bool ret = false; + LOGS_QDEBUG( "logs [ENG] -> LogsContact::updateExisting()" ) + + bool ret = save("editUpdateExisting(QString,QString)"); - QList arguments; + LOGS_QDEBUG( "logs [ENG] <- LogsContact::updateExisting()" ) + return ret; +} + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +bool LogsContact::save(QString message) +{ + QList arguments; + if ( !mNumber.isEmpty() ) { if ( mSaveAsOnlineAccount ){ QString type = QContactOnlineAccount::DefinitionName; @@ -143,21 +170,22 @@ arguments.append( QVariant(type) ); } arguments.append( QVariant(mNumber) ); + } + + bool ret(false); + + if ( arguments.count() == 2 ) { + mCurrentRequest = TypeLogsContactSave; + ret = requestFetchService( message, arguments ); } else { LOGS_QDEBUG( "logs [ENG] !No Caller ID, not saving the contact..") - //no Caller ID available, doesn't make sense to save anything } - - if ( arguments.count() == 2 ) { - mCurrentRequest = TypeLogsContactSave; - ret = requestFetchService( "editCreateNew(QString,QString)", arguments ); - } - LOGS_QDEBUG_2( "logs [ENG] <- LogsContact::save(): ", ret ) + return ret; } // ---------------------------------------------------------------------------- -// LogsContact::requestFetchService +// // ---------------------------------------------------------------------------- // bool LogsContact::requestFetchService( QString message, @@ -168,8 +196,8 @@ delete mService; mService = 0; mService = new XQServiceRequest(service, message, sync); - connect( mService, SIGNAL( requestCompleted(QVariant) ), this, - SLOT( handleRequestCompleted(QVariant) ) ); + connect(mService, SIGNAL(requestCompleted(QVariant)), this, + SLOT(handleRequestCompleted(QVariant))); mService->setArguments(arguments); @@ -178,7 +206,6 @@ } // ---------------------------------------------------------------------------- -// LogsContact::handleRequestCompleted // Phonebookservices define following return values: // - contact wasn't modified (-2) // - was deleted (-1) @@ -213,7 +240,7 @@ } // ---------------------------------------------------------------------------- -// LogsContact::contact +// // ---------------------------------------------------------------------------- // QContact LogsContact::contact() @@ -226,7 +253,7 @@ } // ---------------------------------------------------------------------------- -// LogsContact::isContactInPhonebook +// // ---------------------------------------------------------------------------- // bool LogsContact::isContactInPhonebook() diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/src/logsdetailsmodel.cpp --- a/logsui/logsengine/src/logsdetailsmodel.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/src/logsdetailsmodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -36,8 +36,7 @@ // LogsDetailsModel::LogsDetailsModel( LogsDbConnector& dbConnector, LogsEvent& event ) : LogsAbstractModel(), - mEvent( 0 ), - mDetailItemsCount( 0 ) + mEvent( 0 ) { LOGS_QDEBUG( "logs [ENG] -> LogsDetailsModel::LogsDetailsModel()" ) @@ -47,6 +46,13 @@ initContent(); + if ( mEvent->direction() == LogsEvent::DirMissed && + !mEvent->isRead() && mEvent->duplicates() > 0 ){ + // Read duplicates to get all occurences + connect( mDbConnector, SIGNAL(duplicatesRead()), this, SLOT(duplicatesRead()) ); + mDbConnector->readDuplicates(mEvent->logId()); + } + LOGS_QDEBUG( "logs [ENG] <- LogsDetailsModel::LogsDetailsModel()" ) } @@ -60,6 +66,7 @@ delete mEvent; qDeleteAll(mDetailIcons); + qDeleteAll(mDuplicates); LOGS_QDEBUG( "logs [ENG] <- LogsDetailsModel::~LogsDetailsModel()" ) } @@ -83,7 +90,7 @@ // int LogsDetailsModel::rowCount(const QModelIndex & /* parent */) const { - return mDetailItemsCount; + return mDetailTexts.count(); } // ----------------------------------------------------------------------------- @@ -92,7 +99,7 @@ // QVariant LogsDetailsModel::data(const QModelIndex &index, int role) const { - if (!index.isValid() || index.row() >= mDetailItemsCount || index.row() < 0 ) { + if (!index.isValid() || index.row() >= mDetailTexts.count() || index.row() < 0 ) { return QVariant(); } @@ -165,10 +172,31 @@ // // ----------------------------------------------------------------------------- // +void LogsDetailsModel::duplicatesRead() +{ + LOGS_QDEBUG( "logs [ENG] -> LogsDetailsModel::duplicatesRead()" ) + + qDeleteAll( mDuplicates ); + mDuplicates.clear(); + mDuplicates = mDbConnector->takeDuplicates(); + + initContent(); + reset(); + + // Someone else might be reading duplicates as well, don't interfere with them. + disconnect( mDbConnector, SIGNAL(duplicatesRead()), this, SLOT(duplicatesRead()) ); + + LOGS_QDEBUG( "logs [ENG] <- LogsDetailsModel::duplicatesRead()" ) +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void LogsDetailsModel::getDecorationData(int row, QList& iconList) const { - if ( mDetailIcons.contains(row) ){ - iconList << *mDetailIcons.find(row).value(); + if ( row < mDetailIcons.count() ){ + iconList << *mDetailIcons.at(row); } } @@ -178,8 +206,8 @@ // void LogsDetailsModel::getDisplayData(int row, QStringList& texts) const { - if ( mDetailTexts.contains(row) ){ - texts << mDetailTexts.find(row).value(); + if ( row < mDetailTexts.count() ){ + texts << mDetailTexts.at(row); } } @@ -223,7 +251,7 @@ } if ( headerdata.length() == 0 ){ - headerdata = tr("No number"); + headerdata = hbTrId("txt_dial_dblist_call_id_val_unknown_number"); } return headerdata; } @@ -242,19 +270,6 @@ } // ----------------------------------------------------------------------------- -// VoIP local Uri : -// ----------------------------------------------------------------------------- -// -QString LogsDetailsModel::getLocalUri(const LogsEvent& event) const -{ - QString localUri(("")); - if (event.logsEventData()){ - localUri = event.logsEventData()->localUrl(); - } - return localUri; -} - -// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- // @@ -297,18 +312,18 @@ QString headervalue(""); if (isAddress(value)){ if ((isOutgoingCall() && isRemote)|| (!isOutgoingCall() && !isRemote)){ - headervalue = tr("Call to Address:"); + headervalue = hbTrId("txt_dialer_ui_dblist_call_id"); } else{ - headervalue = tr("Call from Address:"); + headervalue = hbTrId("txt_dialer_ui_dblist_call_id"); } } else { if ((isOutgoingCall() && isRemote)|| (!isOutgoingCall() && !isRemote)) { - headervalue = tr("Call to Number:"); + headervalue = hbTrId("txt_dialer_ui_dblist_call_id"); } else { - headervalue = tr("Call from Number:"); + headervalue = hbTrId("txt_dialer_ui_dblist_call_id"); } } @@ -328,7 +343,6 @@ initIcons(); Q_ASSERT( mDetailIcons.count() == mDetailTexts.count() ); - mDetailItemsCount = mDetailTexts.count(); } // ----------------------------------------------------------------------------- @@ -337,43 +351,40 @@ // void LogsDetailsModel::initTexts() { - int row = 0; - if (getCallerId(*mEvent).length()!= 0){ QStringList remotePartyRow; remotePartyRow << getHeaderValue(getCallerId(*mEvent),true); remotePartyRow << getCallerId(*mEvent); - mDetailTexts.insert(row++, remotePartyRow); + mDetailTexts.append(remotePartyRow); } - - if (getLocalUri(*mEvent).length()!= 0) { - QStringList localUriRow; - localUriRow << getHeaderValue(getLocalUri(*mEvent),false); - localUriRow << getLocalUri(*mEvent); - mDetailTexts.insert(row++, localUriRow); - } - - QStringList dateAndTimeRow; - dateAndTimeRow << hbTrId("txt_dialer_ui_dblist_date_and_time") + tr(":"); - dateAndTimeRow << mEvent->time().toTimeSpec(Qt::LocalTime).toString(); - mDetailTexts.insert(row++, dateAndTimeRow); + + // TODO: if more than one date and time rows, first row has text "Last call event" + // but there's no localization string for that yet + bool firstOfMultipleDates( mDuplicates.count() > 0 ); + addDateAndTimeTextRow(*mEvent, firstOfMultipleDates); QStringList callDirectionRow; - callDirectionRow << hbTrId("txt_dialer_ui_dblist_call_direction") + tr(":"); + callDirectionRow << hbTrId("txt_dialer_ui_dblist_call_direction"); callDirectionRow << mEvent->directionAsString(); - mDetailTexts.insert(row++, callDirectionRow); + mDetailTexts.append(callDirectionRow); QStringList callTypeRow; - callTypeRow << hbTrId("txt_dialer_ui_dblist_call_type") + tr(":"); + callTypeRow << hbTrId("txt_dialer_ui_dblist_call_type"); callTypeRow << mEvent->typeAsString(); - mDetailTexts.insert(row++, callTypeRow); + mDetailTexts.append(callTypeRow); - QStringList callDurationRow; - callDurationRow << hbTrId("txt_dialer_ui_dblist_call_duration") + tr(":"); - QTime n(0, 0, 0); - QTime t = n.addSecs(mEvent->duration()); - callDurationRow << t.toString("hh:mm:ss"); - mDetailTexts.insert(row, callDurationRow); + if ( mEvent->direction() != LogsEvent::DirMissed ){ + QStringList callDurationRow; + callDurationRow << hbTrId("txt_dialer_ui_dblist_call_duration"); + QTime n(0, 0, 0); + QTime t = n.addSecs(mEvent->duration()); + callDurationRow << t.toString("hh:mm:ss"); + mDetailTexts.append(callDurationRow); + } + + foreach ( LogsEvent* event, mDuplicates ){ + addDateAndTimeTextRow(*event); + } } // ----------------------------------------------------------------------------- @@ -382,26 +393,46 @@ // void LogsDetailsModel::initIcons() { - int row = 0; if (getCallerId(*mEvent).length()!= 0){ HbIcon* remotePartyIcon = new HbIcon(logsRemotePartyInfoIconId); - mDetailIcons.insert(row++, remotePartyIcon); + mDetailIcons.append(remotePartyIcon); } - - if (getLocalUri(*mEvent).length()!= 0) { - HbIcon* localUriIcon = new HbIcon(logsRemotePartyInfoIconId); - mDetailIcons.insert(row++, localUriIcon); - } HbIcon* dateAndTimeIcon = new HbIcon(logsCallDateAndTimeIconId); - mDetailIcons.insert(row++, dateAndTimeIcon); + mDetailIcons.append(dateAndTimeIcon); HbIcon* directionIcon = new HbIcon( LogsAbstractModel::directionIconName(*mEvent) ); - mDetailIcons.insert(row++, directionIcon); + mDetailIcons.append(directionIcon); HbIcon* typeIcon = new HbIcon( LogsAbstractModel::typeIconName(*mEvent) ); - mDetailIcons.insert(row++, typeIcon); + mDetailIcons.append(typeIcon); + + if ( mEvent->direction() != LogsEvent::DirMissed ){ + HbIcon* durationIcon = new HbIcon(logsCallDurationIconId); + mDetailIcons.append(durationIcon); + } - HbIcon* durationIcon = new HbIcon(logsCallDurationIconId); - mDetailIcons.insert(row, durationIcon); + foreach ( LogsEvent* event, mDuplicates ){ + // Having multiple date and time icon instances has no performance + // penalty due resource sharing inside HbIcon impl + HbIcon* dateAndTimeIcon = new HbIcon(logsCallDateAndTimeIconId); + mDetailIcons.append(dateAndTimeIcon); + } } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsDetailsModel::addDateAndTimeTextRow( + const LogsEvent& event, bool firstOfMultipleDates) +{ + QStringList dateAndTimeRow; + if ( firstOfMultipleDates ){ + dateAndTimeRow << hbTrId("txt_dial_dblist_last_call_event"); + } else { + dateAndTimeRow << hbTrId("txt_dialer_ui_dblist_date_and_time"); + } + dateAndTimeRow << event.time().toTimeSpec(Qt::LocalTime).toString(); + mDetailTexts.append(dateAndTimeRow); +} diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/src/logsevent.cpp --- a/logsui/logsengine/src/logsevent.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/src/logsevent.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -18,11 +18,11 @@ // INCLUDE FILES #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include "logsevent.h" #include "logseventparser.h" @@ -186,11 +186,11 @@ { QString dir; if ( mDirection == DirIn ) { - dir = QObject::tr("Incoming call"); + dir = hbTrId("txt_dialer_ui_dblist_call_direction_val_received"); } else if ( mDirection == DirOut ) { - dir = QObject::tr("Outgoing call"); + dir = hbTrId("txt_dialer_ui_dblist_call_direction_val_dialled"); } else if ( mDirection == DirMissed ) { - dir = QObject::tr("Missed call"); + dir = hbTrId("txt_dialer_ui_dblist_call_direction_val_missed"); } else { dir = QObject::tr("Direction unknown"); } @@ -527,7 +527,7 @@ LOGS_QDEBUG_2( "logs [ENG] Try to find contact for num:", phoneFilter.value().toString() ) QString contactNameStr; - QList matchingContacts = manager.contacts(phoneFilter); + QList matchingContacts = manager.contactIds(phoneFilter); LOGS_QDEBUG_2( "logs [ENG] Number of matches:", matchingContacts.size() ) if (matchingContacts.size() == 1) { // If multiple matches, don't dare to use any diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/src/logsmatchesmodel.cpp --- a/logsui/logsengine/src/logsmatchesmodel.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/src/logsmatchesmodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -14,7 +14,7 @@ * Description: * */ -#include "LogsMatchesModel.h" +#include "logsmatchesmodel.h" #include "logsmodel.h" #include "logsevent.h" @@ -31,9 +31,8 @@ #include "logscommondata.h" #include #include -#include -#include -#include +#include +#include Q_DECLARE_METATYPE(LogsEvent *) Q_DECLARE_METATYPE(LogsCall *) @@ -160,7 +159,7 @@ } const LogsMatchesModelItemContainer& matchItem = static_cast( item ); - LogsMessage* logsMessage = new LogsMessage(matchItem.contact(), matchItem.number()); + LogsMessage* logsMessage = new LogsMessage(matchItem.contact(), matchItem.number(),matchItem.contactName()); if (!logsMessage->isMessagingAllowed()) { delete logsMessage; logsMessage = 0; @@ -184,7 +183,7 @@ const LogsMatchesModelItemContainer& matchItem = static_cast( item ); LogsContact* logsContact = - new LogsContact(matchItem.contact(), matchItem.number(), *mDbConnector); + new LogsContact(matchItem.number(), *mDbConnector, matchItem.contact()); if ( !logsContact->isContactRequestAllowed() ) { delete logsContact; logsContact = 0; @@ -335,7 +334,7 @@ // // ----------------------------------------------------------------------------- // -void LogsMatchesModel::logsMatches( const QString& pattern ) +void LogsMatchesModel::logsMatches(const QString& pattern) { // Do user inputted searches in async manner to avoid from // blocking next input. This also decreases amount of queries when @@ -347,7 +346,18 @@ // // ----------------------------------------------------------------------------- // -void LogsMatchesModel::getLogsMatches( const QString& pattern, bool async, bool force ) +LogsContact* LogsMatchesModel::createContact(const QString& number) +{ + return new LogsContact(number, *mDbConnector); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsMatchesModel::getLogsMatches(const QString& pattern, + bool async, + bool force ) { LOGS_QDEBUG_2( "logs [ENG] -> LogsMatchesModel::getLogsMatches(), pattern:", pattern ); mCurrentSearchPattern = pattern; @@ -517,6 +527,15 @@ // // ----------------------------------------------------------------------------- // +QString LogsMatchesModelItemContainer::contactName() const +{ + return mContactName; +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// bool LogsMatchesModelItemContainer::isNull() const { return ( !mEvent && !mContactId ); diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/src/logsmessage.cpp --- a/logsui/logsengine/src/logsmessage.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/src/logsmessage.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -19,6 +19,7 @@ #include "logsmessage.h" #include "logslogger.h" #include "logseventdata.h" +#include //SYSTEM @@ -27,7 +28,7 @@ // ----------------------------------------------------------------------------- // LogsMessage::LogsMessage(LogsEvent& event) - :QObject(), mIsAllowed( false ), mContactId( 0 ) + :QObject(), mIsAllowed( false ), mContactId( 0 ), mService( 0 ) { if ( event.logsEventData() && !event.logsEventData()->isCsCompatible() ){ LOGS_QDEBUG( "logs [ENG] LogsMessage::LogsMessage, not CS compatible" ) @@ -36,6 +37,7 @@ mIsAllowed = true; mNumber = event.getNumberForCalling(); mContactId = event.contactLocalId(); + mDisplayName = event.remoteParty(); } } @@ -44,8 +46,9 @@ // // ----------------------------------------------------------------------------- // -LogsMessage::LogsMessage(unsigned int contactId, const QString& number) - :QObject(), mIsAllowed( false ), mContactId( 0 ) +LogsMessage::LogsMessage(unsigned int contactId, const QString& number, + const QString& displayName) + :QObject(), mIsAllowed( false ), mContactId( 0 ), mService( 0 ) { if ( number.length() == 0 ){ LOGS_QDEBUG( "logs [ENG] LogsMessage::LogsMessage, not CS compatible" ) @@ -53,7 +56,8 @@ } else { mIsAllowed = true; mNumber = number; - mContactId = contactId; + mContactId = contactId; + mDisplayName = displayName; } } @@ -64,6 +68,7 @@ LogsMessage::~LogsMessage() { LOGS_QDEBUG( "logs [ENG] <-> LogsMessage::~LogsMessage()" ) + delete mService; } // ---------------------------------------------------------------------------- @@ -83,11 +88,69 @@ { LOGS_QDEBUG( "logs [ENG] -> LogsMessage::sendMessage()" ) - // TODO: sending not possible at the moment + delete mService; + mService = 0; + mService = new XQServiceRequest("com.nokia.services.hbserviceprovider.conversationview", + "send(QString,qint32,QString)", false); + bool sending = doSendMessageToNumber(*mService, mNumber, mDisplayName, mContactId); + connect(mService, SIGNAL(requestCompleted(QVariant)), this, SLOT(requestCompleted(QVariant))); + connect(mService, SIGNAL(requestError(int)), this, SLOT(requestError(int))); + return sending; +} + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +bool LogsMessage::sendMessageToNumber( + const QString& number, const QString& displayName, unsigned int contactId) +{ + LOGS_QDEBUG( "logs [ENG] -> LogsMessage::sendMessageToNumber()" ) - LOGS_QDEBUG( "logs [ENG] <- LogsMessage::sendMessage()" ) + XQServiceRequest req("com.nokia.services.hbserviceprovider.conversationview", + "send(QString,qint32,QString)", false); + return doSendMessageToNumber(req, number, displayName, contactId); +} + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +void LogsMessage::requestCompleted(const QVariant& /*value*/) +{ + LOGS_QDEBUG( "logs [ENG] -> LogsMessage::requestCompleted()" ) +} + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +void LogsMessage::requestError(int /*err*/) +{ + LOGS_QDEBUG( "logs [ENG] -> LogsMessage::requestError()" ) +} + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +bool LogsMessage::doSendMessageToNumber( + XQServiceRequest& request, const QString& number, + const QString& displayName, unsigned int contactId) +{ + LOGS_QDEBUG_4( "logs [ENG] -> LogsMessage::doSendMessageToNumber(), (num, name, id)", + number, displayName, contactId ) + + QList arguments; + arguments.append(QVariant(number)); + arguments.append(QVariant(contactId)); + arguments.append(QVariant(displayName)); + request.setArguments(arguments); + QVariant retValue; + bool ret = request.send(retValue); + LOGS_QDEBUG_2( "logs [ENG] <- LogsMessage::doSendMessageToNumber()", ret ) - return false; + return ret; } // End of file diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/src/logsmodel.cpp --- a/logsui/logsengine/src/logsmodel.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/src/logsmodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -84,6 +84,9 @@ bool LogsModel::clearList(LogsModel::ClearType cleartype) { LOGS_QDEBUG( "logs [ENG] -> LogsModel::clearList()" ) + + connect( mDbConnector, SIGNAL(clearingCompleted(int)), + this, SIGNAL(clearingCompleted(int)) ); return mDbConnector->clearList(cleartype); } @@ -298,6 +301,8 @@ mIcons.insert(logsDialledVoiceCallIconId, icon); icon = new HbIcon(logsMissedVoiceCallIconId); mIcons.insert(logsMissedVoiceCallIconId, icon); + icon = new HbIcon(logsMissedVoiceCallUnseenIconId); + mIcons.insert(logsMissedVoiceCallUnseenIconId, icon); icon = new HbIcon(logsReceivedVoiceCallIconId); mIcons.insert(logsReceivedVoiceCallIconId, icon); @@ -305,6 +310,8 @@ mIcons.insert(logsDialledVideoCallIconId, icon); icon = new HbIcon(logsMissedVideoCallIconId); mIcons.insert(logsMissedVideoCallIconId, icon); + icon = new HbIcon(logsMissedVideoCallUnseenIconId); + mIcons.insert(logsMissedVideoCallUnseenIconId, icon); icon = new HbIcon(logsReceivedVideoCallIconId); mIcons.insert(logsReceivedVideoCallIconId, icon); @@ -312,6 +319,8 @@ mIcons.insert(logsDialledVoipCallIconId, icon); icon = new HbIcon(logsMissedVoipCallIconId); mIcons.insert(logsMissedVoipCallIconId, icon); + icon = new HbIcon(logsMissedVoipCallUnseenIconId); + mIcons.insert(logsMissedVoipCallUnseenIconId, icon); icon = new HbIcon(logsReceivedVoipCallIconId); mIcons.insert(logsReceivedVoipCallIconId, icon); diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_video_call_unseen.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_video_call_unseen.svg Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_voice_call_unseen.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_voice_call_unseen.svg Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_voip_call_unseen.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_voip_call_unseen.svg Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/tsrc/at_logsengine/src/at_logsengine.cpp --- a/logsui/logsengine/tsrc/at_logsengine/src/at_logsengine.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/tsrc/at_logsengine/src/at_logsengine.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -160,6 +161,7 @@ QVERIFY( filter.clearEvents() ); QTest::qWait(1000); // wait clearing completion QVERIFY( filter.rowCount() == 0 ); + QVERIFY( spy.count() == 1 ); } void AT_LogsEngine::testHomeScreenUsecase() @@ -192,7 +194,7 @@ QStringList displayData = filter.data( filter.index(0, 0), Qt::DisplayRole ).toStringList(); QVERIFY( displayData.count() == 2 ); QVERIFY( displayData.at(0) == logsTestHomeScreenMissedCallerName ); - QIcon icon = qVariantValue( filter.data( filter.index(0, 0), Qt::DecorationRole ).toList().at(0) ); + HbIcon icon = qVariantValue( filter.data( filter.index(0, 0), Qt::DecorationRole ).toList().at(0) ); QVERIFY( !icon.isNull() ); // Cenrep missed calls counter is not tested here diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/tsrc/symbianos_stub/logsdbconnector_stub.cpp --- a/logsui/logsengine/tsrc/symbianos_stub/logsdbconnector_stub.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/tsrc/symbianos_stub/logsdbconnector_stub.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -132,6 +132,29 @@ } // ---------------------------------------------------------------------------- +// LogsDbConnector::readDuplicates +// ---------------------------------------------------------------------------- +// +int LogsDbConnector::readDuplicates(int eventId) +{ + Q_UNUSED(eventId); + logsLastCalledFunction = "readDuplicates"; + return 0; +} + +// ---------------------------------------------------------------------------- +// LogsDbConnector::takeDuplicates +// ---------------------------------------------------------------------------- +// +QList LogsDbConnector::takeDuplicates() +{ + QList events; + events = mDuplicatedEvents; + mDuplicatedEvents.clear(); + return events; +} + +// ---------------------------------------------------------------------------- // LogsDbConnector::readCompleted // ---------------------------------------------------------------------------- // @@ -184,6 +207,15 @@ } // ---------------------------------------------------------------------------- +// LogsDbConnector::duplicatesReadingCompleted +// ---------------------------------------------------------------------------- +// +void LogsDbConnector::duplicatesReadingCompleted(QList duplicates) +{ + Q_UNUSED(duplicates); +} + +// ---------------------------------------------------------------------------- // LogsDbConnector::doMarkEventSeen // ---------------------------------------------------------------------------- // diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscontact.h --- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscontact.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscontact.h Fri Apr 16 14:53:18 2010 +0300 @@ -50,7 +50,8 @@ void testConstructor(); void testAllowedRequestType(); void testOpen(); - void testSave(); + void testAddNew(); + void testUpdateExisting(); void testIsContactInPhonebook(); void testIsContactRequestAllowed(); void testHandleRequestCompeted(); diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsdetailsmodel.h --- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsdetailsmodel.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsdetailsmodel.h Fri Apr 16 14:53:18 2010 +0300 @@ -52,8 +52,8 @@ void testData(); void testHeaderData(); void testgetRemoteUri(); - void testgetLocalUri(); void testInitTextsAndIcons(); + void testInitUnseenMissed(); void testGetHeaderData(); void testGetCallerId(); void testgetNumberToClipboard(); diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmatchesmodel.h --- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmatchesmodel.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmatchesmodel.h Fri Apr 16 14:53:18 2010 +0300 @@ -53,6 +53,7 @@ void testDataUpdated(); void testDataRemoved(); void testLogsMatches(); + void testCreateContactWithNumber(); void testCreateCall(); void testCreateMessage(); void testCreateContact(); diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmessage.h --- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmessage.h Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmessage.h Fri Apr 16 14:53:18 2010 +0300 @@ -48,6 +48,7 @@ void testConstructor(); void testIsMessagingAllowed(); void testSendMessage(); + void testSendMessageToNumber(); private: diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/tsrc/ut_logsengine/src/ut_logscontact.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logscontact.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logscontact.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -63,7 +63,7 @@ QVERIFY( !mLogsContact->mService ); QVERIFY( mLogsContact->mCurrentRequest == LogsContact::TypeLogsContactSave ); - LogsContact contactWithoutEvent( 2, "2345", *mDbConnector ); + LogsContact contactWithoutEvent("2345", *mDbConnector, 2); QVERIFY( contactWithoutEvent.mContactId == 2 ); QVERIFY( contactWithoutEvent.mNumber == "2345" ); } @@ -118,7 +118,7 @@ QVERIFY( mLogsContact->mService->message() == "open(int)" ); // Same but without using logsevent at construction - LogsContact contactWithoutEvent( 2, "2345", *mDbConnector ); + LogsContact contactWithoutEvent("2345", *mDbConnector, 2); QVERIFY( contactWithoutEvent.open() ); QVERIFY( contactWithoutEvent.mService ); QVERIFY( contactWithoutEvent.mCurrentRequest == LogsContact::TypeLogsContactOpen ); @@ -127,12 +127,12 @@ } -void UT_LogsContact::testSave() +void UT_LogsContact::testAddNew() { //no caller ID, contact won't be saved mLogsEvent->setEventType(LogsEvent::TypeVoiceCall); QVERIFY( mLogsEvent->getNumberForCalling().isEmpty() ); - QVERIFY( !mLogsContact->save() ); + QVERIFY( !mLogsContact->addNew() ); QVERIFY( !mLogsContact->mService ); QVERIFY( mLogsContact->mCurrentRequest == LogsContact::TypeLogsContactSave ); @@ -144,7 +144,7 @@ mLogsContact = new LogsContact(*mLogsEvent, *mDbConnector); QVERIFY( !mLogsEvent->getNumberForCalling().isEmpty() ); QVERIFY( !mLogsContact->isContactInPhonebook() ); - QVERIFY( mLogsContact->save() ); + QVERIFY( mLogsContact->addNew() ); QVERIFY( mLogsContact->mService ); QVERIFY( mLogsContact->mCurrentRequest == LogsContact::TypeLogsContactSave ); QVERIFY( mLogsContact->mService->service() == logsFetchService ); @@ -160,13 +160,31 @@ mLogsContact = 0; mLogsContact = new LogsContact(*mLogsEvent, *mDbConnector); QVERIFY( mLogsContact->isContactInPhonebook() ); - QVERIFY( mLogsContact->save() ); + QVERIFY( mLogsContact->addNew() ); QVERIFY( mLogsContact->mService ); QVERIFY( mLogsContact->mCurrentRequest == LogsContact::TypeLogsContactSave ); QVERIFY( mLogsContact->mService->service() == logsFetchService ); QVERIFY( mLogsContact->mService->message() == "editCreateNew(QString,QString)" ); } +void UT_LogsContact::testUpdateExisting() +{ + //caller ID present, contact is in phonebook => update is ok + mLogsEvent->setNumber(QString::number(12345)); + mLogsEvent->setEventType(LogsEvent::TypeVoiceCall); + mLogsEvent->logsEventData()->setContactLocalId(2); + QtContactsStubsHelper::setContactId(2); + delete mLogsContact; + mLogsContact = 0; + mLogsContact = new LogsContact(*mLogsEvent, *mDbConnector); + QVERIFY( mLogsContact->isContactInPhonebook() ); + QVERIFY( mLogsContact->updateExisting() ); + QVERIFY( mLogsContact->mService ); + QVERIFY( mLogsContact->mCurrentRequest == LogsContact::TypeLogsContactSave ); + QVERIFY( mLogsContact->mService->service() == logsFetchService ); + QVERIFY( mLogsContact->mService->message() == "editUpdateExisting(QString,QString)" ); +} + void UT_LogsContact::testIsContactInPhonebook() { QVERIFY( !mLogsContact->isContactInPhonebook() ); diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/tsrc/ut_logsengine/src/ut_logsdetailsmodel.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsdetailsmodel.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsdetailsmodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -23,7 +23,9 @@ #include "logsmessage.h" #include "logseventdata.h" #include "qtcontacts_stubs_helper.h" +#include "logsdbconnector_stub_helper.h" #include +#include #include Q_DECLARE_METATYPE(LogsCall *) @@ -196,16 +198,6 @@ QVERIFY( mModel->getRemoteUri(*mModel->mEvent) == QString("test@1.2.3.4") ); } -void UT_LogsDetailsModel::testgetLocalUri() -{ - LogsEvent event; - QVERIFY( mModel->getLocalUri(event) == QString("") ); - LogsEventData* eventData = new LogsEventData; - eventData->mLocalUrl = "test@1.2.3.4"; - mModel->mEvent->setLogsEventData( eventData ); - QVERIFY( mModel->getLocalUri(*mModel->mEvent) == QString("test@1.2.3.4") ); -} - void UT_LogsDetailsModel::testInitTextsAndIcons() { //No VoIP call,no remote url or local url and contactname @@ -218,8 +210,8 @@ event.setEventType( testDetailsEventType ); event.setDuration( testDetailsDuration ); LogsDetailsModel* model = new LogsDetailsModel(*mDbConnector, event); - QVERIFY(model->mDetailItemsCount == 5); - QVERIFY(model->mDetailIcons.count() == model->mDetailItemsCount); + QVERIFY(model->mDetailIcons.count() == 5); + QVERIFY(model->mDetailTexts.count() == 5); delete model; model = 0; @@ -232,8 +224,8 @@ event.setEventType( testDetailsEventType ); event.setDuration( testDetailsDuration ); model = new LogsDetailsModel(*mDbConnector, event); - QVERIFY(model->mDetailItemsCount == 4); - QVERIFY(model->mDetailIcons.count() == model->mDetailItemsCount); + QVERIFY(model->mDetailIcons.count() == 4); + QVERIFY(model->mDetailTexts.count() == 4); delete model; model = 0; @@ -249,8 +241,8 @@ eventData->mRemoteUrl = "tester@100.200.300.400"; event.setLogsEventData( eventData ); model = new LogsDetailsModel(*mDbConnector, event); - QVERIFY(model->mDetailItemsCount == 4); - QVERIFY(model->mDetailIcons.count() == model->mDetailItemsCount); + QVERIFY(model->mDetailIcons.count() == 4); + QVERIFY(model->mDetailTexts.count() == 4); delete model; model = 0; @@ -266,63 +258,11 @@ eventData->mRemoteUrl = "tester@100.200.300.400"; event.setLogsEventData( eventData ); model = new LogsDetailsModel(*mDbConnector, event); - QVERIFY(model->mDetailItemsCount == 5); - QVERIFY(model->mDetailIcons.count() == model->mDetailItemsCount); - delete model; - model = 0; - - //VoIP call,only local url, no contact name - testDetailsDateAndTime.setTime_t( 3000 ); - event.setRemoteParty( testEmpty ); - event.setNumber( testEmpty ); - event.setTime( testDetailsDateAndTime ); - event.setDirection( testDetailsDirection ); - event.setEventType( testDetailsEventType ); - event.setDuration( testDetailsDuration ); - eventData = new LogsEventData; - eventData->mLocalUrl = "caller@100.200.300.400"; - event.setLogsEventData( eventData ); - model = new LogsDetailsModel(*mDbConnector, event); - QVERIFY(model->mDetailItemsCount == 5); - QVERIFY(model->mDetailIcons.count() == model->mDetailItemsCount); + QVERIFY(model->mDetailIcons.count() == 5); + QVERIFY(model->mDetailTexts.count() == 5); delete model; model = 0; - - //VoIP call,only local url, contact name - testDetailsDateAndTime.setTime_t( 3000 ); - event.setRemoteParty( testDetailsRemoteParty ); - event.setNumber( testEmpty ); - event.setTime( testDetailsDateAndTime ); - event.setDirection( testDetailsDirection ); - event.setEventType( testDetailsEventType ); - event.setDuration( testDetailsDuration ); - eventData = new LogsEventData; - eventData->mLocalUrl = "caller@100.200.300.400"; - event.setLogsEventData( eventData ); - model = new LogsDetailsModel(*mDbConnector, event); - QVERIFY(model->mDetailItemsCount == 5); - QVERIFY(model->mDetailIcons.count() == model->mDetailItemsCount); - delete model; - model = 0; - - //VoIP call,remote uri and local uri, no contact name - testDetailsDateAndTime.setTime_t( 3000 ); - event.setRemoteParty( testEmpty ); - event.setNumber( testEmpty ); - event.setTime( testDetailsDateAndTime ); - event.setDirection( testDetailsDirection ); - event.setEventType( testDetailsEventType ); - event.setDuration( testDetailsDuration ); - eventData = new LogsEventData; - eventData->mRemoteUrl = "tester@100.200.300.400"; - eventData->mLocalUrl = "caller@100.200.300.400"; - event.setLogsEventData( eventData ); - model = new LogsDetailsModel(*mDbConnector, event); - QVERIFY(model->mDetailItemsCount == 5); - QVERIFY(model->mDetailIcons.count() == model->mDetailItemsCount); - delete model; - model = 0; - + //VoIP call,remote uri and local uri, contact name testDetailsDateAndTime.setTime_t( 3000 ); event.setRemoteParty( testDetailsRemoteParty ); @@ -336,17 +276,86 @@ eventData->mLocalUrl = "caller@100.200.300.400"; event.setLogsEventData( eventData ); model = new LogsDetailsModel(*mDbConnector, event); - QVERIFY(model->mDetailItemsCount == 6); - QVERIFY(model->mDetailIcons.count() == model->mDetailItemsCount); + QVERIFY(model->mDetailIcons.count() == 5); + QVERIFY(model->mDetailTexts.count() == 5); + delete model; + model = 0; + + // Missed call, duration is not shown + // No VoIP call,no remote url or local url and contactname + event.setRemoteParty( testDetailsRemoteParty ); + event.setNumber( testDetailsRemoteNum ); + event.setTime( testDetailsDateAndTime ); + event.setEventType( testDetailsEventType ); + event.setDirection( LogsEvent::DirMissed ); + model = new LogsDetailsModel(*mDbConnector, event); + QVERIFY(model->mDetailIcons.count() == 4); + QVERIFY(model->mDetailTexts.count() == 4); delete model; model = 0; } +void UT_LogsDetailsModel::testInitUnseenMissed() +{ + LogsDbConnectorStubHelper::reset(); + testDetailsDateAndTime.setTime_t( 3000 ); + QString dateAndTimeRowHeading; + + // No duplicates + LogsEvent event; + event.setRemoteParty( testDetailsRemoteParty ); + event.setNumber( testDetailsRemoteNum ); + event.setTime( testDetailsDateAndTime ); + event.setDirection( LogsEvent::DirMissed ); + event.setEventType( testDetailsEventType ); + event.setDuration( testDetailsDuration ); + LogsDetailsModel* model = new LogsDetailsModel(*mDbConnector, event); + QVERIFY(model->mDetailIcons.count() == 4); + QVERIFY(model->mDetailTexts.count() == 4); + QVERIFY(LogsDbConnectorStubHelper::lastCalledFunction().isEmpty()); + dateAndTimeRowHeading = model->mDetailTexts.at(1).at(0); + delete model; + model = 0; + + // Already read + event.setIsRead(true); + model = new LogsDetailsModel(*mDbConnector, event); + QVERIFY(model->mDetailIcons.count() == 4); + QVERIFY(model->mDetailTexts.count() == 4); + QVERIFY(LogsDbConnectorStubHelper::lastCalledFunction().isEmpty()); + delete model; + model = 0; + + // Not read and duplicates exist + event.setIsRead(false); + event.setDuplicates(3); + model = new LogsDetailsModel(*mDbConnector, event); + QVERIFY(model->mDetailIcons.count() == 4); + QVERIFY(model->mDetailTexts.count() == 4); + QVERIFY(LogsDbConnectorStubHelper::lastCalledFunction() == "readDuplicates" ); + + // Reading duplicates completes + QSignalSpy spy( model, SIGNAL(modelReset()) ); + LogsEvent* dup1 = new LogsEvent; + model->mDbConnector->mDuplicatedEvents.append(dup1); + LogsEvent* dup2 = new LogsEvent; + model->mDbConnector->mDuplicatedEvents.append(dup2); + model->duplicatesRead(); + QVERIFY(model->mDetailIcons.count() == 6); + QVERIFY(model->mDetailTexts.count() == 6); + // When having multiple date and time items, first item has different heading than others + QVERIFY( model->mDetailTexts.at(1).at(0) != dateAndTimeRowHeading ); + QVERIFY( model->mDetailTexts.at(5).at(0) == dateAndTimeRowHeading ); + delete model; + model = 0; + +} + void UT_LogsDetailsModel::testGetHeaderData() { // No name or number LogsEvent event; - QVERIFY( mModel->getHeaderData(event) == QString("No number") ); + QVERIFY( mModel->getHeaderData(event) == hbTrId("txt_dial_dblist_call_id_val_unknown_number") ); // No name QString num("+12345555"); diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmatchesmodel.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmatchesmodel.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmatchesmodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -34,15 +34,27 @@ Q_DECLARE_METATYPE(LogsMessage *) Q_DECLARE_METATYPE(LogsContact *) + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::initTestCase() { } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::cleanupTestCase() { } - +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::init() { mModel = new LogsModel(); @@ -50,6 +62,10 @@ mMatchesModel = mModel->logsMatchesModel(); } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::cleanup() { delete mMatchesModel; @@ -58,11 +74,19 @@ mModel = 0; } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::testConstructor() { QVERIFY( mMatchesModel ); } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::testRowCount() { QVERIFY( mMatchesModel->rowCount(QModelIndex()) == 0 ); @@ -72,6 +96,10 @@ QVERIFY( mMatchesModel->rowCount(QModelIndex()) == 1 ); } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::testData() { QVERIFY( mModel->data(QModelIndex(), Qt::DisplayRole).isNull() ); @@ -167,6 +195,10 @@ delete detailsModel; } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::testDataAdded() { // One event added @@ -194,6 +226,10 @@ QVERIFY( mMatchesModel->mPrevSearchPattern.isEmpty() ); // Must be emptied, otherwise requery would not occur } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::testDataUpdated() { // Nothing to update @@ -213,6 +249,10 @@ QVERIFY( mMatchesModel->mPrevSearchPattern.isEmpty() ); // Must be emptied, otherwise requery would not occur } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::testDataRemoved() { // Nothing to remove @@ -232,6 +272,10 @@ QVERIFY( mMatchesModel->mPrevSearchPattern.isEmpty() ); // Must be emptied, otherwise requery would not occur } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::testLogsMatches() { // Query ready when no matching search events @@ -302,6 +346,23 @@ QVERIFY( mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern.isEmpty() ); } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_LogsMatchesModel::testCreateContactWithNumber() +{ + LogsContact* contact = 0; + contact = mMatchesModel->createContact("123"); + QVERIFY(contact); + QVERIFY(contact->isContactRequestAllowed()); + delete contact; +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::testCreateCall() { // With event @@ -331,6 +392,10 @@ } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::testCreateMessage() { // With event @@ -358,6 +423,10 @@ delete message; } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::testCreateContact() { // With event @@ -381,6 +450,10 @@ delete contact; } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::testUpdateSearchEntry() { // Remote name exists @@ -430,6 +503,10 @@ QVERIFY( entry5.phoneNumber().text() == "" ); } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::testGetFormattedCallerId() { // Entry is not initialized, caller Id is empty @@ -450,6 +527,10 @@ QVERIFY( callerId == "number" ); } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// void UT_LogsMatchesModel::testGetFormattedContactInfo() { QString name; diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmessage.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmessage.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmessage.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -18,6 +18,7 @@ #include "logsmessage.h" #include "logsevent.h" #include "logseventdata.h" +#include "qthighway_stub_helper.h" #include @@ -50,12 +51,12 @@ { QVERIFY( mLogsMessage ); - LogsMessage messageWithoutEvent( 2, "1234" ); + LogsMessage messageWithoutEvent( 2, "1234", "firstname" ); QVERIFY( messageWithoutEvent.mContactId == 2 ); QVERIFY( messageWithoutEvent.mNumber == "1234" ); QVERIFY( messageWithoutEvent.mIsAllowed ); - LogsMessage messageWithoutEvent2( 2, "" ); + LogsMessage messageWithoutEvent2( 2, "","" ); QVERIFY( messageWithoutEvent2.mContactId == 0 ); QVERIFY( messageWithoutEvent2.mNumber == "" ); QVERIFY( !messageWithoutEvent2.mIsAllowed ); @@ -76,6 +77,26 @@ void UT_LogsMessage::testSendMessage() { - QVERIFY( !mLogsMessage->sendMessage() ); + QtHighwayStubHelper::reset(); + QVERIFY( mLogsMessage->sendMessage() ); + QVERIFY( QtHighwayStubHelper::service() == "com.nokia.services.hbserviceprovider.conversationview" ); + QVERIFY( QtHighwayStubHelper::message() == "send(QString,qint32,QString)" ); + } +void UT_LogsMessage::testSendMessageToNumber() +{ + QtHighwayStubHelper::reset(); + QVERIFY( mLogsMessage->sendMessageToNumber( "1234567" ) ); + QVERIFY( QtHighwayStubHelper::service() == "com.nokia.services.hbserviceprovider.conversationview" ); + QVERIFY( QtHighwayStubHelper::message() == "send(QString,qint32,QString)" ); + QtHighwayStubHelper::reset(); + QVERIFY( mLogsMessage->sendMessageToNumber( "1234567", "name" ) ); + QVERIFY( QtHighwayStubHelper::service() == "com.nokia.services.hbserviceprovider.conversationview" ); + QVERIFY( QtHighwayStubHelper::message() == "send(QString,qint32,QString)" ); + QtHighwayStubHelper::reset(); + QVERIFY( mLogsMessage->sendMessageToNumber( "4234567", "namef", 3 ) ); + QVERIFY( QtHighwayStubHelper::service() == "com.nokia.services.hbserviceprovider.conversationview" ); + QVERIFY( QtHighwayStubHelper::message() == "send(QString,qint32,QString)" ); +} + diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmodel.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmodel.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -299,6 +299,26 @@ mModel->getDecorationData(*event, icons); QVERIFY(icons.count() == 1); LOGS_TEST_CMP_ICONS(icons.at(0), mModel->mIcons.value( logsMissedVoiceCallIconId )); + + icons.clear(); + event->setDirection(LogsEvent::DirMissed); + event->setEventType(LogsEvent::TypeVideoCall); + event->setIsRead(false); + mModel->getDecorationData(*event, icons); + QVERIFY(icons.count() == 1); + LOGS_TEST_CMP_ICONS(icons.at(0), mModel->mIcons.value( logsMissedVideoCallUnseenIconId )); + + icons.clear(); + event->setEventType(LogsEvent::TypeVoIPCall); + mModel->getDecorationData(*event, icons); + QVERIFY(icons.count() == 1); + LOGS_TEST_CMP_ICONS(icons.at(0), mModel->mIcons.value( logsMissedVoipCallUnseenIconId )); + + icons.clear(); + event->setEventType(LogsEvent::TypeVoiceCall); + mModel->getDecorationData(*event, icons); + QVERIFY(icons.count() == 1); + LOGS_TEST_CMP_ICONS(icons.at(0), mModel->mIcons.value( logsMissedVoiceCallUnseenIconId )); } void UT_LogsModel::testIconName() @@ -339,11 +359,25 @@ QVERIFY( LogsModel::directionIconName(event) == "" ); QVERIFY( LogsModel::directionIconName(event) == "" ); event.setEventType( LogsEvent::TypeVoiceCall ); + event.setIsRead(true); QVERIFY( LogsModel::directionIconName(event) == logsMissedVoiceCallIconId ); event.setEventType( LogsEvent::TypeVoIPCall ); QVERIFY( LogsModel::directionIconName(event) == logsMissedVoipCallIconId ); event.setEventType( LogsEvent::TypeVideoCall ); QVERIFY( LogsModel::directionIconName(event) == logsMissedVideoCallIconId ); + + event.setDirection(LogsEvent::DirMissed); + event.setEventType( LogsEvent::TypeUndefined ); + QVERIFY( LogsModel::directionIconName(event) == "" ); + QVERIFY( LogsModel::directionIconName(event) == "" ); + event.setEventType( LogsEvent::TypeVoiceCall ); + event.setIsRead(false); + QVERIFY( LogsModel::directionIconName(event) == logsMissedVoiceCallUnseenIconId ); + event.setEventType( LogsEvent::TypeVoIPCall ); + QVERIFY( LogsModel::directionIconName(event) == logsMissedVoipCallUnseenIconId ); + event.setEventType( LogsEvent::TypeVideoCall ); + QVERIFY( LogsModel::directionIconName(event) == logsMissedVideoCallUnseenIconId ); + } void UT_LogsModel::testGetCallerId() diff -r 0ba2181d7c28 -r 76a2435edfd4 logsui/logsui.pro --- a/logsui/logsui.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/logsui/logsui.pro Fri Apr 16 14:53:18 2010 +0300 @@ -22,7 +22,7 @@ :BLD_INF_RULES.prj_exports += "$${LITERAL_HASH}include " :BLD_INF_RULES.prj_exports += "rom/logs.iby CORE_APP_LAYER_IBY_EXPORT_PATH(logs.iby)" :BLD_INF_RULES.prj_exports += "rom/logsresources.iby LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(logsresources.iby)" - :BLD_INF_RULES.prj_exports += "rom/logs_stub.SIS /epoc32/data/z/system/install/logs_stub.SIS" + :BLD_INF_RULES.prj_exports += "rom/logs_stub.sis /epoc32/data/z/system/install/logs_stub.sis" :BLD_INF_RULES.prj_exports += "cenrep/backup_registration.xml /epoc32/data/z/private/101F4CD5/backup_registration.xml" :BLD_INF_RULES.prj_exports += "conf/logs.confml APP_LAYER_CONFML(logs.confml)" :BLD_INF_RULES.prj_exports += "conf/logs_101F874E.crml APP_LAYER_CRML(logs_101F874E.crml)" @@ -36,6 +36,10 @@ :BLD_INF_RULES.prj_exports += "../contacts_plat/logs_engine_api/inc/logsfilter.h APP_LAYER_PLATFORM_EXPORT_PATH(logsfilter.h)" :BLD_INF_RULES.prj_exports += "../contacts_plat/logs_engine_api/inc/logscustomfilter.h APP_LAYER_PLATFORM_EXPORT_PATH(logscustomfilter.h)" :BLD_INF_RULES.prj_exports += "../contacts_plat/logs_engine_api/inc/logsevent.h APP_LAYER_PLATFORM_EXPORT_PATH(logsevent.h)" + exists(confml/logsuda.confml) :BLD_INF_RULES.prj_exports += "confml/logsuda.confml CONFML_EXPORT_PATH(logsuda.confml,uda_content)" + exists(implml/logsuda.implml) :BLD_INF_RULES.prj_exports += "implml/logsuda.implml CRML_EXPORT_PATH(logsuda.implml,uda_content)" + exists(content/LOGDBU.zip) :BLD_INF_RULES.prj_exports += "content/LOGDBU.zip CRML_EXPORT_PATH(../content/zip/,uda_content)" + } SUBDIRS += logsservices diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/CntFindPlugin/group/CntFindPlugin.mmp --- a/phonebookengines/CntFindPlugin/group/CntFindPlugin.mmp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/CntFindPlugin/group/CntFindPlugin.mmp Fri Apr 16 14:53:18 2010 +0300 @@ -36,7 +36,7 @@ // Symbian uses #include in cntviewfindconfig.h SYSTEMINCLUDE /epoc32/include/ecom -START RESOURCE 101F85F4.RSS +START RESOURCE 101f85f4.rss TARGET cntfindplugin TARGETPATH resource/plugins END diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/CntFindPlugin/src/CntFindPlugin.cpp --- a/phonebookengines/CntFindPlugin/src/CntFindPlugin.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/CntFindPlugin/src/CntFindPlugin.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -19,7 +19,7 @@ // INCLUDE FILES #include "cntfindplugin.h" -#include +#include // ========================== MEMBER FUNCTIONS =============================== diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/CntSortPlugin/group/CntSortPlugin.mmp --- a/phonebookengines/CntSortPlugin/group/CntSortPlugin.mmp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/CntSortPlugin/group/CntSortPlugin.mmp Fri Apr 16 14:53:18 2010 +0300 @@ -17,7 +17,7 @@ */ -#include "CntSortPluginUid.h" +#include "cntsortpluginuid.h" #include #include @@ -37,7 +37,7 @@ // Symbian uses #include in cntviewsortplugin.h SYSTEMINCLUDE /epoc32/include/ecom -START RESOURCE 101f85a9.RSS +START RESOURCE 101f85a9.rss TARGET cntsortplugin TARGETPATH resource/plugins END diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/CntSortPlugin/src/CCntSortPlugin.cpp --- a/phonebookengines/CntSortPlugin/src/CCntSortPlugin.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/CntSortPlugin/src/CCntSortPlugin.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -20,7 +20,7 @@ // INCLUDE FILES #include "ccntsortplugin.h" -#include +#include #include #include "csortkeyarray.h" diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/CntSortPlugin/src/CSortKeyArray.h --- a/phonebookengines/CntSortPlugin/src/CSortKeyArray.h Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/CntSortPlugin/src/CSortKeyArray.h Fri Apr 16 14:53:18 2010 +0300 @@ -21,7 +21,7 @@ #define __CSortKeyArray_H__ // INCLUDES -#include +#include // CLASS DESCRIPTION /** diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/bwins/cntmaptileserviceu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/bwins/cntmaptileserviceu.def Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,4 @@ +EXPORTS + ?getMapTileImage@CntMapTileService@@SA?AVQString@@HW4ContactAddressType@1@@Z @ 1 NONAME ; class QString CntMapTileService::getMapTileImage(int, enum CntMapTileService::ContactAddressType) + ?isLocationFeatureEnabled@CntMapTileService@@SA_NXZ @ 2 NONAME ; bool CntMapTileService::isLocationFeatureEnabled(void) + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/bwins/mobcntactionspluginu.def --- a/phonebookengines/bwins/mobcntactionspluginu.def Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/bwins/mobcntactionspluginu.def Fri Apr 16 14:53:18 2010 +0300 @@ -1,20 +1,20 @@ EXPORTS qt_plugin_instance @ 1 NONAME qt_plugin_query_verification_data @ 2 NONAME - ??0MobCntActionFactory@@QAE@XZ @ 3 NONAME ; MobCntActionFactory::MobCntActionFactory(void) - ?trUtf8@MobCntActionFactory@@SA?AVQString@@PBD0@Z @ 4 NONAME ; class QString MobCntActionFactory::trUtf8(char const *, char const *) - ?qt_metacast@MobCntActionFactory@@UAEPAXPBD@Z @ 5 NONAME ; void * MobCntActionFactory::qt_metacast(char const *) - ?tr@MobCntActionFactory@@SA?AVQString@@PBD0@Z @ 6 NONAME ; class QString MobCntActionFactory::tr(char const *, char const *) - ?getStaticMetaObject@MobCntActionFactory@@SAABUQMetaObject@@XZ @ 7 NONAME ; struct QMetaObject const & MobCntActionFactory::getStaticMetaObject(void) - ??_EMobCntActionFactory@@UAE@I@Z @ 8 NONAME ; MobCntActionFactory::~MobCntActionFactory(unsigned int) - ?metaObject@MobCntActionFactory@@UBEPBUQMetaObject@@XZ @ 9 NONAME ; struct QMetaObject const * MobCntActionFactory::metaObject(void) const - ?actionMetadata@MobCntActionFactory@@UBE?AV?$QMap@VQString@@VQVariant@@@@ABVQContactActionDescriptor@@@Z @ 10 NONAME ; class QMap MobCntActionFactory::actionMetadata(class QContactActionDescriptor const &) const - ?qt_metacall@MobCntActionFactory@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 11 NONAME ; int MobCntActionFactory::qt_metacall(enum QMetaObject::Call, int, void * *) - ??1MobCntActionFactory@@UAE@XZ @ 12 NONAME ; MobCntActionFactory::~MobCntActionFactory(void) - ?actionDescriptors@MobCntActionFactory@@UBE?AV?$QList@VQContactActionDescriptor@@@@XZ @ 13 NONAME ; class QList MobCntActionFactory::actionDescriptors(void) const - ?tr@MobCntActionFactory@@SA?AVQString@@PBD0H@Z @ 14 NONAME ; class QString MobCntActionFactory::tr(char const *, char const *, int) - ?trUtf8@MobCntActionFactory@@SA?AVQString@@PBD0H@Z @ 15 NONAME ; class QString MobCntActionFactory::trUtf8(char const *, char const *, int) - ?name@MobCntActionFactory@@UBE?AVQString@@XZ @ 16 NONAME ; class QString MobCntActionFactory::name(void) const - ?instance@MobCntActionFactory@@UBEPAVQContactAction@@ABVQContactActionDescriptor@@@Z @ 17 NONAME ; class QContactAction * MobCntActionFactory::instance(class QContactActionDescriptor const &) const + ?metaObject@MobCntActionFactory@@UBEPBUQMetaObject@@XZ @ 3 NONAME ; struct QMetaObject const * MobCntActionFactory::metaObject(void) const + ??0MobCntActionFactory@@QAE@XZ @ 4 NONAME ; MobCntActionFactory::MobCntActionFactory(void) + ?trUtf8@MobCntActionFactory@@SA?AVQString@@PBD0@Z @ 5 NONAME ; class QString MobCntActionFactory::trUtf8(char const *, char const *) + ?qt_metacall@MobCntActionFactory@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 6 NONAME ; int MobCntActionFactory::qt_metacall(enum QMetaObject::Call, int, void * *) + ??1MobCntActionFactory@@UAE@XZ @ 7 NONAME ; MobCntActionFactory::~MobCntActionFactory(void) + ?qt_metacast@MobCntActionFactory@@UAEPAXPBD@Z @ 8 NONAME ; void * MobCntActionFactory::qt_metacast(char const *) + ?instance@MobCntActionFactory@@UBEPAVQContactAction@QtMobility@@ABVQContactActionDescriptor@3@@Z @ 9 NONAME ; class QtMobility::QContactAction * MobCntActionFactory::instance(class QtMobility::QContactActionDescriptor const &) const + ?actionMetadata@MobCntActionFactory@@UBE?AV?$QMap@VQString@@VQVariant@@@@ABVQContactActionDescriptor@QtMobility@@@Z @ 10 NONAME ; class QMap MobCntActionFactory::actionMetadata(class QtMobility::QContactActionDescriptor const &) const + ?tr@MobCntActionFactory@@SA?AVQString@@PBD0@Z @ 11 NONAME ; class QString MobCntActionFactory::tr(char const *, char const *) + ?tr@MobCntActionFactory@@SA?AVQString@@PBD0H@Z @ 12 NONAME ; class QString MobCntActionFactory::tr(char const *, char const *, int) + ?trUtf8@MobCntActionFactory@@SA?AVQString@@PBD0H@Z @ 13 NONAME ; class QString MobCntActionFactory::trUtf8(char const *, char const *, int) + ?getStaticMetaObject@MobCntActionFactory@@SAABUQMetaObject@@XZ @ 14 NONAME ; struct QMetaObject const & MobCntActionFactory::getStaticMetaObject(void) + ?name@MobCntActionFactory@@UBE?AVQString@@XZ @ 15 NONAME ; class QString MobCntActionFactory::name(void) const + ??_EMobCntActionFactory@@UAE@I@Z @ 16 NONAME ; MobCntActionFactory::~MobCntActionFactory(unsigned int) + ?actionDescriptors@MobCntActionFactory@@UBE?AV?$QList@VQContactActionDescriptor@QtMobility@@@@XZ @ 17 NONAME ; class QList MobCntActionFactory::actionDescriptors(void) const ?staticMetaObject@MobCntActionFactory@@2UQMetaObject@@B @ 18 NONAME ; struct QMetaObject const MobCntActionFactory::staticMetaObject diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/bwins/mobcntmodelu.def --- a/phonebookengines/bwins/mobcntmodelu.def Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/bwins/mobcntmodelu.def Fri Apr 16 14:53:18 2010 +0300 @@ -33,4 +33,5 @@ ?findIndexes@MobCntModel@@AAE?AV?$QList@V?$QList@H@@@@ABV?$QList@I@@@Z @ 32 NONAME ; class QList > MobCntModel::findIndexes(class QList const &) ?contactManager@MobCntModel@@QBEAAVQContactManager@QtMobility@@XZ @ 33 NONAME ; class QtMobility::QContactManager & MobCntModel::contactManager(void) const ?updateContactIcon@MobCntModel@@QAEXH@Z @ 34 NONAME ; void MobCntModel::updateContactIcon(int) + ?myCardId@MobCntModel@@QBEIXZ @ 35 NONAME ; unsigned int MobCntModel::myCardId(void) const diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/bwins/mobhistorymodelu.def --- a/phonebookengines/bwins/mobhistorymodelu.def Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -EXPORTS - ?metaObject@MobHistoryModel@@UBEPBUQMetaObject@@XZ @ 1 NONAME ; struct QMetaObject const * MobHistoryModel::metaObject(void) const - ?directionRoleData@MobHistoryModel@@ABE?AVQVariant@@H@Z @ 2 NONAME ; class QVariant MobHistoryModel::directionRoleData(int) const - ?initializeModel@MobHistoryModel@@AAEXXZ @ 3 NONAME ; void MobHistoryModel::initializeModel(void) - ?clearHistory@MobHistoryModel@@QAEXXZ @ 4 NONAME ; void MobHistoryModel::clearHistory(void) - ??1MobHistoryModel@@UAE@XZ @ 5 NONAME ; MobHistoryModel::~MobHistoryModel(void) - ?qt_metacast@MobHistoryModel@@UAEPAXPBD@Z @ 6 NONAME ; void * MobHistoryModel::qt_metacast(char const *) - ??0MobHistoryModel@@QAE@IPAVQContactManager@QtMobility@@PAVQObject@@@Z @ 7 NONAME ; MobHistoryModel::MobHistoryModel(unsigned int, class QtMobility::QContactManager *, class QObject *) - ?validRowId@MobHistoryModel@@ABE_NH@Z @ 8 NONAME ; bool MobHistoryModel::validRowId(int) const - ?staticMetaObject@MobHistoryModel@@2UQMetaObject@@B @ 9 NONAME ; struct QMetaObject const MobHistoryModel::staticMetaObject - ?tr@MobHistoryModel@@SA?AVQString@@PBD0H@Z @ 10 NONAME ; class QString MobHistoryModel::tr(char const *, char const *, int) - ?dataFromMessageModel@MobHistoryModel@@AAEXABVQModelIndex@@HH@Z @ 11 NONAME ; void MobHistoryModel::dataFromMessageModel(class QModelIndex const &, int, int) - ?trUtf8@MobHistoryModel@@SA?AVQString@@PBD0H@Z @ 12 NONAME ; class QString MobHistoryModel::trUtf8(char const *, char const *, int) - ?trUtf8@MobHistoryModel@@SA?AVQString@@PBD0@Z @ 13 NONAME ; class QString MobHistoryModel::trUtf8(char const *, char const *) - ?dataFromLogsModel@MobHistoryModel@@AAEXABVQModelIndex@@HH@Z @ 14 NONAME ; void MobHistoryModel::dataFromLogsModel(class QModelIndex const &, int, int) - ?decorationRoleData@MobHistoryModel@@ABE?AVQVariant@@H@Z @ 15 NONAME ; class QVariant MobHistoryModel::decorationRoleData(int) const - ?tr@MobHistoryModel@@SA?AVQString@@PBD0@Z @ 16 NONAME ; class QString MobHistoryModel::tr(char const *, char const *) - ?data@MobHistoryModel@@UBE?AVQVariant@@ABVQModelIndex@@H@Z @ 17 NONAME ; class QVariant MobHistoryModel::data(class QModelIndex const &, int) const - ?displayRoleData@MobHistoryModel@@ABE?AVQVariant@@H@Z @ 18 NONAME ; class QVariant MobHistoryModel::displayRoleData(int) const - ?getStaticMetaObject@MobHistoryModel@@SAABUQMetaObject@@XZ @ 19 NONAME ; struct QMetaObject const & MobHistoryModel::getStaticMetaObject(void) - ?seenStatusRoleData@MobHistoryModel@@ABE?AVQVariant@@H@Z @ 20 NONAME ; class QVariant MobHistoryModel::seenStatusRoleData(int) const - ?rowCount@MobHistoryModel@@UBEHABVQModelIndex@@@Z @ 21 NONAME ; int MobHistoryModel::rowCount(class QModelIndex const &) const - ?qt_metacall@MobHistoryModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 22 NONAME ; int MobHistoryModel::qt_metacall(enum QMetaObject::Call, int, void * *) - ?sort@MobHistoryModel@@UAEXHW4SortOrder@Qt@@@Z @ 23 NONAME ; void MobHistoryModel::sort(int, enum Qt::SortOrder) - ?dataFromConversationsModel@MobHistoryModel@@AAEXABVQModelIndex@@HH@Z @ 24 NONAME ; void MobHistoryModel::dataFromConversationsModel(class QModelIndex const &, int, int) - ??_EMobHistoryModel@@UAE@I@Z @ 25 NONAME ; MobHistoryModel::~MobHistoryModel(unsigned int) - ?readEvents@MobHistoryModel@@AAEXHH@Z @ 26 NONAME ; void MobHistoryModel::readEvents(int, int) - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/bwins/simutilityu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/bwins/simutilityu.def Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,15 @@ +EXPORTS + ?tr@SimUtility@@SA?AVQString@@PBD0H@Z @ 1 NONAME ; class QString SimUtility::tr(char const *, char const *, int) + ?trUtf8@SimUtility@@SA?AVQString@@PBD0H@Z @ 2 NONAME ; class QString SimUtility::trUtf8(char const *, char const *, int) + ?staticMetaObject@SimUtility@@2UQMetaObject@@B @ 3 NONAME ; struct QMetaObject const SimUtility::staticMetaObject + ??0SimUtility@@QAE@W4StoreType@0@AAHPAVQObject@@@Z @ 4 NONAME ; SimUtility::SimUtility(enum SimUtility::StoreType, int &, class QObject *) + ?qt_metacast@SimUtility@@UAEPAXPBD@Z @ 5 NONAME ; void * SimUtility::qt_metacast(char const *) + ?trUtf8@SimUtility@@SA?AVQString@@PBD0@Z @ 6 NONAME ; class QString SimUtility::trUtf8(char const *, char const *) + ??_ESimUtility@@UAE@I@Z @ 7 NONAME ; SimUtility::~SimUtility(unsigned int) + ??1SimUtility@@UAE@XZ @ 8 NONAME ; SimUtility::~SimUtility(void) + ?qt_metacall@SimUtility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 9 NONAME ; int SimUtility::qt_metacall(enum QMetaObject::Call, int, void * *) + ?tr@SimUtility@@SA?AVQString@@PBD0@Z @ 10 NONAME ; class QString SimUtility::tr(char const *, char const *) + ?getSimInfo@SimUtility@@QAE?AUSimInfo@1@AAH@Z @ 11 NONAME ; struct SimUtility::SimInfo SimUtility::getSimInfo(int &) + ?getStaticMetaObject@SimUtility@@SAABUQMetaObject@@XZ @ 12 NONAME ; struct QMetaObject const & SimUtility::getStaticMetaObject(void) + ?metaObject@SimUtility@@UBEPBUQMetaObject@@XZ @ 13 NONAME ; struct QMetaObject const * SimUtility::metaObject(void) const + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/cntmaptileservice/cntmaptileservice.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/cntmaptileservice/cntmaptileservice.pro Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,74 @@ +# +# Copyright (c) 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: +# +# + + +TEMPLATE = lib +TARGET = cntmaptileservice + +CONFIG += dll +CONFIG += hb + + +DEPENDPATH += . +INCLUDEPATH += . +INCLUDEPATH += ../inc + + +MOC_DIR = moc + +DEFINES += CNTMAPTILESERVICEDLL + +INTERNAL_PUBLIC_HEADERS += inc/cntmaptileservice.h + +# Input +HEADERS += $$INTERNAL_PUBLIC_HEADERS \ + ./inc/cntmaptiledblookuptable.h + + +SOURCES += ./src/cntmaptileservice.cpp ./src/cntmaptiledblookuptable.cpp + +symbian: +{ + + :BLD_INF_RULES.prj_exports += "conf/cntmaptileservice.confml APP_LAYER_CONFML(cntmaptileservice.confml)" + :BLD_INF_RULES.prj_exports += "conf/cntmaptileservice_2002C3A8.crml APP_LAYER_CRML(cntmaptileservice_2002C3A8.crml)" + :BLD_INF_RULES.prj_exports += "conf/2002C3A8.txt /epoc32/winscw/c/private/10202be9/2002C3A8.txt" + + TARGET.EPOCALLOWDLLDATA = 1 + TARGET.CAPABILITY = All -Tcb + TARGET.UID3 = 0x2002C3A8 + + + LIBS += -lcntmodel \ + -ledbms \ + -lbafl \ + -lcentralrepository \ + -leuser + + +} + +deploy.path = / +headers.sources = $$INTERNAL_PUBLIC_HEADERS +headers.path = epoc32/include/app +DEPLOYMENT += exportheaders + +# This is for new exporting system coming in garden +for(header, headers.sources):BLD_INF_RULES.prj_exports += "$$header $$deploy.path$$headers.path/$$basename(header)" \ No newline at end of file diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/cntmaptileservice/conf/2002C3A8.txt Binary file phonebookengines/cntmaptileservice/conf/2002C3A8.txt has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/cntmaptileservice/conf/cntmaptileservice.confml Binary file phonebookengines/cntmaptileservice/conf/cntmaptileservice.confml has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/cntmaptileservice/conf/cntmaptileservice_2002C3A8.crml Binary file phonebookengines/cntmaptileservice/conf/cntmaptileservice_2002C3A8.crml has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/cntmaptileservice/inc/cntmaptiledblookuptable.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/cntmaptileservice/inc/cntmaptiledblookuptable.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,144 @@ +/* +* Copyright (c) 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: +* Retrieving maptile path from lookup db +* +*/ + +#ifndef __MAPTILEDBLOOKUPTABLE_H__ +#define __MAPTILEDBLOOKUPTABLE_H__ + +//Headers needed +#include //RFs +#include //RDbNamedDatabase,RDbView + +// maptile database column names +_LIT( NCntColUid, "cntuid" ); +_LIT( NCntColFilePath, "filepath" ); +_LIT( NColSource, "source" ); + +// maptile lookup database name +_LIT( KMapTileLookupDatabaseName, "mylocationsmaptilelookup.db" ); + +// maptile database table name +_LIT( KMapTileLookupTable, "cntmaptilelookuptable" ); + +_LIT( KLookupDbPath, "c:\\mylocations\\" ); + +// uid column number +const TInt KColumncntUid = 1; +// source type column number +const TInt KColumnSource = 2; +// source type column number +const TInt KColumnFilePath = 3; + + +/** + * Maptile database lookup entry + */ +class TLookupItem +{ +public: + // Uid of the source entry + TUint32 iUid; + + // Source type + TUint32 iSource; + + // Landmark uid in the landmarks database + TUint32 iLmId; + + // Uid of the Contact + TUint32 icntUid; + + // File Path + TFileName iFilePath; +}; + +/** + * Defines uid source type + */ +enum TUidSourceType +{ + /** Uid Source type contacts default/prefered address */ + ESourceContactsPref = 3, + /** Uid Source type contacts work address */ + ESourceContactsWork, + /** Uid Source type contacts home address */ + ESourceContactsHome, +}; + +/** + * CLookupMapTileDatabase class. + * This class handles all the operations related to maptile lookup database. + * + */ +class CLookupMapTileDatabase : public CBase +{ +public: + + /** + * This is a static function, which creates and returns an instance of this class. + */ + static CLookupMapTileDatabase* NewL( const TDesC& aLookupTableName ); + + /** + * This is a static function, which creates and returns an instance of this class. + * Pushes the created object to the cleanup stack. + */ + static CLookupMapTileDatabase* NewLC( const TDesC& aLookupTableName ); + + /** + * Destructor + */ + ~CLookupMapTileDatabase(); + +public: + + /** + * Finds an entry in the lookup table. + * @param[in/out] aLookupItem The lookup item to be found in the database. + * The source iUid is passed in the lookup item + */ + void FindEntryL( TLookupItem& aLookupItem ); + +private: + + // default constructor + CLookupMapTileDatabase(); + + // Second phase constructor + void ConstructL( const TDesC& aLookupTableName ); + +private: + + // Handle to the items database + RDbNamedDatabase iItemsDatabase; + + // handle to the file session + RFs iFsSession; + + // holds the database file name + TFileName iDbFileName; + + // holds the info about database existence. + TBool iDatabaseExists; + +}; + + +#endif // __MAPTILEDBLOOKUPTABLE_H__` + +// End of file + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/cntmaptileservice/inc/cntmaptileservice.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/cntmaptileservice/inc/cntmaptileservice.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,82 @@ +/* +* Copyright (c) 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: +* Contact maptile service interface +* +*/ + +#ifndef _CNTMAPTILESERVICE_H_ +#define _CNTMAPTILESERVICE_H_ + + +#include +#include + + +#ifdef CNTMAPTILESERVICEDLL +#define CNTMAPTILESERVICE_EXPORT Q_DECL_EXPORT +#else +#define CNTMAPTILESERVICE_EXPORT Q_DECL_IMPORT +#endif + + + +// CLASS DECLARATION + +/** +* Maptile service class, provides interface to get map tile image associated with +* contact. Also provides interface to check whether location feature is enabled or disabled. +* +* Note: Location feature can be enabled or disabled by modifying conf\cntmaptileservice.confml file. +*/ +class CNTMAPTILESERVICE_EXPORT CntMapTileService +{ + +public: + + /** + * Contact address types + */ + enum ContactAddressType + { + /** Address Type Pref */ + AddressPreference, + /** Address type Work */ + AddressWork, + /** Address type Home */ + AddressHome + }; + + /** + * Checks whether location feature enabled or disabled. + * + * @return Returns true or false based on location feature setting. + */ + static bool isLocationFeatureEnabled(); + + /** + * Gets a maptile image associated with a contact id. Returns a maptile + * image path if it is available otherwise returns NULL. + * + * @param contactId Contact id + * @param sourceType Source address type( Preferred, Home , Work address ) + * + * @return Returns maptile image path if it is available, else NULL. + */ + static QString getMapTileImage( int contactId, ContactAddressType sourceType ); + +}; + +#endif //_CNTMAPTILESERVICE_H_ + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/cntmaptileservice/src/cntmaptiledblookuptable.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/cntmaptileservice/src/cntmaptiledblookuptable.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,177 @@ +/* +* Copyright (c) 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: +* Retrieving maptile path from lookup db implementation +* +*/ + +#include + +#include "cntmaptiledblookuptable.h" + +// select all from +_LIT( KSelectAllFrom, "SELECT * FROM " ); + +// string 'where' +_LIT( KStringWhere, " WHERE " ); + +// string ' = ' +_LIT( KStringEqual, " = " ); + +// string 'And' +_LIT( KStringAnd, " AND " ); + + +// ----------------------------------------------------------------------------- +// CLookupMapTileDatabase::CLookupMapTileDatabase() +// Default constructor. +// ----------------------------------------------------------------------------- +// +CLookupMapTileDatabase::CLookupMapTileDatabase() +{ +} + +// ----------------------------------------------------------------------------- +// CLookupMapTileDatabase::~CLookupMapTileDatabase() +// Destructor. +// ----------------------------------------------------------------------------- +// +CLookupMapTileDatabase::~CLookupMapTileDatabase() +{ + // close the database + iItemsDatabase.Close(); + + // close the file session + iFsSession.Close(); +} + +// ----------------------------------------------------------------------------- +// CLookupMapTileDatabase::~CLookupMapTileDatabase() +// Creates an object of this class and pushes to cleanup stack. +// ----------------------------------------------------------------------------- +// +CLookupMapTileDatabase* CLookupMapTileDatabase::NewLC( const TDesC& aLookupTableName ) +{ + CLookupMapTileDatabase* self = new (ELeave) CLookupMapTileDatabase; + CleanupStack::PushL(self); + self->ConstructL( aLookupTableName ); + return self; +} + + +// ----------------------------------------------------------------------------- +// CLookupMapTileDatabase::NewL() +// Creates an object of this class. +// ----------------------------------------------------------------------------- +// +CLookupMapTileDatabase* CLookupMapTileDatabase::NewL( const TDesC& aLookupTableName ) +{ + CLookupMapTileDatabase* self = CLookupMapTileDatabase::NewLC( aLookupTableName ); + CleanupStack::Pop( self ); + return self; +} + + +// ----------------------------------------------------------------------------- +// CLookupMapTileDatabase::ConstructL() +// 2nd phase contructor. +// ----------------------------------------------------------------------------- +// +void CLookupMapTileDatabase::ConstructL( const TDesC& aLookupTableName ) +{ + User::LeaveIfError( iFsSession.Connect() ); + + iDbFileName.Copy( KLookupDbPath ); + iDbFileName.Append( aLookupTableName ); + + iDatabaseExists = EFalse; + + if( BaflUtils::FileExists( iFsSession, iDbFileName ) ) + { + // database exists + iDatabaseExists = ETrue; + } +} + + +// ----------------------------------------------------------------------------- +// CLookupMapTileDatabase::FindEntryL() +// Finds an entry in the lookup table. +// ----------------------------------------------------------------------------- +// +void CLookupMapTileDatabase::FindEntryL( TLookupItem& aLookupItem ) +{ + + // used to check whether entry available or not + TBool entryAvailable = EFalse; + + if ( iDatabaseExists ) + { + // Create a query to find the item. + TFileName queryBuffer; + queryBuffer.Copy( KSelectAllFrom ); + queryBuffer.Append( KMapTileLookupTable ); + queryBuffer.Append( KStringWhere ); + queryBuffer.Append( NCntColUid ); + queryBuffer.Append( KStringEqual ); + queryBuffer.AppendNum( aLookupItem.icntUid ); + queryBuffer.Append( KStringAnd ); + queryBuffer.Append( NColSource ); + queryBuffer.Append( KStringEqual ); + queryBuffer.AppendNum( aLookupItem.iSource ); + + TInt ret = iItemsDatabase.Open( iFsSession, iDbFileName ); + + if( ret != KErrNone ) + { + //if already opened , close and open again + iItemsDatabase.Close(); + User::LeaveIfError( iItemsDatabase.Open( iFsSession, iDbFileName ) ); + } + User::LeaveIfError( iItemsDatabase.Begin() ); + + // Create a view of the table with the above query. + RDbView myView; + myView.Prepare( iItemsDatabase, TDbQuery( queryBuffer ) ); + CleanupClosePushL( myView ); + myView.EvaluateAll(); + myView.FirstL(); + + if( myView.AtRow() ) + { + // Item found. get the details. + myView.GetL(); + if( aLookupItem.icntUid == myView.ColUint( KColumncntUid ) ) + { + aLookupItem.iFilePath.Copy( myView.ColDes16( KColumnFilePath ) ); + entryAvailable = ETrue; + } + } + + CleanupStack::PopAndDestroy( &myView ); // myView + + //Close the database + iItemsDatabase.Close(); + } + + //No entry found + if( !entryAvailable ) + { + User::Leave( KErrNotFound ); + } +} + + +// End of file + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/cntmaptileservice/src/cntmaptileservice.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/cntmaptileservice/src/cntmaptileservice.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,118 @@ +/* +* Copyright (c) 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: +* Maptile service implementation +* +*/ + + +#include + + +#include "cntmaptileservice.h" +#include "cntmaptiledblookuptable.h" + +// CONSTANTS +// Maptile interface uid +const TUid KUidMapTileInterface = { 0x2002C3A8 }; +// Central Repository Key IDs +const TInt KEnableLocationFeature = 0x1; + + +// ----------------------------------------------------------------------------- +// MapTileService::isLocationFeatureEnabled() +// Checks whether location feature is enabled or disabled +// ----------------------------------------------------------------------------- +// +bool CntMapTileService::isLocationFeatureEnabled() +{ + //Create the centrep with uid 0x2002C3A8 + bool enableLocationFeature = false; + + CRepository* centralRepository = NULL; + + TRAPD( err, centralRepository = CRepository::NewL( KUidMapTileInterface ) ); + if ( KErrNone == err ) + { + TInt repValue; + + //Get the Location feature flag + TInt ret = centralRepository->Get( KEnableLocationFeature , repValue ); + + if ( ret == KErrNone && repValue == 1 ) + { + enableLocationFeature = true; + } + + delete centralRepository; + } + + return enableLocationFeature; + +} + + +// ----------------------------------------------------------------------------- +// MapTileService::getMapTileImage() +// Gets the maptile image path associated with a contact. +// ----------------------------------------------------------------------------- +// +QString CntMapTileService::getMapTileImage( int contactId , ContactAddressType sourceType ) +{ + //Image file to return; + + //Maptile database instance + CLookupMapTileDatabase* mapTileDatabase = NULL; + + TRAPD( err, mapTileDatabase = CLookupMapTileDatabase::NewL( + KMapTileLookupDatabaseName ) ); + if ( KErrNone == err ) + { + TLookupItem lookupItem; + lookupItem.icntUid = contactId; + switch( sourceType ) + { + case AddressPreference: + lookupItem.iSource = ESourceContactsPref; + break; + case AddressWork: + lookupItem.iSource = ESourceContactsWork; + break; + case AddressHome: + lookupItem.iSource = ESourceContactsHome; + break; + default: + break; + } + + TRAP( err , mapTileDatabase->FindEntryL( lookupItem ) ); + + //delet the database instance + delete mapTileDatabase; + + //if entry available returns the file path otherwise NULL. + if ( KErrNone == err ) + { + //Get the image path + QString imageFile((QChar*)lookupItem.iFilePath.Ptr(), + lookupItem.iFilePath.Length()); + return imageFile; + } + } + + return QString(); +} + +// End of file + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/homeaddressmap.png Binary file phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/homeaddressmap.png has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/preferredaddressmap.png Binary file phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/preferredaddressmap.png has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/ut_maptileservice.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/ut_maptileservice.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,270 @@ +/* +* 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 +#include +#include +#include +#include + + +#include "cntmaptileservice.h" + + +//Maximum maptile processing time +const int KMapTileFetchTime = 150000; + +QTM_USE_NAMESPACE + + +//Maptile test interface class +class MaptileServiceTest: public QObject +{ + Q_OBJECT + +private slots: + + void checkLocationFeature(); + void getPreferredAddressMapTilePath(); + void getWorkAddressMapTilePath(); + void getHomeAddressMapTilePath(); + void checkInvalidContactId(); + +}; + + +//Checks whether location feature enabled or disabled +void MaptileServiceTest::checkLocationFeature() +{ + + QVERIFY( CntMapTileService::isLocationFeatureEnabled() == 1 ); +} + +//Checks the maptile path retrieval for preferred address +void MaptileServiceTest::getPreferredAddressMapTilePath() +{ + + QContact* contact = new QContact(); + + //Add contact name + QContactName* name = new QContactName(); + name->setFirst("Raj"); + contact->saveDetail( name ); + + //Add address + QContactAddress* address = new QContactAddress(); + address->setPostOfficeBox("87640"); + address->setStreet("Torstrasse"); + address->setPostcode("12345"); + address->setLocality("Berlin"); + address->setCountry("Germany"); + contact->saveDetail(address); + + //Save the contact + QContactManager* contactManager = NULL; + contactManager = new QContactManager("symbian"); + contactManager->saveContact( contact ); + + //Wait till maptile operation complete + QTest::qWait( KMapTileFetchTime ); + + + //Get the saved id + QContactId savedId = contact->id(); + TUint32 contactId = savedId.localId(); + + //Get the maptile + QString string = CntMapTileService::getMapTileImage( contactId, CntMapTileService::AddressPreference ); + + //Construct the QPimap from reference bitmap + QImage referenceBitmap( "c:\\maptiletest\\preferredaddressmap.png" ); + + //Construct the QPixmap from new retrieved bitmap + QImage retrievedBitmap( string ); + + + //delete the contact + contactManager->removeContact( contactId ); + + delete contact; + delete name; + delete address; + delete contactManager; + +} + +//Checks the maptile path retrieval for work address +void MaptileServiceTest::getWorkAddressMapTilePath() +{ + + QContact* contact = new QContact(); + + //Set name + QContactName* name = new QContactName(); + name->setFirst("Mike"); + contact->saveDetail(name); + + //Set address + QContactAddress* address = new QContactAddress(); + address->setPostOfficeBox("2345"); + address->setPostcode("29834"); + address->setStreet("Domlur"); + address->setLocality("Bangalore"); + address->setCountry("India"); + address->setContexts(QContactDetail::ContextWork); + contact->saveDetail(address); + + //Save the contact + QContactManager* contactManager = NULL; + contactManager = new QContactManager("symbian"); + contactManager->saveContact( contact ); + + //Wait till maptile operation complete + QTest::qWait( KMapTileFetchTime ); + + + //Get the saved id + QContactId savedId = contact->id(); + TUint32 contactId = savedId.localId(); + + //Get the maptile + QString string = CntMapTileService::getMapTileImage( contactId, CntMapTileService::AddressWork ); + + //Construct the QPimap from already stored bitmap + QImage referenceBitmap( "c:\\maptiletest\\workaddressmap.png" ); + + //Construct the QPixmap from new retrieved bitmap + QImage retrievedBitmap( string ); + + //check results are same + QVERIFY( retrievedBitmap == referenceBitmap ); + + + contactManager->removeContact( contactId ); + + delete contact; + delete name; + delete address; + delete contactManager; + +} + +//Checks the maptile path retrieval for home address +void MaptileServiceTest::getHomeAddressMapTilePath() +{ + + QContact* contact = new QContact(); + + QContactName* name = new QContactName(); + name->setFirst("first"); + contact->saveDetail(name); + + QContactAddress* address = new QContactAddress(); + address->setContexts(QContactDetail::ContextHome); + address->setPostOfficeBox("81282"); + address->setStreet("Keilalahdentie"); + address->setPostcode("67890"); + address->setLocality("Espoo"); + address->setCountry("Finland"); + contact->saveDetail(address); + + //Save the contact + QContactManager* contactManager = NULL; + contactManager = new QContactManager("symbian"); + contactManager->saveContact( contact ); + + //Wait till maptile operation complete + QTest::qWait( KMapTileFetchTime ); + + //Get the saved id + QContactId savedId = contact->id(); + TUint32 contactId = savedId.localId(); + + //Get the maptile + QString string = CntMapTileService::getMapTileImage( contactId, CntMapTileService::AddressHome ); + + //Construct the QPimap from already stored bitmap + QImage referenceBitmap( "c:\\maptiletest\\homeaddressmap.png" ); + + //Construct the QPixmap from new retrieved bitmap + QImage retrievedBitmap( string ); + + //comapre the bitmaps + QVERIFY( retrievedBitmap == referenceBitmap ); + + + contactManager->removeContact( contactId ); + + delete contact; + delete name; + delete address; + delete contactManager; + +} + +//Checks the maptile path retrieval returns NULL for invalid address +void MaptileServiceTest::checkInvalidContactId() +{ + + QContact* contact = new QContact(); + + QContactName* name = new QContactName(); + name->setFirst("first"); + contact->saveDetail(name); + + //Add some invalid address + QContactAddress* address = new QContactAddress(); + address->setPostOfficeBox("11111"); + address->setStreet("htrtfdsk"); + address->setPostcode("98989"); + address->setLocality("ghwdxnkwnn"); + address->setCountry("Fbsjwskws"); + contact->saveDetail(address); + + //Save the contact + QContactManager* contactManager = NULL; + contactManager = new QContactManager("symbian"); + contactManager->saveContact( contact ); + + //Wait till maptile operation complete + QTest::qWait( KMapTileFetchTime ); + + + //Get the saved id + QContactId savedId = contact->id(); + TUint32 contactId = savedId.localId(); + + //Get the maptile + QString string = CntMapTileService::getMapTileImage( contactId, CntMapTileService::AddressPreference ); + + contactManager->removeContact( contactId ); + + //Maptile path should be NULL for invalid address + QVERIFY( string.isNull() ); + + delete contact; + delete name; + delete address; + delete contactManager; + + +} + + +QTEST_MAIN(MaptileServiceTest) +#include "ut_maptileservice.moc" + + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/ut_maptileservice.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/ut_maptileservice.pro Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,38 @@ +# +# 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: +# + +TEMPLATE = app +QT += testlib + +INCLUDEPATH += inc +INCLUDEPATH += ../inc + +symbian: +{ + :BLD_INF_RULES.prj_exports += "preferredaddressmap.png /epoc32/winscw/c/maptiletest/preferredaddressmap.png" + :BLD_INF_RULES.prj_exports += "workaddressmap.png /epoc32/winscw/c/maptiletest/workaddressmap.png" + :BLD_INF_RULES.prj_exports += "homeaddressmap.png /epoc32/winscw/c/maptiletest/homeaddressmap.png" + SYSTEMINCLUDEPATH += \epoc32\include\stdapis +} + +SOURCES += ut_maptileservice.cpp + + +LIBS += -lcntmaptileservice \ + -lQtContacts + +TARGET.CAPABILITY = ALL -TCB + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/workaddressmap.png Binary file phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/workaddressmap.png has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/cntdbdumper/src/dbsqldumper.cpp --- a/phonebookengines/contactsmodel/cntdbdumper/src/dbsqldumper.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/cntdbdumper/src/dbsqldumper.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -72,6 +72,14 @@ //columns in comm-address table iColumnsIndex.Append(KInitialValue); iNumColumns.Append(KNumColInCommTable); + + //columns in predictive search tables + const TInt KAmountOfPredictiveSearchTables = 10; + for (TInt i = 0; i < KAmountOfPredictiveSearchTables; ++i) + { + iColumnsIndex.Append(KInitialValue); + iNumColumns.Append(KNumColInPredSearchTable); + } } /** @@ -119,6 +127,28 @@ { return KSqlContactCommAddrTableName; } + + case KContactPredSearchTable0Name: + return KSqlContactPredSearchTable0; + case KContactPredSearchTable1Name: + return KSqlContactPredSearchTable1; + case KContactPredSearchTable2Name: + return KSqlContactPredSearchTable2; + case KContactPredSearchTable3Name: + return KSqlContactPredSearchTable3; + case KContactPredSearchTable4Name: + return KSqlContactPredSearchTable4; + case KContactPredSearchTable5Name: + return KSqlContactPredSearchTable5; + case KContactPredSearchTable6Name: + return KSqlContactPredSearchTable6; + case KContactPredSearchTable7Name: + return KSqlContactPredSearchTable7; + case KContactPredSearchTable8Name: + return KSqlContactPredSearchTable8; + case KContactPredSearchTable9Name: + return KSqlContactPredSearchTable9; + default: { return KNullText; @@ -300,6 +330,34 @@ } } break; + case KContactPredSearchTable0Name: //columns in predictive search tables + case KContactPredSearchTable1Name: + case KContactPredSearchTable2Name: + case KContactPredSearchTable3Name: + case KContactPredSearchTable4Name: + case KContactPredSearchTable5Name: + case KContactPredSearchTable6Name: + case KContactPredSearchTable7Name: + case KContactPredSearchTable8Name: + case KContactPredSearchTable9Name: + switch(aColumnIndex) + { + case 0: + return KPredSearchContactId; + case 1: + return KPredSearchNameAsNumber; + case 2: + return KPredSearchNameAsNumber2; + case 3: + return KPredSearchNameAsNumber3; + case 4: + return KPredSearchNameAsNumber4; + case 5: + return KPredSearchFirstName; + case 6: + return KPredSearchLastName; + } + break; } return KNullText; } @@ -697,4 +755,3 @@ __UHEAP_MARKEND; return KErrNone; } - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/cntplsql/inc/cntpplviewmanager.h --- a/phonebookengines/contactsmodel/cntplsql/inc/cntpplviewmanager.h Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/cntplsql/inc/cntpplviewmanager.h Fri Apr 16 14:53:18 2010 +0300 @@ -46,7 +46,7 @@ class NONSHARED CCntPplViewManager : public CBase, public MLplViewIteratorManager { public: - static CCntPplViewManager* NewL(CPplContactsFile& aContactsFile, const CContactTemplate& aSystemTemplate); + static CCntPplViewManager* NewL(CPplContactsFile& aContactsFile, const CLplContactProperties& aContactProperties); ~CCntPplViewManager(); //Methods defined in MLplViewIteratorManager @@ -63,14 +63,14 @@ private: void ConstructL(); - CCntPplViewManager(CPplContactsFile& aContactsFile, const CContactTemplate& aSystemTemplate); + CCntPplViewManager(CPplContactsFile& aContactsFile, const CLplContactProperties& aContactProperties); TInt FindViewSessionIndexById(TInt aViewId) const; CCntPplViewSession* FindViewSessionByIdL(TInt aViewId) const; private: CPplContactsFile& iContactsFile; - const CContactTemplate& iSystemTemplate; + const CLplContactProperties& iContactProperties; TInt iNextViewId; RPointerArray iViewSessions; @@ -81,7 +81,7 @@ class NONSHARED CCntPplViewSession : public CTimer { public: - static CCntPplViewSession* NewL(CPplContactsFile& aContactsFile, const CContactTemplate& aSystemTemplate, CCntSqlStatement& aSelectAllFields, TInt aViewId, const CContactTextDef& aTextDef, TContactViewPreferences aViewPrefs); + static CCntPplViewSession* NewL(CPplContactsFile& aContactsFile, const CLplContactProperties& aContactProperties, CCntSqlStatement& aSelectAllFields, TInt aViewId, const CContactTextDef& aTextDef, TContactViewPreferences aViewPrefs); ~CCntPplViewSession(); void ChangeSortOrderL(const CContactTextDef& aTextDef); @@ -97,7 +97,7 @@ private: void ConstructL(const CContactTextDef& aTextDef); - CCntPplViewSession(CPplContactsFile& aContactsFile, const CContactTemplate& aSystemTemplate, CCntSqlStatement& aSelectAllFields, TInt aViewId, TContactViewPreferences aViewPrefs); + CCntPplViewSession(CPplContactsFile& aContactsFile, const CLplContactProperties& aContactProperties, CCntSqlStatement& aSelectAllFields, TInt aViewId, TContactViewPreferences aViewPrefs); CViewContact* CreateViewItemL(RSqlStatement& aSqlStmt, const CCntSqlStatement& aCntSqlStmt, const TContactViewPreferences& aViewPrefs); void FillViewItemL(CViewContact& aViewContact, RSqlStatement& aSqlStmt, const TContactViewPreferences& aViewPrefs); @@ -115,7 +115,7 @@ void CleanupCachedPrepareStatement(); private: const TInt iViewId; - const CContactTemplate& iSystemTemplate; + const CLplContactProperties& iContactProperties; CPplContactsFile& iContactsFile; CCntSqlStatement& iSqlSmtSelectAllFieldsById; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/cntplsql/inc/cntsqlprovider.h --- a/phonebookengines/contactsmodel/cntplsql/inc/cntsqlprovider.h Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/cntplsql/inc/cntsqlprovider.h Fri Apr 16 14:53:18 2010 +0300 @@ -86,6 +86,8 @@ // aTableName New table name, ownership is transferred void SetTableName(HBufC* aTableName); + void ClearSqlString(); + protected: void ConstructL(const TDesC& aTableName); diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/cntplsql/inc/cpcskeymap.h --- a/phonebookengines/contactsmodel/cntplsql/inc/cpcskeymap.h Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/cntplsql/inc/cpcskeymap.h Fri Apr 16 14:53:18 2010 +0300 @@ -20,13 +20,29 @@ #define __CPCSKEYMAP_H__ -///// Since the real Orbit keymap code crashes, -///// use this hardcoded keymap for now +// If this macro is defined, Orbit code is used to build the keymap. +// But this might crash at startup for unknown reason. +// +// If macro is not defined, a hardcoded keymap is used. That code does not +// crash, but it supports just a limited range of characters. +//#define USE_ORBIT_KEYMAP // INCLUDES +#if defined(USE_ORBIT_KEYMAP) +#include +#include +#endif + #include +// FORWARD DECLARATIONS +#if defined(USE_ORBIT_KEYMAP) +class QString; +class HbInputLanguage; +class HbKeymap; +#endif + // CLASS DECLARATION NONSHARABLE_CLASS(CPcsKeyMap) : public CBase { @@ -44,18 +60,22 @@ /** * Converts a string to a numeric string. * aSource String to be converted - * aPlainConversion ETrue do a simple conversion, without special + * aPlainConversion ETrue Perform a simple conversion, without special * handling for sepator characters - * EFalse add a separator character at the beginning - * and convert spaces to separator characters - * returns Conversion result, ownership is transferred + * EFalse Convert spaces to separator characters + * returns Conversion result, ownership is transferred */ HBufC* GetNumericKeyStringL(const TDesC& aSource, - TBool aPlainConversion) const; + TBool aPlainConversion) const; + +#if defined(USE_ORBIT_KEYMAP) + /* + * Return the separator character. + */ + QChar Separator() const; +#endif private: - TChar GetNumericValueForChar(TChar input) const; - /** * Constructor */ @@ -65,6 +85,49 @@ * Second phase constructor */ void ConstructL(); + +#if defined(USE_ORBIT_KEYMAP) + /** + * Construct mappings between keys and characters. + */ + void ContructKeyboardMappingsL(); + + /** + * Returns a list of languages installed on the phone. + */ + QList AvailableLanguages() const; + + /** + * Returns ETrue if this language is supported + */ + TBool IsLanguageSupported(QLocale::Language aLanguage) const; + + /** + * Returns the numeric key id corresponding to a specific character + * Considers possible multiple matches for some phone variants + */ + TChar KeyForCharacter(const TChar& aChar) const; + + TInt KeyIdToNumber(TInt aKeyId) const; + + TChar ArrayIndexToNumberChar(TInt aArrayIndex) const; + + const HbKeymap* GetKeymap(HbInputLanguage aLanguage) const; +#else // #if defined(USE_ORBIT_KEYMAP) + TChar GetNumericValueForChar(TChar input) const; +#endif // #if defined(USE_ORBIT_KEYMAP) + + private: // Data + +#if defined(USE_ORBIT_KEYMAP) + // One QString for each key of the keyboard (1-9,0). + // Each contains all the characters that can originate from that key, + // considering the languages available on the device. + QList iKeyMapping; +#endif // #if defined(USE_ORBIT_KEYMAP) + + // For unit testing + friend class UT_CPcsKeyMap; }; #endif // __CPCSKEYMAP_H__ diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/cntplsql/inc/dbsqlconstants.h --- a/phonebookengines/contactsmodel/cntplsql/inc/dbsqlconstants.h Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/cntplsql/inc/dbsqlconstants.h Fri Apr 16 14:53:18 2010 +0300 @@ -21,12 +21,14 @@ #include const TInt KInitialValue = -1; -const TInt KNumOfTables = 5; + +// TODO: update this to handle all 10 predictive search tables +const TInt KNumOfTables = 14; const TInt KNumColInPrefTable = 6; const TInt KNumColInContactTable = 16; const TInt KNumColInGroupTable = 3; const TInt KNumColInCommTable = 5; -const TInt KNumColInPredSearchTable = 4; +const TInt KNumColInPredSearchTable = 7; const TInt KNumColInPresenceTable = 5; // tables in the contact database @@ -34,7 +36,16 @@ _LIT(KSqlContactGroupTableName,"groups"); _LIT(KSqlContactPrefTableName,"preferences"); _LIT(KSqlContactCommAddrTableName,"comm_addr"); -_LIT(KSqlContactPredSearchTableName,"predictivesearch"); +_LIT(KSqlContactPredSearchTable0,"predictivesearch0"); +_LIT(KSqlContactPredSearchTable1,"predictivesearch1"); +_LIT(KSqlContactPredSearchTable2,"predictivesearch2"); +_LIT(KSqlContactPredSearchTable3,"predictivesearch3"); +_LIT(KSqlContactPredSearchTable4,"predictivesearch4"); +_LIT(KSqlContactPredSearchTable5,"predictivesearch5"); +_LIT(KSqlContactPredSearchTable6,"predictivesearch6"); +_LIT(KSqlContactPredSearchTable7,"predictivesearch7"); +_LIT(KSqlContactPredSearchTable8,"predictivesearch8"); +_LIT(KSqlContactPredSearchTable9,"predictivesearch9"); _LIT(KSqlContactPresenceTableName, "presence"); enum TDatabaseTables @@ -43,7 +54,16 @@ EContactTableName, EContactGroupTableName, EContactCommAddressTableName, - KContactPredSearchTableName + KContactPredSearchTable0Name, + KContactPredSearchTable1Name, + KContactPredSearchTable2Name, + KContactPredSearchTable3Name, + KContactPredSearchTable4Name, + KContactPredSearchTable5Name, + KContactPredSearchTable6Name, + KContactPredSearchTable7Name, + KContactPredSearchTable8Name, + KContactPredSearchTable9Name }; // columns for contact table @@ -147,69 +167,169 @@ // predictive search table // columns -_LIT(KPredSearchFirstNameAsNumber, "first_name_as_number"); -_LIT(KPredSearchLastNameAsNumber, "last_name_as_number"); -_LIT(KPredSearchCompanyNameAsNumber, "company_name_as_number"); _LIT(KPredSearchContactId, "contact_id"); -// Do not store names. They can be looked up from contact table. -// Do not store phone number. It can be searched from comm-address table. +_LIT(KPredSearchNameAsNumber, "nbr"); +_LIT(KPredSearchNameAsNumber2, "nbr2"); +_LIT(KPredSearchNameAsNumber3, "nbr3"); +_LIT(KPredSearchNameAsNumber4, "nbr4"); +_LIT(KPredSearchFirstName, "first_name"); +_LIT(KPredSearchLastName, "last_name"); // parameters -_LIT(KPredSearchFirstNameAsNumberParam, ":first_name_as_number"); -_LIT(KPredSearchLastNameAsNumberParam, ":last_name_as_number"); -_LIT(KPredSearchCompanyNameAsNumberParam, ":company_name_as_number"); _LIT(KPredSearchContactIdParam, ":contact_id"); +_LIT(KPredSearchNameAsNumberParam, ":nbr"); +_LIT(KPredSearchNameAsNumber2Param, ":nbr2"); +_LIT(KPredSearchNameAsNumber3Param, ":nbr3"); +_LIT(KPredSearchNameAsNumber4Param, ":nbr4"); +_LIT(KPredSearchFirstNameParam, ":first_name"); +_LIT(KPredSearchLastNameParam, ":last_name"); // create statements -_LIT(KPredSearchCreateStmnt, -"CREATE TABLE predictivesearch (first_name_as_number VARCHAR(255) NULL,\ - last_name_as_number VARCHAR(255) NULL,\ - company_name_as_number VARCHAR(255) NULL, contact_id INTEGER);"); - -// create table index -_LIT(KPredSearchCreateIndex, -"CREATE INDEX index_last_name_as_number \ -on predictivesearch (last_name_as_number, first_name_as_number );"); - -_LIT(KPredSearchCreateView1, -"CREATE VIEW view1 AS SELECT contact_id, last_name_as_number, first_name_as_number FROM predictivesearch \ -WHERE (first_name_as_number LIKE \"%% 1%%\") OR (last_name_as_number LIKE \"%% 1%%\")"); +_LIT(KPredSearchCreateTable0Stmnt, +"CREATE TABLE predictivesearch0 (contact_id INTEGER PRIMARY KEY,\ + nbr BIGINT NULL, nbr2 BIGINT NULL, nbr3 BIGINT NULL, nbr4 BIGINT NULL,\ + first_name CHAR(16) NULL, last_name CHAR(16) NULL);"); +_LIT(KPredSearchCreateTable1Stmnt, +"CREATE TABLE predictivesearch1 (contact_id INTEGER PRIMARY KEY,\ + nbr BIGINT NULL, nbr2 BIGINT NULL, nbr3 BIGINT NULL, nbr4 BIGINT NULL,\ + first_name CHAR(16) NULL, last_name CHAR(16) NULL);"); +_LIT(KPredSearchCreateTable2Stmnt, +"CREATE TABLE predictivesearch2 (contact_id INTEGER PRIMARY KEY,\ + nbr BIGINT NULL, nbr2 BIGINT NULL, nbr3 BIGINT NULL, nbr4 BIGINT NULL,\ + first_name CHAR(16) NULL, last_name CHAR(16) NULL);"); +_LIT(KPredSearchCreateTable3Stmnt, +"CREATE TABLE predictivesearch3 (contact_id INTEGER PRIMARY KEY,\ + nbr BIGINT NULL, nbr2 BIGINT NULL, nbr3 BIGINT NULL, nbr4 BIGINT NULL,\ + first_name CHAR(16) NULL, last_name CHAR(16) NULL);"); +_LIT(KPredSearchCreateTable4Stmnt, +"CREATE TABLE predictivesearch4 (contact_id INTEGER PRIMARY KEY,\ + nbr BIGINT NULL, nbr2 BIGINT NULL, nbr3 BIGINT NULL, nbr4 BIGINT NULL,\ + first_name CHAR(16) NULL, last_name CHAR(16) NULL);"); +_LIT(KPredSearchCreateTable5Stmnt, +"CREATE TABLE predictivesearch5 (contact_id INTEGER PRIMARY KEY,\ + nbr BIGINT NULL, nbr2 BIGINT NULL, nbr3 BIGINT NULL, nbr4 BIGINT NULL,\ + first_name CHAR(16) NULL, last_name CHAR(16) NULL);"); +_LIT(KPredSearchCreateTable6Stmnt, +"CREATE TABLE predictivesearch6 (contact_id INTEGER PRIMARY KEY,\ + nbr BIGINT NULL, nbr2 BIGINT NULL, nbr3 BIGINT NULL, nbr4 BIGINT NULL,\ + first_name CHAR(16) NULL, last_name CHAR(16) NULL);"); +_LIT(KPredSearchCreateTable7Stmnt, +"CREATE TABLE predictivesearch7 (contact_id INTEGER PRIMARY KEY,\ + nbr BIGINT NULL, nbr2 BIGINT NULL, nbr3 BIGINT NULL, nbr4 BIGINT NULL,\ + first_name CHAR(16) NULL, last_name CHAR(16) NULL);"); +_LIT(KPredSearchCreateTable8Stmnt, +"CREATE TABLE predictivesearch8 (contact_id INTEGER PRIMARY KEY,\ + nbr BIGINT NULL, nbr2 BIGINT NULL, nbr3 BIGINT NULL, nbr4 BIGINT NULL,\ + first_name CHAR(16) NULL, last_name CHAR(16) NULL);"); +_LIT(KPredSearchCreateTable9Stmnt, +"CREATE TABLE predictivesearch9 (contact_id INTEGER PRIMARY KEY,\ + nbr BIGINT NULL, nbr2 BIGINT NULL, nbr3 BIGINT NULL, nbr4 BIGINT NULL,\ + first_name CHAR(16) NULL, last_name CHAR(16) NULL);"); -_LIT(KPredSearchCreateView2, -"CREATE VIEW view2 AS SELECT contact_id, last_name_as_number, first_name_as_number FROM predictivesearch \ -WHERE (first_name_as_number LIKE \"%% 2%%\") OR (last_name_as_number LIKE \"%% 2%%\")"); + +// create table indexes +_LIT(KPredSearchCreateNbrIndexTable0, "CREATE INDEX index0_nbr on predictivesearch0 (nbr);"); +_LIT(KPredSearchCreateNbr2IndexTable0, "CREATE INDEX index0_nbr2 on predictivesearch0 (nbr2);"); +_LIT(KPredSearchCreateNbr3IndexTable0, "CREATE INDEX index0_nbr3 on predictivesearch0 (nbr3);"); +_LIT(KPredSearchCreateNbr4IndexTable0, "CREATE INDEX index0_nbr4 on predictivesearch0 (nbr4);"); + +_LIT(KPredSearchCreateNbrIndexTable1, "CREATE INDEX index1_nbr on predictivesearch1 (nbr);"); +_LIT(KPredSearchCreateNbr2IndexTable1, "CREATE INDEX index1_nbr2 on predictivesearch1 (nbr2);"); +_LIT(KPredSearchCreateNbr3IndexTable1, "CREATE INDEX index1_nbr3 on predictivesearch1 (nbr3);"); +_LIT(KPredSearchCreateNbr4IndexTable1, "CREATE INDEX index1_nbr4 on predictivesearch1 (nbr4);"); -_LIT(KPredSearchCreateView3, -"CREATE VIEW view3 AS SELECT contact_id, last_name_as_number, first_name_as_number FROM predictivesearch \ -WHERE (first_name_as_number LIKE \"%% 3%%\") OR (last_name_as_number LIKE \"%% 3%%\")"); +_LIT(KPredSearchCreateNbrIndexTable2, "CREATE INDEX index2_nbr on predictivesearch2 (nbr);"); +_LIT(KPredSearchCreateNbr2IndexTable2, "CREATE INDEX index2_nbr2 on predictivesearch2 (nbr2);"); +_LIT(KPredSearchCreateNbr3IndexTable2, "CREATE INDEX index2_nbr3 on predictivesearch2 (nbr3);"); +_LIT(KPredSearchCreateNbr4IndexTable2, "CREATE INDEX index2_nbr4 on predictivesearch2 (nbr4);"); + +_LIT(KPredSearchCreateNbrIndexTable3, "CREATE INDEX index3_nbr on predictivesearch3 (nbr);"); +_LIT(KPredSearchCreateNbr2IndexTable3, "CREATE INDEX index3_nbr2 on predictivesearch3 (nbr2);"); +_LIT(KPredSearchCreateNbr3IndexTable3, "CREATE INDEX index3_nbr3 on predictivesearch3 (nbr3);"); +_LIT(KPredSearchCreateNbr4IndexTable3, "CREATE INDEX index3_nbr4 on predictivesearch3 (nbr4);"); + +_LIT(KPredSearchCreateNbrIndexTable4, "CREATE INDEX index4_nbr on predictivesearch4 (nbr);"); +_LIT(KPredSearchCreateNbr2IndexTable4, "CREATE INDEX index4_nbr2 on predictivesearch4 (nbr2);"); +_LIT(KPredSearchCreateNbr3IndexTable4, "CREATE INDEX index4_nbr3 on predictivesearch4 (nbr3);"); +_LIT(KPredSearchCreateNbr4IndexTable4, "CREATE INDEX index4_nbr4 on predictivesearch4 (nbr4);"); + +_LIT(KPredSearchCreateNbrIndexTable5, "CREATE INDEX index5_nbr on predictivesearch5 (nbr);"); +_LIT(KPredSearchCreateNbr2IndexTable5, "CREATE INDEX index5_nbr2 on predictivesearch5 (nbr2);"); +_LIT(KPredSearchCreateNbr3IndexTable5, "CREATE INDEX index5_nbr3 on predictivesearch5 (nbr3);"); +_LIT(KPredSearchCreateNbr4IndexTable5, "CREATE INDEX index5_nbr4 on predictivesearch5 (nbr4);"); -_LIT(KPredSearchCreateView4, -"CREATE VIEW view4 AS SELECT contact_id, last_name_as_number, first_name_as_number FROM predictivesearch \ -WHERE (first_name_as_number LIKE \"%% 4%%\") OR (last_name_as_number LIKE \"%% 4%%\")"); +_LIT(KPredSearchCreateNbrIndexTable6, "CREATE INDEX index6_nbr on predictivesearch6 (nbr);"); +_LIT(KPredSearchCreateNbr2IndexTable6, "CREATE INDEX index6_nbr2 on predictivesearch6 (nbr2);"); +_LIT(KPredSearchCreateNbr3IndexTable6, "CREATE INDEX index6_nbr3 on predictivesearch6 (nbr3);"); +_LIT(KPredSearchCreateNbr4IndexTable6, "CREATE INDEX index6_nbr4 on predictivesearch6 (nbr4);"); + +_LIT(KPredSearchCreateNbrIndexTable7, "CREATE INDEX index7_nbr on predictivesearch7 (nbr);"); +_LIT(KPredSearchCreateNbr2IndexTable7, "CREATE INDEX index7_nbr2 on predictivesearch7 (nbr2);"); +_LIT(KPredSearchCreateNbr3IndexTable7, "CREATE INDEX index7_nbr3 on predictivesearch7 (nbr3);"); +_LIT(KPredSearchCreateNbr4IndexTable7, "CREATE INDEX index7_nbr4 on predictivesearch7 (nbr4);"); + +_LIT(KPredSearchCreateNbrIndexTable8, "CREATE INDEX index8_nbr on predictivesearch8 (nbr);"); +_LIT(KPredSearchCreateNbr2IndexTable8, "CREATE INDEX index8_nbr2 on predictivesearch8 (nbr2);"); +_LIT(KPredSearchCreateNbr3IndexTable8, "CREATE INDEX index8_nbr3 on predictivesearch8 (nbr3);"); +_LIT(KPredSearchCreateNbr4IndexTable8, "CREATE INDEX index8_nbr4 on predictivesearch8 (nbr4);"); -_LIT(KPredSearchCreateView5, -"CREATE VIEW view5 AS SELECT contact_id, last_name_as_number, first_name_as_number FROM predictivesearch \ -WHERE (first_name_as_number LIKE \"%% 5%%\") OR (last_name_as_number LIKE \"%% 5%%\")"); +_LIT(KPredSearchCreateNbrIndexTable9, "CREATE INDEX index9_nbr on predictivesearch9 (nbr);"); +_LIT(KPredSearchCreateNbr2IndexTable9, "CREATE INDEX index9_nbr2 on predictivesearch9 (nbr2);"); +_LIT(KPredSearchCreateNbr3IndexTable9, "CREATE INDEX index9_nbr3 on predictivesearch9 (nbr3);"); +_LIT(KPredSearchCreateNbr4IndexTable9, "CREATE INDEX index9_nbr4 on predictivesearch9 (nbr4);"); -_LIT(KPredSearchCreateView6, -"CREATE VIEW view6 AS SELECT contact_id, last_name_as_number, first_name_as_number FROM predictivesearch \ -WHERE (first_name_as_number LIKE \"%% 6%%\") OR (last_name_as_number LIKE \"%% 6%%\")"); +// create table indexes for readable names for ordering results alphabetically +_LIT(KPredSearchCreateFNIndexInTable0, +"CREATE INDEX index_last_name0 on predictivesearch0 (last_name);"); +_LIT(KPredSearchCreateLNIndexInTable0, +"CREATE INDEX index_first_name0 on predictivesearch0 (first_name);"); + +_LIT(KPredSearchCreateFNIndexInTable1, +"CREATE INDEX index_last_name1 on predictivesearch1 (last_name);"); +_LIT(KPredSearchCreateLNIndexInTable1, +"CREATE INDEX index_first_name1 on predictivesearch1 (first_name);"); + +_LIT(KPredSearchCreateFNIndexInTable2, +"CREATE INDEX index_last_name2 on predictivesearch2 (last_name);"); +_LIT(KPredSearchCreateLNIndexInTable2, +"CREATE INDEX index_first_name2 on predictivesearch2 (first_name);"); -_LIT(KPredSearchCreateView7, -"CREATE VIEW view7 AS SELECT contact_id, last_name_as_number, first_name_as_number FROM predictivesearch \ -WHERE (first_name_as_number LIKE \"%% 7%%\") OR (last_name_as_number LIKE \"%% 7%%\")"); +_LIT(KPredSearchCreateFNIndexInTable3, +"CREATE INDEX index_last_name3 on predictivesearch3 (last_name);"); +_LIT(KPredSearchCreateLNIndexInTable3, +"CREATE INDEX index_first_name3 on predictivesearch3 (first_name);"); -_LIT(KPredSearchCreateView8, -"CREATE VIEW view8 AS SELECT contact_id, last_name_as_number, first_name_as_number FROM predictivesearch \ -WHERE (first_name_as_number LIKE \"%% 8%%\") OR (last_name_as_number LIKE \"%% 8%%\")"); +_LIT(KPredSearchCreateFNIndexInTable4, +"CREATE INDEX index_last_name4 on predictivesearch4 (last_name);"); +_LIT(KPredSearchCreateLNIndexInTable4, +"CREATE INDEX index_first_name4 on predictivesearch4 (first_name);"); + +_LIT(KPredSearchCreateFNIndexInTable5, +"CREATE INDEX index_last_name5 on predictivesearch5 (last_name);"); +_LIT(KPredSearchCreateLNIndexInTable5, +"CREATE INDEX index_first_name5 on predictivesearch5 (first_name);"); -_LIT(KPredSearchCreateView9, -"CREATE VIEW view9 AS SELECT contact_id, last_name_as_number, first_name_as_number FROM predictivesearch \ -WHERE (first_name_as_number LIKE \"%% 9%%\") OR (last_name_as_number LIKE \"%% 9%%\")"); +_LIT(KPredSearchCreateFNIndexInTable6, +"CREATE INDEX index_last_name6 on predictivesearch6 (last_name);"); +_LIT(KPredSearchCreateLNIndexInTable6, +"CREATE INDEX index_first_name6 on predictivesearch6 (first_name);"); + +_LIT(KPredSearchCreateFNIndexInTable7, +"CREATE INDEX index_last_name7 on predictivesearch7 (last_name);"); +_LIT(KPredSearchCreateLNIndexInTable7, +"CREATE INDEX index_first_name7 on predictivesearch7 (first_name);"); -_LIT(KPredSearchCreateView0, -"CREATE VIEW view0 AS SELECT contact_id, last_name_as_number, first_name_as_number FROM predictivesearch \ -WHERE (first_name_as_number LIKE \"%% 0%%\") OR (last_name_as_number LIKE \"%% 0%%\")"); +_LIT(KPredSearchCreateFNIndexInTable8, +"CREATE INDEX index_last_name8 on predictivesearch8 (last_name);"); +_LIT(KPredSearchCreateLNIndexInTable8, +"CREATE INDEX index_first_name8 on predictivesearch8 (first_name);"); + +_LIT(KPredSearchCreateFNIndexInTable9, +"CREATE INDEX index_last_name9 on predictivesearch9 (last_name);"); +_LIT(KPredSearchCreateLNIndexInTable9, +"CREATE INDEX index_first_name9 on predictivesearch9 (first_name);"); + + _LIT(KPresenceContactId, "contact_id"); _LIT(KPresenceAccountUri, "account_uri"); diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/cntplsql/inc/pltables.h --- a/phonebookengines/contactsmodel/cntplsql/inc/pltables.h Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/cntplsql/inc/pltables.h Fri Apr 16 14:53:18 2010 +0300 @@ -37,6 +37,8 @@ #include #include +#include +#include class CPcsKeyMap; @@ -321,15 +323,52 @@ private: void ConstructL(); CPplPredictiveSearchTable(RSqlDatabase& aDatabase); - void WriteToDbL(const CContactItem& aItem, CCntSqlStatement* aStatement); - HBufC* ConvertToNumericRepresentationLC( const TDesC& aString /*, key map */ ); + void WriteToDbL(const CContactItem& aItem); + + // aFirstNameAsNbr OUT: Pointer to first name converted to numbers, + // pushed to cleanupstack. Ownership is transferred. + // aLastNameAsNbr OUT: Pointer to last name converted to numbers, + // pushed to cleanupstack. Ownership is transferred. + // aFirstName OUT: Pointer to the first N characters of first name, + // pushed to cleanupstack. Ownership is transferred. + // aLastName OUT: Pointer to the first N characters of last name, + // pushed to cleanupstack. Ownership is transferred. + void GetFieldsLC(const CContactItem& aItem, + HBufC** aFirstNameAsNbr, + HBufC** aLastNameAsNbr, + HBufC** aFirstName, + HBufC** aLastName) const; + + // aFirstName ownership is not transferred + // aLastName ownership is not transferred + QList DetermineTables(HBufC* aFirstName, HBufC* aLastName) const; + QList DetermineTables(QStringList aTokens) const; + + // aString ownership is not transferred + void AddBeginningCharacters(HBufC* aString, QList& aTables) const; + + // aString ownership is not transferred + void AddTokens(HBufC* aString, QStringList& aTokens) const; + + TBool IsValidChar(TInt aChar) const; + TBool IsValidChar(QChar aChar) const; + + // aFirstName ownership is not transferred + // aLastName ownership is not transferred + QStringList GetNumericTokens(HBufC* aFirstName, HBufC* aLastName) const; + void GetNextToken(QStringList& aSource, QStringList& aDestination) const; + void DeleteFromAllTablesL(TContactItemId aContactId, + TBool& aLowDiskErrorOccurred) const; + + // Return next table's name, ownership is transferred + HBufC* GetTableNameL(QList& aTables) const; + + quint64 ConvertToHex(QString aToken) const; private: // Owned CCntSqlStatement* iInsertStmnt; // Owned - CCntSqlStatement* iUpdateStmnt; - // Owned CCntSqlStatement* iDeleteStmnt; // Owned CPcsKeyMap* iKeyMap; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/cntplsql/inc/pplcontactitemmanager.h --- a/phonebookengines/contactsmodel/cntplsql/inc/pplcontactitemmanager.h Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/cntplsql/inc/pplcontactitemmanager.h Fri Apr 16 14:53:18 2010 +0300 @@ -37,6 +37,7 @@ class CPplTableBase; class CPplPreferencesPersistor; +class CPplPredictiveSearchTable; /** The CPplContactItemManager implements the MLplPersistenceBroker. @@ -77,7 +78,8 @@ TInt CardTemplatePrefIdL() const; void SetCardTemplatePrefIdL(TInt aCardTemplatePrefId); void SynchronizePredSearchTableL(); - + void RecreatePredSearchTablesL(); + private: CPplContactItemManager(RSqlDatabase& aDatabase, MLplTransactionManager& aTransactionManager, CLplContactProperties& aContactProperties, RPplIccContactStore& aIccContactStore); void ConstructL(); @@ -90,7 +92,9 @@ void DeleteInLowDiskConditionL(CPplTableBase* aTable, CContactItem* aContactItem); TBool DoesPredSearchTableExistL() const; - + void CreatePredSearchTablesL(); + void DeletePredSearchTablesL(); + private: RSqlDatabase& iDatabase; // CPplContactItemManager does not own the RSqlDatabase object MLplTransactionManager& iTransactionManager; @@ -100,7 +104,7 @@ CPplTableBase* iContactTable; CPplTableBase* iGroupTable; CPplTableBase* iCommAddrTable; - CPplTableBase* iPredSearchTable; + CPplPredictiveSearchTable* iPredSearchTable; CPplTableBase* iPresenceTable; CPplPreferencesPersistor* iPreferencePersistor; RPplIccContactStore& iIccContactStore; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/cntplsql/src/cntpplviewmanager.cpp --- a/phonebookengines/contactsmodel/cntplsql/src/cntpplviewmanager.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/cntplsql/src/cntpplviewmanager.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -33,9 +33,9 @@ /** Object factory method. */ -CCntPplViewManager* CCntPplViewManager::NewL(CPplContactsFile& aContactsFile, const CContactTemplate& aSystemTemplate) +CCntPplViewManager* CCntPplViewManager::NewL(CPplContactsFile& aContactsFile, const CLplContactProperties& aContactProperties) { - CCntPplViewManager* manager = new (ELeave) CCntPplViewManager(aContactsFile, aSystemTemplate); + CCntPplViewManager* manager = new (ELeave) CCntPplViewManager(aContactsFile, aContactProperties); CleanupStack::PushL(manager); manager->ConstructL(); CleanupStack::Pop(manager); @@ -46,9 +46,9 @@ /** CCntPplViewManager first phase constructor. */ -CCntPplViewManager::CCntPplViewManager(CPplContactsFile& aContactsFile, const CContactTemplate& aSystemTemplate) +CCntPplViewManager::CCntPplViewManager(CPplContactsFile& aContactsFile, const CLplContactProperties& aContactProperties) : iContactsFile(aContactsFile), - iSystemTemplate(aSystemTemplate), + iContactProperties(aContactProperties), iNextViewId(KPLViewSessionIdNull + 1), iViewSessions(KViewSessionsGranularity) { @@ -113,7 +113,8 @@ */ TInt CCntPplViewManager::OpenViewL(const CContactTextDef& aTextDef, const TContactViewPreferences aViewPrefs) { - CCntPplViewSession* viewSession = CCntPplViewSession::NewL(iContactsFile, iSystemTemplate, *iSelectFullFieldsStmt, iNextViewId, aTextDef, aViewPrefs); + CCntPplViewSession* viewSession = CCntPplViewSession::NewL(iContactsFile, + iContactProperties, *iSelectFullFieldsStmt, iNextViewId, aTextDef, aViewPrefs); CleanupStack::PushL(viewSession); iViewSessions.AppendL(viewSession); CleanupStack::Pop(viewSession); @@ -310,7 +311,7 @@ CContactDatabase::TTextFieldMinimal textFieldMin; textDefItem = aTextDef[i]; // Populate the TTextFieldMinimal. - CCntPplViewSession::TextFieldL(contactSqlStmt, *iSelectFullFieldsStmt, iSystemTemplate, textDefItem.iFieldType, textFieldMin); + CCntPplViewSession::TextFieldL(contactSqlStmt, *iSelectFullFieldsStmt, iContactProperties.SystemTemplateL(), textDefItem.iFieldType, textFieldMin); // Append the returned text. if (textFieldMin.Length() > 0) { @@ -331,11 +332,11 @@ CContactDatabase::TTextFieldMinimal textFieldMin; if (aTextDef.FallbackField() != KUidContactFieldNone) { - CCntPplViewSession::TextFieldL(contactSqlStmt, *iSelectFullFieldsStmt, iSystemTemplate, aTextDef.FallbackField(), textFieldMin); + CCntPplViewSession::TextFieldL(contactSqlStmt, *iSelectFullFieldsStmt, iContactProperties.SystemTemplateL(), aTextDef.FallbackField(), textFieldMin); } if(textFieldMin.Length() == 0) // No results from call to TextFieldL()? { - CCntPplViewSession::TextFieldL(contactSqlStmt, *iSelectFullFieldsStmt, iSystemTemplate, KUidContactFieldMatchAll, textFieldMin); + CCntPplViewSession::TextFieldL(contactSqlStmt, *iSelectFullFieldsStmt, iContactProperties.SystemTemplateL(), KUidContactFieldMatchAll, textFieldMin); } aResult.Append(textFieldMin.Left(Min(aResult.MaxLength(),textFieldMin.Length()))); } @@ -391,7 +392,7 @@ User::LeaveIfError(err); - CCntPplViewSession::TextFieldL(contactSqlStmt, *iSelectFullFieldsStmt, iSystemTemplate, aFieldType, aText); + CCntPplViewSession::TextFieldL(contactSqlStmt, *iSelectFullFieldsStmt, iContactProperties.SystemTemplateL(), aFieldType, aText); CleanupStack::PopAndDestroy(&contactSqlStmt); } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/cntplsql/src/cntpplviewsession.cpp --- a/phonebookengines/contactsmodel/cntplsql/src/cntpplviewsession.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/cntplsql/src/cntpplviewsession.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -31,9 +31,9 @@ /** Object factory method. */ -CCntPplViewSession* CCntPplViewSession::NewL(CPplContactsFile& aContactsFile, const CContactTemplate& aSystemTemplate, CCntSqlStatement& aSelectAllFields, TInt aViewId, const CContactTextDef& aTextDef, const TContactViewPreferences aViewPrefs) +CCntPplViewSession* CCntPplViewSession::NewL(CPplContactsFile& aContactsFile, const CLplContactProperties& aContactProperties, CCntSqlStatement& aSelectAllFields, TInt aViewId, const CContactTextDef& aTextDef, const TContactViewPreferences aViewPrefs) { - CCntPplViewSession* viewSession = new (ELeave) CCntPplViewSession(aContactsFile, aSystemTemplate, aSelectAllFields, aViewId, aViewPrefs); + CCntPplViewSession* viewSession = new (ELeave) CCntPplViewSession(aContactsFile, aContactProperties, aSelectAllFields, aViewId, aViewPrefs); CleanupStack::PushL(viewSession); viewSession->ConstructL(aTextDef); CleanupStack::Pop(viewSession); @@ -44,10 +44,10 @@ /** CCntPplViewSession first phase constructor. */ -CCntPplViewSession::CCntPplViewSession(CPplContactsFile& aContactsFile, const CContactTemplate& aSystemTemplate, CCntSqlStatement& aSelectAllFields, TInt aViewId, TContactViewPreferences aViewPrefs) +CCntPplViewSession::CCntPplViewSession(CPplContactsFile& aContactsFile, const CLplContactProperties& aContactProperties, CCntSqlStatement& aSelectAllFields, TInt aViewId, TContactViewPreferences aViewPrefs) : CTimer(CActive::EPriorityIdle), iViewId(aViewId), - iSystemTemplate(aSystemTemplate), + iContactProperties(aContactProperties), iContactsFile(aContactsFile), iSqlSmtSelectAllFieldsById(aSelectAllFields), iViewPrefs(aViewPrefs) @@ -349,7 +349,7 @@ /* set first field with possible content for group or unsorted contact */ CContactDatabase::TTextFieldMinimal buf; - TextFieldL(contactSqlStmt, iSqlSmtSelectAllFieldsById, iSystemTemplate, typeUid, buf); + TextFieldL(contactSqlStmt, iSqlSmtSelectAllFieldsById, iContactProperties.SystemTemplateL(), typeUid, buf); viewContact->SetFirstFieldForBlankContactL(buf); CleanupStack::PopAndDestroy(&contactSqlStmt); } //if(typeUid != 0) @@ -402,7 +402,7 @@ TPtrC textFieldPtrC = aSqlStmt.ColumnTextL(iCntSqlStatement->ParameterIndex(KContactTextFields())); HBufC* textFieldsBuf = textFieldPtrC.AllocLC(); - TCntPersistenceUtility::ReadTextBlobL(textHeaderStoreStream, textFieldsBuf, *iTextDef, iSystemTemplate, fields, searchFastAccessFields); + TCntPersistenceUtility::ReadTextBlobL(textHeaderStoreStream, textFieldsBuf, *iTextDef, iContactProperties.SystemTemplateL(), fields, searchFastAccessFields); CleanupStack::PopAndDestroy(4, &textHeaderStream); //textHeaderStore, textHeaderStream, textHeaderStoreStream, textFieldsBuf // Loop through fields, checking for fields from fast access fields, and add diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/cntplsql/src/cntsqlprovider.cpp --- a/phonebookengines/contactsmodel/cntplsql/src/cntsqlprovider.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/cntplsql/src/cntsqlprovider.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -301,11 +301,8 @@ void CCntSqlStatement::SetConditionL(const TDesC& aCondition) { ClearCondition(); - - iCondition = aCondition.AllocL(); - iProcessed = EFalse; - delete iSqlString; - iSqlString = NULL; + iCondition = aCondition.AllocL(); + ClearSqlString(); } /** @@ -317,9 +314,7 @@ { delete iCondition; iCondition = NULL; - iProcessed = EFalse; - delete iSqlString; - iSqlString = NULL; + ClearSqlString(); } } @@ -334,12 +329,10 @@ delete iCondition; iCondition = NULL; - delete iSqlString; - iSqlString = NULL; + ClearSqlString(); iParams->Reset(); - iValues->Reset(); - iProcessed = EFalse; + iValues->Reset(); } /** @@ -393,10 +386,15 @@ iTableName = aTableName; // Table name changes, so SQL statement must be re-generated - iProcessed = EFalse; + ClearSqlString(); + } + +void CCntSqlStatement::ClearSqlString() + { + iProcessed = EFalse; delete iSqlString; iSqlString = NULL; - } + } /** Creates a concrete CCntSqlUpdate object (used to retrieve sql update statements) diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/cntplsql/src/cpcskeymap.cpp --- a/phonebookengines/contactsmodel/cntplsql/src/cpcskeymap.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/cntplsql/src/cpcskeymap.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -17,47 +17,84 @@ // INCLUDE FILES #include "cpcskeymap.h" -// Treat space as sepator +#if defined(USE_ORBIT_KEYMAP) +#include +#include +#include +#include +#endif // #if defined(USE_ORBIT_KEYMAP) + + +#if defined(_DEBUG) +#include // RDebug + +#define PRINT(x) RDebug::Print(x) +#define PRINT1(x,y) RDebug::Print(x,y) +#define PRINT2(x,y,z) RDebug::Print(x,y,z) +#define PRINT3(w,x,y,z) RDebug::Print(w,x,y,z) +#else // #if defined(_DEBUG) +#define PRINT(x) +#define PRINT1(x,y) +#define PRINT2(x,y,z) +#define PRINT3(w,x,y,z) +#endif // #if defined(_DEBUG) + + #define KSpaceChar ' ' +#if defined(USE_ORBIT_KEYMAP) +#define KSeparatorChar ' ' +#endif // #if defined(USE_ORBIT_KEYMAP) + // Separator character stored in predictive search table columns _LIT(KSeparator, " "); +#if defined(USE_ORBIT_KEYMAP) +// How many keys have mappings (keys 0..9 have mapping) +const TInt KAmountOfKeys = 10; + +// The first key of the keyboard has value zero ('1' in the 12-key virtual keypad) +enum TKeyId + { + EKey1 = 0, + EKey2, + EKey3, + EKey4, + EKey5, + EKey6, + EKey7, + EKey8, + EKey9, + EKey0 + }; +#endif // #if defined(USE_ORBIT_KEYMAP) // ============================== MEMBER FUNCTIONS ============================ // ---------------------------------------------------------------------------- // CPcsKeyMap::NewL -// Two Phase Construction // ---------------------------------------------------------------------------- CPcsKeyMap* CPcsKeyMap::NewL() { + PRINT( _L("Enter CPcsKeyMap::NewL") ); + CPcsKeyMap* self = new ( ELeave ) CPcsKeyMap(); CleanupStack::PushL( self ); self->ConstructL(); CleanupStack::Pop( self ); + + PRINT( _L("End CPcsKeyMap::NewL") ); return self; - } - -// ---------------------------------------------------------------------------- -// CPcsKeyMap::CPcsKeyMap -// Constructor -// ---------------------------------------------------------------------------- -CPcsKeyMap::CPcsKeyMap() - { - } - -void CPcsKeyMap::ConstructL() - { } // ---------------------------------------------------------------------------- // CPcsKeyMap::~CPcsKeyMap -// Destructor // ---------------------------------------------------------------------------- CPcsKeyMap::~CPcsKeyMap() - { - } + { + PRINT( _L("Enter CPcsKeyMap::~CPcsKeyMap") ); + PRINT( _L("End CPcsKeyMap::~CPcsKeyMap") ); + } // ---------------------------------------------------------------------------- // CPcsKeyMap::GetNumericKeyStringL @@ -67,40 +104,292 @@ HBufC* CPcsKeyMap::GetNumericKeyStringL(const TDesC& aSource, TBool aPlainConversion) const { + PRINT1( _L("Enter CPcsKeyMap::GetNumericKeyStringL input '%S'"), &aSource ); + TInt length = aSource.Length(); - if (!aPlainConversion) - { - ++length; // One extra character for leading separator - } HBufC* destination = HBufC::NewL(length); TPtr ptr = destination->Des(); - if (!aPlainConversion) - { - ptr.Append(KSeparator); - } - - for (TInt i = 0; i < aSource.Length(); ++i) + for (TInt i = 0; i < aSource.Length(); ++i) { - if (!aPlainConversion && aSource[i] == KSpaceChar) - { - ptr.Append(KSeparator); - } - else - { + if (!aPlainConversion && aSource[i] == KSpaceChar) + { + ptr.Append(KSeparator); + } + else + { +#if defined(USE_ORBIT_KEYMAP) + ptr.Append(KeyForCharacter(aSource[i])); +#else TChar a = aSource[i]; TChar b = a.GetUpperCase(); ptr.Append(GetNumericValueForChar(b)); - } +#endif + } } + PRINT1( _L("End CPcsKeyMap::GetNumericKeyStringL result '%S'"), destination ); return destination; } +#if defined(USE_ORBIT_KEYMAP) +// ---------------------------------------------------------------------------- +// CPcsKeyMap::Separator +// ---------------------------------------------------------------------------- +QChar CPcsKeyMap::Separator() const + { + return KSeparatorChar; + } + +// ---------------------------------------------------------------------------- +// CPcsKeyMap::CPcsKeyMap +// Fill QList with empty strings +// ---------------------------------------------------------------------------- +CPcsKeyMap::CPcsKeyMap() : + iKeyMapping() + { + for (TInt i = 0; i < KAmountOfKeys; ++i) + { + iKeyMapping << QString(""); + } + } + +// ---------------------------------------------------------------------------- +// CPcsKeyMap::ConstructL +// ---------------------------------------------------------------------------- +void CPcsKeyMap::ConstructL() + { + ContructKeyboardMappingsL(); + } + +// ---------------------------------------------------------------------------- +// CPcsKeyMap::ContructKeyboardMappingsL +// Fetch keymap for every language/country pair present. +// 10.1 only has virtual 12 key ITU-T keyboard +// ---------------------------------------------------------------------------- +void CPcsKeyMap::ContructKeyboardMappingsL() + { + PRINT( _L("Enter CPcsKeyMap::ContructKeyboardMappingsL") ); + +#if defined(_DEBUG) + TInt count(0); +#endif + QList languages = AvailableLanguages(); + + // Calling HbKeymapFactory::keymap() causes no memory exception after + // ~20 different language/variant combinations in emulator. + // In text shell all languages can be handled successfully. + // In device, already the first call to HbKeymapFactory::keymap() + // crashes. + const TInt KMaxLanguages = 30; + TInt handleMaxLanguages = languages.size(); + if (handleMaxLanguages > KMaxLanguages) + { + handleMaxLanguages = KMaxLanguages; + } + PRINT1( _L("handle %d languages"), handleMaxLanguages ); // test + + for (TInt lang = 0; lang < handleMaxLanguages; ++lang) + { + PRINT1( _L("handle language %d"), languages[lang].language() ); // test + if (IsLanguageSupported(languages[lang].language())) + { + PRINT2(_L("Constructing keymap for lang=%d,var=%d"), + languages[lang].language(), + languages[lang].variant()); +#if 0 + const HbKeymap* keymap = + HbKeymapFactory::instance()->keymap(languages[lang].language(), + languages[lang].variant()); +#else + const HbKeymap* keymap = GetKeymap(languages[lang]); +#endif + if (keymap) + { + for (TInt key = EKey1; key <= EKey0; ++key) + { + PRINT1( _L("handle key(enum value %d)"), key ); // test + const HbMappedKey* mappedKey = keymap->keyForIndex(HbKeyboardVirtual12Key, key); + if (!mappedKey) + { + PRINT1(_L("Mapped key not found, key(%d)"), KeyIdToNumber(key)); + User::Leave(KErrNotFound); + } + // Get both upper and lowercase letters + const QString lowerCase = mappedKey->characters(HbModifierNone); // e.g. "abc2.." + const QString upperCase = mappedKey->characters(HbModifierShiftPressed); // e.g. "ABC2.." + const QString charsForKey = lowerCase + upperCase; + + // Filter out duplicate characters + for (TInt i = charsForKey.length() - 1; i >= 0 ; --i) + { + QChar ch = charsForKey[i]; + // Key '1' is at index 0 in iKeyMapping, key '2' at index 1 etc. + // and key '0' at the last index. + TInt index = key - EKey1; + if (!iKeyMapping[index].contains(ch)) + { +/* + PRINT3(_L("CPcsKeyMap: map key(%d) <-> char='%c'(0x%x)"), + KeyIdToNumber(key), + ch.toAscii(), + ch.toAscii()); */ +#if defined(_DEBUG) + ++count; +#endif + iKeyMapping[index] += ch; + } + } + } + } + else + { + PRINT(_L("CPcsKeyMap: keymap not found")); + } + } + } + +#if defined(_DEBUG) + PRINT1( _L("End CPcsKeyMap::ContructKeyboardMappingsL key map has %d chars"), count ); +#endif + } + +// ---------------------------------------------------------------------------- +// CPcsKeyMap::AvailableLanguages +// Put default language at the beginning of the language list, so that +// ContructKeyboardMappingsL handles it first. +// ---------------------------------------------------------------------------- +QList CPcsKeyMap::AvailableLanguages() const + { + PRINT( _L("Enter CPcsKeyMap::AvailableLanguages") ); + + QLocale locale; + QLocale::Language currentLanguage = locale.language(); + if (!IsLanguageSupported(currentLanguage)) + { + PRINT( _L("current lang not supported, use english") ); //test + currentLanguage = QLocale::English; + } + HbInputLanguage defaultLanguage(currentLanguage); + + QList languages = HbKeymapFactory::availableLanguages(); + if (languages.contains(defaultLanguage)) + { + PRINT( _L("remove default lang") ); //test + languages.removeOne(defaultLanguage); + } + PRINT( _L("insert default lang as first lang") ); //test + languages.insert(0, defaultLanguage); + + PRINT1( _L("End CPcsKeyMap::AvailableLanguages found %d languages"), + languages.count() ); + return languages; + } + +// ---------------------------------------------------------------------------- +// CPcsKeyMap::IsLanguageSupported +// ---------------------------------------------------------------------------- +TBool CPcsKeyMap::IsLanguageSupported(QLocale::Language aLanguage) const + { + return (aLanguage != QLocale::Japanese && aLanguage != QLocale::Chinese); + } + +// ---------------------------------------------------------------------------- +// CPcsKeyMap::KeyForCharacter +// Loop all QStrings of iKeyMapping to find one containing the character. +// If the character is not mapped, use the character itself. +// ---------------------------------------------------------------------------- +TChar CPcsKeyMap::KeyForCharacter(const TChar& aChar) const + { + TUint charValue(aChar); + QChar ch(charValue); + + for (TInt index = 0; index < KAmountOfKeys; ++index) + { + if (iKeyMapping[index].contains(ch)) + { + return ArrayIndexToNumberChar(index); + } + } + + PRINT2( _L("CPcsKeyMap::KeyForCharacter no mapping for char '%c' (0x%x)"), + (TUint)aChar, (TUint)aChar ); // test + return aChar; + } + +// ---------------------------------------------------------------------------- +// CPcsKeyMap::KeyIdToNumber +// Map Orbit API's key id to the number that the key results when pressed. +// ---------------------------------------------------------------------------- +TInt CPcsKeyMap::KeyIdToNumber(TInt aKeyId) const + { + switch (aKeyId) + { + case EKey1: + case EKey2: + case EKey3: + case EKey4: + case EKey5: + case EKey6: + case EKey7: + case EKey8: + case EKey9: + return aKeyId + 1; + case EKey0: + return 0; + default: + PRINT1( _L("CPcsKeyMap::KeyIdToNumber invalid index %d"), aKeyId ); + User::Panic(_L("CPcsKeyMap::KeyIdToNumber"), KErrArgument); + return 0; + } + } + +// ---------------------------------------------------------------------------- +// CPcsKeyMap::ArrayIndexToNumberChar +// Map index of iKeyMapping list, to the number char that the mapping is for. +// ---------------------------------------------------------------------------- +TChar CPcsKeyMap::ArrayIndexToNumberChar(TInt aArrayIndex) const + { + __ASSERT_DEBUG(aArrayIndex < KAmountOfKeys, + User::Panic(_L("CPcsKeyMap::ArrayIndexToNumberChar"), + KErrOverflow)); + if (aArrayIndex == KAmountOfKeys - 1) + { + return '0'; + } + return aArrayIndex + '1'; + } + +const HbKeymap* CPcsKeyMap::GetKeymap(HbInputLanguage aLanguage) const + { + PRINT(_L("CPcsKeyMap::GetKeymap")); + + const HbKeymap* keymap(NULL); + TInt err(KErrNone); + // Catches C++ exception and converts it to Symbian error code + QT_TRYCATCH_ERROR(err, keymap = HbKeymapFactory::instance()->keymap(aLanguage.language(), + aLanguage.variant())); + if (err != KErrNone) + { + // In emulator, trying to get the 20th keymap results KErrNoMemory + PRINT1(_L("factory->keymap threw exception, err=%d"), err); + return NULL; + } + PRINT(_L("CPcsKeyMap::GetKeymap got keymap")); + return keymap; + } +#else // #if defined(USE_ORBIT_KEYMAP) +CPcsKeyMap::CPcsKeyMap() + { + } + +void CPcsKeyMap::ConstructL() + { + } + TChar CPcsKeyMap::GetNumericValueForChar(TChar input ) const { - - TChar ret = '0'; + TChar ret = '0'; switch (input) { case 'A': @@ -161,5 +450,6 @@ } return ret; } +#endif // #if defined(USE_ORBIT_KEYMAP) // End of file diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/cntplsql/src/cplpersistencebroker.cpp --- a/phonebookengines/contactsmodel/cntplsql/src/cplpersistencebroker.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/cntplsql/src/cplpersistencebroker.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -236,7 +236,7 @@ { if(iManager == NULL) { - iManager = CCntPplViewManager::NewL(iContactsFile, iContactProperties.SystemTemplateL()); + iManager = CCntPplViewManager::NewL(iContactsFile, iContactProperties); } return *iManager; } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/cntplsql/src/cpplpredictivesearchtable.cpp --- a/phonebookengines/contactsmodel/cntplsql/src/cpplpredictivesearchtable.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/cntplsql/src/cpplpredictivesearchtable.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -19,6 +19,25 @@ #include "dbsqlconstants.h" #include "cntitem.h" #include "cpcskeymap.h" +#include + + +// How many characters from the beginning of the first name and last name are +// stored. This only affects how precisely the results are put in alphabetic order. +const TInt KCharactersFromName = 16; + +// Max amount of tokens stored from contact +const TInt KMaxTokens = 4; + +// How many digits are stored at most in the numeric field +// Since BIGINT is a signed 64-bit integer, store only 15 hexadecimal characters +// to prevent overflow when comparing upper and lower limits. +const TInt KMaxDigits = 15; + +const QChar KPadChar = 'a'; // Pad with hex-digit 0xA + +const quint64 KConversionError = 0xeeeeeeeeeeeeeee; + /** @@ -63,7 +82,6 @@ { RDebug::Print(_L("CPplPredictiveSearchTable dtor")); delete iInsertStmnt; - delete iUpdateStmnt; delete iDeleteStmnt; delete iKeyMap; RDebug::Print(_L("CPplPredictiveSearchTable dtor ends")); @@ -76,57 +94,47 @@ void CPplPredictiveSearchTable::CreateInDbL( CContactItem& aItem ) { RDebug::Print(_L("CPplPredictiveSearchTable::CreateInDbL")); - WriteToDbL( aItem, iInsertStmnt ); + WriteToDbL(aItem); RDebug::Print(_L("CPplPredictiveSearchTable::CreateInDbL ends")); } /** +Update is done in two steps: delete contact from all predictive search tables, +then insert it into relevant tables. + @param aItem A contact item whose data is updated in the database. */ void CPplPredictiveSearchTable::UpdateL( const CContactItem& aItem ) { RDebug::Print(_L("CPplPredictiveSearchTable::UpdateL")); - WriteToDbL( aItem, iUpdateStmnt ); + + TBool lowDiskErrorOccurred(EFalse); + DeleteFromAllTablesL(aItem.Id(), lowDiskErrorOccurred); + if (lowDiskErrorOccurred) + { + User::Leave(KErrGeneral); + } + WriteToDbL(aItem); + RDebug::Print(_L("CPplPredictiveSearchTable::UpdateL ends")); } /** -Deletes all the communication addresses for a particular contact item. Should be used when -deleting a contact item from the database altogether. +Deletes a contact item from predictive search tables. -@param aItem The contact item whose communcation addresses are to be deleted. +@param aItem The contact item to be deleted. It contains contact id, but not + first name or last name fields. */ -void CPplPredictiveSearchTable::DeleteL(const CContactItem& aItem, TBool& aLowDiskErrorOccurred) +void CPplPredictiveSearchTable::DeleteL(const CContactItem& aItem, + TBool& aLowDiskErrorOccurred) { RDebug::Print(_L("CPplPredictiveSearchTable::DeleteL")); - RSqlStatement stmnt; - CleanupClosePushL(stmnt); - stmnt.PrepareL(iDatabase, iDeleteStmnt->SqlStringL()); - - // Contact id was not added with iDeleteStmnt->SetParamL() so it can not be - // accessed with iDeleteStmnt->ParameterIndex(). - // It is the first and only parameter in query - const TInt KContactIdParamIndex(KFirstIndex); - User::LeaveIfError(stmnt.BindInt(KContactIdParamIndex, aItem.Id())); - RDebug::Print(_L("CPplPredictiveSearchTable::DeleteL execute SQL statement")); - // Returns the amount of rows that were changed/inserted/deleted - TInt status = stmnt.Exec(); - RDebug::Print(_L("CPplPredictiveSearchTable::DeleteL rows deleted=%d"), status); - CleanupStack::PopAndDestroy(&stmnt); - if (status == KErrDiskFull) - { - RDebug::Print(_L("CPplPredictiveSearchTable::DeleteL disk full")); - aLowDiskErrorOccurred = ETrue; - } - else - { - RDebug::Print(_L("CPplPredictiveSearchTable::DeleteL status=%d"), status); - User::LeaveIfError(status); - } - RDebug::Print(_L("CPplPredictiveSearchTable::DeleteL")); + DeleteFromAllTablesL(aItem.Id(), aLowDiskErrorOccurred); + + RDebug::Print(_L("CPplPredictiveSearchTable::DeleteL ends")); } @@ -137,20 +145,90 @@ { RDebug::Print(_L("CPplPredictiveSearchTable::CreateTableL")); - User::LeaveIfError(iDatabase.Exec(KPredSearchCreateStmnt)); - - User::LeaveIfError(iDatabase.Exec(KPredSearchCreateIndex)); + RDebug::Print(_L("Create 10 tables")); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable0Stmnt)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable1Stmnt)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable2Stmnt)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable3Stmnt)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable4Stmnt)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable5Stmnt)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable6Stmnt)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable7Stmnt)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable8Stmnt)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable9Stmnt)); + + + RDebug::Print(_L("Create indexes")); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbrIndexTable0)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr2IndexTable0)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr3IndexTable0)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr4IndexTable0)); + + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbrIndexTable1)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr2IndexTable1)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr3IndexTable1)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr4IndexTable1)); + + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbrIndexTable2)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr2IndexTable2)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr3IndexTable2)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr4IndexTable2)); + + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbrIndexTable3)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr2IndexTable3)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr3IndexTable3)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr4IndexTable3)); + + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbrIndexTable4)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr2IndexTable4)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr3IndexTable4)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr4IndexTable4)); - User::LeaveIfError(iDatabase.Exec(KPredSearchCreateView1)); - User::LeaveIfError(iDatabase.Exec(KPredSearchCreateView2)); - User::LeaveIfError(iDatabase.Exec(KPredSearchCreateView3)); - User::LeaveIfError(iDatabase.Exec(KPredSearchCreateView4)); - User::LeaveIfError(iDatabase.Exec(KPredSearchCreateView5)); - User::LeaveIfError(iDatabase.Exec(KPredSearchCreateView6)); - User::LeaveIfError(iDatabase.Exec(KPredSearchCreateView7)); - User::LeaveIfError(iDatabase.Exec(KPredSearchCreateView8)); - User::LeaveIfError(iDatabase.Exec(KPredSearchCreateView9)); - User::LeaveIfError(iDatabase.Exec(KPredSearchCreateView0)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbrIndexTable5)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr2IndexTable5)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr3IndexTable5)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr4IndexTable5)); + + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbrIndexTable6)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr2IndexTable6)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr3IndexTable6)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr4IndexTable6)); + + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbrIndexTable7)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr2IndexTable7)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr3IndexTable7)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr4IndexTable7)); + + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbrIndexTable8)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr2IndexTable8)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr3IndexTable8)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr4IndexTable8)); + + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbrIndexTable9)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr2IndexTable9)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr3IndexTable9)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr4IndexTable9)); + + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateFNIndexInTable0)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateLNIndexInTable0)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateFNIndexInTable1)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateLNIndexInTable1)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateFNIndexInTable2)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateLNIndexInTable2)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateFNIndexInTable3)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateLNIndexInTable3)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateFNIndexInTable4)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateLNIndexInTable4)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateFNIndexInTable5)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateLNIndexInTable5)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateFNIndexInTable6)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateLNIndexInTable6)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateFNIndexInTable7)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateLNIndexInTable7)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateFNIndexInTable8)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateLNIndexInTable8)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateFNIndexInTable9)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateLNIndexInTable9)); RDebug::Print(_L("CPplPredictiveSearchTable::CreateTableL ends")); } @@ -162,46 +240,31 @@ void CPplPredictiveSearchTable::ConstructL() { RDebug::Print(_L("CPplPredictiveSearchTable::ConstructL")); - // Statement types - TCntSqlStatementType insertType( EInsert, KSqlContactPredSearchTableName() ); - TCntSqlStatementType updateType( EUpdate, KSqlContactPredSearchTableName() ); - TCntSqlStatementType deleteType( EDelete, KSqlContactPredSearchTableName() ); + // Using dummy table names here + TCntSqlStatementType insertType( EInsert, KSqlContactPredSearchTable0 ); + TCntSqlStatementType deleteType( EDelete, KSqlContactPredSearchTable0 ); // Insert new record - // INSERT INTO predictivesearch - // (first_name_as_number, last_name_as_number, company_name_as_number, contact_id) - // VALUES (first_name_as_number value, last_name_as_number value, - // company_name_as_number value, contact_id value); - // + // INSERT INTO predictivesearchX (X=0..9) + // (contact_id, nbr, nbr2, nbr3, nbr4, first_name, last_name) + // VALUES (contact_id value, nbr value, nbr2 value, nbr3 value, nbr4 value, + // first_name value, last_name value); iInsertStmnt = TSqlProvider::GetSqlStatementL(insertType); - iInsertStmnt->SetParamL( KPredSearchFirstNameAsNumber, - KPredSearchFirstNameAsNumberParam ); - iInsertStmnt->SetParamL( KPredSearchLastNameAsNumber, - KPredSearchLastNameAsNumberParam ); - iInsertStmnt->SetParamL( KPredSearchCompanyNameAsNumber, - KPredSearchCompanyNameAsNumberParam ); iInsertStmnt->SetParamL( KPredSearchContactId, - KPredSearchContactIdParam ); - - - // Update predictivesearch record (done when contact info or key map changes) - // For a statement in the following format: - // UPDATE predictivesearch SET - // first_name_as_number = [first_name_as_number value], - // last_name_as_number = [last_name_as_number value], - // company_name_as_number = [company_name_as_number value] - // WHERE contact_id = [contact_id value]; - // - iUpdateStmnt = TSqlProvider::GetSqlStatementL(updateType); - iUpdateStmnt->SetParamL( KPredSearchFirstNameAsNumber, - KPredSearchFirstNameAsNumberParam ); - iUpdateStmnt->SetParamL( KPredSearchLastNameAsNumber, - KPredSearchLastNameAsNumberParam ); - iUpdateStmnt->SetParamL( KPredSearchCompanyNameAsNumber, - KPredSearchCompanyNameAsNumberParam ); - iUpdateStmnt->SetParamL( KPredSearchContactId, - KPredSearchContactIdParam ); + KPredSearchContactIdParam ); + iInsertStmnt->SetParamL( KPredSearchNameAsNumber, + KPredSearchNameAsNumberParam ); + iInsertStmnt->SetParamL( KPredSearchNameAsNumber2, + KPredSearchNameAsNumber2Param ); + iInsertStmnt->SetParamL( KPredSearchNameAsNumber3, + KPredSearchNameAsNumber3Param ); + iInsertStmnt->SetParamL( KPredSearchNameAsNumber4, + KPredSearchNameAsNumber4Param ); + iInsertStmnt->SetParamL( KPredSearchFirstName, + KPredSearchFirstNameParam ); + iInsertStmnt->SetParamL( KPredSearchLastName, + KPredSearchLastNameParam ); const TInt KWhereContactIdBufSize( KWhereStringEqualsStringFormatText().Size() + @@ -211,12 +274,10 @@ // for WHERE contact_id = [contact id value] whereContactIdClause->Des().AppendFormat(KWhereStringEqualsStringFormatText, &KPredSearchContactId, &KPredSearchContactIdParam); - iUpdateStmnt->SetConditionL(*whereContactIdClause); - // Delete information of a particular contact item - // DELETE FROM predictivesearch WHERE contact_id = [contact id value]; - // + // DELETE FROM predictivesearchX (X=0..9) + // WHERE contact_id = [contact id value]; iDeleteStmnt = TSqlProvider::GetSqlStatementL(deleteType); iDeleteStmnt->SetConditionL(*whereContactIdClause); @@ -238,87 +299,395 @@ } -// This function does the common parts of both insert and update operations -void CPplPredictiveSearchTable::WriteToDbL( const CContactItem& aItem, - CCntSqlStatement* aStatement ) +// Insert a contact to predictive search tables. +// Write contact's all tokens to each associate pred.search table. +// E.g. if FN="11 22" LN="2 333", write "11","22","2" and "333" to tables 1, 2 and 3. +void CPplPredictiveSearchTable::WriteToDbL(const CContactItem& aItem) { RDebug::Print(_L("CPplPredictiveSearchTable::WriteToDbL")); - RSqlStatement stmnt; - CleanupClosePushL( stmnt ); - stmnt.PrepareL( iDatabase, aStatement->SqlStringL() ); - - // Fill parameters and their values - CContactItemFieldSet& fieldset = aItem.CardFields(); + + HBufC* firstNameAsNbr(NULL); // owned + HBufC* lastNameAsNbr(NULL); // owned + HBufC* firstName(NULL); // owned + HBufC* lastName(NULL); // owned + GetFieldsLC(aItem, &firstNameAsNbr, &lastNameAsNbr, &firstName, &lastName); - TInt pos = fieldset.Find( KUidContactFieldGivenName ); - if ( pos != KErrNotFound ) - { - RDebug::Print(_L("CPplPredictiveSearchTable::WriteToDbL first name")); - CContactTextField* textfield = fieldset[ pos ].TextStorage(); - if ( textfield ) - { - TPtrC firstName = textfield->Text(); - HBufC* firstNameAsNbr = ConvertToNumericRepresentationLC( firstName ); - User::LeaveIfError( stmnt.BindText( - User::LeaveIfError( stmnt.ParameterIndex( KPredSearchFirstNameAsNumberParam ) ), - *firstNameAsNbr ) ); - CleanupStack::PopAndDestroy( firstNameAsNbr ); - } - } + QStringList numericTokens = GetNumericTokens(firstNameAsNbr, lastNameAsNbr); + QList tables = DetermineTables(numericTokens); + HBufC* tableName(NULL); + while ((tableName = GetTableNameL(tables)) != NULL) + { + // Takes ownership. Clears also earlier SQL statement. + iInsertStmnt->SetTableName(tableName); + RSqlStatement stmnt; + CleanupClosePushL( stmnt ); + RDebug::Print(_L("CPplPredictiveSearchTable::WriteToDbL SQL='%S'"), + &iInsertStmnt->SqlStringL()); + stmnt.PrepareL(iDatabase, iInsertStmnt->SqlStringL()); - pos = fieldset.Find( KUidContactFieldFamilyName ); - if ( pos != KErrNotFound ) - { - RDebug::Print(_L("CPplPredictiveSearchTable::WriteToDbL last name")); - CContactTextField* textfield = fieldset[ pos ].TextStorage(); - if ( textfield ) - { - TPtrC lastName = textfield->Text(); - HBufC* lastNameAsNbr = ConvertToNumericRepresentationLC( lastName ); - User::LeaveIfError( stmnt.BindText( - User::LeaveIfError( stmnt.ParameterIndex( KPredSearchLastNameAsNumberParam ) ), - *lastNameAsNbr ) ); - CleanupStack::PopAndDestroy( lastNameAsNbr ); - } - } + const TDesC* paramNames[] = { + &KPredSearchNameAsNumberParam, + &KPredSearchNameAsNumber2Param, + &KPredSearchNameAsNumber3Param, + &KPredSearchNameAsNumber4Param}; + for (TInt i = 0; i < numericTokens.count(); ++i) + { + quint64 hex = ConvertToHex(numericTokens[i]); + if (hex == KConversionError) + { + User::Leave(KErrArgument); + } + User::LeaveIfError(stmnt.BindInt64( + User::LeaveIfError(stmnt.ParameterIndex(*paramNames[i])), hex)); + } + + User::LeaveIfError(stmnt.BindInt( + User::LeaveIfError(stmnt.ParameterIndex(KPredSearchContactIdParam)), + aItem.Id())); - pos = fieldset.Find( KUidContactFieldCompanyName ); - if ( pos != KErrNotFound ) - { - RDebug::Print(_L("CPplPredictiveSearchTable::WriteToDbL company name")); - CContactTextField* textfield = fieldset[ pos ].TextStorage(); - if ( textfield ) - { - TPtrC companyName = textfield->Text(); - HBufC* companyNameAsNbr = ConvertToNumericRepresentationLC( companyName ); - User::LeaveIfError( stmnt.BindText( - User::LeaveIfError( stmnt.ParameterIndex( KPredSearchCompanyNameAsNumberParam ) ), - *companyNameAsNbr ) ); - CleanupStack::PopAndDestroy( companyNameAsNbr ); - } - } + if (firstName) + { + User::LeaveIfError( stmnt.BindText( + User::LeaveIfError( stmnt.ParameterIndex( KPredSearchFirstNameParam ) ), + *firstName ) ); + } + if (lastName) + { + User::LeaveIfError( stmnt.BindText( + User::LeaveIfError( stmnt.ParameterIndex( KPredSearchLastNameParam ) ), + *lastName ) ); + } - RDebug::Print(_L("CPplPredictiveSearchTable::WriteToDbL set contact id")); - // When inserting, contact id is written. - // When updating, contact id is the search key. - User::LeaveIfError( stmnt.BindInt( - User::LeaveIfError( stmnt.ParameterIndex( KPredSearchContactIdParam ) ), - aItem.Id() ) ); + RDebug::Print(_L("CPplPredictiveSearchTable::WriteToDbL execute SQL statement")); + // Execute the SQL statement + User::LeaveIfError( stmnt.Exec() ); + CleanupStack::PopAndDestroy( &stmnt ); + } - RDebug::Print(_L("CPplPredictiveSearchTable::WriteToDbL execute SQL statement")); - // Execute the SQL statement - User::LeaveIfError( stmnt.Exec() ); - CleanupStack::PopAndDestroy( &stmnt ); + CleanupStack::PopAndDestroy( lastNameAsNbr ); + CleanupStack::PopAndDestroy( lastName ); + CleanupStack::PopAndDestroy( firstNameAsNbr ); + CleanupStack::PopAndDestroy( firstName ); RDebug::Print(_L("CPplPredictiveSearchTable::WriteToDbL ends")); } -HBufC* CPplPredictiveSearchTable::ConvertToNumericRepresentationLC( const TDesC& aString ) +void CPplPredictiveSearchTable::GetFieldsLC(const CContactItem& aItem, + HBufC** aFirstNameAsNbr, + HBufC** aLastNameAsNbr, + HBufC** aFirstName, + HBufC** aLastName) const + { + RDebug::Print(_L("CPplPredictiveSearchTable::GetFieldsLC")); + __ASSERT_ALWAYS(aFirstNameAsNbr != NULL && *aFirstNameAsNbr == NULL, + User::Leave(KErrArgument)); + __ASSERT_ALWAYS(aLastNameAsNbr != NULL && *aLastNameAsNbr == NULL, + User::Leave(KErrArgument)); + __ASSERT_ALWAYS(aFirstName != NULL && *aFirstName == NULL, + User::Leave(KErrArgument)); + __ASSERT_ALWAYS(aLastName != NULL && *aLastName == NULL, + User::Leave(KErrArgument)); + + CContactItemFieldSet& fieldset = aItem.CardFields(); + TInt pos = fieldset.Find(KUidContactFieldGivenName); + if (pos != KErrNotFound) + { + CContactTextField* textfield = fieldset[pos].TextStorage(); + if (textfield) + { + TPtrC firstName = textfield->Text(); + *aFirstName = firstName.Left(KCharactersFromName).AllocLC(); + *aFirstNameAsNbr = iKeyMap->GetNumericKeyStringL(firstName, EFalse); + } + } + // If aFirstName was not pushed to cleanupstack above, do it now + if (*aFirstName == NULL) + { + CleanupStack::PushL(*aFirstName); + } + CleanupStack::PushL(*aFirstNameAsNbr); + + pos = fieldset.Find(KUidContactFieldFamilyName); + if (pos != KErrNotFound) + { + CContactTextField* textfield = fieldset[pos].TextStorage(); + if (textfield) + { + TPtrC lastName = textfield->Text(); + *aLastName = lastName.Left(KCharactersFromName).AllocLC(); + *aLastNameAsNbr = iKeyMap->GetNumericKeyStringL(lastName, EFalse); + } + } + // If aLastName was not pushed to cleanupstack above, do it now + if (*aLastName == NULL) + { + CleanupStack::PushL(*aLastName); + } + CleanupStack::PushL(*aLastNameAsNbr); + + RDebug::Print(_L("CPplPredictiveSearchTable::GetFieldsLC id=%d FNnbr='%S' LNnbr='%S' FN='%S' LN='%S'"), + aItem.Id(), + *aFirstNameAsNbr ? *aFirstNameAsNbr : &KNullDesC, + *aLastNameAsNbr ? *aLastNameAsNbr : &KNullDesC, + *aFirstName ? *aFirstName : &KNullDesC, + *aLastName ? *aLastName: &KNullDesC); + } + +// Find out which tables the contact belongs to. +// e.g. FN(first name)="123 456", LN(last name)=" 89 15" -> belongs to tables 1,4 and 8 +QList +CPplPredictiveSearchTable::DetermineTables(HBufC* aFirstName, + HBufC* aLastName) const + { + RDebug::Print(_L("CPplPredictiveSearchTable::DetermineTables FN='%S',LN='%S'"), + aFirstName ? aFirstName : &KNullDesC, + aLastName ? aLastName : &KNullDesC); + + QList tables; + AddBeginningCharacters(aFirstName, tables); + AddBeginningCharacters(aLastName, tables); + + RDebug::Print(_L("CPplPredictiveSearchTable::DetermineTables belongs to %d tables"), + tables.count()); + return tables; + } + +QList CPplPredictiveSearchTable::DetermineTables(QStringList aTokens) const + { + QList tables; + for (TInt i = aTokens.count() - 1; i >= 0; --i) + { + TChar ch(aTokens[i][0].unicode()); + __ASSERT_ALWAYS(IsValidChar(ch), + User::Panic(_L("DetermineTables"), KErrArgument)); + if (!tables.contains(ch)) + { + tables.append(ch); + } + } + return tables; + } + +// Ignore spaces when inspecting the first digits of (sub)strings within FN/LN. +// If FN and LN don't begin with any of digit (meaning the first char in the +// original name did not map into any digit, but was written as is, the contact +// is not added to any of the 10 tables). +void CPplPredictiveSearchTable::AddBeginningCharacters(HBufC* aString, + QList& aTables) const + { + if (aString) + { + QString s((QChar*)aString->Ptr(), aString->Length()); +#if defined(USE_ORBIT_KEYMAP) + QStringList subStrings = s.split(iKeyMap->Separator(), QString::SkipEmptyParts); +#else + QStringList subStrings = s.split(' ', QString::SkipEmptyParts); +#endif + + for (TInt i = subStrings.count() - 1; i >= 0; --i) + { + if (subStrings[i].length() > 0) + { + TChar ch(subStrings[i][0].unicode()); + if (IsValidChar(ch) && !aTables.contains(ch)) + { + aTables.append(ch); + } + } + } + } + } + +// Ignore tokens beginning with something else than '0'..'9'. +// Keep duplicate tokens to support e.g. search "202" when both FN and LN are "23". +void +CPplPredictiveSearchTable::AddTokens(HBufC* aString, QStringList& aTokens) const + { + if (aString) + { + QString s((QChar*)aString->Ptr(), aString->Length()); +#if defined(USE_ORBIT_KEYMAP) + QStringList tokens = s.split(iKeyMap->Separator(), QString::SkipEmptyParts); +#else + QStringList tokens = s.split(' ', QString::SkipEmptyParts); +#endif + + // Select tokens in the same order they are in original aString + for (TInt i = 0; i < tokens.count(); ++i) + { + if (IsValidChar(tokens[i][0])) + { + aTokens.append(tokens[i]); + } + } + } + } + +TBool CPplPredictiveSearchTable::IsValidChar(TInt aChar) const + { + return (aChar >= '0' && aChar <= '9'); + } + +TBool CPplPredictiveSearchTable::IsValidChar(QChar aChar) const { - RDebug::Print(_L("CPplPredictiveSearchTable::ConvertToNumericRepresentationLC")); - HBufC* numericBuf = iKeyMap->GetNumericKeyStringL( aString, EFalse ); - CleanupStack::PushL( numericBuf ); - RDebug::Print(_L("CPplPredictiveSearchTable::ConvertToNumericRepresentationLC result='%S'"), - numericBuf); - return numericBuf; + return (aChar >= '0' && aChar <= '9'); + } + +// 1. get first token of LN +// 2. get first token of FN +// 3. get second token of LN +// 4. get second token of FN +// : +// : +// If LN or FN runs out of tokens before KMaxTokens have been found, +// keep getting tokens from the other field. +QStringList CPplPredictiveSearchTable::GetNumericTokens(HBufC* aFirstName, + HBufC* aLastName) const + { + RDebug::Print(_L("CPplPredictiveSearchTable::GetNumericTokens FN='%S',LN='%S'"), + aFirstName ? aFirstName : &KNullDesC, + aLastName ? aLastName : &KNullDesC); + + QStringList firstNameTokens; + QStringList lastNameTokens; + AddTokens(aFirstName, firstNameTokens); + AddTokens(aLastName, lastNameTokens); + + QStringList tokens; + while (tokens.count() < KMaxTokens && + (!firstNameTokens.isEmpty() || !lastNameTokens.isEmpty())) + { + GetNextToken(lastNameTokens, tokens); + GetNextToken(firstNameTokens, tokens); + } + RDebug::Print(_L("CPplPredictiveSearchTable::GetNumericTokens found %d tokens"), + tokens.count()); + return tokens; + } + +void CPplPredictiveSearchTable::GetNextToken(QStringList& aSource, + QStringList& aDestination) const + { + if (!aSource.isEmpty() && aDestination.count() < KMaxTokens) + { + QString padded = aSource[0].left(KMaxDigits); + aDestination.append(padded); + aSource.removeFirst(); + } } + +void +CPplPredictiveSearchTable::DeleteFromAllTablesL(TContactItemId aContactId, + TBool& aLowDiskErrorOccurred) const + { + QList tables; + const TInt KLargestKey = '9'; + for (TInt i = '0'; i <= KLargestKey; ++i) + { + TChar ch = i; + tables << ch; + } + + HBufC* tableName(NULL); + while ((tableName = GetTableNameL(tables)) != NULL) + { + iDeleteStmnt->SetTableName(tableName); // Clears also earlier SQL statement + + RSqlStatement stmnt; + CleanupClosePushL(stmnt); + + RDebug::Print(_L("CPplPredictiveSearchTable::DeleteFromAllTablesL SQL='%S'"), + &iDeleteStmnt->SqlStringL()); + stmnt.PrepareL(iDatabase, iDeleteStmnt->SqlStringL()); + + // Contact id was not added with iDeleteStmnt->SetParamL() so it can not be + // accessed with iDeleteStmnt->ParameterIndex(). + // It is the first and only parameter in query + const TInt KContactIdParamIndex(KFirstIndex); + User::LeaveIfError(stmnt.BindInt(KContactIdParamIndex, aContactId)); + RDebug::Print(_L("CPplPredictiveSearchTable::DeleteFromAllTablesL execute statement")); + // Returns the amount of rows that were changed/inserted/deleted. + // Since contact is not present in all tables, some operations return 0, + // it is not an error. + TInt status = stmnt.Exec(); + RDebug::Print(_L("CPplPredictiveSearchTable::DeleteFromAllTablesL rows deleted=%d"), status); + CleanupStack::PopAndDestroy(&stmnt); + + if (status == KErrDiskFull) + { + RDebug::Print(_L("CPplPredictiveSearchTable::DeleteFromAllTablesL disk full")); + aLowDiskErrorOccurred = ETrue; + } + else + { + RDebug::Print(_L("CPplPredictiveSearchTable::DeleteFromAllTablesL status=%d"), status); + User::LeaveIfError(status); + } + } + } + +HBufC* CPplPredictiveSearchTable::GetTableNameL(QList& aTables) const + { + HBufC* tableName(NULL); + if (aTables.count() > 0) + { + TChar ch = aTables[0]; + __ASSERT_ALWAYS(IsValidChar(ch), User::Leave(KErrArgument)); + + // Each table's name has same length, replace last char with the correct one + tableName = HBufC::NewL(KSqlContactPredSearchTable0().Length()); + TPtr ptr = tableName->Des(); + ptr.Append(KSqlContactPredSearchTable0); + ptr[ptr.Length() - 1] = ch; + aTables.removeFirst(); + RDebug::Print(_L("CPplPredictiveSearchTable::GetTableNameL '%S'"), tableName); + } + return tableName; + } + +// E.g. aToken = "01230" -> append 'a' until has KMaxDigits characters +// -> "01230aaaaaaaaaa" -> convert to hexadecimal number -> 0x01230aaaaaaaaaa. +// Leaving from this function causes panic, perhaps because of QString +// parameter? So rather return an error code if conversion fails. +quint64 CPplPredictiveSearchTable::ConvertToHex(QString aToken) const + { + if (aToken.length() > KMaxDigits) + { + return KConversionError; + } + QString padded = aToken.leftJustified(KMaxDigits, KPadChar); + + TBuf log(padded.utf16()); + RDebug::Print(_L("CPplPredictiveSearchTable::ConvertToHex padded '%S'"), &log); + + // Replace unmapped char and the following characters with KPadChar. + QString replaced = padded; + bool done(false); + for (TInt i = 0; i < KMaxDigits && !done; ++i) + { + if (!IsValidChar(padded[i])) + { + // replace() does not work, it puts just one 'a' at end + // replaced = padded.replace(i, KMaxDigits - i, KPadChar); + + padded.remove(i, KMaxDigits - i); + replaced = padded.leftJustified(KMaxDigits, KPadChar); + done = true; + + TBuf log2(replaced.utf16()); + RDebug::Print(_L("After replacing '%S'"), &log2); + } + } + + const TInt KHexadecimalBase = 16; + bool ok(true); + quint64 hex = replaced.toULongLong(&ok, KHexadecimalBase); + if (!ok) + { + RDebug::Print(_L("conv to hex failed")); + return KConversionError; + } + + RDebug::Print(_L("CPplPredictiveSearchTable::ConvertToHex result 0x%lx"), hex); + return hex; + } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/cntplsql/src/csqlitelocalview.cpp --- a/phonebookengines/contactsmodel/cntplsql/src/csqlitelocalview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/cntplsql/src/csqlitelocalview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -606,6 +606,24 @@ DebugLogNotification(_L("[CNTMODEL] . . . . . Queueing Database Event "), aEvent); #endif iOutstandingEvents.AppendL(aEvent); + + // The view state is set to ENotReady when a recovery takes place, and also when the tables + // are closed, so set ready here. + if (iState == ENotReady && (aEvent.iType + == EContactDbObserverEventRecover || aEvent.iType + == EContactDbObserverEventTablesOpened)) + { + SetState(EReady); + } + // view was Initializing (sorting) before recovery or compression started! + if (iState == EInitializing && (aEvent.iType + == EContactDbObserverEventRecover || aEvent.iType + == EContactDbObserverEventCompress)) + { + // re-read database and sort + SafeResort(); + } + } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/cntplsql/src/pplcontactitemmanager.cpp --- a/phonebookengines/contactsmodel/cntplsql/src/pplcontactitemmanager.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/cntplsql/src/pplcontactitemmanager.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -726,13 +726,13 @@ { CContactIdArray* idArray = CContactIdArray::NewLC(); - //Prepare ane execute the sql query + //Prepare and execute the sql query RSqlStatement selectStatement; CleanupClosePushL(selectStatement); User::LeaveIfError(selectStatement.Prepare(iDatabase, aSearchQuery)); const TInt KIdx = iSelectStatement->ParameterIndex(KContactId); - // Iterate through the results and append the contactIds to idArray + // Iterate through the results and append the contactIds to idArray TInt err; while((err = selectStatement.Next()) == KSqlAtRow) { @@ -767,11 +767,8 @@ iPreferencePersistor->SetPreferredCardTemplateIdL(aCardTemplatePrefId); } -// If pred search table is missing, generate it from existing contacts table -// Even if contact would not have any first name, last name or company name -// defined, write an entry to predictive search. So that if contact is later -// updated by adding e.g. company name, the predictive search table already -// has an entry for the contact, and the company name can be updated there too. +// If predictive search tables do not exist, generate them using data from +// contacts table. void CPplContactItemManager::SynchronizePredSearchTableL() { #if !defined(USE_PRED_SEARCH_TABLE) @@ -779,41 +776,48 @@ #endif RDebug::Print(_L("CPplContactItemManager::SynchronizePredSearchTableL")); - if (DoesPredSearchTableExistL()) + if (!DoesPredSearchTableExistL()) { - RDebug::Print(_L("pred search table exists, don't generate it")); - return; + CreatePredSearchTablesL(); } + } + +void CPplContactItemManager::RecreatePredSearchTablesL() + { + DeletePredSearchTablesL(); + CreatePredSearchTablesL(); + } + +void CPplContactItemManager::CreatePredSearchTablesL() + { + RDebug::Print(_L("CPplContactItemManager::CreatePredSearchTablesL")); iPredSearchTable->CreateTableL(); - _LIT(KSelectAllContactsFormat, "SELECT %S,%S,%S,%S FROM %S;"); + _LIT(KSelectAllContactsFormat, "SELECT %S,%S,%S FROM %S;"); TInt bufSize = KSelectAllContactsFormat().Length() + KContactId().Length() + KContactFirstName().Length() + KContactLastName().Length() + - KContactCompanyName().Length() + KSqlContactTableName().Length(); HBufC* sqlStatement = HBufC::NewLC(bufSize); sqlStatement->Des().AppendFormat(KSelectAllContactsFormat, &KContactId, &KContactFirstName, &KContactLastName, - &KContactCompanyName, &KSqlContactTableName); RSqlStatement stmnt; CleanupClosePushL(stmnt); - RDebug::Print(_L("SynchronizePredSearchTableL prepare SQL statement")); + RDebug::Print(_L("CreatePredSearchTablesL prepare SQL statement")); stmnt.PrepareL(iDatabase, *sqlStatement); const TInt KContactIdIndex = 0; const TInt KFirstNameIndex = 1; const TInt KLastNameIndex = 2; - const TInt KCompanyNameIndex = 3; TInt err(KErrNone); while ((err = stmnt.Next()) == KSqlAtRow) { - RDebug::Print(_L("SynchronizePredSearchTableL create CContactItem")); + RDebug::Print(_L("CreatePredSearchTablesL create CContactItem")); TInt id = KUidContactCardValue; TUid uid; @@ -825,54 +829,39 @@ TPtrC firstName; if (stmnt.ColumnText(KFirstNameIndex, firstName) == KErrNone) { - RDebug::Print(_L("SynchronizePredSearchTableL read first name")); CContactItemField* field = - CContactItemField::NewL(KStorageTypeText, KUidContactFieldGivenName); + CContactItemField::NewLC(KStorageTypeText, KUidContactFieldGivenName); CContactTextField* textfield = field->TextStorage(); - RDebug::Print(_L("set first name to text field")); textfield->SetTextL(firstName); contact->AddFieldL(*field); // Takes ownership + CleanupStack::Pop(field); } TPtrC lastName; if (stmnt.ColumnText(KLastNameIndex, lastName) == KErrNone) { - RDebug::Print(_L("SynchronizePredSearchTableL read last name")); CContactItemField* field = - CContactItemField::NewL(KStorageTypeText, KUidContactFieldFamilyName); + CContactItemField::NewLC(KStorageTypeText, KUidContactFieldFamilyName); CContactTextField* textfield = field->TextStorage(); - RDebug::Print(_L("set last name to text field")); textfield->SetTextL(lastName); contact->AddFieldL(*field); // Takes ownership + CleanupStack::Pop(field); } - - TPtrC companyName; - if (stmnt.ColumnText(KCompanyNameIndex, companyName) == KErrNone) - { - RDebug::Print(_L("SynchronizePredSearchTableL read company name")); - CContactItemField* field = - CContactItemField::NewL(KStorageTypeText, KUidContactFieldCompanyName); - CContactTextField* textfield = field->TextStorage(); - RDebug::Print(_L("set company name to text field")); - textfield->SetTextL(companyName); - contact->AddFieldL(*field); // Takes ownership - } - - RDebug::Print(_L("SynchronizePredSearchTableL create entry to pred search table")); + RDebug::Print(_L("CreatePredSearchTablesL create entry to tables")); iPredSearchTable->CreateInDbL(*contact); CleanupStack::PopAndDestroy(contact); } - RDebug::Print(_L("SynchronizePredSearchTableL while loop done")); // Leave if we didn't complete going through the results properly if (err != KSqlAtEnd) { - RDebug::Print(_L("SynchronizePredSearchTableL SQL err=%d"), err); + RDebug::Print(_L("CreatePredSearchTablesL SQL err=%d"), err); User::Leave(err); } CleanupStack::PopAndDestroy(&stmnt); CleanupStack::PopAndDestroy(sqlStatement); - RDebug::Print(_L("CPplContactItemManager::SynchronizePredSearchTableL ends")); + + RDebug::Print(_L("CPplContactItemManager::CreatePredSearchTablesL ends")); } TBool CPplContactItemManager::DoesPredSearchTableExistL() const @@ -882,11 +871,11 @@ _LIT(KSelectContactIdsFormat, "SELECT %S FROM %S;"); TInt bufSize = KSelectContactIdsFormat().Length() + KPredSearchContactId().Length() + - KSqlContactPredSearchTableName().Length(); + KSqlContactPredSearchTable0().Length(); HBufC* sqlStatement = HBufC::NewLC(bufSize); sqlStatement->Des().AppendFormat(KSelectContactIdsFormat, &KPredSearchContactId, - &KSqlContactPredSearchTableName); + &KSqlContactPredSearchTable0); RSqlStatement stmnt; CleanupClosePushL(stmnt); @@ -902,3 +891,38 @@ err == KErrNone ); return err == KErrNone; } + +void CPplContactItemManager::DeletePredSearchTablesL() + { + RDebug::Print(_L("CPplContactItemManager::DeletePredSearchTablesL")); + + const TInt KTableCount = 10; + const TDesC* KTableNames[KTableCount] = + { + &KSqlContactPredSearchTable0, + &KSqlContactPredSearchTable1, + &KSqlContactPredSearchTable2, + &KSqlContactPredSearchTable3, + &KSqlContactPredSearchTable4, + &KSqlContactPredSearchTable5, + &KSqlContactPredSearchTable6, + &KSqlContactPredSearchTable7, + &KSqlContactPredSearchTable8, + &KSqlContactPredSearchTable9 + }; + + // IF EXISTS suppresses error that would occur if table does not exist + _LIT(KDropTable, "DROP TABLE IF EXISTS %S;"); + for (TInt i = 0; i < KTableCount; ++i) + { + HBufC* dropTableCommand = HBufC::NewLC(KDropTable().Length() + + // All table names are of same length + KTableNames[i]->Length()); + TPtr ptr = dropTableCommand->Des(); + ptr.Format(KDropTable, KTableNames[i]); + + User::LeaveIfError(iDatabase.Exec(*dropTableCommand)); + CleanupStack::PopAndDestroy(dropTableCommand); + } + RDebug::Print(_L("CPplContactItemManager::DeletePredSearchTablesL ends")); + } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/cntview/ViewBase.cpp --- a/phonebookengines/contactsmodel/cntview/ViewBase.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/cntview/ViewBase.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -1539,6 +1539,7 @@ } iContactType = aContact.iContactType; + SetContactTypeUid( aContact.ContactTypeUid() ); iExtension->HintBitField() = aContact.iExtension->HintBitField(); HBufC* fieldText = aContact.iExtension->FieldText().AllocL(); iExtension->SetFieldText(fieldText); diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/documentation/CNTMODEL test code.rtf --- a/phonebookengines/contactsmodel/documentation/CNTMODEL test code.rtf Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,233 +0,0 @@ -{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} -{\f36\froman\fcharset238\fprq2 Times New Roman CE;}{\f37\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f39\froman\fcharset161\fprq2 Times New Roman Greek;}{\f40\froman\fcharset162\fprq2 Times New Roman Tur;} -{\f41\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f42\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f43\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f44\froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\f46\fswiss\fcharset238\fprq2 Arial CE;}{\f47\fswiss\fcharset204\fprq2 Arial Cyr;}{\f49\fswiss\fcharset161\fprq2 Arial Greek;}{\f50\fswiss\fcharset162\fprq2 Arial Tur;}{\f51\fswiss\fcharset177\fprq2 Arial (Hebrew);} -{\f52\fswiss\fcharset178\fprq2 Arial (Arabic);}{\f53\fswiss\fcharset186\fprq2 Arial Baltic;}{\f54\fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0; -\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128; -\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe2052\cgrid\langnp2057\langfenp2052 \snext0 Normal;}{ -\s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \b\f1\fs28\lang2057\langfe1033\kerning28\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0 heading 1;}{ -\s2\ql \li0\ri0\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0 \b\f1\fs22\cf9\lang2057\langfe2052\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 2;}{ -\s4\ql \li0\ri0\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0 \b\f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0 heading 4;}{ -\s5\ql \li0\ri0\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel4\adjustright\rin0\lin0\itap0 \b\f1\fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0 heading 5;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\* -\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}}{\*\listtable{\list\listtemplateid-488854760\listhybrid{\listlevel\levelnfc0\levelnfcn0 -\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'00.;}{\levelnumbers\'01;}\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 -{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698703 -\'02\'03.;}{\levelnumbers\'01;}\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\fi-360\li3600 -\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel -\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0 -\levelindent0{\leveltext\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid908004289}{\list\listtemplateid1572638590\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid134807567\'02\'00.;}{\levelnumbers\'01;}\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 -\levelindent0{\leveltext\leveltemplateid134807577\'02\'01.;}{\levelnumbers\'01;}\fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\leveltemplateid134807579\'02\'02.;}{\levelnumbers\'01;}\fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid134807567 -\'02\'03.;}{\levelnumbers\'01;}\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid134807577\'02\'04.;}{\levelnumbers\'01;} -\fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid134807579\'02\'05.;}{\levelnumbers\'01;}\fi-180\li4320\jclisttab\tx4320\lin4320 } -{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid134807567\'02\'06.;}{\levelnumbers\'01;}\fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid134807577\'02\'07.;}{\levelnumbers\'01;}\fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\leveltemplateid134807579\'02\'08.;}{\levelnumbers\'01;}\fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1216742051}{\list\listtemplateid-881316324\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'00.;}{\levelnumbers\'01;}\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698703 -\'02\'03.;}{\levelnumbers\'01;}\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\fi-360\li3600 -\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel -\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0 -\levelindent0{\leveltext\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1889610592}}{\*\listoverridetable{\listoverride\listid1216742051\listoverridecount0\ls1} -{\listoverride\listid1889610592\listoverridecount0\ls2}{\listoverride\listid908004289\listoverridecount0\ls3}}{\*\rsidtbl \rsid5130934\rsid12336753}{\*\generator Microsoft Word 10.0.4219;}{\info{\title AGNMODEL test code}{\author Geraldo Tou} -{\operator KellyH}{\creatim\yr2005\mo5\dy2\hr12\min3}{\revtim\yr2005\mo6\dy17\hr10\min21}{\version11}{\edmins263}{\nofpages2}{\nofwords651}{\nofchars3714}{\*\company Symbian}{\nofcharsws4357}{\vern16469}}\paperw11909\paperh16834\margl1440\margr1440 -\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dghspace180\dgvspace180\dghorigin1701\dgvorigin1984\dghshow0\dgvshow0 -\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\nolnhtadjtbl\rsidroot5130934 \fet0\sectd \psz9\linex0\headery706\footery706\endnhere\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 -\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 -\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \b\f1\fs28\lang2057\langfe1033\kerning28\cgrid\langnp2057\langfenp1033 {\insrsid12336753 CNTMODEL test code - -\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe2052\cgrid\langnp2057\langfenp2052 {\b\f1\insrsid12336753 History: -\par }{\f1\insrsid12336753 3 May 2005 - Special Requirements section updated. -\par -\par }{\b\f1\insrsid12336753 -\par -\par }{\b\f1\fs24\insrsid12336753 Background: -\par }{\f1\insrsid12336753 -\par }\pard\plain \s2\ql \li0\ri0\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0 \b\f1\fs22\cf9\lang2057\langfe2052\cgrid\langnp2057\langfenp2052 {\insrsid12336753 -CntmodelTest.iby can be found at //EPOC/main/generic/app-engines/cntmodel/group -\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe2052\cgrid\langnp2057\langfenp2052 {\f1\insrsid12336753 -\par }{\b\f1\fs24\insrsid12336753 Test executable file locations -\par -\par }\trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt -\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \clshdng10000\cltxlrtb\clftsWidth3\clwWidth3158\clshdngraw10000 \cellx3050\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr -\brdrs\brdrw10 \clshdng10000\cltxlrtb\clftsWidth3\clwWidth3158\clshdngraw10000 \cellx6208\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 WINS location\cell Hardware location\cell }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh -\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 -\clshdng10000\cltxlrtb\clftsWidth3\clwWidth3158\clshdngraw10000 \cellx3050\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \clshdng10000\cltxlrtb\clftsWidth3\clwWidth3158\clshdngraw10000 \cellx6208\row -}\trowd \irow1\irowband1\lastrow \ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 -\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth3158\clshdrawnil \cellx3050\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr -\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth3158\clshdrawnil \cellx6208\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 \\epoc32\\release\\wins\\udeb\\ -\par or -\par \\epoc32\\release\\wins\\urel\\\cell c:\\ or z:\\\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 \trowd \irow1\irowband1\lastrow \ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl -\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr -\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth3158\clshdrawnil \cellx3050\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth3158\clshdrawnil \cellx6208\row }\pard -\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\f1\insrsid12336753 -\par }\pard\plain \s5\ql \li0\ri0\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel4\adjustright\rin0\lin0\itap0 \b\f1\fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\insrsid12336753 Automatic test executables - should be run before every release - -\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe2052\cgrid\langnp2057\langfenp2052 {\f1\insrsid12336753 Success: Test program exits cleanly -\par Failure: Test program stops with an error message. -\par }{\i\f1\insrsid12336753 List is out of date \endash refer to the bld.inf file to identify \lquote automatic\rquote unit tests.}{\i\insrsid12336753 -\par }{\b\f1\insrsid12336753 -\par }\trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 -\trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \clshdng10000\cltxlrtb\clftsWidth3\clwWidth2988\clshdngraw10000 -\cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \clshdng10000\cltxlrtb\clftsWidth3\clwWidth5275\clshdngraw10000 \cellx8155\pard\plain -\s4\ql \li0\ri0\keepn\widctlpar\intbl\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0 \b\f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\insrsid12336753 Filename\cell Purpose\cell }\pard\plain -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2052\cgrid\langnp2057\langfenp2052 {\b\f1\insrsid12336753 \trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 -\trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 -\clbrdrr\brdrs\brdrw10 \clshdng10000\cltxlrtb\clftsWidth3\clwWidth2988\clshdngraw10000 \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 -\clshdng10000\cltxlrtb\clftsWidth3\clwWidth5275\clshdngraw10000 \cellx8155\row }\trowd \irow1\irowband1\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv -\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880 -\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 { -\f1\insrsid12336753 T_BENCH.EXE\cell Benchmark test for typical database operations\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow1\irowband1\ts11\trgaph108\trleft-108\trbrdrt -\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl -\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 -\cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 T_CARDTM.EXE\cell Card template\cell }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow2\irowband2\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh -\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 -\cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 T_CONNEC.EXE\cell Connectivity requirements\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 -\trowd \irow3\irowband3\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 -\trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt -\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 { -\f1\insrsid12336753 T_DBASE.EXE\cell Basic database operations: Create a new database, deletes existing databases, sets the database drive setting, adds, edits text fields and moves fields\cell }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow4\irowband4\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh -\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 -\cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 T_DBASE2.EXE\cell Sorting, searching and matching\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 -\trowd \irow5\irowband5\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 -\trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt -\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 { -\f1\insrsid12336753 T_ERROR.EXE\cell OOM tests, file server failure tests\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow6\irowband6\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 -\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 -\clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil -\cellx8155\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 T_EXPDEL.EXE\cell Synchronisation tests. Increments/decrements access counts\cell }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow7\irowband7\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh -\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 -\cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 T_FERROR.EXE\cell File error tests\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 -\trowd \irow8\irowband8\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 -\trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt -\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 { -\f1\insrsid12336753 T_FIELD.EXE\cell Test fields, field set, id array, labels, attributes, multiple cards, multiple fields, fields id\rquote s and does a store/restore test\cell }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow9\irowband9\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh -\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 -\cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 T_FILTEREDVIEW.EXE\cell Filtered view \cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 -\trowd \irow10\irowband10\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 -\trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt -\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 { -\f1\insrsid12336753 T_GROUPS.EXE\cell Group support\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow11\irowband11\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl -\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb -\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155 -\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 T_GROUPVIEW.EXE\cell Group view\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 -\trowd \irow12\irowband12\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 -\trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt -\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 { -\f1\insrsid12336753 T_IMPORT.EXE\cell vCard import (strictly not a test - useful for debugging)\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow13\irowband13 -\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt -\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 -\cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 T_ITEM.EXE\cell Adds basic cards, adds text fields to cards, chec -ks field contents, edits text fields and moves fields\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow14\irowband14\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl -\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb -\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155 -\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 T_MULTS.EXE\cell Multi-client access test\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 { -\b\f1\insrsid12336753 \trowd \irow15\irowband15\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 -\trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt -\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 { -\f1\insrsid12336753 T_NOMACH.EXE\cell Phone number matching\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow16\irowband16\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl -\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb -\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155 -\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 T_OWNCAR.EXE\cell Own card support\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 -\trowd \irow17\irowband17\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 -\trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt -\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 { -\f1\insrsid12336753 T_PROFILE.EXE\cell Asynchronous sorting testcode\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow18\irowband18\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 -\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 -\clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil -\cellx8155\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 T_SIZE.EXE\cell Testcode to monitor file size growth for worst case database operations\cell }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow19\irowband19\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh -\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 -\cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 T_TEMPL.EXE\cell System template\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 -\trowd \irow20\irowband20\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 -\trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt -\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 { -\f1\insrsid12336753 T_TIME.EXE\cell Various profiling of read/add/delete contacts and vCard import/export\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow21\irowband21 -\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt -\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 -\cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 T_TTVERS.EXE\cell Imports, exports and updates via vCard\cell }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow22\irowband22\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh -\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 -\cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 T_VERS.EXE\cell Imports a card and displays the field label, field contents and UID store type\cell }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow23\irowband23\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh -\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 -\cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid12336753 T_VIEW.EXE\cell CcontactItemViewDef\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 -\trowd \irow24\irowband24\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 -\trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt -\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 { -\f1\insrsid12336753 T_VIEW2.EXE\cell Tests core view architecture code\cell }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid12336753 \trowd \irow25\irowband25\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 -\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 -\clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil -\cellx8155\row }\pard \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid14030050 {\f1\insrsid5130934\charrsid12336753 Testexecute z:\\testdata\\scripts\\CntModel_Import.script\cell {\listtext\pard\plain\intbl -\f1\fs20\lang2057\langfe2052\langnp2057\langfenp2052\insrsid5130934\charrsid5130934 \hich\af1\dbch\af0\loch\f1 1.\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\intbl\jclisttab\tx720\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\pararsid14030050 { -\f1\insrsid5130934\charrsid5130934 A VCard with REV property in UTC format is imported to a Contact database using the CntModelConverter. -\par {\listtext\pard\plain\intbl\f1\fs20\lang2057\langfe2052\langnp2057\langfenp2052\insrsid5130934\charrsid5130934 \hich\af1\dbch\af0\loch\f1 2.\tab}A VCard with no REV property is imported to a Contact database using the CntModelConverter -\par {\listtext\pard\plain\intbl\f1\fs20\lang2057\langfe2052\langnp2057\langfenp2052\insrsid5130934\charrsid5130934 \hich\af1\dbch\af0\loch\f1 3.\tab}Import VCard with REV property set to local -\par {\listtext\pard\plain\intbl\f1\fs20\lang2057\langfe2052\langnp2057\langfenp2052\insrsid5130934\charrsid5130934 \hich\af1\dbch\af0\loch\f1 4.\tab}Import VCard with REV property set to local, but no TZ property set. -\par {\listtext\pard\plain\intbl\f1\fs20\lang2057\langfe2052\langnp2057\langfenp2052\insrsid5130934\charrsid5130934 \hich\af1\dbch\af0\loch\f1 5.\tab}Import VCard with BDAY property in local date/time format\cell }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid5130934 \trowd \irow26\irowband26\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh -\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 -\cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid14030050 {\f1\insrsid5130934\charrsid5130934 Testexecute z:\\testdata\\scripts\\CntModel_Export.script\cell {\listtext\pard\plain\intbl -\f1\fs20\lang2057\langfe2052\langnp2057\langfenp2052\insrsid5130934\charrsid5130934 \hich\af1\dbch\af0\loch\f1 1.\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\intbl\jclisttab\tx720\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin720\pararsid14030050 { -\f1\insrsid5130934\charrsid5130934 Export to VCard with REV in UTC format -\par {\listtext\pard\plain\intbl\f1\fs20\lang2057\langfe2052\langnp2057\langfenp2052\insrsid5130934\charrsid5130934 \hich\af1\dbch\af0\loch\f1 2.\tab}Export to VCard with BDAY property in local date/time format\cell }\pard -\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\insrsid5130934 \trowd \irow27\irowband27\lastrow \ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 -\trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 -\cltxlrtb\clftsWidth3\clwWidth2988\clshdrawnil \cellx2880\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5275\clshdrawnil \cellx8155\row }\pard -\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\b\f1\fs24\insrsid12336753 -\par -\par -\par -\par -\par Special Requirements -\par -\par }{\b\f1\insrsid12336753 1. Building tests -\par }{\f1\insrsid12336753 -\par Before building the tests you must build (}{\b\f1\insrsid12336753 abld test build}{\f1\insrsid12336753 -) the app-services/CoreAppsTest component. This test component as a server that can perform requested actions, such as copy or delete of files, on behalf of a test harness \endash where the test harness only has the required security capabilities -documented for the component APIs. -\par }{\b\f1\insrsid12336753 -\par 2. Tests that need special requirements -\par }{\b\f1\fs24\insrsid12336753 -\par }{\f1\insrsid12336753 Unit tests }{\b\f1\insrsid12336753 T_Error}{\f1\insrsid12336753 and }{\b\f1\insrsid12336753 T_Sec_CntDbase}{\f1\insrsid12336753 \endash - need a writeable drive, (e.g. D or F), to be set up for the emulator, or present on hardware. The test code automatically tries to find the first available drive. -\par -\par Manual tests }{\b\f1\insrsid12336753 T_Dbase}{\f1\insrsid12336753 and }{\b\f1\insrsid12336753 T_Ferror}{\f1\insrsid12336753 \endash need a writeable drive D: to be set up for the emulator, or present on hardware. -\par -\par To set up D or F drive on the emulator: -\par {\listtext\pard\plain\f1\fs20\lang2057\langfe2052\langnp2057\langfenp2052 \hich\af1\dbch\af0\loch\f1 1.\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 {\f1\insrsid12336753 -check if we have got \'93}{\b\f1\insrsid12336753 epoc.ini}{\f1\insrsid12336753 \'94 in directory }{\b\f1\insrsid12336753 epoc32\\data}{\f1\insrsid12336753 . If not, create one. -\par {\listtext\pard\plain\f1\fs20\lang2057\langfe2052\langnp2057\langfenp2052 \hich\af1\dbch\af0\loch\f1 2.\tab}Create directories for the drives to map to, e.g. \\epoc32\\winscw\\d or \\epoc32\\winscw\\f. -\par {\listtext\pard\plain\f1\fs20\lang2057\langfe2052\langnp2057\langfenp2052 \hich\af1\dbch\af0\loch\f1 3.\tab}Make sure a line like this is present in the epoc.ini file; -\par }\pard \ql \li720\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 {\b\f1\insrsid12336753 _EPOC_DRIVE_D \\epoc32\\winscw\\d -\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\b\f1\fs24\insrsid12336753 -\par }{\f1\insrsid12336753 All }{\b\f1\insrsid12336753 T_Icc* }{\f1\insrsid12336753 tests exercise the interface for the Phonebook Sync -hroniser, to read the phonebook entries from an ICC (Integrated Circuit Card, e.g. a GSM SIM card or a WCDMA USIM card). The tests need to use the test components:cnttestsync.dll and cntsyncchecker.dll. From Symbian OS 9.0 the DLL search mechanism has cha -nged, and for these tests to run you must remove Telephony component\rquote s Phonebook Synchroniser:at least phbksyncplugin.dll, and possibly also phbksyncsvr.dll & phbksyncsvrexe.exe. -\par }\pard \ql \li0\ri0\widctlpar\tx2790\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\f1\insrsid12336753 \tab -\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\b\f1\fs24\insrsid12336753 Test rom building -\par }{\f1\fs24\insrsid12336753 -\par }{\f1\insrsid12336753 To be able to run all contacts model test programs, we have to type the following on command line at epoc32\\rom, -\par -\par }{\b\f1\insrsid12336753 tools\\buildrom assabet engbuild \\\\CntmodelTest.iby}{\insrsid12336753 -\par }} \ No newline at end of file diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookengines/contactsmodel/group/backup_registration.xml --- a/phonebookengines/contactsmodel/group/backup_registration.xml Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookengines/contactsmodel/group/backup_registration.xml Fri Apr 16 14:53:18 2010 +0300 @@ -1,7 +1,7 @@ - -]> - - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_received_normal_bl.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_received_normal_bl.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ - - - -]> - - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_received_normal_br.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_received_normal_br.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ - - - -]> - - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_received_normal_c.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_received_normal_c.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ - - - -]> - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_received_normal_l.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_received_normal_l.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ - - - -]> - - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_received_normal_r.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_received_normal_r.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ - - - -]> - - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_received_normal_t.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_received_normal_t.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ - - - -]> - - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_received_normal_tl.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_received_normal_tl.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ - - - -]> - - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_received_normal_tr.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_received_normal_tr.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ - - - -]> - - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_b.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_b.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ - - - -]> - - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_bl.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_bl.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ - - - -]> - - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_br.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_br.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ - - - -]> - - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_c.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_c.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ - - - -]> - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_l.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_l.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ - - - -]> - - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_r.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_r.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ - - - -]> - - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_t.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_t.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ - - - -]> - - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_tl.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_tl.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ - - - -]> - - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_tr.svg --- a/phonebookui/pbkcommonui/resources/images/qtg_fr_convlist_sent_normal_tr.svg Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ - - - -]> - - - - - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/pbkcommonui.qrc --- a/phonebookui/pbkcommonui/resources/pbkcommonui.qrc Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/resources/pbkcommonui.qrc Fri Apr 16 14:53:18 2010 +0300 @@ -1,75 +1,25 @@ + edit_button_pressed.fxml + edit_button_released.fxml contacts_actions.docml contacts_cc.docml contacts_ev.docml contacts_mc.docml contacts_if.docml contacts_list.docml + contacts_namelist.docml contacts_groupactions.docml contacts_history.docml contacts_editor.docml - edit_button_pressed.fxml - edit_button_released.fxml + contacts_favorite.docml + contacts_favmember.docml + contacts_collections.docml - icons/qtg_large_avatar.svg - icons/qtg_large_favourites.svg - icons/qtg_large_custom.svg - icons/qtg_small_mobile.svg - icons/qtg_small_email.svg - icons/qtg_small_location.svg - icons/qtg_small_internet.svg - icons/qtg_small_assistant.svg - icons/qtg_small_car.svg - icons/qtg_small_landline.svg - icons/qtg_small_fax.svg - icons/qtg_small_pager.svg - icons/qtg_large_call_mobile.svg - icons/qtg_large_message.svg - icons/qtg_large_email.svg - icons/qtg_large_call_assistant.svg - icons/qtg_large_call_car.svg - icons/qtg_large_call_fax.svg - icons/qtg_large_call_group.svg - icons/qtg_large_call_landline.svg - icons/qtg_large_call_pager.svg - icons/qtg_mono_activitystream.svg - icons/qtg_mono_contact_all.svg - icons/qtg_mono_group.svg - icons/qtg_mono_search.svg - icons/qtg_mono_add_field.svg - icons/qtg_mono_person_history.svg - icons/qtg_mono_person_activitystream.svg - icons/qtg_mono_add_group.svg - icons/qtg_mono_refresh.svg - icons/qtg_mono_details.svg - icons/qtg_mono_communication.svg - icons/qtg_mono_plus.svg - images/qgn_prop_pb_comm_call_large.svg - images/qgn_prop_pb_comm_message_large.svg - images/qgn_prop_pb_comm_email_large.svg - images/qgn_prop_nrtyp_address.svg - images/qgn_prop_nrtyp_assistant.svg - images/qgn_prop_nrtyp_car.svg - images/qgn_prop_nrtyp_chat.svg - images/qgn_prop_nrtyp_date.svg - images/qgn_prop_nrtyp_email.svg - images/qgn_prop_empty.svg - images/qgn_prop_nrtyp_fax.svg - images/qgn_prop_nrtyp_mobile.svg - images/qgn_prop_nrtyp_note.svg - images/qgn_prop_nrtyp_pager.svg - images/qgn_prop_nrtyp_phone.svg - images/qgn_prop_nrtyp_sip.svg - images/qgn_prop_nrtyp_swis.svg - images/qgn_prop_nrtyp_url.svg - images/qgn_prop_nrtyp_voip.svg - images/qgn_indi_ai_nt_birthday.svg - images/qgn_prop_pb_thumb_unknown.svg - images/qgn_indi_ai_nt_camera.svg - images/qgn_prop_tutor_gallery.svg + icons/pickerIcon.jpg + icons/pin.png style/cnteditviewdetailitem.widgetml @@ -83,27 +33,7 @@ style/cntcontactcardheadingitem.css style/cnthistoryviewitemwidget.widgetml style/cnthistoryviewitemwidget.css + style/cntlocationbutton.hbpushbutton.widgetml + style/cntlocationbutton.css - - images/qtg_fr_convlist_received_normal_b.svg - images/qtg_fr_convlist_received_normal_bl.svg - images/qtg_fr_convlist_received_normal_br.svg - images/qtg_fr_convlist_received_normal_c.svg - images/qtg_fr_convlist_received_normal_l.svg - images/qtg_fr_convlist_received_normal_r.svg - images/qtg_fr_convlist_received_normal_t.svg - images/qtg_fr_convlist_received_normal_tl.svg - images/qtg_fr_convlist_received_normal_tr.svg - - - images/qtg_fr_convlist_sent_normal_b.svg - images/qtg_fr_convlist_sent_normal_bl.svg - images/qtg_fr_convlist_sent_normal_br.svg - images/qtg_fr_convlist_sent_normal_c.svg - images/qtg_fr_convlist_sent_normal_l.svg - images/qtg_fr_convlist_sent_normal_r.svg - images/qtg_fr_convlist_sent_normal_t.svg - images/qtg_fr_convlist_sent_normal_tl.svg - images/qtg_fr_convlist_sent_normal_tr.svg - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/style/cntcontactcardheadingitem.widgetml --- a/phonebookui/pbkcommonui/resources/style/cntcontactcardheadingitem.widgetml Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/resources/style/cntcontactcardheadingitem.widgetml Fri Apr 16 14:53:18 2010 +0300 @@ -13,6 +13,11 @@ + + + + + @@ -45,6 +50,11 @@ + + + + + @@ -76,5 +86,10 @@ + + + + + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/style/cntlocationbutton.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/style/cntlocationbutton.css Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,26 @@ +HbPushButton#cntlocationbutton +{ + layout:text_icon_horizontal_prt; +} + + +HbPushButton#cntlocationbutton::icon{ + top:-1.5un; + bottom:1.5un; + right:1.0un; + fixed-width:6.0un; + fixed-height:6.0un; +} + + + + +HbPushButton#cntlocationbutton::text{ + left:-0.5un; + right:0.5un; + top:-1.5un; + bottom:1.5un; + font-variant:primary; + text-align:center; +} + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/resources/style/cntlocationbutton.hbpushbutton.widgetml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/style/cntlocationbutton.hbpushbutton.widgetml Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntaction.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntaction.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,55 @@ +/* +* 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 "cntaction.h" + +CntAction::CntAction( QString aAction ) : QObject(), +mAction( aAction ) + { + } + +CntAction::~CntAction() + { + delete mContactAction; + } + +void CntAction::execute( QContact aContact, QContactDetail aDetail ) + { + QList all = QContactAction::actionDescriptors(mAction, "symbian"); + mContactAction = QContactAction::action( all.first() ); + if ( mContactAction ) + { + connect(mContactAction, SIGNAL(progress(QContactAction::Status, const QVariantMap&)), + this, SLOT(progress(QContactAction::Status, const QVariantMap&))); + mContactAction->invokeAction( aContact, aDetail ); + } + } + +void CntAction::progress( QContactAction::Status status, const QVariantMap& result ) + { + Q_UNUSED(result); + switch(status) + { + case QContactAction::Finished: + case QContactAction::FinishedWithError: + emit actionExecuted( this ); + break; + default: + break; + } + } + +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntactionmenubuilder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntactionmenubuilder.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,154 @@ +/* +* 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 "cntactionmenubuilder.h" +#include +#include "cntstringmapper.h" +#include + +CntActionMenuBuilder::CntActionMenuBuilder( QContactLocalId aMyCardId ) : +QObject(), +iMyCardId( aMyCardId ), +mContact( 0 ), +mMap( 0 ) + { + mMap = new CntStringMapper(); + } + +CntActionMenuBuilder::~CntActionMenuBuilder() + { + delete mMap; + mMap = 0; + + delete mContact; + mContact = 0; + } + +HbMenu* CntActionMenuBuilder::buildActionMenu( QContact& aContact ) + { + HbMenu* menu = new HbMenu(); + + // Regular contact, NOT MyCard + if ( aContact.localId() != iMyCardId ) + { + QList actionDescriptors = aContact.availableActions(); + QStringList actions; + foreach ( QContactActionDescriptor d, aContact.availableActions() ) + { + actions << d.actionName(); + } + + if ( actions.contains("call", Qt::CaseInsensitive) ) + { + createCallAction( *menu, aContact ); + } + + if ( actions.contains("message", Qt::CaseInsensitive) ) + { + createSmsAction( *menu, aContact ); + } + + if ( actions.contains("email", Qt::CaseInsensitive) ) + { + createEmailAction( *menu, aContact ); + } + + if ( menu->actions().size() > 0 ) + menu->addSeparator(); + } + + // If contact is NOT MyCard OR MyCard is not empty (detail count is more than 4) + if ( aContact.localId() != iMyCardId || aContact.details().size() > 4 ) + { + menu->addAction(hbTrId("txt_common_menu_open"), this, SLOT(emitOpenContact()) ); + menu->addAction(hbTrId("txt_common_menu_edit"), this, SLOT(emitEditContact()) ); + menu->addAction(hbTrId("txt_common_menu_delete_contact"), this, SLOT(emitDeleteContact())); + } + return menu; + } + +void CntActionMenuBuilder::execActionMenu( QContact& aContact, QPointF aPoint ) +{ + mContact = new QContact( aContact ); + HbMenu* menu = buildActionMenu( aContact ); + menu->exec( aPoint ); + delete menu; +} + +void CntActionMenuBuilder::emitOpenContact() +{ + emit openContact( *mContact ); +} + +void CntActionMenuBuilder::emitEditContact() +{ + emit editContact( *mContact ); +} + +void CntActionMenuBuilder::emitDeleteContact() +{ + emit deleteContact( *mContact ); +} + +void CntActionMenuBuilder::emitCallContact() +{ + emit performContactAction( *mContact, "call" ); +} + +void CntActionMenuBuilder::emitSmsContact() +{ + emit performContactAction( *mContact, "message" ); +} + +void CntActionMenuBuilder::emitMailContact() +{ + emit performContactAction( *mContact, "email" ); +} + +void CntActionMenuBuilder::createCallAction( HbMenu& aMenu, QContact& aContact ) + { + // Create call action + QContactDetail detail = aContact.preferredDetail("call"); + QContactPhoneNumber number = detail.isEmpty() ? aContact.detail() : detail; + + QString detailName = mMap->getMappedDetail( number.subTypes().first() ); + if (!number.contexts().isEmpty()) + { + detailName += hbTrId(" %1").arg(mMap->getMappedDetail( number.contexts().first()) ); + } + aMenu.addAction( hbTrId("Call %1").arg(detailName), this, SLOT(emitCallContact()) ); + } + +void CntActionMenuBuilder::createEmailAction( HbMenu& aMenu, QContact& aContact ) + { + QContactDetail detail = aContact.preferredDetail("email"); + QContactEmailAddress email = detail.isEmpty() ? aContact.detail() : detail; + + QString detailName = hbTrId("txt_phob_menu_email"); + if (!email.contexts().isEmpty()) + { + detailName += hbTrId(" %1").arg(mMap->getMappedDetail(email.contexts().first())); + } + aMenu.addAction(hbTrId("Mail %1").arg(detailName), this, SLOT(emitMailContact())); + } + +void CntActionMenuBuilder::createSmsAction( HbMenu& aMenu, QContact& aContact ) + { + Q_UNUSED( aContact ) + aMenu.addAction(hbTrId("txt_phob_menu_send_message"), this, SLOT(emitSmsContact())); + } + +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntactions.cpp --- a/phonebookui/pbkcommonui/src/cntactions.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntactions.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -55,7 +55,6 @@ if (baseAction) { mStringActionMap.insert(aName, baseAction); - baseAction->setParent(this); } return baseAction; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntaddressmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntaddressmodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,173 @@ +/* +* 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 "cntaddressmodel.h" +#include "cntdetailmodelitem.h" +#include "cntdetailconst.h" + +CntAddressModel::CntAddressModel( QContact* aContact ): +CntDetailEditorModel( aContact ), +mAddress(0), +mAddressHome(0), +mAddressWork(0) + { + HbDataFormModelItem* address = appendDataFormGroup(qtTrId("Address"), invisibleRootItem()); + HbDataFormModelItem* addressHome = appendDataFormGroup(qtTrId("Address (home)"), invisibleRootItem()); + HbDataFormModelItem* addressWork = appendDataFormGroup(qtTrId("Address (work)"), invisibleRootItem()); + + foreach ( QContactAddress a, mContact->details() ) + { + QStringList context = a.contexts(); + if ( context.isEmpty() && !mAddress ) // no context + { + mAddress = new QContactAddress( a ); + createAddressItems( address, mAddress ); + } + else if (context.first() == QContactAddress::ContextHome && !mAddressHome ) + { + mAddressHome = new QContactAddress( a ); + createAddressItems( addressHome, mAddressHome ); + } + else if (context.first() == QContactAddress::ContextWork && !mAddressWork ) + { + mAddressWork = new QContactAddress( a ); + createAddressItems( addressWork, mAddressWork ); + } + } + + // Check that all items (address, addressHome, addressWork) are created + if ( !mAddress ) + { + mAddress = new QContactAddress(); + createAddressItems( address, mAddress ); + } + + if ( !mAddressHome ) + { + QStringList context; + context << QContactAddress::ContextHome; + + mAddressHome = new QContactAddress(); + mAddressHome->setContexts( context ); + + createAddressItems( addressHome, mAddressHome ); + } + + if ( !mAddressWork ) + { + mAddressWork = new QContactAddress(); + QStringList context; + context << QContactAddress::ContextWork; + mAddressWork->setContexts( context ); + createAddressItems( addressWork, mAddressWork ); + } + } + +CntAddressModel::~CntAddressModel() + { + delete mAddress; + delete mAddressHome; + delete mAddressWork; + } + +void CntAddressModel::createAddressItems( HbDataFormModelItem* aGroup, QContactAddress* aAddress ) + { + // custom item for map button + // HbDataFormModelItem* mapButton = new HbDataFormModelItem( HbDataFormModelItem::CustomItemBase ); + + // default items for rest of fields + HbDataFormModelItem* street = new HbDataFormModelItem( HbDataFormModelItem::TextItem, qtTrId("Street")); + street->setContentWidgetData( "text", aAddress->street() ); + street->setContentWidgetData( "maxLength", CNT_STREET_MAXLENGTH ); + + HbDataFormModelItem* postal = new HbDataFormModelItem( HbDataFormModelItem::TextItem, qtTrId("Post code")); + postal->setContentWidgetData( "text", aAddress->postcode() ); + postal->setContentWidgetData( "maxLength", CNT_POSTCODE_MAXLENGTH ); + + HbDataFormModelItem* city = new HbDataFormModelItem( HbDataFormModelItem::TextItem, qtTrId("City")); + city->setContentWidgetData( "text", aAddress->locality() ); + city->setContentWidgetData( "maxLength", CNT_LOCALITY_MAXLENGTH ); + + HbDataFormModelItem* region = new HbDataFormModelItem( HbDataFormModelItem::TextItem, qtTrId("Province")); + region->setContentWidgetData( "text", aAddress->region() ); + region->setContentWidgetData( "maxLength", CNT_REGION_MAXLENGTH ); + + HbDataFormModelItem* country = new HbDataFormModelItem( HbDataFormModelItem::TextItem, qtTrId("Country")); + country->setContentWidgetData( "text", aAddress->country() ); + country->setContentWidgetData( "maxLength", CNT_COUNTRY_MAXLENGTH ); + + //appendDataFormItem( mapButton, aGroup ); + appendDataFormItem( street, aGroup ); + appendDataFormItem( postal, aGroup ); + appendDataFormItem( city, aGroup ); + appendDataFormItem( region, aGroup ); + appendDataFormItem( country, aGroup ); + } + +void CntAddressModel::saveContactDetails() +{ + // No Context + HbDataFormModelItem* addressRoot = invisibleRootItem()->childAt( 0 ); + saveAddressItems( addressRoot, mAddress ); + + // Home + HbDataFormModelItem* addressHomeRoot = invisibleRootItem()->childAt( 1 ); + saveAddressItems( addressHomeRoot, mAddressHome ); + + // Work + HbDataFormModelItem* addressWorkRoot = invisibleRootItem()->childAt( 2 ); + saveAddressItems( addressWorkRoot, mAddressWork ); + + // save and remove empty details + mContact->saveDetail( mAddress ); + mContact->saveDetail( mAddressHome ); + mContact->saveDetail( mAddressWork ); + + if ( isAddressEmpty(mAddress) ) + { + mContact->removeDetail( mAddress ); + } + + if ( isAddressEmpty(mAddressHome) ) + { + mContact->removeDetail( mAddressHome ); + } + + if ( isAddressEmpty(mAddressWork) ) + { + mContact->removeDetail( mAddressWork ); + } +} + +void CntAddressModel::saveAddressItems( HbDataFormModelItem* aGroup, QContactAddress* aAddress ) +{ + // first item (0) is the map button + aAddress->setStreet( aGroup->childAt( 0 )->contentWidgetData("text").toString().trimmed() ); + aAddress->setPostcode( aGroup->childAt( 1 )->contentWidgetData("text").toString().trimmed() ); + aAddress->setLocality( aGroup->childAt( 2 )->contentWidgetData("text").toString().trimmed() ); + aAddress->setRegion( aGroup->childAt( 3 )->contentWidgetData("text").toString().trimmed() ); + aAddress->setCountry( aGroup->childAt( 4 )->contentWidgetData("text").toString().trimmed() ); +} + +bool CntAddressModel::isAddressEmpty( QContactAddress* aAddress ) +{ + return ( aAddress->street().length() == 0 && + aAddress->postcode().length() == 0 && + aAddress->locality().length() == 0 && + aAddress->region().length() == 0 && + aAddress->country().length() == 0 ); +} diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntaddressviewitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntaddressviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,105 @@ +/* +* 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 "cntaddressviewitem.h" +#include "cntdetailmodelitem.h" +#include "cntdetailconst.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//#include "qlocationpickeritem_temp.h" +#include +#include +#include +CntAddressViewItem::CntAddressViewItem(QGraphicsItem* aParent) : + /*CntDetailViewItem(aParent),*/ + HbDataFormViewItem(aParent), + mRequest(0), + mAppManager(0), + mSenderButton(0) +{ +} + +CntAddressViewItem::~CntAddressViewItem() +{ + delete mRequest; + delete mAppManager; +} + +HbAbstractViewItem* CntAddressViewItem::createItem() +{ + return new CntAddressViewItem(*this); +} + +HbWidget* CntAddressViewItem::createCustomWidget() +{ + QGraphicsLinearLayout* layout = new QGraphicsLinearLayout(Qt::Horizontal); + + HbWidget* widget = new HbWidget(); + widget->setLayout(layout); + + HbStyleLoader::registerFilePath(":/style/cntlocationbutton.css"); + HbStyleLoader::registerFilePath(":/style/cntlocationbutton.hbpushbutton.widgetml"); + HbDataForm* form = static_cast (itemView()); + HbDataFormModel* model = static_cast (form->model()); + HbDataFormModelItem* item = model->itemFromIndex(modelIndex()); + + HbPushButton* mLocationButton = new HbPushButton(this); + mLocationButton->setObjectName("cntlocationbutton"); + mLocationButton->setIcon(HbIcon(":/icons/pickerIcon.jpg")); + mLocationButton->setText(qtTrId("Select location from map")); + mLocationButton->setOrientation(Qt::Horizontal); + + connect(mLocationButton, SIGNAL(clicked()), this, SLOT(launchLocationPicker())); + + layout->addItem(mLocationButton); + return widget; +} + +void CntAddressViewItem::launchLocationPicker() +{ + mAppManager = new XQApplicationManager(); + if (mRequest) { + delete mRequest; + mRequest = 0; + } + + mSenderButton = sender(); + mRequest = mAppManager->create("com.nokia.symbian", "ILocationPick", "pick()", false); + if (mRequest) { + connect(mRequest, SIGNAL(requestOk(const QVariant&)), this, + SLOT(handleLocationChange(const QVariant&))); + mRequest->send(); + } +} + +void CntAddressViewItem::handleLocationChange(const QVariant& aValue) +{ + Q_UNUSED( aValue ); +} + +//Q_IMPLEMENT_USER_METATYPE(QLocationPickerItem) + +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntbasedetaileditorview.cpp --- a/phonebookui/pbkcommonui/src/cntbasedetaileditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntbasedetaileditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -56,8 +56,13 @@ void CntBaseDetailEditorView::aboutToCloseView() { + CntViewParameters args;//( CntViewParameters::editView ); + args.setSelectedContact( *mContact ); + viewManager()->back( args ); + /* viewManager()->previousViewParameters().setSelectedContact(*mContact); viewManager()->onActivatePreviousView(); + */ } /*! @@ -78,8 +83,13 @@ */ void CntBaseDetailEditorView::cancelChanges() { + CntViewParameters args;//( CntViewParameters::editView ); + args.setSelectedContact( *mContact ); + viewManager()->back( args ); + /* viewManager()->previousViewParameters().setSelectedContact(*mContact); viewManager()->onActivatePreviousView(); + */ } HbDataFormModel *CntBaseDetailEditorView::formModel() diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntbaselistview.cpp --- a/phonebookui/pbkcommonui/src/cntbaselistview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntbaselistview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -357,13 +357,13 @@ { CntViewParameters viewParameters(CntViewParameters::myCardView); viewParameters.setSelectedContact(contactModel()->contact(index)); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } else { CntViewParameters viewParameters(CntViewParameters::commLauncherView); viewParameters.setSelectedContact(contactModel()->contact(index)); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntbaseview.cpp --- a/phonebookui/pbkcommonui/src/cntbaseview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntbaseview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -25,14 +25,13 @@ mViewManager(viewManager), mActions(0), mCommands(0), - mSoftKeyBackAction(new HbAction(Hb::BackAction, this)) + mSoftKeyBackAction(new HbAction(Hb::BackNaviAction, this)) { mModelProvider=CntModelProvider::instance(); setTitle(hbTrId("txt_phob_title_contacts")); connect(mViewManager->mainWindow(), SIGNAL(keyPressed(QKeyEvent*)), this, SLOT(keyPressEvent(QKeyEvent*))); connect(mViewManager->mainWindow(), SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation))); - mSoftKeyBackAction->setText(hbTrId("Back")); connect(mSoftKeyBackAction, SIGNAL(triggered()), this, SLOT(aboutToCloseView())); } @@ -53,7 +52,6 @@ return mViewManager; } - /*! \return pointer to MobCntModel */ @@ -79,10 +77,8 @@ void CntBaseView::addSoftkeyAction() { - HbAction *action = viewManager()->mainWindow()->softKeyAction(Hb::SecondarySoftKey); - viewManager()->mainWindow()->removeSoftKeyAction(Hb::SecondarySoftKey, action); - - viewManager()->mainWindow()->addSoftKeyAction(Hb::SecondarySoftKey, mSoftKeyBackAction); + if (navigationAction() != mSoftKeyBackAction) + setNavigationAction(mSoftKeyBackAction); } void CntBaseView::keyPressEvent(QKeyEvent *event) diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp --- a/phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -20,13 +20,15 @@ #include #include #include +#include /*! Constructor */ CntCollectionListModel::CntCollectionListModel(QContactManager *manager, QObject *parent) : QAbstractListModel(parent), - mContactManager(manager) + mContactManager(manager), + mFavoriteGroupId(-1) { mDataPointer = new CntCollectionListData(); doConstruct(); @@ -63,8 +65,8 @@ else if (role == Qt::DecorationRole) { QVariantList icons; - QIcon itemIcon(values[1].toString()); - icons.append(itemIcon); + HbIcon icon(values[1].toString()); + icons.append(icon); return QVariant(icons); } @@ -134,16 +136,60 @@ */ void CntCollectionListModel::initializeStaticGroups() { + QVariantList dataList; QStringList displayList; displayList.append(hbTrId("txt_phob_dblist_favorites")); - displayList.append(hbTrId("txt_phob_dblist_favorites_val_no_favorites_selecte")); // as this isn't supported yet + if(!isFavoriteGroupCreated()) + { + displayList.append(hbTrId("txt_phob_dblist_favorites_val_no_favorites_selecte")); // as this isn't supported yet + + //Create Fav grp + QContact favoriteGroup; + favoriteGroup.setType(QContactType::TypeGroup); + QContactName favoriteGroupName; + favoriteGroupName.setCustomLabel("Favorites"); + favoriteGroup.saveDetail(&favoriteGroupName); + mContactManager->saveContact(&favoriteGroup); + mFavoriteGroupId = favoriteGroup.localId(); + } + else + { + QContact favoriteGroup = mContactManager->contact(mFavoriteGroupId); + QContactRelationshipFilter rFilter; + rFilter.setRelationshipType(QContactRelationship::HasMember); + rFilter.setRelatedContactRole(QContactRelationshipFilter::First); + rFilter.setRelatedContactId(favoriteGroup.id()); + + // group members and their count + QList groupMemberIds = mContactManager->contactIds(rFilter); + + if (!groupMemberIds.isEmpty()) + { + QStringList nameList; + for(int i = 0;i < groupMemberIds.count();i++) + { + QContact contact = mContactManager->contact(groupMemberIds.at(i)); + QString memberName = contact.displayLabel(); + nameList << memberName; + if (nameList.join(", ").length() > 30) + { + break; + } + } + QString names = nameList.join(", "); + displayList.append(names); + displayList.append(hbTrId("(%1)").arg(groupMemberIds.count())); + } + else + { + displayList.append(hbTrId("txt_phob_dblist_favorites_val_no_favorites_selecte")); // as this isn't supported yet + } + + } dataList.append(displayList); - - dataList.append(":/icons/qtg_large_favourites.svg"); - - dataList.append(-1); // as favorites doesn't really have a contact Id, -1 is used - + dataList.append("qtg_large_favourites"); + dataList.append(mFavoriteGroupId); // as favorites doesn't really have a contact Id, -1 is used mDataPointer->mDataList.append(dataList); } @@ -156,8 +202,7 @@ groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup))); - QList groupContactIds = mContactManager->contacts(groupFilter); - + QList groupContactIds = mContactManager->contactIds(groupFilter); if (!groupContactIds.isEmpty()) { for(int i = 0;i < groupContactIds.count();i++) @@ -170,55 +215,91 @@ QContact contact = mContactManager->contact(groupContactIds.at(i)); QContactName contactName = contact.detail(); QString groupName = contactName.customLabel(); - - if (groupName.isNull()) - { - QString unnamed(hbTrId("Unnamed")); - displayList.append(unnamed); - } - else + if(groupContactIds.at(i) != mFavoriteGroupId ) { - displayList.append(groupName); - } - - QContactRelationshipFilter rFilter; - rFilter.setRelationshipType(QContactRelationship::HasMember); - rFilter.setRole(QContactRelationshipFilter::Second); - rFilter.setOtherParticipantId(contact.id()); - - // group members and their count - QList groupMemberIds = mContactManager->contacts(rFilter); - - if (!groupMemberIds.isEmpty()) - { - QStringList nameList; - for(int i = 0;i < groupMemberIds.count();i++) + if (groupName.isNull()) + { + QString unnamed(hbTrId("Unnamed")); + displayList.append(unnamed); + } + else + { + displayList.append(groupName); + } + + QContactRelationshipFilter rFilter; + rFilter.setRelationshipType(QContactRelationship::HasMember); + rFilter.setRelatedContactRole(QContactRelationshipFilter::First); + rFilter.setRelatedContactId(contact.id()); + + // group members and their count + QList groupMemberIds = mContactManager->contactIds(rFilter); + + if (!groupMemberIds.isEmpty()) { - QContact contact = mContactManager->contact(groupMemberIds.at(i)); - QString memberName = contact.displayLabel(); - nameList << memberName; - if (nameList.join(", ").length() > 30) + QStringList nameList; + for(int i = 0;i < groupMemberIds.count();i++) { - break; + QContact contact = mContactManager->contact(groupMemberIds.at(i)); + QString memberName = contact.displayLabel(); + nameList << memberName; + if (nameList.join(", ").length() > 30) + { + break; + } } + QString names = nameList.join(", "); + displayList.append(names); + displayList.append(hbTrId("(%1)").arg(groupMemberIds.count())); } - QString names = nameList.join(", "); - displayList.append(names); - displayList.append(hbTrId("(%1)").arg(groupMemberIds.count())); + else + { + displayList.append(hbTrId("No members selected")); + } + dataList.append(displayList); + + // icon, default for now always + dataList.append("qtg_large_custom"); + + // contact Id for identification + dataList.append(groupContactIds.at(i)); + + mDataPointer->mDataList.append(dataList); } - else - { - displayList.append(hbTrId("No members selected")); - } - dataList.append(displayList); - - // icon, default for now always - dataList.append(":/icons/qtg_large_custom.svg"); - - // contact Id for identification - dataList.append(groupContactIds.at(i)); - - mDataPointer->mDataList.append(dataList); } } } + + +bool CntCollectionListModel::isFavoriteGroupCreated() +{ + bool favoriteGroupCreated = false; + QContactDetailFilter groupFilter; + groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup))); + + QList groupContactIds = mContactManager->contactIds(groupFilter); + + if (!groupContactIds.isEmpty()) + { + for(int i = 0;i < groupContactIds.count();i++) + { + QContact contact = mContactManager->contact(groupContactIds.at(i)); + QContactName contactName = contact.detail(); + QString groupName = contactName.customLabel(); + if(groupName.compare("Favorites") == 0) + { + favoriteGroupCreated = true; + mFavoriteGroupId = groupContactIds.at(i); + break; + } + } + } + return favoriteGroupCreated; +} + +int CntCollectionListModel::favoriteGroupId() +{ + return mFavoriteGroupId; +} + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntcollectionview.cpp --- a/phonebookui/pbkcommonui/src/cntcollectionview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntcollectionview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -16,31 +16,70 @@ */ #include "cntcollectionview.h" +#include "cntgroupselectionpopup.h" +#include "cntgroupdeletepopup.h" +#include "cntcollectionlistmodel.h" +#include "qtpbkglobal.h" #include #include #include #include -#include -#include "hbinputdialog.h" -#include "hbdialog.h" -#include "hbaction.h" -#include "cntgroupselectionpopup.h" +#include +#include +#include +#include +#include +#include +#include -const char *CNT_COLLECTIONVIEW_ACTIONS_XML = ":/xml/contacts_actions.docml"; +const char *CNT_COLLECTIONVIEW_XML = ":/xml/contacts_collections.docml"; /*! */ -CntCollectionView::CntCollectionView(CntViewManager *viewManager, QGraphicsItem *parent) - : CntBaseListView(viewManager, parent), +CntCollectionView::CntCollectionView() : + mView(0), + mSoftkey(0), + mViewManager(0), mModel(0), - mReorderAction(0), - mDeleteGroupAction(0), - mDisconnectAllAction(0), - mOptionsMenu(0) + mListView(0), + mNamesAction(0), + mRefreshAction(0), + mNewGroupAction(0), + mDeleteGroupsAction(0) { - setBannerName(hbTrId("txt_phob_subtitle_groups")); + bool ok = false; + mDocumentLoader.load(CNT_COLLECTIONVIEW_XML, &ok); + + if (ok) + { + mView = static_cast(mDocumentLoader.findWidget(QString("view"))); + } + else + { + qFatal("Unable to read :/xml/contacts_collections.docml"); + } + + //back button + mSoftkey = new HbAction(Hb::BackNaviAction, mView); + connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView())); + + // menu actions + mDeleteGroupsAction = static_cast(mDocumentLoader.findObject("cnt:deletegroups")); + mDeleteGroupsAction->setParent(mView); + connect(mDeleteGroupsAction, SIGNAL(triggered()), this, SLOT(deleteGroups())); + + // toolbar actions + mNamesAction = static_cast(mDocumentLoader.findObject("cnt:names")); + mNamesAction->setParent(mView); + connect(mNamesAction, SIGNAL(triggered()), this, SLOT(showPreviousView())); + mRefreshAction = static_cast(mDocumentLoader.findObject("cnt:refresh")); + mRefreshAction->setParent(mView); + connect(mRefreshAction, SIGNAL(triggered()), this, SLOT(refreshDataModel())); + mNewGroupAction = static_cast(mDocumentLoader.findObject("cnt:newgroup")); + mNewGroupAction->setParent(mView); + connect(mNewGroupAction, SIGNAL(triggered()), this, SLOT(newGroup())); } /*! @@ -48,118 +87,145 @@ */ CntCollectionView::~CntCollectionView() { -delete mModel; -mModel = 0; -delete mOptionsMenu; -mOptionsMenu = 0; + mView->deleteLater(); } /*! - +Called when activating the view */ -void CntCollectionView::aboutToCloseView() +void CntCollectionView::activate( CntAbstractViewManager* aMgr, const CntViewParameters& aArgs ) { - CntViewParameters viewParameters(CntViewParameters::namesView); - viewManager()->onActivateView(viewParameters); + Q_UNUSED(aArgs) + + if (mView->navigationAction() != mSoftkey) + mView->setNavigationAction(mSoftkey); + + mViewManager = aMgr; + + // disable delete group(s) button if only favorites group is present + QContactDetailFilter groupFilter; + groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + groupFilter.setValue(QLatin1String(QContactType::TypeGroup)); + QList groupContactIds = mViewManager->contactManager(SYMBIAN_BACKEND)->contactIds(groupFilter); + if (groupContactIds.count() < 2) + { + mDeleteGroupsAction->setEnabled(false); + } + + // set up the list + mListView = static_cast(mDocumentLoader.findWidget(QString("listView"))); + + connect(mListView, SIGNAL(activated(const QModelIndex&)), this, + SLOT(openGroup(const QModelIndex&))); + connect(mListView, SIGNAL(longPressed(HbAbstractViewItem*,QPointF)), this, + SLOT(showContextMenu(HbAbstractViewItem*,QPointF))); + + HbFrameBackground frame; + frame.setFrameGraphicsName("qtg_fr_list_normal"); + frame.setFrameType(HbFrameDrawer::NinePieces); + mListView->itemPrototypes().first()->setDefaultFrame(frame); + + mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::LargeIcon); + + mModel = new CntCollectionListModel(mViewManager->contactManager(SYMBIAN_BACKEND), this); + mListView->setModel(mModel); +} + +void CntCollectionView::deactivate() +{ + +} + +/*! +Go back to previous view +*/ +void CntCollectionView::showPreviousView() +{ + CntViewParameters viewParameters; + mViewManager->back(viewParameters); } /*! Called after user clicked on the listview. */ -void CntCollectionView::onListViewActivated(const QModelIndex &index) +void CntCollectionView::openGroup(const QModelIndex &index) { - int id = index.data(Qt::UserRole).toInt(); - - if (id == -1) + int id = index.data(Qt::UserRole).toInt(); + int favoriteGrpId = mModel->favoriteGroupId(); + + if (id == favoriteGrpId ) { - CntViewParameters viewParameters(CntViewParameters::collectionFavoritesView); - viewManager()->onActivateView(viewParameters); + QContact favoriteGroup = mViewManager->contactManager(SYMBIAN_BACKEND)->contact(favoriteGrpId); + QContactRelationshipFilter rFilter; + rFilter.setRelationshipType(QContactRelationship::HasMember); + rFilter.setRelatedContactRole(QContactRelationshipFilter::First); + rFilter.setRelatedContactId(favoriteGroup.id()); + // group members and their count + QList groupMemberIds = mViewManager->contactManager(SYMBIAN_BACKEND)->contactIds(rFilter); + + if (groupMemberIds.isEmpty()) + { + CntViewParameters viewParameters(CntViewParameters::collectionFavoritesView); + viewParameters.setSelectedContact(favoriteGroup); + mViewManager->changeView(viewParameters); + } + else + { + CntViewParameters viewParameters(CntViewParameters::FavoritesMemberView); + viewParameters.setSelectedContact(favoriteGroup); + mViewManager->changeView(viewParameters); + } } else { - QContact groupContact = contactManager()->contact(id); - CntViewParameters viewParameters(CntViewParameters::groupActionsView); + QContact groupContact = mViewManager->contactManager(SYMBIAN_BACKEND)->contact(id); + CntViewParameters viewParameters(CntViewParameters::groupMemberView); viewParameters.setSelectedContact(groupContact); - viewManager()->onActivateView(viewParameters); + mViewManager->changeView(viewParameters); } } -void CntCollectionView::onLongPressed(HbAbstractViewItem *item, const QPointF &coords) +void CntCollectionView::showContextMenu(HbAbstractViewItem *item, const QPointF &coords) { + int id = item->modelIndex().data(Qt::UserRole).toInt(); + int favoriteGrpId = mModel->favoriteGroupId(); + HbMenu *menu = new HbMenu(); HbAction *openAction = 0; HbAction *deleteAction = 0; - HbAction *homeScreenAction = 0; openAction = menu->addAction(hbTrId("txt_common_menu_open")); - if (item->modelIndex().data(Qt::UserRole).toInt() > -1) + if (id != favoriteGrpId) { deleteAction = menu->addAction(hbTrId("txt_phob_menu_delete_group")); } - homeScreenAction = menu->addAction(hbTrId("txt_phob_opt_send_to_homescreen_as_widget")); - homeScreenAction->setEnabled(false); - HbAction *selectedAction = menu->exec(coords); if (selectedAction) { if (selectedAction == openAction) { - onListViewActivated(item->modelIndex()); + openGroup(item->modelIndex()); } else if (selectedAction == deleteAction) { - connect(commands(), SIGNAL(commandExecuted(QString, QContact)), this, - SLOT(handleExecutedCommand(QString, QContact))); - QContact groupContact = contactManager()->contact(item->modelIndex().data(Qt::UserRole).toInt()); - commands()->deleteContact(groupContact); - } - else if (selectedAction == homeScreenAction) - { - + QContact groupContact = mViewManager->contactManager(SYMBIAN_BACKEND)->contact(id); + deleteGroup(groupContact); } } menu->deleteLater(); } -void CntCollectionView::handleExecutedCommand(QString command, QContact contact) -{ - if (command == "delete") - { - static_cast(listView()->model())->removeGroup(contact.localId()); - } -} - -/*! -Add actions also to toolbar -*/ -void CntCollectionView::addActionsToToolBar() -{ - actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:nameslist") << actions()->baseAction("cnt:collections") - << actions()->baseAction("cnt:refresh") << actions()->baseAction("cnt:newgroup"); - actions()->addActionsToToolBar(toolBar()); - - connect(actions()->baseAction("cnt:nameslist"), SIGNAL(triggered()), - this, SLOT (aboutToCloseView())); - - actions()->baseAction("cnt:collections")->setEnabled(false); - - connect(actions()->baseAction("cnt:newgroup"), SIGNAL(triggered()), - this, SLOT (newGroup())); -} - void CntCollectionView::newGroup() { QString mTextOfNewItem(""); HbInputDialog popup; - HbGroupBox *headingLabel = new HbGroupBox(); - HbLabel *label = new HbLabel(hbTrId("txt_phob_title_new_group_name")); - headingLabel->setContentWidget(label); + HbGroupBox *headingLabel = new HbGroupBox(&popup); + headingLabel->setHeading("txt_phob_title_new_group_name"); popup.setHeadingWidget(headingLabel); popup.setPrimaryAction(new HbAction(hbTrId("txt_phob_button_create"),&popup)); popup.setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"),&popup)); @@ -176,97 +242,46 @@ QContact groupContact; groupContact.setType(QContactType::TypeGroup); - QContactName groupName; groupName.setCustomLabel(mTextOfNewItem); groupContact.saveDetail(&groupName); - contactManager()->saveContact(&groupContact); + mViewManager->contactManager(SYMBIAN_BACKEND)->saveContact(&groupContact); // call a dialog to display the contacts - CntGroupSelectionPopup *groupSelectionPopup = new CntGroupSelectionPopup(contactManager(),contactModel(),&groupContact); + CntGroupSelectionPopup *groupSelectionPopup = + new CntGroupSelectionPopup(mViewManager->contactManager(SYMBIAN_BACKEND), &groupContact); groupSelectionPopup->populateListOfContact(); HbAction* action = groupSelectionPopup->exec(); if (action == groupSelectionPopup->primaryAction()) { groupSelectionPopup->saveNewGroup(); - CntViewParameters viewParameters(CntViewParameters::groupActionsView); + CntViewParameters viewParameters(CntViewParameters::groupMemberView); viewParameters.setSelectedContact(groupContact); - viewManager()->onActivateView(viewParameters); + mViewManager->changeView(viewParameters); delete groupSelectionPopup; } else if (action == groupSelectionPopup->secondaryAction()) { delete groupSelectionPopup; - QString groupNameCreated(groupName.value( QContactName::FieldCustomLabel )); + QString groupNameCreated(groupName.customLabel()); HbNotificationDialog::launchDialog(hbTrId("txt_phob_dpophead_new_group_1_created").arg(groupNameCreated)); //refresh the page refreshDataModel(); - //reconstruct the menu items - addMenuItems(); + mDeleteGroupsAction->setEnabled(true); } } } -void CntCollectionView::setDataModel() -{ - HbListViewItem *prototype = listView()->listItemPrototype(); - prototype->setGraphicsSize(HbListViewItem::LargeIcon); - mModel = new CntCollectionListModel(contactManager(), this); - listView()->setModel(mModel); -} - void CntCollectionView::refreshDataModel() { + mListView->setModel(0); delete mModel; mModel = 0; - mModel = new CntCollectionListModel(contactManager(), this); - listView()->setModel(mModel); -} - -void CntCollectionView::addMenuItems() -{ - bool ok = false; - HbDocumentLoader documentLoader; - documentLoader.load(CNT_COLLECTIONVIEW_ACTIONS_XML, &ok); - if (!ok) - { - qFatal("Unable to read :/xml/contacts_actions.docml"); - } - - //Uncomment this once spec for this is ready - // mReorderAction = qobject_cast(documentLoader.findObject("cnt:reordergroups")); - mDeleteGroupAction = qobject_cast(documentLoader.findObject("cnt:deletegroups")); - - //Uncomment this once spec for this is ready - // mDisconnectAllAction =qobject_cast(documentLoader.findObject("cnt:disconnectall")); - - delete mOptionsMenu; - mOptionsMenu = 0; - mOptionsMenu = new HbMenu(); - //Uncomment this once spec for this is ready - //mOptionsMenu->addAction(mReorderAction); - - //add deletegroup action to option menu if group presents - QContactDetailFilter groupFilter; - groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); - groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup))); - QList groupContactIds = contactManager()->contacts(groupFilter); - if (!groupContactIds.isEmpty()) - { - mOptionsMenu->addAction(mDeleteGroupAction); - } - - //Uncomment this once spec for this is ready - // mOptionsMenu->addAction(mDisconnectAllAction); - - // connect(mReorderAction, SIGNAL(triggered()), this, SLOT (reorderGroup())); - connect(mDeleteGroupAction, SIGNAL(triggered()), this, SLOT (deleteGroups())); - // connect(mDisconnectAllAction, SIGNAL(triggered()), this, SLOT (disconnectAll())); - - setMenu(mOptionsMenu); + mModel = new CntCollectionListModel(mViewManager->contactManager(SYMBIAN_BACKEND), this); + mListView->setModel(mModel); } void CntCollectionView::reorderGroup() @@ -274,27 +289,57 @@ // wait for specs } +void CntCollectionView::deleteGroup(QContact group) +{ + QString name = group.displayLabel(); + + HbMessageBox *note = new HbMessageBox(hbTrId("txt_phob_info_delete_1").arg(name), HbMessageBox::MessageTypeQuestion); + note->setPrimaryAction(new HbAction(hbTrId("txt_phob_button_delete"), note)); + note->setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), note)); + HbAction *selected = note->exec(); + if (selected == note->primaryAction()) + { + mViewManager->contactManager(SYMBIAN_BACKEND)->removeContact(group.localId()); + mModel->removeGroup(group.localId()); + + // disable delete group(s) button if only favorites group is present + QContactDetailFilter groupFilter; + groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + groupFilter.setValue(QLatin1String(QContactType::TypeGroup)); + QList groupContactIds = mViewManager->contactManager(SYMBIAN_BACKEND)->contactIds(groupFilter); + if (groupContactIds.count() < 2) + { + mDeleteGroupsAction->setEnabled(false); + } + } + delete note; +} + void CntCollectionView::deleteGroups() { // save the group here - QContact groupContact; - groupContact.setType(QContactType::TypeGroup); - - CntGroupSelectionPopup *groupSelectionPopup = new CntGroupSelectionPopup(contactManager(),contactModel(),&groupContact); + CntGroupDeletePopup *groupDeletePopup = new CntGroupDeletePopup(mViewManager->contactManager(SYMBIAN_BACKEND)); - groupSelectionPopup->populateListOfGroup(); - HbAction* action = groupSelectionPopup->exec(); - if (action == groupSelectionPopup->primaryAction()) + groupDeletePopup->populateListOfGroup(); + HbAction* action = groupDeletePopup->exec(); + if (action == groupDeletePopup->primaryAction()) { - groupSelectionPopup->deleteGroup(); + groupDeletePopup->deleteGroup(); } - delete groupSelectionPopup; - + delete groupDeletePopup; //refresh the page refreshDataModel(); - //reconstruct the menu items - addMenuItems(); + + // disable delete group(s) button if only favorites group is present + QContactDetailFilter groupFilter; + groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + groupFilter.setValue(QLatin1String(QContactType::TypeGroup)); + QList groupContactIds = mViewManager->contactManager(SYMBIAN_BACKEND)->contactIds(groupFilter); + if (groupContactIds.count() < 2) + { + mDeleteGroupsAction->setEnabled(false); + } } void CntCollectionView::disconnectAll() diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntcommands.cpp --- a/phonebookui/pbkcommonui/src/cntcommands.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntcommands.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -81,11 +81,12 @@ { int copied(0); int failed(0); - QList contactIds = mContactSimManager->contacts(); + QList contactIds = mContactSimManager->contactIds(); if (contactIds.count() == 0) { HbMessageBox::information("Nothing to copy: SIM card is empty or not accessible."); return; } + foreach(QContactLocalId id, contactIds) { QContact contact = mContactSimManager->contact(id); if (contact.localId() > 0) { @@ -94,6 +95,16 @@ contactId->setLocalId(0); contactId->setManagerUri(QString()); contact.setId(*contactId); + + // custom label contains name information, save it to the first name + QList names = contact.details(QContactName::DefinitionName); + if (names.count() > 0) { + QContactName name = static_cast(names.at(0)); + name.setFirstName(name.customLabel()); + name.setCustomLabel(QString()); + contact.saveDetail(&name); + } + if (mContactManager->saveContact(&contact)) { copied++; } @@ -110,6 +121,7 @@ resultMessage.append(" contact copied, "); resultMessage.append(QString().setNum(failed)); resultMessage.append(" failed."); + HbMessageBox::information(resultMessage); } @@ -119,9 +131,9 @@ void CntCommands::editContact(QContact contact) { CntViewParameters viewParameters(CntViewParameters::editView); - viewParameters.setPreviousViewId(mViewManager.previousViewParameters().previousViewId()); + //viewParameters.setPreviousViewId(mViewManager.previousViewParameters().previousViewId()); viewParameters.setSelectedContact(contact); - mViewManager.onActivateView(viewParameters); + mViewManager.changeView(viewParameters); } /*! @@ -129,7 +141,7 @@ */ void CntCommands::deleteContact(QContact contact) { - QString name = mContactManager->synthesizeDisplayLabel(contact); + QString name = mContactManager->synthesizedDisplayLabel(contact); HbMessageBox *note = new HbMessageBox(hbTrId("txt_phob_info_delete_1").arg(name), HbMessageBox::MessageTypeQuestion); note->setPrimaryAction(new HbAction(hbTrId("txt_phob_button_delete"), note)); @@ -151,7 +163,7 @@ CntViewParameters viewParameters(CntViewParameters::commLauncherView); viewParameters.setSelectedContact(contact); - mViewManager.onActivateView(viewParameters); + mViewManager.changeView(viewParameters); } /*! @@ -161,7 +173,7 @@ { CntViewParameters viewParameters(CntViewParameters::historyView); viewParameters.setSelectedContact(contact); - mViewManager.onActivateView(viewParameters); + mViewManager.changeView(viewParameters); } /*! diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntcompanyeditormodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntcompanyeditormodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,88 @@ +/* +* 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 "cntcompanyeditormodel.h" +#include "cntdetailconst.h" +#include + +CntCompanyEditorModel::CntCompanyEditorModel(QContact* aContact) : + CntDetailEditorModel(aContact) +{ + QList orgList = mContact->details (); + if (orgList.isEmpty()) { + QContactOrganization organization; + orgList << organization; + } + + mCompany = orgList.first(); + + HbDataFormModelItem* organization = new HbDataFormModelItem(HbDataFormModelItem::TextItem, + qtTrId("Company")); + organization->setContentWidgetData("text", mCompany.name()); + organization->setContentWidgetData("maxLength", CNT_ORGANIZATION_MAXLENGTH); + + HbDataFormModelItem* jobTitle = new HbDataFormModelItem(HbDataFormModelItem::TextItem, qtTrId( + "Job title")); + jobTitle->setContentWidgetData("text", mCompany.title()); + jobTitle->setContentWidgetData("maxLength", CNT_JOBTITLE_MAXLENGTH); + + HbDataFormModelItem* department = new HbDataFormModelItem(HbDataFormModelItem::TextItem, + qtTrId("Department")); + department->setContentWidgetData("text", mCompany.department()); + department->setContentWidgetData("maxLength", CNT_DEPARTMENT_MAXLENGTH); + + HbDataFormModelItem* assistant = new HbDataFormModelItem(HbDataFormModelItem::TextItem, qtTrId( + "Assistant name")); + assistant->setContentWidgetData("text", mCompany.assistantName()); + assistant->setContentWidgetData("maxLength", CNT_ASSISTANT_MAXLENGTH); + + HbDataFormModelItem* root = invisibleRootItem(); + appendDataFormItem(organization, root); + appendDataFormItem(jobTitle, root); + appendDataFormItem(department, root); + appendDataFormItem(assistant, root); +} + +CntCompanyEditorModel::~CntCompanyEditorModel() +{ +} + +void CntCompanyEditorModel::saveContactDetails() +{ + HbDataFormModelItem* root = invisibleRootItem(); + if (!root->childAt(0)->contentWidgetData("text").toString().isEmpty()) + mCompany.setName( root->childAt(0)->contentWidgetData("text").toString() ); + else + mCompany.setName(QString()); + if (!root->childAt(1)->contentWidgetData("text").toString().isEmpty()) + mCompany.setTitle( root->childAt(1)->contentWidgetData("text").toString() ); + else + mCompany.setTitle(QString()); + if (!root->childAt(2)->contentWidgetData("text").toString().isEmpty()) + mCompany.setDepartment( root->childAt(2)->contentWidgetData("text").toString().split(", ") ); + else + mCompany.setDepartment(QStringList()); + if (!root->childAt(3)->contentWidgetData("text").toString().isEmpty()) + mCompany.setAssistantName( root->childAt(3)->contentWidgetData("text").toString() ); + else + mCompany.setAssistantName(QString()); + + if ( !mCompany.isEmpty() ) { + mContact->saveDetail( &mCompany ); + } +} + +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntcontactcarddatacontainer.cpp --- a/phonebookui/pbkcommonui/src/cntcontactcarddatacontainer.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntcontactcarddatacontainer.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -16,6 +16,7 @@ */ #include "cntcontactcarddatacontainer.h" +#include //For fetching maptile #include #include @@ -106,7 +107,7 @@ //data dataList.append(number.number()); //icon - dataList.append(":/icons/qtg_large_message.svg"); + dataList.append("qtg_large_message"); //detail QContactDetail detail(number); QVariant var; @@ -141,7 +142,7 @@ //data dataList.append(email.emailAddress()); //icon - dataList.append(":/icons/qtg_large_email.svg"); + dataList.append("qtg_large_email"); //detail QContactDetail detail(email); QVariant var; @@ -170,7 +171,7 @@ //data callDataList.append(confCallNumber.number()); //icon - callDataList.append(":/icons/qtg_large_call_group.svg"); + callDataList.append("qtg_large_call_group"); //detail QContactDetail detail(confCallNumber); QVariant var; @@ -189,7 +190,7 @@ //data messageDataList.append(confCallNumber.number()); //icon - messageDataList.append(":/icons/qtg_large_message.svg"); + messageDataList.append("qtg_large_message"); //detail QContactDetail messageDetail(confCallNumber); QVariant messageVar; @@ -205,7 +206,7 @@ //data emailDataList.append(confCallNumber.number()); //icon - emailDataList.append(":/icons/qtg_large_email.svg"); + emailDataList.append("qtg_large_email"); //detail QContactDetail emailDetail(confCallNumber); QVariant emailVar; @@ -220,10 +221,15 @@ */ void CntContactCardDataContainer::initializeDetailsData() { + QString contextHome(QContactAddress::ContextHome.operator QString()); + QString contextWork(QContactAddress::ContextWork.operator QString()); + CntMapTileService::ContactAddressType sourceAddressType; + mLocationFeatureEnabled = CntMapTileService::isLocationFeatureEnabled() ; //address QList addressDetails = mContact->details(); for (int i = 0; i < addressDetails.count(); i++) { + sourceAddressType = CntMapTileService::AddressPreference; QVariantList addressList; //no action addressList.append(QString()); @@ -233,7 +239,16 @@ } else { - addressList.append(hbTrId("Address (%1):").arg(addressDetails[i].contexts().at(0))); + if ( addressDetails[i].contexts().at(0) == contextHome ) + { + sourceAddressType = CntMapTileService::AddressHome; + addressList.append(hbTrId("txt_phob_formlabel_address_home")); + } + else if (addressDetails[i].contexts().at(0) == contextWork) + { + sourceAddressType = CntMapTileService::AddressWork; + addressList.append(hbTrId("txt_phob_formlabel_address_work")); + } } QStringList address; @@ -260,6 +275,27 @@ addressList.append(var); addSeparator(rowCount()); mDataPointer->mDataList.insert(rowCount(), addressList); + //Check whether location feature enabled + if (mLocationFeatureEnabled) + { + TUint32 contactId = mContact->id().localId(); + + //Get the maptile image path + QString imageFile = CntMapTileService::getMapTileImage(contactId, sourceAddressType); + + if ( !imageFile.isNull() ) + { + //Insert the imagepath in data container + QVariantList maptileImage; + maptileImage.append(QString()); + maptileImage.append(QString(" ")); + maptileImage.append(QString(" ")); + + maptileImage.append( imageFile ); + addSeparator(rowCount()); + mDataPointer->mDataList.insert(rowCount(), maptileImage); + } + } } //birthday @@ -311,7 +347,7 @@ QVariantList dataList; //no action dataList.append(QString()); - dataList.append(hbTrId("Ringtone:")); + dataList.append(hbTrId("txt_phob_formlabel_ringing_tone")); dataList.append(ringtoneDetails[i].avatar()); //no icon dataList.append(QString()); diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntcontactcardheadingitem.cpp --- a/phonebookui/pbkcommonui/src/cntcontactcardheadingitem.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntcontactcardheadingitem.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -18,6 +18,7 @@ #include "cntcontactcardheadingitem.h" #include +#include #include #include @@ -25,8 +26,8 @@ #include #include #include - - +#include +#include CntContactCardHeadingItem::CntContactCardHeadingItem(QGraphicsItem *parent) : HbWidget(parent), @@ -36,7 +37,10 @@ mSecondLineText(0), mSecondaryText(0), mMarqueeItem(0), - mFrameItem(0) + mFrameItem(0), + mGestureFilter(0), + mGestureLongpressed(0), + mPictureArea(0) { } @@ -173,6 +177,14 @@ mFrameItem->setZValue(-2); style()->setItemName(mFrameItem, "background"); } + + + if (!mPictureArea) { + mPictureArea = new HbTouchArea(this); + style()->setItemName(mPictureArea, "pictureArea"); + } + + initGesture(); } void CntContactCardHeadingItem::setIcon(const HbIcon newIcon) @@ -210,6 +222,9 @@ delete mFrameItem; mFrameItem = 0; + + delete mPictureArea; + mPictureArea = 0; createPrimitives(); } @@ -239,7 +254,7 @@ tinyMarqueeText.clear(); // icon label - icon = HbIcon(":/icons/qtg_large_avatar.svg"); + icon = HbIcon("qtg_large_avatar"); QContactName name = contact->detail(); @@ -248,7 +263,7 @@ { // prefix, first, middle, last and suffix QStringList nameList; - nameList << name.prefix() << name.first() << name.middle() << name.last() << name.suffix(); + nameList << name.prefix() << name.firstName() << name.middleName() << name.lastName() << name.suffix(); firstLineText = nameList.join(" ").trimmed(); if (firstLineText.isEmpty()) { @@ -259,7 +274,7 @@ { // prefix, first, middle, last and suffix QStringList nameList; - nameList << name.prefix() << name.first() << name.middle() << name.last() << name.suffix(); + nameList << name.prefix() << name.firstName() << name.middleName() << name.lastName() << name.suffix(); primaryText = nameList.join(" ").trimmed(); if (primaryText.isEmpty()) { @@ -288,8 +303,9 @@ // company label if (isCompanyName(contact)) { + QContactOrganization org = contact->detail(); QStringList companyList; - companyList << contact->detail().title() << contact->detail().name(); + companyList << org.title() << org.name() << org.department(); tinyMarqueeText = companyList.join(" ").trimmed(); } @@ -303,7 +319,7 @@ icon.clear(); // icon label - icon = HbIcon(":/icons/qtg_large_custom.svg"); + icon = HbIcon("qtg_large_custom"); QContactName contactName = contact->detail( QContactName::DefinitionName ); QString groupName = contactName.value( QContactName::FieldCustomLabel ); @@ -317,3 +333,44 @@ recreatePrimitives(); } + +void CntContactCardHeadingItem::processLongPress(const QPointF &point) +{ + emit passLongPressed(point); +} + +void CntContactCardHeadingItem::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + event->accept(); +} + +void CntContactCardHeadingItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + event->accept(); +} + +void CntContactCardHeadingItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + if (rect().contains(event->pos())) { + emit clicked(); + } + event->accept(); +} + +void CntContactCardHeadingItem::initGesture() +{ + mGestureFilter = new HbGestureSceneFilter(Qt::LeftButton, this); + + // Orbit documentation states that added gestures will be deleted + // when the filter is deleted (filter takes ownership). So no + // need to worry about deleting the gesture. + mGestureLongpressed = new HbGesture(HbGesture::longpress, 5); + mGestureFilter->addGesture(mGestureLongpressed); + mGestureFilter->setLongpressAnimation(true); + + installSceneEventFilter(mGestureFilter); + connect(mGestureLongpressed, SIGNAL(longPress(QPointF)), this, SLOT(processLongPress(QPointF))); +} + +// EOF + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntcontactcardview.cpp --- a/phonebookui/pbkcommonui/src/cntcontactcardview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntcontactcardview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -22,15 +22,15 @@ #include #include #include - +#include #include #include #include - #include "cntcontactcarddatacontainer.h" #include "cntcontactcarddetailitem.h" #include "cntcontactcardheadingitem.h" #include "cntmainwindow.h" +#include //For maptile processing #include "cntcommands.h" const char *CNT_COMMLAUNCERVIEW_XML = ":/xml/contacts_cc.docml"; @@ -50,7 +50,10 @@ mHeadingItem(0), mThumbnailManager(0), mGroupContact(0), - mIsGroupMember(false) + mAvatar(0), + mIsGroupMember(false), + mIsHandlingMenu(false), + mFavoriteGroupId(-1) { bool ok = false; ok = loadDocument(CNT_COMMLAUNCERVIEW_XML); @@ -80,18 +83,28 @@ CntContactCardView::~CntContactCardView() { delete mContact; + mContact = 0; + delete mDataContainer; + mDataContainer = 0; + delete mGroupContact; + mGroupContact = 0; + + delete mAvatar; + mAvatar = 0; } void CntContactCardView::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error) { Q_UNUSED(data); Q_UNUSED(id); - Q_UNUSED(error); - QIcon qicon(pixmap); - HbIcon icon(qicon); - mHeadingItem->setIcon(icon); + if (!error) + { + QIcon qicon(pixmap); + HbIcon icon(qicon); + mHeadingItem->setIcon(icon); + } } /*! @@ -101,7 +114,8 @@ { actions()->clearActionList(); actions()->actionList() << actions()->baseAction("cnt:sendbusinesscard") << actions()->baseAction("cnt:editcontact") << - actions()->baseAction("cnt:addtogroup") << actions()->baseAction("cnt:deletecontact"); + actions()->baseAction("cnt:addtogroup") << actions()->baseAction("cnt:deletecontact") << + actions()->baseAction("cnt:setasfavorite") << actions()->baseAction("cnt:removefromfavorite"); actions()->addActionsToMenu(menu()); connect(actions()->baseAction("cnt:sendbusinesscard"), SIGNAL(triggered()), @@ -115,12 +129,15 @@ connect(actions()->baseAction("cnt:deletecontact"), SIGNAL(triggered()), this, SLOT (deleteContact())); + connect(actions()->baseAction("cnt:setasfavorite"), SIGNAL(triggered()), + this, SLOT (setAsFavorite())); + connect(actions()->baseAction("cnt:removefromfavorite"), SIGNAL(triggered()), + this, SLOT (removeFromFavorite())); // to be enabled after implementation actions()->baseAction("cnt:sendbusinesscard")->setEnabled(false); actions()->baseAction("cnt:addtogroup")->setEnabled(false); - -} + } /*! Add actions also to toolbar @@ -145,7 +162,7 @@ { CntViewParameters viewParameters(CntViewParameters::editView); viewParameters.setSelectedContact(*mContact); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } void CntContactCardView::sendBusinessCard() @@ -156,6 +173,49 @@ { } +void CntContactCardView::setAsFavorite() +{ + QContact favoriteGroup; + if (!isFavoriteGroupCreated() ) + { + //Create Fav grp + favoriteGroup.setType(QContactType::TypeGroup); + QContactName favoriteGroupName; + favoriteGroupName.setCustomLabel("Favorites"); + favoriteGroup.saveDetail(&favoriteGroupName); + contactManager()->saveContact(&favoriteGroup); + mFavoriteGroupId = favoriteGroup.localId(); + } + else + { + favoriteGroup = contactManager()->contact(mFavoriteGroupId); + } + + // new contact added to the favorite group + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(favoriteGroup.id()); + relationship.setSecond(mContact->id()); + // save relationship + contactManager()->saveRelationship(&relationship); + + menu()->removeAction(actions()->baseAction("cnt:setasfavorite")); + menu()->addAction(actions()->baseAction("cnt:removefromfavorite")); +} + + +void CntContactCardView::removeFromFavorite() + { + QContact favoriteGroup = contactManager()->contact(mFavoriteGroupId); + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(favoriteGroup.id()); + relationship.setSecond(mContact->id()); + contactManager()->removeRelationship(relationship); + + menu()->removeAction(actions()->baseAction("cnt:removefromfavorite")); + menu()->addAction(actions()->baseAction("cnt:setasfavorite")); + } /*! Delete contact */ @@ -185,11 +245,13 @@ { CntViewParameters viewParameters(CntViewParameters::groupMemberView); viewParameters.setSelectedContact(*mGroupContact); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } else { - viewManager()->onActivateView(CntViewParameters::namesView); + //viewManager()->onActivateView(CntViewParameters::namesView); + CntViewParameters viewParameters; + viewManager()->back( viewParameters ); } } @@ -208,7 +270,7 @@ if (command == "delete") { CntViewParameters viewParameters(CntViewParameters::namesView); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } } @@ -232,6 +294,8 @@ mHeadingItem = new CntContactCardHeadingItem(c); mHeadingItem->setDetails(mContact); + + connect(mHeadingItem, SIGNAL(passLongPressed(const QPointF&)), this, SLOT(drawMenu(const QPointF&))); l->insertItem(0, mHeadingItem); @@ -243,7 +307,8 @@ { if (details.at(i).subType() == QContactAvatar::SubTypeImage) { - mThumbnailManager->getThumbnail(details.at(i).avatar()); + mAvatar = new QContactAvatar(details.at(i)); + mThumbnailManager->getThumbnail(mAvatar->avatar()); break; } } @@ -363,37 +428,141 @@ { CntContactCardDetailItem* item = new CntContactCardDetailItem(index, mContainerWidget, false); + //Display the maptile image HbIcon icon(""); + QIcon mapTileIcon; QString text; QString valueText; + + QPainter painter; + QPixmap baloon( ":/icons/pin.png" ); + int maptileWidth = 0; + int maptileHeight = 0; + - QVariant displayRole = mDataContainer->data(index, Qt::DisplayRole); - QStringList stringList; - if (displayRole.canConvert()) - { - stringList.append(displayRole.toString()); - } - else if (displayRole.canConvert()) + QVariant decorationRole = mDataContainer->data( index, Qt::DecorationRole ); + if ( decorationRole.canConvert()) { - stringList = displayRole.toStringList(); - } - - for (int j = 0; j < stringList.count(); j++) + //Get the maptile image + icon = decorationRole.value(); + QPixmap map (icon.pixmap()); + + maptileWidth = map.width(); + maptileHeight = map.height(); + + //Display pin image in the center of maptile image + painter.begin( &map ); + painter.drawPixmap( (map.width()/2), + ((map.height()/2)-(baloon.height())), baloon ); + painter.end(); + mapTileIcon.addPixmap( map ); + } + else if (decorationRole.canConvert< QList >()) { - if (j==0) + QVariantList variantList; + variantList = decorationRole.toList(); + for (int j = 0; j < variantList.count(); j++) { - text = stringList.at(0); - } - else if (j==1) - { - valueText = stringList.at(1); + if (j==0 && variantList.at(0).canConvert()) + { + icon = variantList.at(0).value(); + QPixmap map (icon.pixmap()); + + maptileWidth = map.width(); + maptileHeight = map.height(); + + + //Display pin image in the center of maptile image + painter.begin( &map ); + painter.drawPixmap( (map.width()/2), + ((map.height()/2)-(baloon.height())), baloon ); + painter.end(); + mapTileIcon.addPixmap( map ); + } } } - + else + { + QVariant displayRole = mDataContainer->data(index, Qt::DisplayRole); + QStringList stringList; + if (displayRole.canConvert()) + { + stringList.append(displayRole.toString()); + } + else if (displayRole.canConvert()) + { + stringList = displayRole.toStringList(); + } + + for (int j = 0; j < stringList.count(); j++) + { + if (j==0) + { + text = stringList.at(0); + } + else if (j==1) + { + valueText = stringList.at(1); + } + } + } + //Display maptile image if it is available + HbIcon mapIcon( mapTileIcon ); + if ( !mapIcon.isNull() ) + { + HbLabel* iconLabel=new HbLabel(this); + iconLabel->setIcon( mapIcon ); + iconLabel->setPreferredSize( maptileWidth, maptileHeight ); + mContainerLayout->addItem( iconLabel ); + } + else + { item->setDetails(icon, text, valueText); mContainerLayout->addItem(item); + } } } + + bool setAsFavorite = false; + if(isFavoriteGroupCreated()) + { + QContact favoriteGroup = contactManager()->contact(mFavoriteGroupId); + // Use relationship filter to get list of contacts in the relationship (if any) + QContactRelationshipFilter filter; + filter.setRelationshipType(QContactRelationship::HasMember); + filter.setRelatedContactRole(QContactRelationshipFilter::First); + filter.setRelatedContactId(favoriteGroup.id()); + + QList mContactsList = contactManager()->contactIds(filter); + int count = mContactsList.count(); + if (count) + { + for (int i = 0 ; i < count ; i++) + { + if (mContactsList.at(i) == mContact->localId() ) + { + setAsFavorite = true; + } + } + } + } + + if(setAsFavorite) + { + menu()->removeAction(actions()->baseAction("cnt:setasfavorite")); + } + else + { + menu()->removeAction(actions()->baseAction("cnt:removefromfavorite")); + } +} + +/*! +Called after user selects to view the icon image. +*/ +void CntContactCardView::doViewImage() +{ + // TODO Image viewer not implemented yet in QtHighway. Pending implementation } /*! @@ -504,4 +673,90 @@ } } +/*! +Called after the user clicked "Change Image" from popup menu after +longpressing the image in this view. +*/ +void CntContactCardView::doChangeImage() +{ + CntViewParameters viewParameters(CntViewParameters::imageEditorView); + viewParameters.setSelectedContact(*mContact); + viewManager()->changeView(viewParameters); +} + +/*! +Called after the user clicked "Remove Image" from popup menu after +longpressing the image in this view. +*/ +void CntContactCardView::doRemoveImage() +{ + if (mAvatar) { + bool success = mContact->removeDetail(mAvatar); + if (success) { + contactManager()->saveContact(mContact); + } + } +} + +void CntContactCardView::drawMenu(const QPointF &aCoords) +{ + if (mIsHandlingMenu) return; + + // To avoid re-drawing the menu and causing a crash due to + // multiple emitted signals, set state that we are handling the signal + mIsHandlingMenu = true; + + HbMenu *menu = new HbMenu(); + HbAction *viewAction = menu->addAction(hbTrId("View")); + HbAction *changeImageAction = menu->addAction(hbTrId("Change Image")); + HbAction *removeAction = menu->addAction(hbTrId("Remove Image")); + + menu->addSeparator(); + + HbAction *selectedAction = menu->exec(aCoords); + + if (selectedAction) { + if (selectedAction == viewAction) { + doViewImage(); + } + else if (selectedAction == changeImageAction) { + doChangeImage(); + } + else if (selectedAction == removeAction) { + doRemoveImage(); + } + } + + mIsHandlingMenu = false; + + menu->deleteLater(); +} + +bool CntContactCardView::isFavoriteGroupCreated() +{ + bool favoriteGroupCreated = false; + QContactDetailFilter groupFilter; + groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup))); + + QList groupContactIds = contactManager()->contactIds(groupFilter); + + if (!groupContactIds.isEmpty()) + { + for(int i = 0;i < groupContactIds.count();i++) + { + QContact contact = contactManager()->contact(groupContactIds.at(i)); + QContactName contactName = contact.detail(); + QString groupName = contactName.customLabel(); + if(groupName.compare("Favorites") == 0) + { + favoriteGroupCreated = true; + mFavoriteGroupId = groupContactIds.at(i); + break; + } + } + } + return favoriteGroupCreated; +} + // end of file diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntdateeditormodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntdateeditormodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,68 @@ +/* +* 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 "cntdateeditormodel.h" +#include "cntdetailmodelitem.h" +#include +#include +#include + +CntDateEditorModel::CntDateEditorModel( QContact* aContact ) : +CntDetailEditorModel( aContact ) + { + QList bdList = mContact->details(); + if ( bdList.isEmpty() ) + { + QContactBirthday birthday; + bdList << birthday; + } + + QList anniversaryList = mContact->details(); + if ( anniversaryList.isEmpty() ) + { + QContactAnniversary anniversary; + anniversaryList << anniversary; + } + + mBirthday = bdList.first(); + mAnniversary = anniversaryList.first(); + + HbDataFormModelItem* root = invisibleRootItem(); + appendDataFormItem( new CntDetailModelItem( mBirthday, qtTrId("Birthday")), root ); + appendDataFormItem( new CntDetailModelItem( mAnniversary, qtTrId("Anniversary")), root ); + } + +CntDateEditorModel::~CntDateEditorModel() + { + } + +void CntDateEditorModel::saveContactDetails() +{ + HbDataFormModelItem* root = invisibleRootItem(); + // Birthday + CntDetailModelItem* birthday = static_cast( root->childAt(0) ); + mBirthday = birthday->detail(); + if ( mBirthday.date().isValid() ) + mContact->saveDetail( &mBirthday ); + + // Anniversary + CntDetailModelItem* anniversary = static_cast( root->childAt(1) ); + mAnniversary = anniversary->detail(); + if ( mAnniversary.originalDate().isValid() ) + mContact->saveDetail( &mAnniversary ); + +} +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntdateeditorviewitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntdateeditorviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,146 @@ +/* +* 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 "cntdateeditorviewitem.h" +#include "cntdetailmodelitem.h" +#include "cntdetailconst.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +CntDateEditorViewItem::CntDateEditorViewItem( QGraphicsItem* aParent ) : +CntDetailViewItem( aParent ) + { + mLocale = QLocale::system(); + } + +CntDateEditorViewItem::~CntDateEditorViewItem() + { + } + +HbAbstractViewItem* CntDateEditorViewItem::createItem() + { + return new CntDateEditorViewItem( *this ); + } + +void CntDateEditorViewItem::clicked() + { + HbDataFormModel* model = static_cast(itemView()->model()); + CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); + QContactDetail detail = item->detail(); + + QString buttonText = qtTrId( "No date set" ); + if ( detail.definitionName() == QContactBirthday::DefinitionName ) + { + QContactBirthday bd = detail; + QDate date = editDate( bd.date(), qtTrId("Birthday") ); + if ( date != bd.date() ) + { + bd.setDate( date ); + item->setDetail( bd ); + } + buttonText = mLocale.toString( date ); + } + + if ( detail.definitionName() == QContactAnniversary::DefinitionName ) + { + QContactAnniversary anniversary = detail; + QDate date = editDate( anniversary.originalDate(), qtTrId("Anniversary") ); + if ( date != anniversary.originalDate() ) + { + anniversary.setOriginalDate( date ); + item->setDetail( anniversary ); + } + buttonText = mLocale.toString( date ); + } + + mButton->setText( buttonText ); + } + +HbWidget* CntDateEditorViewItem::createCustomWidget() + { + mButton = new HbPushButton(); + connect( mButton, SIGNAL(clicked(bool)), this, SLOT(clicked()) ); + + HbDataFormModel* model = static_cast(itemView()->model()); + CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); + + QContactDetail detail = item->detail(); + QString text( qtTrId("No date set") ); + + if ( detail.definitionName() == QContactBirthday::DefinitionName ) + { + QContactBirthday birthday = detail; + if ( !birthday.isEmpty() ) + { + text = mLocale.toString( birthday.date() ); + } + } + + if ( detail.definitionName() == QContactAnniversary::DefinitionName ) + { + QContactAnniversary anniversary = detail; + if ( !anniversary.isEmpty() ) + { + text = mLocale.toString( anniversary.originalDate() ); + } + } + mButton->setText( text ); + return mButton; + } + +QDate CntDateEditorViewItem::editDate( QDate aCurrent, QString aTitle ) + { + QPointer popup = new HbDialog(); + popup->setDismissPolicy(HbDialog::NoDismiss); + popup->setTimeout(HbPopup::NoTimeout); + + HbDateTimePicker *picker = new HbDateTimePicker( popup ); + picker->setDisplayFormat( mLocale.dateFormat() ); + picker->setDateRange(CNT_DATEPICKER_FROM, CNT_DATEPICKER_TO ); + picker->setDate( aCurrent ); + + HbTextItem *headingText = new HbTextItem( popup ); + headingText->setFontSpec( HbFontSpec(HbFontSpec::Title) ); + headingText->setText( aTitle ); + + popup->setHeadingWidget(headingText); + popup->setContentWidget(picker); + popup->setPrimaryAction(new HbAction(qtTrId("Ok"), popup)); + popup->setSecondaryAction(new HbAction(qtTrId("Cancel"), popup)); + + HbAction *selected = popup->exec(); + QDate date = (selected == popup->primaryAction()) ? picker->date() : aCurrent; + delete popup; + + return date; + } + +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntdefaultviewfactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntdefaultviewfactory.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,87 @@ +/* +* 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 "cntabstractviewfactory.h" +#include "cntviewparameters.h" +#include "cntmainwindow.h" + +// views +#include "cntnamesview.h" +#include "cntmycardview.h" +#include "cntfavoritesview.h" +#include "cntimageeditorview.h" +#include "cntcollectionview.h" + +CntDefaultViewFactory::CntDefaultViewFactory( ) +{ +} + +CntDefaultViewFactory::~CntDefaultViewFactory() +{ +} + +CntAbstractView* CntDefaultViewFactory::createView( int aId ) +{ + switch ( aId ) + { + case CntViewParameters::namesView: + case CntViewParameters::defaultView: + return new CntNamesView(); + case CntViewParameters::noView: + case CntViewParameters::commLauncherView: + case CntViewParameters::serviceContactCardView: + case CntViewParameters::serviceAssignContactCardView: + break; + case CntViewParameters::myCardView: + return new CntMyCardView(); + case CntViewParameters::myCardSelectionView: + case CntViewParameters::serviceContactSelectionView: + break; + case CntViewParameters::collectionView: + return new CntCollectionView(); + case CntViewParameters::collectionFavoritesView: + return new CntFavoritesView(); + case CntViewParameters::FavoritesMemberView: + case CntViewParameters::editView: + case CntViewParameters::serviceEditView: + case CntViewParameters::serviceSubEditView: + case CntViewParameters::emailEditorView: + case CntViewParameters::namesEditorView: + case CntViewParameters::urlEditorView: + case CntViewParameters::companyEditorView: + case CntViewParameters::phoneNumberEditorView: + case CntViewParameters::onlineAccountEditorView: + case CntViewParameters::noteEditorView: + case CntViewParameters::familyDetailEditorView: + case CntViewParameters::addressEditorView: + case CntViewParameters::dateEditorView: + break; + case CntViewParameters::imageEditorView: + return new CntImageEditorView(); + case CntViewParameters::serviceContactFetchView: + case CntViewParameters::groupEditorView: + case CntViewParameters::groupMemberView: + case CntViewParameters::groupActionsView: + case CntViewParameters::historyView: + break; + default: + break; + } + return NULL; +} + +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntdefaultviewmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntdefaultviewmanager.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,194 @@ +/* +* 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 "cntdefaultviewmanager.h" +#include "cntabstractviewfactory.h" +#include "cntabstractview.h" +#include "cntmainwindow.h" +#include +//#include "cntmodelprovider.h" +#include +#include "cntviewnavigator.h" +#include "cntbaseview.h" + +CntDefaultViewManager::CntDefaultViewManager(CntMainWindow* aWindow, + CntViewParameters::ViewId defaultView) : + CntViewManager(aWindow, defaultView), + mCurrent(0), + mArgs( 0 ) +{ + mFactory = new CntDefaultViewFactory(); + + QContactManager* manager = new QContactManager(SIM_BACKEND); + mBackends.append( manager ); + + mNavigator = new CntViewNavigator(this); + mNavigator->addException( CntViewParameters::editView, CntViewParameters::namesView ); + mNavigator->addException( CntViewParameters::FavoritesMemberView, CntViewParameters::collectionView ); + + if (defaultView != CntViewParameters::noView) { + //activate the view + CntViewParameters viewParameters(defaultView, defaultView); + changeView(viewParameters); + } +} + +CntDefaultViewManager::~CntDefaultViewManager() +{ + delete mFactory; + delete mArgs; +} + +void CntDefaultViewManager::back(const CntViewParameters& aArgs) +{ + if ( mArgs ) + { + delete mArgs; + mArgs = NULL; + } + mArgs = new CntViewParameters( mNavigator->back() ); + mArgs->setSelectedAction(aArgs.selectedAction()); + mArgs->setSelectedContact(aArgs.selectedContact()); + mArgs->setSelectedDetail(aArgs.selectedDetail()); + mArgs->setParameters(aArgs.parameters()); + mArgs->setSelectedGroupContact(aArgs.selectedGroupContact()); + + removeCurrentView(); + if (mArgs->nextViewId() != CntViewParameters::noView) { + switchView( *mArgs ); + } +} + +void CntDefaultViewManager::changeView(const CntViewParameters& aArgs) +{ + removeCurrentView(); + + mNavigator->next( aArgs.nextViewId() ); + switchView(aArgs); +} + +QContactManager* CntDefaultViewManager::contactManager( const QString& aType ) +{ + foreach ( QContactManager* mgr, mBackends ) + { + if ( aType.compare(mgr->managerName(), Qt::CaseInsensitive) == 0 ) + { + return mgr; + } + } + QContactManager* manager = new QContactManager( aType ); + if ( manager ) + { + mBackends.append( manager ); + } + + return manager; +} + +bool CntDefaultViewManager::isDepracatedView(CntViewParameters::ViewId aId) +{ + switch (aId) + { + case CntViewParameters::commLauncherView:return true; + case CntViewParameters::serviceContactCardView:return true; + case CntViewParameters::serviceAssignContactCardView:return true; + case CntViewParameters::myCardSelectionView:return true; + case CntViewParameters::serviceContactSelectionView:return true; + case CntViewParameters::FavoritesMemberView:return true; + case CntViewParameters::editView:return true; + case CntViewParameters::serviceEditView:return true; + case CntViewParameters::serviceSubEditView:return true; + case CntViewParameters::emailEditorView:return true; + case CntViewParameters::namesEditorView:return true; + case CntViewParameters::urlEditorView:return true; + case CntViewParameters::companyEditorView:return true; + case CntViewParameters::phoneNumberEditorView:return true; + case CntViewParameters::onlineAccountEditorView:return true; + case CntViewParameters::noteEditorView:return true; + case CntViewParameters::familyDetailEditorView:return true; + case CntViewParameters::addressEditorView:return true; + case CntViewParameters::dateEditorView:return true; + case CntViewParameters::serviceContactFetchView:return true; + case CntViewParameters::groupEditorView:return true; + case CntViewParameters::groupMemberView:return true; + case CntViewParameters::groupActionsView:return true; + case CntViewParameters::historyView:return true; + default: + return false; + } +} + +void CntDefaultViewManager::removeCurrentView() +{ + if (mCurrent == NULL) { + removeDepracatedCurrentView(); + return; + } + + if (mCurrent) { + mCurrent->deactivate(); + mMainWindow->removeView(mCurrent->view()); + + if (!mCurrent->isDefault()) { + delete mCurrent; + mCurrent = NULL; + } + } +} + +void CntDefaultViewManager::switchView(const CntViewParameters& aArgs) +{ + CntViewParameters::ViewId id = aArgs.nextViewId(); + if (isDepracatedView(id)) + { + // current view might not be deleted if it was a "default" view + // Still, needs to be nulled out so it won't be deactivated unnecessarily + mCurrent = NULL; + + CntBaseView *newView = getView( aArgs ); + + if (newView) { + mCurrentViewId = newView->viewId(); + addViewToWindow(newView); + newView->activateView(aArgs); + } + + } + else + { + CntAbstractView* nextView(NULL); + if (mDefaults.contains(id)) + { + nextView = mDefaults.value(id); + } + else + { + nextView = mFactory->createView((int) id); + if (nextView->isDefault()) + { + mDefaults.insert(id, nextView); + } + } + + mCurrent = nextView; + + mMainWindow->addView(mCurrent->view()); + mMainWindow->setCurrentView(mCurrent->view()); + mCurrent->activate(this, aArgs); + } +} +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntdetaileditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntdetaileditor.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,107 @@ +/* +* 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 "cntdetaileditor.h" +#include +CntDetailEditor::CntDetailEditor(CntViewManager *viewManager, QGraphicsItem *parent) : + CntBaseView(viewManager, parent), mDataForm(0), mDataFormModel(0) +{ + if (loadDocument(":/xml/contacts_editor.docml")) { + QGraphicsWidget *content = findWidget(QString("content")); + setWidget(content); + mDataForm = static_cast (findWidget(QString("dataForm"))); + } +} + +void CntDetailEditor::setViewId( CntViewParameters::ViewId aId ) +{ + iId = aId; +} + +void CntDetailEditor::setInsertAction( const QString aInsert ) +{ + HbAction* insert = new HbAction( aInsert ); + menu()->addAction( insert ); + connect( insert, SIGNAL(triggered()), this, SLOT(insertField()) ); +} + +void CntDetailEditor::insertField() +{ + mDataFormModel->insertDetailField(); +} + +CntDetailEditor::~CntDetailEditor() +{ + delete mDataForm; + delete mDataFormModel; + delete mPrototype; + delete mHeader; +} + +void CntDetailEditor::discardChanges() +{ + QContact selected( *mDataFormModel->contact() ); + CntViewParameters args; + args.setSelectedContact( selected ); + viewManager()->back( args ); +} + +void CntDetailEditor::aboutToCloseView() +{ + mDataFormModel->saveContactDetails(); + + QContact selected( *mDataFormModel->contact() ); + CntViewParameters args; + args.setSelectedContact( selected ); + viewManager()->back( args ); +} + +void CntDetailEditor::setHeader(QString aHeader) +{ + if (!mHeader) { + mHeader = static_cast (findWidget(QString("headerBox"))); + } + mHeader->setHeading(aHeader); +} + +void CntDetailEditor::setDetails(CntDetailEditorModel* aModel, HbAbstractViewItem* aPrototype) +{ + mDataFormModel = aModel; + mPrototype = aPrototype; +} + +void CntDetailEditor::activateView(const CntViewParameters &viewParameters) +{ + Q_UNUSED( viewParameters ); + HbAction* cancel = static_cast(findObject("cnt:discardchanges")); + menu()->addAction( cancel ); + connect( cancel, SIGNAL(triggered()), this, SLOT(discardChanges()) ); + + // add new field if required + if ( viewParameters.selectedAction() == "add" ) { + mDataFormModel->insertDetailField(); + } + + mDataForm->setItemRecycling(true); + mDataForm->setModel(mDataFormModel, mPrototype); +} + +CntViewParameters::ViewId CntDetailEditor::viewId() const +{ + return iId; +} + +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntdetailmodelitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntdetailmodelitem.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,46 @@ +/* +* 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 "cntdetailmodelitem.h" +#include + +CntDetailModelItem::CntDetailModelItem( QContactDetail aDetail ) : +HbDataFormModelItem(), +mDetail( aDetail ) + { + setType( CustomItemBase ); + } + +CntDetailModelItem::CntDetailModelItem( QContactDetail aDetail, QString aLabel ) : +HbDataFormModelItem( CustomItemBase, aLabel ), +mDetail( aDetail ) + { + } + +void CntDetailModelItem::setDetail( QContactDetail aDetail ) + { + mDetail = aDetail; + } + +QContactDetail CntDetailModelItem::detail() + { + return mDetail; + } + +CntDetailModelItem::~CntDetailModelItem() + { + } +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntdetailpopup.cpp --- a/phonebookui/pbkcommonui/src/cntdetailpopup.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntdetailpopup.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -22,59 +22,33 @@ #include #include #include -#include +#include QTM_USE_NAMESPACE CntDetailPopup::CntDetailPopup(QStringList excludeList, QGraphicsItem *parent): HbDialog(parent), mListModel(0), - mListView(0) + mListView(0), + mExcludeList(excludeList) { mListView = new HbListView(this); + mListModel = new QStandardItemModel(); - mListModel = new QStringListModel(); - - QStringList list; - - if (!excludeList.contains(QContactNote::DefinitionName)) - { - list << hbTrId("txt_phob_formlabel_note"); - } - - if (!excludeList.contains(QContactAvatar::SubTypeAudioRingtone)) - { - list << hbTrId("txt_phob_formlabel_personal_ringing_tone"); - } - - if (!excludeList.contains(QContactBirthday::DefinitionName) && - !excludeList.contains(QContactAnniversary::DefinitionName)) - { - list << hbTrId("txt_phob_formlabel_date"); - } + addListItem(hbTrId("txt_phob_formlabel_note"), QContactNote::DefinitionName); + addListItem(hbTrId("txt_phob_formlabel_personal_ringing_tone"), QContactAvatar::SubTypeAudioRingtone); + addListItem(hbTrId("txt_phob_formlabel_date"), QContactAnniversary::DefinitionName, QContactBirthday::DefinitionName); + addListItem(hbTrId("txt_phob_formlabel_company_details"), QContactOrganization::DefinitionName, QContactOrganization::FieldAssistantName); + addListItem(hbTrId("txt_phob_formlabel_family"), QContactFamily::FieldSpouse, QContactFamily::FieldChildren); + addListItem("Synchronization", "some-synch-id"); // TODO: change to real synch id when backend done - if (!excludeList.contains(QContactOrganization::DefinitionName) && - !excludeList.contains(QContactOrganization::FieldAssistantName)) - { - list << hbTrId("txt_phob_formlabel_company_details"); - } - - if (!excludeList.contains(QContactFamily::FieldSpouse) && - !excludeList.contains(QContactFamily::FieldChildren)) - { - list << hbTrId("txt_phob_formlabel_family"); - } - list << hbTrId("Synchronization"); - - - mListModel->setStringList(list); mListView->setModel(mListModel); mListView->setSelectionMode(HbAbstractItemView::NoSelection); HbGroupBox *headingLabel = new HbGroupBox(); HbLabel *label = new HbLabel(hbTrId("txt_phob_title_add_field")); headingLabel->setContentWidget(label); - + setHeadingWidget(headingLabel); setContentWidget(mListView); @@ -88,12 +62,11 @@ CntDetailPopup::~CntDetailPopup() { - } void CntDetailPopup::listItemSelected(QModelIndex index) { - mSelectedDetail = mListModel->data(index, Qt::DisplayRole).toString(); + mSelectedDetail = mListModel->item(index.row(), 1)->text(); close(); } @@ -109,18 +82,24 @@ HbAction *action = popup->exec(); - if (action == popup->secondaryAction()) - { - - } - else - { - if (!popup->selectedDetail().isEmpty()) - { - result = popup->selectedDetail(); - } + if (action != popup->secondaryAction() && !popup->selectedDetail().isEmpty()) + { + result = popup->selectedDetail(); } delete popup; return result; } + +void CntDetailPopup::addListItem(QString label, QString id1, QString id2) +{ + if (mExcludeList.contains(id1) || mExcludeList.contains(id2)) + return; + + QList items; + QStandardItem *labelItem = new QStandardItem(label); + QStandardItem *idItem = new QStandardItem(id1); + + items << labelItem << idItem; + mListModel->appendRow(items); +} diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cnteditorfactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cnteditorfactory.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,134 @@ +/* +* 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 "cnteditorfactory.h" +#include "cntviewmanager.h" +#include "cntnameeditormodel.h" +#include "cntphonenumbermodel.h" +#include "cntphonenumberviewitem.h" +#include "cntemaileditormodel.h" +#include "cntemaileditorviewitem.h" +#include "cntaddressmodel.h" +#include "cntaddressviewitem.h" +#include "cnturleditormodel.h" +#include "cnturleditorviewitem.h" +#include "cntnoteeditormodel.h" +#include "cntnoteeditorviewitem.h" +#include "cntdateeditormodel.h" +#include "cntdateeditorviewitem.h" +#include "cntcompanyeditormodel.h" +#include "cntfamilyeditormodel.h" +#include "cntdetaileditor.h" + +CntEditorFactory::CntEditorFactory(CntViewManager* aMgr, QObject* aParent) : + QObject(aParent), iViewMgr(aMgr) +{ +} + +CntEditorFactory::~CntEditorFactory() +{ +} + +CntBaseView* CntEditorFactory::createNameEditorView(QContact aContact) +{ + return createEditor(CntViewParameters::namesEditorView, + new CntNameEditorModel(new QContact(aContact)), + NULL, + qtTrId("Edit contact name")); +} + +CntBaseView* CntEditorFactory::createNumberEditorView(QContact aContact) +{ + return createEditor( CntViewParameters::phoneNumberEditorView, + new CntPhoneNumberModel(new QContact(aContact)), + new CntPhoneNumberViewItem(), + qtTrId("Edit phone number"), + qtTrId("Add number")); +} + +CntBaseView* CntEditorFactory::createEmailEditorView(QContact aContact) +{ + return createEditor(CntViewParameters::emailEditorView, + new CntEmailEditorModel(new QContact(aContact)), + new CntEmailEditorViewItem(), + qtTrId("Edit email details"), + qtTrId("Add email")); +} + +CntBaseView* CntEditorFactory::createAddressEditorView(QContact aContact) +{ + return createEditor(CntViewParameters::addressEditorView, + new CntAddressModel(new QContact(aContact)), + new CntAddressViewItem(), + qtTrId("Edit address details")); +} + +CntBaseView* CntEditorFactory::createUrlEditorView(QContact aContact) +{ + return createEditor(CntViewParameters::urlEditorView, + new CntUrlEditorModel(new QContact(aContact)), + new CntUrlEditorViewItem(), + qtTrId("Edit URL details"), + qtTrId("Add URL")); +} + +CntBaseView* CntEditorFactory::createNoteEditorView(QContact aContact) +{ + return createEditor(CntViewParameters::noteEditorView, + new CntNoteEditorModel(new QContact(aContact)), + new CntNoteEditorViewItem(), + qtTrId("Edit note details"), + qtTrId("Add note")); +} + +CntBaseView* CntEditorFactory::createDateEditorView(QContact aContact) +{ + return createEditor(CntViewParameters::dateEditorView, + new CntDateEditorModel(new QContact(aContact)), + new CntDateEditorViewItem(), + qtTrId("Edit date details")); +} + +CntBaseView* CntEditorFactory::createCompanyEditorView(QContact aContact) +{ + return createEditor(CntViewParameters::companyEditorView, + new CntCompanyEditorModel(new QContact(aContact)), + NULL, + qtTrId("Edit company details")); +} + +CntBaseView* CntEditorFactory::createFamilyEditorView(QContact aContact) +{ + return createEditor(CntViewParameters::familyDetailEditorView, + new CntFamilyEditorModel(new QContact(aContact)), + NULL, + qtTrId("Edit family details")); +} + +CntBaseView* CntEditorFactory::createEditor( + CntViewParameters::ViewId aId, CntDetailEditorModel* aModel, + HbDataFormViewItem* aProto, QString aTitle, QString aInsert ) +{ + CntDetailEditor* editor = new CntDetailEditor(iViewMgr); + editor->setViewId( aId ); + editor->setHeader(aTitle); + editor->setDetails(aModel, aProto); + if ( aInsert.length() > 0 ) + { + editor->setInsertAction( aInsert ); + } + return editor; +} diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cnteditview.cpp --- a/phonebookui/pbkcommonui/src/cnteditview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cnteditview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -74,10 +74,12 @@ { Q_UNUSED(data); Q_UNUSED(id); - Q_UNUSED(error); - QIcon qicon(pixmap); - HbIcon icon(qicon); - mHeadingItem->setIcon(icon); + if (!error) + { + QIcon qicon(pixmap); + HbIcon icon(qicon); + mHeadingItem->setIcon(icon); + } } /*! @@ -85,13 +87,12 @@ */ void CntEditView::aboutToCloseView() { + CntViewParameters viewParameters; if (contact() && contact()->localId() == contactManager()->selfContactId() && contactManager()->selfContactId() != 0 && contact()->details().count() <= 4) { //delete empty mycard contactManager()->removeContact(contact()->localId()); - CntViewParameters viewParameters(CntViewParameters::namesView); - viewManager()->onActivateView(viewParameters); } // save contact if there is one and it's not empty @@ -99,7 +100,6 @@ { bool isSaved = contactManager()->saveContact(contact()); - CntViewParameters viewParameters(CntViewParameters::namesView); if (isSaved) { viewParameters.setSelectedContact(*contact()); @@ -109,13 +109,8 @@ { viewParameters.setSelectedAction("failed"); } - viewManager()->onActivateView(viewParameters); } - else - { - CntViewParameters viewParameters(CntViewParameters::namesView); - viewManager()->onActivateView(viewParameters); - } + viewManager()->back(viewParameters); } void CntEditView::resizeEvent(QGraphicsSceneResizeEvent *event) @@ -171,8 +166,9 @@ connect(commands(), SIGNAL(commandExecuted(QString, QContact)), this, SLOT(handleExecutedCommand(QString, QContact))); - // You can't delete a contact which hasn't been saved yet, now can you? - if (mContact->localId() == 0) + // You can't delete a contact or my card contact which hasn't been saved yet, now can you? + if (contact() && contact()->localId() == contactManager()->selfContactId() + && contactManager()->selfContactId() != 0 && contact()->details().count() <= 4 || mContact->localId()== 0) { menu()->removeAction(actions()->baseAction("cnt:deletecontact")); } @@ -498,7 +494,7 @@ viewParameters.setSelectedContact(*contact()); if (viewParameters.nextViewId() != CntViewParameters::noView) { - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } } @@ -517,7 +513,7 @@ viewParameters.setSelectedContact(*contact()); if (viewParameters.nextViewId() != CntViewParameters::noView) { - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } } @@ -721,7 +717,7 @@ void CntEditView::discardAllChanges() { CntViewParameters viewParameters(CntViewParameters::namesView); - viewManager()->onActivateView(viewParameters); + viewManager()->back(viewParameters); } /*! @@ -739,37 +735,37 @@ { QString detail = CntDetailPopup::selectDetail(mExcludeList); - if (detail == hbTrId("txt_phob_formlabel_note")) + if (detail == QContactNote::DefinitionName) { CntViewParameters viewParameters(CntViewParameters::noteEditorView); viewParameters.setSelectedContact(*contact()); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } - else if (detail == hbTrId("txt_phob_formlabel_personal_ringing_tone")) + else if (detail == QContactAvatar::SubTypeAudioRingtone) { // launch ringtone selection service } - else if (detail == hbTrId("txt_phob_formlabel_date")) + else if (detail == QContactAnniversary::DefinitionName) { CntViewParameters viewParameters(CntViewParameters::dateEditorView); viewParameters.setSelectedContact(*contact()); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } - else if (detail == hbTrId("txt_phob_formlabel_company_details")) + else if (detail == QContactOrganization::DefinitionName) { CntViewParameters viewParameters(CntViewParameters::companyEditorView); viewParameters.setSelectedContact(*contact()); viewParameters.setSelectedAction("company"); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } - else if (detail == hbTrId("txt_phob_formlabel_family")) + else if (detail == QContactFamily::FieldSpouse) { CntViewParameters viewParameters(CntViewParameters::familyDetailEditorView); viewParameters.setSelectedContact(*contact()); viewParameters.setSelectedAction("spouse"); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } - else if (detail == hbTrId("Synchronization")) + else if (detail == "some-synch-id") // TODO: change to real synch id when backend done { // Synchronization detail editor view to be done (lacks engine support) } @@ -782,7 +778,7 @@ { CntViewParameters viewParameters(CntViewParameters::namesEditorView); viewParameters.setSelectedContact(*contact()); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } /*! @@ -792,7 +788,7 @@ { CntViewParameters viewParameters(CntViewParameters::imageEditorView); viewParameters.setSelectedContact(*contact()); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } /* @@ -807,7 +803,7 @@ CntViewParameters viewParameters(CntViewParameters::namesView); viewParameters.setSelectedContact(*contact()); viewParameters.setSelectedAction("delete"); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); result=0; } return result; @@ -844,7 +840,7 @@ // open online account editor else if (aViewType == QContactOnlineAccount::DefinitionName) { - viewParameters.setNextViewId(CntViewParameters::onlineAccountEditorView); + viewParameters.setNextViewId(CntViewParameters::phoneNumberEditorView); } // open URL editor else if (aViewType == QContactUrl::DefinitionName) diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cnteditviewdetailitem.cpp --- a/phonebookui/pbkcommonui/src/cnteditviewdetailitem.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cnteditviewdetailitem.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -204,7 +204,7 @@ text = hbTrId("txt_phob_list_add_phone_number"); icon = HbIcon(mStringMapper.getMappedIcon(number.definitionName())); } - else + else if ( !number.subTypes().isEmpty() ) { QStringList list; list << mStringMapper.getMappedDetail(number.subTypes().at(0)) << context; @@ -275,7 +275,7 @@ text = hbTrId("Add IM address"); icon = HbIcon(mStringMapper.getMappedIcon(account.definitionName())); } - else + else if ( !account.subTypes().isEmpty() ) { QStringList list; list << mStringMapper.getMappedDetail(account.subTypes().at(0)) << context; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cnteditviewheadingitem.cpp --- a/phonebookui/pbkcommonui/src/cnteditviewheadingitem.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cnteditviewheadingitem.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -155,7 +155,7 @@ icon.clear(); // icon label shows default icon first - icon = HbIcon(":/icons/qtg_large_avatar.svg"); + icon = HbIcon("qtg_large_avatar"); QContactName name = contact->detail(); @@ -164,17 +164,17 @@ { nameList << name.prefix(); } - if (!name.first().isEmpty()) + if (!name.firstName().isEmpty()) { - nameList << name.first(); + nameList << name.firstName(); } - if (!name.middle().isEmpty()) + if (!name.middleName().isEmpty()) { - nameList << name.middle(); + nameList << name.middleName(); } - if (!name.last().isEmpty()) + if (!name.lastName().isEmpty()) { - nameList << name.last(); + nameList << name.lastName(); } if (!name.suffix().isEmpty()) { diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntemaileditormodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntemaileditormodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,64 @@ +/* +* 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 "cntemaileditormodel.h" +#include "cntdetailmodelitem.h" +#include + +CntEmailEditorModel::CntEmailEditorModel( QContact* aContact ) : +CntDetailEditorModel( aContact ) + { + QList addr = mContact->details(); + if ( addr.isEmpty() ) + { + QContactEmailAddress newAddr; + addr.append( newAddr ); + } + + foreach ( QContactEmailAddress email, addr ) + { + CntDetailModelItem* item = new CntDetailModelItem( email ); + appendDataFormItem( item, invisibleRootItem() ); + } + } + +CntEmailEditorModel::~CntEmailEditorModel() + { + } + +void CntEmailEditorModel::insertDetailField() +{ + QContactEmailAddress newAddr; + + CntDetailModelItem* item = new CntDetailModelItem( newAddr ); + appendDataFormItem( item, invisibleRootItem() ); +} + +void CntEmailEditorModel::saveContactDetails() +{ + HbDataFormModelItem* root = invisibleRootItem(); + int count( root->childCount() ); + for ( int i(0); i < count; i++ ) { + CntDetailModelItem* item = static_cast( root->childAt(i) ); + QContactEmailAddress address = item->detail(); + QString email = address.emailAddress(); + if ( email.length() > 0 ) { + mContact->saveDetail( &address ); + } + } +} + +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntemaileditorview.cpp --- a/phonebookui/pbkcommonui/src/cntemaileditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntemaileditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -56,21 +56,18 @@ QStandardItem *email = new QStandardItem; email->setText(hbTrId("txt_phob_dblist_email")); email->setData(emailField, Qt::UserRole); - email->setData(":/icons/qgn_prop_nrtyp_email.svg", Qt::UserRole+2); email->setData(CNT_EMAIL_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(email); QStandardItem *emailhome = new QStandardItem; emailhome->setText(hbTrId("txt_phob_dblist_email_home")); emailhome->setData(emailField, Qt::UserRole); emailhome->setData(contextHome, Qt::UserRole+1); - emailhome->setData(":/icons/qgn_prop_nrtyp_email.svg", Qt::UserRole+2); emailhome->setData(CNT_EMAIL_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(emailhome); QStandardItem *emailwork = new QStandardItem; emailwork->setText(hbTrId("txt_phob_dblist_email_work")); emailwork->setData(emailField, Qt::UserRole); emailwork->setData(contextWork, Qt::UserRole+1); - emailwork->setData(":/icons/qgn_prop_nrtyp_email.svg", Qt::UserRole+2); emailwork->setData(CNT_EMAIL_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(emailwork); diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntemaileditorviewitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntemaileditorviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,153 @@ +/* +* 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 "cntemaileditorviewitem.h" +#include "cntdetailmodelitem.h" +#include "cntdetailconst.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +CntEmailEditorViewItem::CntEmailEditorViewItem( QGraphicsItem* aParent ) : +CntDetailViewItem( aParent ) + { + + } + +CntEmailEditorViewItem::~CntEmailEditorViewItem() + { + + } + +HbAbstractViewItem* CntEmailEditorViewItem::createItem() + { + return new CntEmailEditorViewItem(*this); + } + +HbWidget* CntEmailEditorViewItem::createCustomWidget() + { + QGraphicsLinearLayout* layout = new QGraphicsLinearLayout( itemView()->mainWindow()->orientation() ); + HbWidget* widget = new HbWidget(); + mBox = new HbComboBox(); + mEdit = new HbLineEdit(); + mEdit->setMaxLength( CNT_EMAIL_EDITOR_MAXLENGTH ); + mEdit->setInputMethodHints(Qt::ImhPreferLowercase); + + widget->setLayout( layout ); + layout->addItem( mBox ); + layout->addItem( mEdit ); + + connect( mBox, SIGNAL(currentIndexChanged(int)), this, SLOT(indexChanged(int)) ); + connect( mEdit, SIGNAL(textChanged(QString)),this, SLOT(textChanged(QString)) ); + + + HbDataFormModel* model = static_cast(itemView()->model()); + CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); + QContactDetail detail = item->detail(); + + HbEditorInterface editorInterface( mEdit ); + editorInterface.setFilter( HbEmailAddressFilter::instance() ); + + constructSubTypeModel( detail.contexts() ); + + QContactEmailAddress address = detail; + QString d = address.emailAddress(); + mEdit->setText( address.emailAddress() ); + + return widget; + } + +void CntEmailEditorViewItem::indexChanged( int aIndex ) + { + QString context = mBox->itemData( aIndex, DetailContext ).toString(); + + // check that if current QContactDetail contains the changed subtype + HbDataFormModel* model = static_cast(itemView()->model()); + CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); + + QStringList contextList; + if ( !context.isEmpty() ) + contextList << context; + + QContactEmailAddress address = item->detail(); + address.setContexts( contextList ); + item->setDetail( address ); + } + +void CntEmailEditorViewItem::textChanged( QString aText ) + { + HbDataFormModel* model = static_cast(itemView()->model()); + CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); + + QContactEmailAddress address = item->detail(); + address.setEmailAddress( aText ); + item->setDetail( address ); + } + +void CntEmailEditorViewItem::constructSubTypeModel( QStringList aContext ) + { + QStandardItemModel* model = new QStandardItemModel(); + + QString contextHome = QContactDetail::ContextHome; + QString contextWork = QContactDetail::ContextWork; + QString fieldAddress = QContactEmailAddress::FieldEmailAddress; + + QStandardItem *noContext = new QStandardItem; + noContext->setText(qtTrId("Email")); + noContext->setData(fieldAddress, DetailSubType); + noContext->setData(CNT_EMAIL_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(noContext); + + QStandardItem *home = new QStandardItem; + home->setText(qtTrId("Email (home)")); + home->setData(fieldAddress, DetailSubType); + home->setData(contextHome, DetailContext); + home->setData(CNT_EMAIL_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(home); + + QStandardItem *work = new QStandardItem; + work->setText(qtTrId("Email (work)")); + work->setData(fieldAddress, DetailSubType); + work->setData(contextWork, DetailContext); + work->setData(CNT_EMAIL_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(work); + + mBox->setModel( model ); + + QString context = aContext.isEmpty() ? "" : aContext.first(); + // search the selected index to be set + for ( int i(0); i < model->rowCount(); i++ ) + { + if ( model->item(i)->data( DetailContext ).toString() == context ) + { + mBox->setCurrentIndex( i ); + break; + } + } + } + +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntfamilyeditormodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntfamilyeditormodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,65 @@ +/* +* 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 "cntfamilyeditormodel.h" +#include "cntdetailconst.h" +#include +#include + +CntFamilyEditorModel::CntFamilyEditorModel(QContact* aContact) : + CntDetailEditorModel(aContact) +{ + QList familyList = mContact->details (); + if (familyList.isEmpty()) { + QContactFamily family; + familyList << family; + } + + mFamily = familyList.first(); + QStringList children = mFamily.children(); + + HbDataFormModelItem* spouseItem = new HbDataFormModelItem(HbDataFormModelItem::TextItem, + qtTrId("Spouse")); + spouseItem->setContentWidgetData("text", mFamily.spouse()); + spouseItem->setContentWidgetData("maxLength", CNT_SPOUSE_MAXLENGTH); + + HbDataFormModelItem* childrenItem = new HbDataFormModelItem(HbDataFormModelItem::TextItem, + qtTrId("Children")); + childrenItem->setContentWidgetData("text", children.join(", ")); + childrenItem->setContentWidgetData("maxLength", CNT_CHILDREN_MAXLENGTH); + + HbDataFormModelItem* root = invisibleRootItem(); + appendDataFormItem(spouseItem, root); + appendDataFormItem(childrenItem, root); +} + +CntFamilyEditorModel::~CntFamilyEditorModel() +{ +} + +void CntFamilyEditorModel::saveContactDetails() +{ + HbDataFormModelItem* root = invisibleRootItem(); + mFamily.setSpouse( root->childAt(0)->contentWidgetData("text").toString() ); + + QString children = root->childAt(1)->contentWidgetData("text").toString(); + mFamily.setChildren( children.split(", ", QString::SkipEmptyParts) ); + + if ( !mFamily.isEmpty() ) { + mContact->saveDetail( &mFamily ); + } +} +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntfavoritesmemberview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntfavoritesmemberview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,199 @@ +/* +* 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 "cntfavoritesmemberview.h" +#include "cntgroupselectionpopup.h" + +#include +#include +#include +#include + +const char *CNT_FAVORITESMEMBERVIEW_XML = ":/xml/contacts_favmember.docml"; + +/*! +Constructor, initialize member variables. +\a viewManager is the parent that creates this view. \a parent is a pointer to parent QGraphicsItem (by default this is 0) +*/ +CntFavoritesMemberView::CntFavoritesMemberView(CntViewManager *viewManager, QGraphicsItem *parent) +:CntBaseView(viewManager, parent), +mManageFavoritesAction(0), +mFavoritesMenu(0), +mFavoriteListView(0) +{ + bool ok = false; + ok = loadDocument(CNT_FAVORITESMEMBERVIEW_XML); + + if (ok) + { + QGraphicsWidget *content = findWidget(QString("content")); + setWidget(content); + } + else + { + qFatal("Unable to read :/xml/contacts_favmember.docml"); + } +} + +/*! +Destructor +*/ +CntFavoritesMemberView::~CntFavoritesMemberView() +{ +delete mManageFavoritesAction; +delete mFavoritesMenu; +delete mContact; +} + +/*! +Save selections +*/ +void CntFavoritesMemberView::aboutToCloseView() +{ + CntViewParameters viewParameters; + viewManager()->back(viewParameters); +} + +void CntFavoritesMemberView::activateView(const CntViewParameters &viewParameters) +{ + //group box + HbGroupBox* groupBox = static_cast(findWidget(QString("groupBox"))); + mContact = new QContact(viewParameters.selectedContact()); + + mFavoriteListView = static_cast(findWidget(QString("cnt_listview_favorites"))); + connect(mFavoriteListView, SIGNAL(longPressed(HbAbstractViewItem *, const QPointF &)), + this, SLOT(onLongPressed(HbAbstractViewItem *, const QPointF &))); + + QContactRelationshipFilter rFilter; + rFilter.setRelationshipType(QContactRelationship::HasMember); + rFilter.setRelatedContactRole(QContactRelationshipFilter::First); + rFilter.setRelatedContactId(mContact->id()); + + contactModel()->setFilterAndSortOrder(rFilter); + contactModel()->showMyCard(false); + mFavoriteListView->setModel(contactModel()); + } + +void CntFavoritesMemberView::manageFavorites() +{ + // call a dialog to display the contacts + CntGroupSelectionPopup *groupSelectionPopup = new CntGroupSelectionPopup(contactManager(), mContact); + mFavoriteListView->setModel(0); + groupSelectionPopup->populateListOfContact(); + + HbAction* action = groupSelectionPopup->exec(); + if (action == groupSelectionPopup->primaryAction()) + { + groupSelectionPopup->saveOldGroup(); + } + delete groupSelectionPopup; + + mFavoriteListView->setModel(contactModel()); +} + +/*! +Add actions also to toolbar +*/ +void CntFavoritesMemberView::addMenuItems() +{ +mManageFavoritesAction = new HbAction(hbTrId("Manage favorites")); +mFavoritesMenu = new HbMenu(); +mFavoritesMenu->addAction(mManageFavoritesAction); + +connect(mManageFavoritesAction, SIGNAL(triggered()), + this, SLOT (manageFavorites())); + +setMenu(mFavoritesMenu); +} + +/*! +Called when a list item is longpressed +*/ +void CntFavoritesMemberView::onLongPressed (HbAbstractViewItem *aItem, const QPointF &aCoords) +{ + QModelIndex index = aItem->modelIndex(); + QVariant variant = index.data(Qt::UserRole+1); + const QMap map = variant.toMap(); + + HbMenu *menu = new HbMenu(); + + HbAction *openContactAction = 0; + HbAction *editContactAction = 0; + HbAction *removeFromFavoritesAction = 0; + HbAction *sendToHsAction = 0; + + QString action = map.value("action").toString(); + + openContactAction = menu->addAction(hbTrId("txt_common_menu_open")); + editContactAction = menu->addAction(hbTrId("txt_common_menu_edit")); + removeFromFavoritesAction = menu->addAction(hbTrId("txt_phob_menu_remove_from_favorites")); + sendToHsAction = menu->addAction(hbTrId("Send to HS")); + + HbAction *selectedAction = menu->exec(aCoords); + + if (selectedAction) + { + if (selectedAction == openContactAction) + { + openContact(index); + } + else if (selectedAction == editContactAction) + { + editContact(index); + } + else if (selectedAction == removeFromFavoritesAction) + { + removeFromFavorites(index); + } + else if (selectedAction == sendToHsAction) + { +// sendToHs(index); + } + } + menu->deleteLater(); +} + +void CntFavoritesMemberView::openContact(const QModelIndex &index) +{ + QContact selectedContact = contactModel()->contact(index); + CntViewParameters viewParameters(CntViewParameters::commLauncherView); + viewParameters.setSelectedContact(selectedContact); + viewManager()->changeView(viewParameters); +} + +void CntFavoritesMemberView::editContact(const QModelIndex &index) +{ + QContact selectedContact = contactModel()->contact(index); + CntViewParameters viewParameters(CntViewParameters::editView); + viewParameters.setSelectedContact(selectedContact); + viewManager()->changeView(viewParameters); +} + +/*! +Called after user clicked on the listview. +*/ +void CntFavoritesMemberView::removeFromFavorites(const QModelIndex &index) +{ + // get contact id using index + QContact selectedContact = contactModel()->contact(index); + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(mContact->id()); + relationship.setSecond(selectedContact.id()); + contactManager()->removeRelationship(relationship); +} + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntfavoritesselectionview.cpp --- a/phonebookui/pbkcommonui/src/cntfavoritesselectionview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/* -* 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 "cntfavoritesselectionview.h" - -#include - -/*! -Constructor, initialize member variables. -\a viewManager is the parent that creates this view. \a parent is a pointer to parent QGraphicsItem (by default this is 0) -*/ -CntFavoritesSelectionView::CntFavoritesSelectionView(CntViewManager *viewManager, QGraphicsItem *parent) -: CntBaseSelectionView(viewManager, parent) -{ -} - -/*! -Destructor -*/ -CntFavoritesSelectionView::~CntFavoritesSelectionView() -{ -} - -/*! -Save selections -*/ -void CntFavoritesSelectionView::aboutToCloseView() -{ - CntViewParameters viewParameters(CntViewParameters::collectionView); - viewManager()->onActivateView(viewParameters); -} - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntfavoritesview.cpp --- a/phonebookui/pbkcommonui/src/cntfavoritesview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntfavoritesview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -16,74 +16,109 @@ */ #include "cntfavoritesview.h" - -/*! -\class CntFavoritesView -\brief +#include "cntgroupselectionpopup.h" +#include "qtpbkglobal.h" +#include +#include +#include +#include -This is the namesview class that shows list of contacts for the user. View contains banner for OVI and a listview that shows actual contacts. -There is also toolbar and menu for navigating between different views. Instance of this class is created by our viewmanager but view itself is -owned by the mainwindow which will also delete it in the end. - -*/ +const char *CNT_FAVORITE_UI_XML = ":/xml/contacts_favorite.docml"; -/*! -Constructor, initialize member variables. -\a viewManager is the parent that creates this view. \a parent is a pointer to parent QGraphicsItem (by default this is 0) +CntFavoritesView::CntFavoritesView() : + mContact(0), + mView(0), + mSoftkey(0), + mViewManager(0) +{ + bool ok = false; + mDocumentLoader.load(CNT_FAVORITE_UI_XML, &ok); -*/ -CntFavoritesView::CntFavoritesView(CntViewManager *viewManager, QGraphicsItem *parent) - : CntBaseListView(viewManager, parent) - -{ -setBannerName(hbTrId("txt_phob_subtitle_favorites")); + if (ok) + { + mView = static_cast(mDocumentLoader.findWidget(QString("favoritesView"))); + } + else + { + qFatal("Unable to read :/xml/contacts_favorite.docml"); + } + + //back button + mSoftkey = new HbAction(Hb::BackNaviAction, mView); + connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView())); } - /*! Destructor */ CntFavoritesView::~CntFavoritesView() { + mView->deleteLater(); + + delete mContact; + mContact = 0; +} + +void CntFavoritesView::activate( CntAbstractViewManager* aMgr, const CntViewParameters& aArgs ) +{ + if (mView->navigationAction() != mSoftkey) + mView->setNavigationAction(mSoftkey); + + HbMainWindow* window = mView->mainWindow(); + connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation))); + setOrientation(window->orientation()); + + mContact = new QContact(aArgs.selectedContact()); + mViewManager = aMgr; + + HbPushButton *addButton = static_cast(mDocumentLoader.findWidget(QString("cnt_button_add"))); + connect(addButton, SIGNAL(clicked()), this, SLOT(openSelectionPopup())); +} + +void CntFavoritesView::deactivate() +{ } -void CntFavoritesView::openFetch() -{ - CntViewParameters viewParameters(CntViewParameters::collectionFavoritesSelectionView); - viewManager()->onActivateView(viewParameters); -} - -void CntFavoritesView::openNamesList() +void CntFavoritesView::openSelectionPopup() { - CntViewParameters viewParameters(CntViewParameters::namesView); - viewManager()->onActivateView(viewParameters); -} - -void CntFavoritesView::aboutToCloseView() -{ - CntViewParameters viewParameters(CntViewParameters::collectionView); - viewManager()->onActivateView(viewParameters); + // call a dialog to display the contacts + CntGroupSelectionPopup *groupSelectionPopup = new CntGroupSelectionPopup(mViewManager->contactManager(SYMBIAN_BACKEND), mContact); + groupSelectionPopup->populateListOfContact(); + HbAction* action = groupSelectionPopup->exec(); + + if (action == groupSelectionPopup->primaryAction()) + { + groupSelectionPopup->saveOldGroup(); + delete groupSelectionPopup; + CntViewParameters viewParameters(CntViewParameters::FavoritesMemberView); + viewParameters.setSelectedContact(*mContact); + mViewManager->changeView(viewParameters); + } + else if (action == groupSelectionPopup->secondaryAction()) + { + delete groupSelectionPopup; + showPreviousView(); + } } -/*! -Add actions also to toolbar -*/ -void CntFavoritesView::addActionsToToolBar() +void CntFavoritesView::setOrientation(Qt::Orientation orientation) { - //Add Action to the toolbar - actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:nameslist") << actions()->baseAction("cnt:collections") - << actions()->baseAction("cnt:addfavorites"); - actions()->addActionsToToolBar(toolBar()); - - connect(actions()->baseAction("cnt:nameslist"), SIGNAL(triggered()), - this, SLOT(openNamesList())); + if (orientation == Qt::Vertical) + { + // reading "portrait" section + mDocumentLoader.load(CNT_FAVORITE_UI_XML, "portrait"); + } + else + { + // reading "landscape" section + mDocumentLoader.load(CNT_FAVORITE_UI_XML, "landscape"); + } +} - connect(actions()->baseAction("cnt:collections"), SIGNAL(triggered()), - this, SLOT(aboutToCloseView())); - - connect(actions()->baseAction("cnt:addfavorites"), SIGNAL(triggered()), - this, SLOT(openFetch())); +void CntFavoritesView::showPreviousView() +{ + CntViewParameters args; + mViewManager->back(args); } // end of file diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntgroupactionsview.cpp --- a/phonebookui/pbkcommonui/src/cntgroupactionsview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntgroupactionsview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -32,6 +32,7 @@ #include #include + const char *CNT_GROUPACTIONVIEW_XML = ":/xml/contacts_cc.docml"; /*! @@ -46,7 +47,7 @@ mContainerLayout(0), mDataContainer(0), mHeadingItem(0), - mThumbnailManager(0) + mBanner(0) { bool ok = false; ok = loadDocument(CNT_GROUPACTIONVIEW_XML); @@ -61,13 +62,6 @@ qFatal("Unable to read :/xml/contacts_cc.docml"); } - mThumbnailManager = new ThumbnailManager(this); - mThumbnailManager->setMode(ThumbnailManager::Default); - mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForQuality); - mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailMedium); - - connect(mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void*, int, int)), - this, SLOT(thumbnailReady(QPixmap, void*, int, int))); } /*! @@ -80,61 +74,12 @@ } -void CntGroupActionsView::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error) -{ - Q_UNUSED(data); - Q_UNUSED(id); - Q_UNUSED(error); - QIcon qicon(pixmap); - HbIcon icon(qicon); - mHeadingItem->setIcon(icon); -} -/*! -Add actions also to toolbar -*/ -void CntGroupActionsView::addActionsToToolBar() -{ - //Add Action to the toolbar - actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:editgroup") << actions()->baseAction("cnt:deletegroup") - << actions()->baseAction("cnt:groupmembers"); - actions()->addActionsToToolBar(toolBar()); - - connect(actions()->baseAction("cnt:editgroup"), SIGNAL(triggered()), - this, SLOT(editGroupDetails())); - connect(actions()->baseAction("cnt:deletegroup"), SIGNAL(triggered()), - this, SLOT(deleteGroup())); - connect(actions()->baseAction("cnt:groupmembers"), SIGNAL(triggered()), - this, SLOT(groupMembers())); - -} - - void CntGroupActionsView::editGroup() { CntViewParameters viewParameters(CntViewParameters::groupEditorView); viewParameters.setSelectedAction("EditGroupMembers"); viewParameters.setSelectedContact(*mGroupContact); - viewManager()->onActivateView(viewParameters); -} - -void CntGroupActionsView::groupMembers() -{ - CntViewParameters viewParameters(CntViewParameters::groupMemberView); - viewParameters.setSelectedContact(*mGroupContact); - viewManager()->onActivateView(viewParameters); -} - -void CntGroupActionsView::openNamesView() -{ - CntViewParameters viewParameters(CntViewParameters::namesView); - viewManager()->onActivateView(viewParameters); -} - -void CntGroupActionsView::openCollections() -{ - CntViewParameters viewParameters(CntViewParameters::collectionView); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } /*! @@ -150,7 +95,9 @@ */ void CntGroupActionsView::aboutToCloseView() { - viewManager()->onActivateView(CntViewParameters::collectionView); + CntViewParameters args; + args.setSelectedContact(*mGroupContact); + viewManager()->back( args ); } void CntGroupActionsView::resizeEvent(QGraphicsSceneResizeEvent *event) @@ -162,7 +109,10 @@ CntBaseView::resizeEvent(event); } - +void CntGroupActionsView::addActionsToToolBar() +{ + +} /* Activates a default view and setup name label texts */ @@ -175,25 +125,15 @@ QGraphicsWidget *c = findWidget(QString("content")); QGraphicsLinearLayout* l = static_cast(c->layout()); - mHeadingItem = new CntContactCardHeadingItem(c); - mHeadingItem->setGroupDetails(mGroupContact); - - l->insertItem(0, mHeadingItem); + QContactName groupContactName = mGroupContact->detail( QContactName::DefinitionName ); + QString groupName(groupContactName.value( QContactName::FieldCustomLabel )); + + mBanner = new HbGroupBox(this); + l->insertItem(0, mBanner); + mBanner->setHeading(groupName); - // avatar - QList details = mGroupContact->details(); - if (details.count() > 0) - { - for (int i = 0;i < details.count();i++) - { - if (details.at(i).subType() == QContactAvatar::SubTypeImage) - { - mThumbnailManager->getThumbnail(details.at(i).avatar()); - break; - } - } - } + // data mDataContainer = new CntContactCardDataContainer(mGroupContact); @@ -286,95 +226,18 @@ } - -void CntGroupActionsView::doConferenceCall() -{ - -} - -void CntGroupActionsView::sendGroupMessage() -{ - -} - -void CntGroupActionsView::sendGroupEmail() -{ - -} - /*! Add actions to menu */ void CntGroupActionsView::addMenuItems() { actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:placegrouptohs"); + actions()->actionList() << actions()->baseAction("cnt:editgroupdetails"); actions()->addActionsToMenu(menu()); - connect(actions()->baseAction("cnt:placegrouptohs"), SIGNAL(triggered()), - this, SLOT (placeGroupToHs())); - + connect(actions()->baseAction("cnt:editgroupdetails"), SIGNAL(triggered()), + this, SLOT (editGroup())); } -void CntGroupActionsView::manageMembers() -{ - /* CntViewParameters viewParameters(CntViewParameters::groupMemberSelectionView); - viewParameters.setSelectedAction("EditGroupMembers"); - viewParameters.setSelectedContact(*mGroupContact); - viewManager()->onActivateView(viewParameters); -*/ -} -void CntGroupActionsView::editGroupDetails() -{ - CntViewParameters viewParameters(CntViewParameters::groupEditorView); - viewParameters.setSelectedAction("EditGroupDetails"); - viewParameters.setSelectedContact(*mGroupContact); - viewManager()->onActivateView(viewParameters); -} - -void CntGroupActionsView::placeGroupToHs() -{ -// wait for specs -} - -void CntGroupActionsView::deleteGroup() -{ - // the delete command - HbDialog popup; - - // Set dismiss policy that determines what tap events will cause the dialog - // to be dismissed - popup.setDismissPolicy(HbDialog::NoDismiss); - - QContactName groupContactName = mGroupContact->detail( QContactName::DefinitionName ); - QString groupName(groupContactName.value( QContactName::FieldCustomLabel )); - // Set the label as heading widget - popup.setHeadingWidget(new HbLabel(hbTrId("Delete %1 group?").arg(groupName))); - - // Set a label widget as content widget in the dialog - popup.setContentWidget(new HbLabel(tr("Only group will be removed, contacts can be found frim All contacts list"))); - - // Sets the primary action and secondary action - popup.setPrimaryAction(new HbAction(hbTrId("txt_phob_button_delete"),&popup)); - popup.setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"),&popup)); - - popup.setTimeout(0) ; - HbAction* action = popup.exec(); - if (action == popup.primaryAction()) - { - contactManager()->removeContact(mGroupContact->localId()); - CntViewParameters viewParameters(CntViewParameters::collectionView); - viewParameters.setSelectedAction("EditGroupDetails"); - viewParameters.setSelectedContact(*mGroupContact); - viewManager()->onActivateView(viewParameters); - } -} - -void CntGroupActionsView::onItemActivated() -{ -// to be implemented -} - -// end of file diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntgroupdeletepopup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntgroupdeletepopup.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,92 @@ +/* +* 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 "cntgroupdeletepopup.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +CntGroupDeletePopup::CntGroupDeletePopup(QContactManager *manager, QGraphicsItem *parent): + HbDialog(parent), + mListView(0), + mContactManager(manager), + mModel(0) +{ + mModel = new CntGroupDeletePopupModel(mContactManager, this); +} + +CntGroupDeletePopup::~CntGroupDeletePopup() +{ + delete mModel; + mModel = 0; +} + +void CntGroupDeletePopup::populateListOfGroup() +{ + HbGroupBox *headingLabel = new HbGroupBox(); + HbLabel *label = new HbLabel(hbTrId("txt_phob_opt_delete_groups")); + headingLabel->setContentWidget(label); + + setHeadingWidget(headingLabel); + + mListView = new HbListView(this); + + + mModel->initializeGroupsList(); + + //Get the index of the contacts + // Set the select option for those contacts in the selectionModel + mListView->setModel(mModel); + // set the listview to multiSelection mode, this will bring MarkAll functionality (from Orbit) + mListView->setSelectionMode(HbAbstractItemView::MultiSelection); + mListView->setFrictionEnabled(true); + mListView->setScrollingStyle(HbScrollArea::PanOrFlick); + + setContentWidget(mListView); + + setTimeout(0); + setModal(true); + + HbAction *mPrimaryAction = new HbAction(hbTrId("Delete selected")); + setPrimaryAction(mPrimaryAction); + + HbAction *mSecondaryAction = new HbAction(hbTrId("txt_common_button_cancel")); + setSecondaryAction(mSecondaryAction); +} + +void CntGroupDeletePopup::deleteGroup() +{ + QModelIndexList indexes = mListView->selectionModel()->selection().indexes(); + QList selectionList; + for (int i = 0; i < indexes.count(); i++) + { + QContact contact = mModel->contact(indexes[i]); + QContactLocalId locId = contact.localId(); + selectionList.append(locId); + } + + QMap errors; + bool result = mContactManager->removeContacts(&selectionList, &errors); +} diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntgroupdeletepopupmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntgroupdeletepopupmodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,163 @@ +/* +* 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 "cntgroupdeletepopupmodel.h" + +#include +#include + +/*! +Constructor +*/ +CntGroupDeletePopupModel::CntGroupDeletePopupModel(QContactManager *manager, QObject *parent) + : QAbstractListModel(parent), + mContactManager(manager), + mFavoriteGroupId(-1) +{ + mDataPointer = new CntGroupPopupListData(); + isFavoriteGroupCreated(); +} + +/*! +Destructor +*/ +CntGroupDeletePopupModel::~CntGroupDeletePopupModel() +{ + +} + +/*! +Initialize groups +*/ +void CntGroupDeletePopupModel::initializeGroupsList() +{ + QContactDetailFilter groupFilter; + groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup))); + + QList groupContactIds = mContactManager->contactIds(groupFilter); + if (!groupContactIds.isEmpty()) + { + for(int i = 0;i < groupContactIds.count();i++) + { + QVariantList dataList; + + // group name + QStringList displayList; + + QContact contact = mContactManager->contact(groupContactIds.at(i)); + QContactName contactName = contact.detail(); + QString groupName = contactName.customLabel(); + if(groupContactIds.at(i) != mFavoriteGroupId ) + { + if (groupName.isNull()) + { + QString unnamed(hbTrId("Unnamed")); + displayList.append(unnamed); + } + else + { + displayList.append(groupName); + } + + dataList.append(displayList); + + // contact Id for identification + dataList.append(groupContactIds.at(i)); + + mDataPointer->mDataList.append(dataList); + } + } + } +} + +bool CntGroupDeletePopupModel::isFavoriteGroupCreated() +{ + bool favoriteGroupCreated = false; + QContactDetailFilter groupFilter; + groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup))); + + QList groupContactIds = mContactManager->contactIds(groupFilter); + + if (!groupContactIds.isEmpty()) + { + for(int i = 0;i < groupContactIds.count();i++) + { + QContact contact = mContactManager->contact(groupContactIds.at(i)); + QContactName contactName = contact.detail(); + QString groupName = contactName.customLabel(); + if(groupName.compare("Favorites") == 0) + { + favoriteGroupCreated = true; + mFavoriteGroupId = groupContactIds.at(i); + break; + } + } + } + return favoriteGroupCreated; +} + +int CntGroupDeletePopupModel::favoriteGroupId() +{ + return mFavoriteGroupId; +} + +/*! +Returns the number of rows in the model +*/ +int CntGroupDeletePopupModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return mDataPointer->mDataList.count(); +} +/*! +Returns data for given index with a given role +*/ +QVariant CntGroupDeletePopupModel::data(const QModelIndex &index, int role) const +{ + int row = index.row(); + + if (row < 0) + { + return QVariant(); + } + + QVariantList values = mDataPointer->mDataList.at(row); + + if (role == Qt::DisplayRole) + { + QStringList list = values[0].toStringList(); + return QVariant(list); + } + + else if (role == Qt::UserRole) + { + int contactId = values[1].toInt(); + return QVariant(contactId); + } + return QVariant(); +} + + +QContact CntGroupDeletePopupModel::contact(QModelIndex &index) const +{ + int row = index.row(); + QVariantList values = mDataPointer->mDataList.at(row); + int groupId = values[1].toInt(); + return mContactManager->contact( groupId ); +} diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntgroupmemberselectionview.cpp --- a/phonebookui/pbkcommonui/src/cntgroupmemberselectionview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,246 +0,0 @@ -/* -* 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 "cntgroupmemberselectionview.h" -#include -#include -#include -#include - -/*! -Constructor, initialize member variables. -\a viewManager is the parent that creates this view. \a parent is a pointer to parent QGraphicsItem (by default this is 0) -*/ -CntGroupMemberSelectionView::CntGroupMemberSelectionView(CntViewManager *viewManager, QGraphicsItem *parent) - : CntBaseSelectionView(viewManager, parent), - mContact(0), - mBanner(0), - mCountContacts(0), - mActionNewGroup(false) -{ - -} - -/*! -Destructor -*/ -CntGroupMemberSelectionView::~CntGroupMemberSelectionView() -{ - delete mContact; -} - -/*! -Set selection to a group -*/ -void CntGroupMemberSelectionView::aboutToCloseView() -{ - CntViewParameters viewParameters(CntViewParameters::collectionView); - viewParameters.setSelectedContact(*mContact); - viewManager()->onActivateView(viewParameters); - -} - -void CntGroupMemberSelectionView::saveGroup() -{ - // get the contact from new selection model indexes - // for each contact, check if contact in this new index is member of mContactsLocalIdList( as achieved in activateView) - // if yes, then do nothing - // if no, then add contact to the relationship - - QModelIndexList indexes = selectionModel()->selection().indexes(); - // if yes, then do nothing - // if no, then remove it from the relationship - - /* - * Code below to be refactored to improve performance - */ - - for (int i = 0; i < indexes.count(); i++) - { - QContact contact = contactModel()->contact(indexes[i]); - QContactLocalId locId = contact.localId(); - qDebug()<< locId; - mSelectionList.append(locId); - - if (mContactsLocalIdList.contains(locId)) - { - // user has not deselected an old member of the group - // dont do anything - } - else - { - // new contact added to the group - QContactRelationship relationship; - relationship.setRelationshipType(QContactRelationship::HasMember); - relationship.setFirst(mContact->id()); - relationship.setSecond(contact.id()); - // save relationship - contactManager()->saveRelationship(&relationship); - } - } - - // for each contact in mContactsLocalIdList, check if contact is also in new selection model - // if yes, then do nothing - // if no, then remove it from the relationship - - for (int x=0; x < mContactsLocalIdList.count(); x++) - { - QContactLocalId oldSelectedLocalContactId = mContactsLocalIdList.at(x); - qDebug()<< oldSelectedLocalContactId; - if (mSelectionList.contains(oldSelectedLocalContactId)) - { - // user has not deselected an old member of the group - // dont do anything - } - else - { - QContact contactInOldList = contactManager()->contact(mContactsLocalIdList.at(x)); - QContactRelationship relationship; - relationship.setRelationshipType(QContactRelationship::HasMember); - relationship.setFirst(mContact->id()); - relationship.setSecond(contactInOldList.id()); - contactManager()->removeRelationship(relationship); - } - } - - CntViewParameters viewParameters(CntViewParameters::groupActionsView); - viewParameters.setSelectedContact(*mContact); - viewManager()->onActivateView(viewParameters); -} - -void CntGroupMemberSelectionView::markUnmarkAll() -{ - if(mCountContacts < contactModel()->rowCount()) - { - listView()->selectAll(); // mark all - } - else - { - listView()->clearSelection(); // unmark all only when everything is already marked - } - -} - -void CntGroupMemberSelectionView::OnCancel() -{ - QString groupNameCreated(mGroupContactName.value( QContactName::FieldCustomLabel )); - if(mActionNewGroup) - { - HbNotificationDialog::launchDialog(qtTrId("New group %1 created").arg(groupNameCreated)); - } - CntViewParameters viewParameters(CntViewParameters::collectionView); - viewManager()->onActivateView(viewParameters); -} - -void CntGroupMemberSelectionView::openGroupNameEditor() -{ - CntViewParameters viewParameters(CntViewParameters::groupEditorView); - viewParameters.setSelectedContact(*mContact); - viewManager()->onActivateView(viewParameters); -} - -void CntGroupMemberSelectionView::activateView(const CntViewParameters &viewParameters) -{ - QContact contact = viewParameters.selectedContact(); - mContact = new QContact(contact); - - mGroupContactName = mContact->detail( QContactName::DefinitionName ); - QString groupName(mGroupContactName.value( QContactName::FieldCustomLabel )); - - mBanner = new HbGroupBox(this); - listLayout()->insertItem(0, mBanner); - - if (viewParameters.selectedAction() == "NewGroup") - { - mActionNewGroup = true; // to enable the Cancel notification only for New Group ->Cancel - } - - // create a filter to show contacts of typeContact - QContactDetailFilter contactsFilter; - contactsFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); - contactsFilter.setValue(QString(QLatin1String(QContactType::TypeContact))); - - contactModel()->setFilterAndSortOrder(contactsFilter); - contactModel()->showMyCard(false); - - // Use relationship filter to get list of contacts in the relationship (if any) - QContactRelationshipFilter rFilter; - rFilter.setRelationshipType(QContactRelationship::HasMember); - rFilter.setRole(QContactRelationshipFilter::Second); // should be second here - rFilter.setOtherParticipantId(mContact->id()); - - mContactsLocalIdList = contactManager()->contacts(rFilter); - mCountContacts = mContactsLocalIdList.count(); - - // set the model to the list (needed before next step) - CntBaseSelectionView::activateView(viewParameters); - - //Get the index of the contacts - // Set the select option for those contacts in the selectionModel - - for (int i=0; i < mCountContacts; i++ ) - { - // get QContact from QContactId - QContact contactInList = contactManager()->contact(mContactsLocalIdList.at(i)); - QContactLocalId contactInListLocId = contactInList.localId(); - - QModelIndex contactIndex = contactModel()->indexOfContact(contactInList); - selectionModel()->select(contactIndex, QItemSelectionModel::Select); - } - - QString temp; - temp.setNum(mCountContacts); - mBanner->setHeading(qtTrId("(%1) members selected").arg(temp)); - - connect(selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, SLOT(updateTitle(const QItemSelection&, const QItemSelection&))); -} - -void CntGroupMemberSelectionView::updateTitle(const QItemSelection &selected, const QItemSelection &deselected) -{ - if (selected.count()) - { - mCountContacts += selected.indexes().count(); - QString temp; - temp.setNum(mCountContacts); - mBanner->setHeading(qtTrId("(%1) members selected").arg(temp)); - } - if (deselected.count()) - { - mCountContacts -= deselected.indexes().count(); - QString temp; - temp.setNum(mCountContacts); - mBanner->setHeading(qtTrId("(%1) members selected").arg(temp)); - } -} - -void CntGroupMemberSelectionView::addActionsToToolBar() -{ - //Add Action to the toolbar - actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:save") << actions()->baseAction("cnt:markUnmarkAll") << actions()->baseAction("cnt:cancel"); - - actions()->addActionsToToolBar(toolBar()); - - connect(actions()->baseAction("cnt:save"), SIGNAL(triggered()), - this, SLOT(saveGroup())); - connect(actions()->baseAction("cnt:markUnmarkAll"), SIGNAL(triggered()), - this, SLOT(markUnmarkAll())); - connect(actions()->baseAction("cnt:cancel"), SIGNAL(triggered()), - this, SLOT(OnCancel())); -} - diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntgroupmemberview.cpp --- a/phonebookui/pbkcommonui/src/cntgroupmemberview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntgroupmemberview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -30,10 +30,7 @@ #include #include #include -#include -#include - - +#include #include "cntcontactcardheadingitem.h" #include "cntgroupselectionpopup.h" @@ -56,10 +53,16 @@ : CntBaseListView(viewManager, parent), mNoGroupContactsPresent(0), mGroupContact(0), - mSearchPanel(0), - mEmptyListLabel(0) + mHeadingItem(0), + mThumbnailManager(0) { - + mThumbnailManager = new ThumbnailManager(this); + mThumbnailManager->setMode(ThumbnailManager::Default); + mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForQuality); + mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailMedium); + + connect(mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void*, int, int)), + this, SLOT(thumbnailReady(QPixmap, void*, int, int))); } /*! @@ -72,16 +75,9 @@ void CntGroupMemberView::aboutToCloseView() { - if (mSearchPanel) - { - closeFind(); - } - else - { - CntViewParameters viewParameters(CntViewParameters::groupActionsView); + CntViewParameters viewParameters;//(CntViewParameters::groupActionsView); viewParameters.setSelectedContact(*mGroupContact); - viewManager()->onActivateView(viewParameters); - } + viewManager()->back(viewParameters); } /*! @@ -91,119 +87,37 @@ { actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:managemembers") << actions()->baseAction("cnt:find"); - actions()->addActionsToToolBar(toolBar()); + - //setItemVisible - connect(actions()->baseAction("cnt:managemembers"), SIGNAL(triggered()), - this, SLOT(manageMembers())); - connect(actions()->baseAction("cnt:find"), SIGNAL(triggered()), - this, SLOT(find())); - actions()->baseAction("cnt:find")->setEnabled(false); // to be enabled after Intersection filter implementation + + + actions()->clearActionList(); + actions()->actionList() << actions()->baseAction("cnt:managemembers") << actions()->baseAction("cnt:deletegroup") + << actions()->baseAction("cnt:groupactions"); + actions()->addActionsToToolBar(toolBar()); + + connect(actions()->baseAction("cnt:managemembers"), SIGNAL(triggered()), + this, SLOT(manageMembers())); + connect(actions()->baseAction("cnt:deletegroup"), SIGNAL(triggered()), + this, SLOT(deleteGroup())); + connect(actions()->baseAction("cnt:groupactions"), SIGNAL(triggered()), + this, SLOT(groupActions())); } -void CntGroupMemberView::find() -{ - if (mSearchPanel == 0) - { - toolBar()->hide(); - mSearchPanel = new HbSearchPanel(); - setBannerName(hbTrId("Find: Group contacts")); - banner()->setVisible(true); - listLayout()->addItem(mSearchPanel); - contactModel()->showMyCard(false); - setFilter(QString()); - - connect(mSearchPanel, SIGNAL(exitClicked()), this, SLOT(closeFind())); - connect(mSearchPanel, SIGNAL(criteriaChanged(QString)), this, SLOT(setFilter(QString))); - } - -} - -void CntGroupMemberView::setFilter(const QString &filterString) -{ - QStringList searchList = filterString.split(QRegExp("\\s+"), QString::SkipEmptyParts); - - QContactDetailFilter filter; - filter.setDetailDefinitionName(QContactDisplayLabel::DefinitionName, QContactDisplayLabel::FieldLabel); - filter.setMatchFlags(QContactFilter::MatchStartsWith); - filter.setValue(searchList); - - mFilteredLocalIdList = contactManager()->contacts(filter); - - contactModel()->setFilterAndSortOrder(filter); - // use intersection filter here - - if (!contactModel()->rowCount()) - { - listLayout()->removeItem(listView()); - listView()->setVisible(false); - if (mEmptyListLabel == 0) - { - mEmptyListLabel = new HbTextItem(hbTrId("(no matching contacts)")); - mEmptyListLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); - mEmptyListLabel->setFontSpec(HbFontSpec(HbFontSpec::Primary)); - mEmptyListLabel->setAlignment(Qt::AlignCenter); - listLayout()->insertItem(1, mEmptyListLabel); - } - } - else - { - listLayout()->removeItem(mEmptyListLabel); - delete mEmptyListLabel; - mEmptyListLabel = 0; - listLayout()->insertItem(1, listView()); - listView()->setVisible(true); - } -} - -void CntGroupMemberView::closeFind() -{ - if( mSearchPanel) - { - listLayout()->removeItem(mEmptyListLabel); - delete mEmptyListLabel; - mEmptyListLabel = 0; - - listLayout()->removeItem(banner()); - banner()->setVisible(false); - listLayout()->removeItem(mSearchPanel); - listLayout()->addItem(listView()); - listView()->setVisible(true); - - // display User-groups - QContactRelationshipFilter rFilter; - rFilter.setRelationshipType(QContactRelationship::HasMember); - rFilter.setRole(QContactRelationshipFilter::Second); - rFilter.setOtherParticipantId(mGroupContact->id()); - - contactModel()->setFilterAndSortOrder(rFilter); - contactModel()->showMyCard(false); - - mSearchPanel->deleteLater(); - mSearchPanel = 0; - toolBar()->show(); - } -} void CntGroupMemberView::groupActions() { CntViewParameters viewParameters(CntViewParameters::groupActionsView); viewParameters.setSelectedContact(*mGroupContact); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } -void CntGroupMemberView::callNamesList() -{ - CntViewParameters viewParameters(CntViewParameters::namesView); - viewManager()->onActivateView(viewParameters); -} void CntGroupMemberView::manageMembers() { // save the group here - CntGroupSelectionPopup *groupSelectionPopup = new CntGroupSelectionPopup(contactManager(),contactModel(),mGroupContact); - listView()->hide(); + CntGroupSelectionPopup *groupSelectionPopup = new CntGroupSelectionPopup(contactManager(), mGroupContact); + listView()->setModel(0); groupSelectionPopup->populateListOfContact(); @@ -211,12 +125,9 @@ if (action == groupSelectionPopup->primaryAction()) { groupSelectionPopup->saveOldGroup(); - CntViewParameters viewParameters(CntViewParameters::groupActionsView); - viewParameters.setSelectedContact(*mGroupContact); - viewManager()->onActivateView(viewParameters); } delete groupSelectionPopup; - listView()->show(); + listView()->setModel(contactModel()); } /*! Add actions to menu @@ -224,21 +135,12 @@ void CntGroupMemberView::addMenuItems() { actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:editgroupdetails") << actions()->baseAction("cnt:managemembersmenu") << - actions()->baseAction("cnt:placegrouptohs") << actions()->baseAction("cnt:deletegroup"); + actions()->actionList() << actions()->baseAction("cnt:editgroupdetails"); actions()->addActionsToMenu(menu()); connect(actions()->baseAction("cnt:editgroupdetails"), SIGNAL(triggered()), this, SLOT (editGroup())); - - connect(actions()->baseAction("cnt:managemembersmenu"), SIGNAL(triggered()), - this, SLOT (manageMembers())); - - connect(actions()->baseAction("cnt:placegrouptohs"), SIGNAL(triggered()), - this, SLOT (placeGroupToHs())); - - connect(actions()->baseAction("cnt:deletegroup"), SIGNAL(triggered()), - this, SLOT (deleteGroup())); + } @@ -247,20 +149,43 @@ CntViewParameters viewParameters(CntViewParameters::groupEditorView); viewParameters.setSelectedAction("EditGroupDetails"); viewParameters.setSelectedContact(*mGroupContact); - viewManager()->onActivateView(viewParameters); -} - -void CntGroupMemberView::placeGroupToHs() -{ -// wait for specs + viewManager()->changeView(viewParameters); } void CntGroupMemberView::deleteGroup() { // the delete command - connect(commands(), SIGNAL(commandExecuted(QString, QContact)), this, - SLOT(handleExecutedCommand(QString, QContact))); - commands()->deleteContact(*mGroupContact); + HbDialog popup; + + // Set dismiss policy that determines what tap events will cause the dialog + // to be dismissed + popup.setDismissPolicy(HbDialog::NoDismiss); + + QContactName groupContactName = mGroupContact->detail( QContactName::DefinitionName ); + QString groupName(groupContactName.value( QContactName::FieldCustomLabel )); + // Set the label as heading widget + popup.setHeadingWidget(new HbLabel(hbTrId("Delete %1 group?").arg(groupName))); + + // Set a label widget as content widget in the dialog + HbLabel *label = new HbLabel; + label->setPlainText("Only group will be removed, contacts can be found from All contacts list"); + label->setTextWrapping(Hb::TextWordWrap); + popup.setContentWidget(label); + + // Sets the primary action and secondary action + popup.setPrimaryAction(new HbAction(hbTrId("txt_phob_button_delete"),&popup)); + popup.setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"),&popup)); + + popup.setTimeout(0) ; + HbAction* action = popup.exec(); + if (action == popup.primaryAction()) + { + contactManager()->removeContact(mGroupContact->localId()); + CntViewParameters viewParameters(CntViewParameters::collectionView); + viewParameters.setSelectedAction("EditGroupDetails"); + viewParameters.setSelectedContact(*mGroupContact); + viewManager()->changeView(viewParameters); + } } /*! @@ -274,12 +199,14 @@ HbMenu *menu = new HbMenu(); HbAction *removeFromGroupAction = 0; - HbAction *viewDetailsAction = 0; - + HbAction *openContactAction = 0; + HbAction *editContactAction = 0; QString action = map.value("action").toString(); + openContactAction = menu->addAction(hbTrId("txt_common_menu_open")); + editContactAction = menu->addAction(hbTrId("txt_common_menu_edit")); removeFromGroupAction = menu->addAction(hbTrId("txt_phob_menu_remove_from_group")); - viewDetailsAction = menu->addAction(hbTrId("View details")); + HbAction *selectedAction = menu->exec(aCoords); @@ -289,14 +216,27 @@ { removeFromGroup(index); } - else if (selectedAction == viewDetailsAction) + else if (selectedAction == editContactAction) + { + editContact(index); + } + else if (selectedAction == openContactAction) { onListViewActivated(index); } + } menu->deleteLater(); } +void CntGroupMemberView::editContact(const QModelIndex &index) +{ + QContact selectedContact = contactModel()->contact(index); + CntViewParameters viewParameters(CntViewParameters::editView); + viewParameters.setSelectedContact(selectedContact); + viewManager()->changeView(viewParameters); +} + void CntGroupMemberView::removeFromGroup(const QModelIndex &index) { // get contact id using index @@ -308,14 +248,6 @@ contactManager()->removeRelationship(relationship); } -void CntGroupMemberView::viewDetailsOfGroupContact(const QModelIndex &index) -{ - QContact selectedContact = contactModel()->contact(index); - CntViewParameters viewParameters(CntViewParameters::commLauncherView); - viewParameters.setSelectedContact(selectedContact); - viewManager()->onActivateView(viewParameters); -} - /*! Called after user clicked on the listview. */ @@ -325,7 +257,7 @@ viewParameters.setSelectedContact(contactModel()->contact(index)); viewParameters.setSelectedGroupContact(*mGroupContact); viewParameters.setSelectedAction("FromGroupMemberView"); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } @@ -334,34 +266,67 @@ if (command == "delete") { CntViewParameters viewParameters(CntViewParameters::collectionView); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } } +void CntGroupMemberView::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error) +{ + Q_UNUSED(data); + Q_UNUSED(id); + Q_UNUSED(error); + QIcon qicon(pixmap); + HbIcon icon(qicon); + mHeadingItem->setIcon(icon); +} + void CntGroupMemberView::activateView(const CntViewParameters &viewParameters) { QContact contact = viewParameters.selectedContact(); mGroupContact = new QContact(contact); - QContactName groupContactName = mGroupContact->detail( QContactName::DefinitionName ); - QString groupName(groupContactName.value( QContactName::FieldCustomLabel )); + //QContactName groupContactName = mGroupContact->detail( QContactName::DefinitionName ); + // QString groupName(groupContactName.value( QContactName::FieldCustomLabel )); - setBannerName(groupName); + //setBannerName(groupName); + + // add heading widget to the content + QGraphicsWidget *c = findWidget(QString("container")); + QGraphicsLinearLayout* l = static_cast(c->layout()); + + mHeadingItem = new CntContactCardHeadingItem(c); + mHeadingItem->setGroupDetails(mGroupContact); + + l->insertItem(0, mHeadingItem); - // display User-groups + // avatar + QList details = mGroupContact->details(); + if (details.count() > 0) + { + for (int i = 0;i < details.count();i++) + { + if (details.at(i).subType() == QContactAvatar::SubTypeImage) + { + mThumbnailManager->getThumbnail(details.at(i).avatar()); + break; + } + } + } + + // display group members QContactRelationshipFilter rFilter; rFilter.setRelationshipType(QContactRelationship::HasMember); - rFilter.setRole(QContactRelationshipFilter::Second); - rFilter.setOtherParticipantId(mGroupContact->id()); + rFilter.setRelatedContactRole(QContactRelationshipFilter::First); + rFilter.setRelatedContactId(mGroupContact->id()); - mLocalIdList = contactManager()->contacts(rFilter); + mLocalIdList = contactManager()->contactIds(rFilter); contactModel()->setFilterAndSortOrder(rFilter); contactModel()->showMyCard(false); if (viewParameters.selectedAction() == "save") { - QString name = contactManager()->synthesizeDisplayLabel(viewParameters.selectedContact()); + QString name = contactManager()->synthesizedDisplayLabel(viewParameters.selectedContact()); HbNotificationDialog::launchDialog(hbTrId("Group \"%1\" saved").arg(name)); } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntgroupselectionpopup.cpp --- a/phonebookui/pbkcommonui/src/cntgroupselectionpopup.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntgroupselectionpopup.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -20,23 +20,59 @@ #include #include #include +#include +#include #include #include +#include #include -CntGroupSelectionPopup::CntGroupSelectionPopup(QContactManager *manager,MobCntModel *model, QContact *contact, QGraphicsItem *parent): +CntGroupSelectionPopup::CntGroupSelectionPopup(QContactManager *manager, QContact *contact, QGraphicsItem *parent): HbDialog(parent), mListView(0), + mSearchPanel(0), + mEmptyListLabel(0), mContactManager(manager), - mCntModel(model), - mContact(contact) + mCntModel(0), + mContact(contact), + mContainerWidget(0), + mContainerLayout(0) { -} + QList sortOrders; + QContactSortOrder sortOrderFirstName; + sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldFirst); + sortOrderFirstName.setCaseSensitivity(Qt::CaseInsensitive); + sortOrders.append(sortOrderFirstName); + + QContactSortOrder sortOrderLastName; + sortOrderLastName.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldLast); + sortOrderLastName.setCaseSensitivity(Qt::CaseInsensitive); + sortOrders.append(sortOrderLastName); + + mCntModel = new MobCntModel(mContactManager, QContactFilter(), sortOrders); + + mSearchPanel = new HbSearchPanel(); + connect(mSearchPanel, SIGNAL(exitClicked()), this, SLOT(closeFind())); + connect(mSearchPanel, SIGNAL(criteriaChanged(QString)), this, SLOT(setFilter(QString))); + + mContainerLayout = new QGraphicsLinearLayout(Qt::Vertical); + mContainerLayout->setContentsMargins(0, 0, 0, 0); + mContainerLayout->setSpacing(0); + + mContainerWidget = new QGraphicsWidget; + } CntGroupSelectionPopup::~CntGroupSelectionPopup() { + delete mContainerWidget; + mContainerWidget = 0; + + delete mEmptyListLabel; + mEmptyListLabel = 0; + delete mCntModel; + mCntModel = 0; } void CntGroupSelectionPopup::populateListOfContact() @@ -44,9 +80,8 @@ QContactName groupContactName = mContact->detail( QContactName::DefinitionName ); QString groupName(groupContactName.value( QContactName::FieldCustomLabel )); - HbGroupBox *headingLabel = new HbGroupBox(); - HbLabel *label = new HbLabel(hbTrId("txt_phob_title_members_of_1_group").arg(groupName)); - headingLabel->setContentWidget(label); + HbGroupBox *headingLabel = new HbGroupBox(this); + headingLabel->setHeading(hbTrId("txt_phob_title_members_of_1_group").arg(groupName)); setHeadingWidget(headingLabel); @@ -60,9 +95,9 @@ mCntModel->showMyCard(false); rFilter.setRelationshipType(QContactRelationship::HasMember); - rFilter.setRole(QContactRelationshipFilter::Second); // should be second here - rFilter.setOtherParticipantId(mContact->id()); - QList contactsLocalIdList = mContactManager->contacts(rFilter); + rFilter.setRelatedContactRole(QContactRelationshipFilter::First); + rFilter.setRelatedContactId(mContact->id()); + QList contactsLocalIdList = mContactManager->contactIds(rFilter); int countContacts = contactsLocalIdList.count(); //Get the index of the contacts @@ -70,7 +105,8 @@ mListView->setModel(mCntModel); // set the listview to multiSelection mode, this will bring MarkAll functionality (from Orbit) mListView->setSelectionMode(HbAbstractItemView::MultiSelection); - + mListView->setFrictionEnabled(true); + mListView->setScrollingStyle(HbScrollArea::PanOrFlick); for (int i=0; i < countContacts; i++ ) { @@ -79,64 +115,35 @@ QModelIndex contactIndex = mCntModel->indexOfContact(contactInList); mListView->selectionModel()->select(contactIndex, QItemSelectionModel::Select); } - setContentWidget(mListView); - + setTimeout(0); setModal(true); - HbAction *mPrimaryAction = new HbAction(hbTrId("Save")); - setPrimaryAction(mPrimaryAction); - - HbAction *mSecondaryAction = new HbAction(hbTrId("Cancel")); - setSecondaryAction(mSecondaryAction); -} + // Note that the layout takes ownership of the item(s) it contains. + mContainerLayout->addItem(mListView); + mContainerLayout->addItem(mSearchPanel); + mContainerWidget->setLayout(mContainerLayout); -void CntGroupSelectionPopup::populateListOfGroup() -{ - QContactName groupContactName = mContact->detail( QContactName::DefinitionName ); - QString groupName(groupContactName.value( QContactName::FieldCustomLabel )); - - HbGroupBox *headingLabel = new HbGroupBox(); - HbLabel *label = new HbLabel(hbTrId("txt_phob_opt_delete_groups")); - headingLabel->setContentWidget(label); - - setHeadingWidget(headingLabel); + setContentWidget(mContainerWidget); - mListView = new HbListView(this); - QContactRelationshipFilter rFilter; - - QContactDetailFilter contactsFilter; - contactsFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); - contactsFilter.setValue(QString(QLatin1String(QContactType::TypeGroup))); - mCntModel->setFilterAndSortOrder(contactsFilter); - mCntModel->showMyCard(false); - - //Get the index of the contacts - // Set the select option for those contacts in the selectionModel - mListView->setModel(mCntModel); - // set the listview to multiSelection mode, this will bring MarkAll functionality (from Orbit) - mListView->setSelectionMode(HbAbstractItemView::MultiSelection); - - setContentWidget(mListView); - - setTimeout(0); - setModal(true); - - HbAction *mPrimaryAction = new HbAction(hbTrId("Delete selected")); + HbAction *mPrimaryAction = new HbAction(hbTrId("Save")); setPrimaryAction(mPrimaryAction); HbAction *mSecondaryAction = new HbAction(hbTrId("txt_common_button_cancel")); setSecondaryAction(mSecondaryAction); } - void CntGroupSelectionPopup::saveNewGroup() { // Save the relationship from the selection model of the member selection list QModelIndexList indexes = mListView->selectionModel()->selection().indexes(); + for (int i = 0; i < indexes.count(); i++) { + QModelIndex index = indexes[i]; QContact contact = mCntModel->contact(indexes[i]); + int id = contact.localId(); + int gpid = mContact->localId(); QContactRelationship relationship; relationship.setRelationshipType(QContactRelationship::HasMember); relationship.setFirst(mContact->id()); @@ -152,10 +159,10 @@ // Use relationship filter to get list of contacts in the relationship (if any) QContactRelationshipFilter rFilter; rFilter.setRelationshipType(QContactRelationship::HasMember); - rFilter.setRole(QContactRelationshipFilter::Second); // should be second here - rFilter.setOtherParticipantId(mContact->id()); + rFilter.setRelatedContactRole(QContactRelationshipFilter::First); + rFilter.setRelatedContactId(mContact->id()); - QList contactsLocalIdList = mContactManager->contacts(rFilter); + QList contactsLocalIdList = mContactManager->contactIds(rFilter); // get the contact from new selection model indexes // for each contact, check if contact in this new index is member of mContactsLocalIdList( as achieved in activateView) @@ -163,7 +170,11 @@ // if no, then add contact to the relationship QModelIndexList indexes = mListView->selectionModel()->selection().indexes(); - QList selectionList; + QList selectionList; + + QList removedRelationships; + QList addedRelationships; + for (int i = 0; i < indexes.count(); i++) { QContact contact = mCntModel->contact(indexes[i]); @@ -177,8 +188,7 @@ relationship.setRelationshipType(QContactRelationship::HasMember); relationship.setFirst(mContact->id()); relationship.setSecond(contact.id()); - // save relationship - mContactManager->saveRelationship(&relationship); + addedRelationships.append(relationship); } } @@ -186,30 +196,88 @@ // if yes, then do nothing // if no, then remove it from the relationship - for (int x=0; x < contactsLocalIdList.count(); x++) + for (int j = 0; j < contactsLocalIdList.count(); j++) { - QContactLocalId oldSelectedLocalContactId = contactsLocalIdList.at(x); + QContactLocalId oldSelectedLocalContactId = contactsLocalIdList.at(j); if (!selectionList.contains(oldSelectedLocalContactId)) { - QContact contactInOldList = mContactManager->contact(contactsLocalIdList.at(x)); + QContact contactInOldList = mContactManager->contact(contactsLocalIdList.at(j)); QContactRelationship relationship; relationship.setRelationshipType(QContactRelationship::HasMember); relationship.setFirst(mContact->id()); relationship.setSecond(contactInOldList.id()); - mContactManager->removeRelationship(relationship); + removedRelationships.append(relationship); } } + // save & remove relationships + mContactManager->removeRelationships(removedRelationships); + mContactManager->saveRelationships(&addedRelationships); +} + +void CntGroupSelectionPopup::closeFind() +{ + if (mSearchPanel) + { + mContainerLayout->removeItem(mEmptyListLabel); + delete mEmptyListLabel; + mEmptyListLabel = 0; + + mContainerLayout->removeItem(mSearchPanel); + mContainerLayout->addItem(mListView); + + QContactDetailFilter filter; + filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + QString typeContact = QContactType::TypeContact; + filter.setValue(typeContact); + + mSearchPanel->deleteLater(); + } } -void CntGroupSelectionPopup::deleteGroup() +void CntGroupSelectionPopup::setFilter(const QString &filterString) { - QModelIndexList indexes = mListView->selectionModel()->selection().indexes(); - QList selectionList; - for (int i = 0; i < indexes.count(); i++) + QStringList searchList = filterString.split(QRegExp("\\s+"), QString::SkipEmptyParts); + + // find matches and existing members + QContactRelationshipFilter relationFilter; + relationFilter.setRelationshipType(QContactRelationship::HasMember); + relationFilter.setRelatedContactRole(QContactRelationshipFilter::First); + relationFilter.setRelatedContactId(mContact->id()); + + QContactDetailFilter detailfilter; + detailfilter.setDetailDefinitionName(QContactDisplayLabel::DefinitionName, QContactDisplayLabel::FieldLabel); + detailfilter.setMatchFlags(QContactFilter::MatchStartsWith); + detailfilter.setValue(searchList); + + QContactUnionFilter filter; + filter.append(relationFilter); + filter.append(detailfilter); + + mCntModel->setFilterAndSortOrder(filter); + + // select all contacts already in group relationship + QList contactsLocalIdList = mContactManager->contactIds(relationFilter); + int countContacts = contactsLocalIdList.count(); + for (int i=0; i < countContacts; i++ ) { - QContact contact = mCntModel->contact(indexes[i]); - QContactLocalId locId = contact.localId(); - selectionList.append(locId); + // get QContact from QContactId + QContact contactInList = mContactManager->contact(contactsLocalIdList.at(i)); + QModelIndex contactIndex = mCntModel->indexOfContact(contactInList); + mListView->selectionModel()->select(contactIndex, QItemSelectionModel::Select); } - mContactManager->removeContacts(&selectionList); + + if (!mCntModel->rowCount()) { + if (mEmptyListLabel == 0) { + mEmptyListLabel = new HbTextItem(hbTrId("(no matching contacts)")); + mEmptyListLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + mEmptyListLabel->setFontSpec(HbFontSpec(HbFontSpec::Primary)); + mEmptyListLabel->setAlignment(Qt::AlignCenter); + mContainerLayout->insertItem(1, mEmptyListLabel); + } + } + else { + mContainerLayout->removeItem(mEmptyListLabel); + delete mEmptyListLabel; + mEmptyListLabel = 0; + } } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cnthistoryview.cpp --- a/phonebookui/pbkcommonui/src/cnthistoryview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cnthistoryview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,11 +21,13 @@ #include #include #include +#include +#include +#include #include #include "cnthistoryviewitem.h" const char *CNT_HISTORYVIEW_XML = ":/xml/contacts_history.docml"; -//const QString db_path("c:\\conversations.sqlite"); /*! Constructor, initialize member variables. @@ -66,8 +68,13 @@ */ void CntHistoryView::aboutToCloseView() { + CntViewParameters args;//( CntViewParameters::commLauncherView ); + args.setSelectedContact( *mContact ); + viewManager()->back( args ); + /* viewManager()->previousViewParameters().setSelectedContact(*mContact); viewManager()->onActivatePreviousView(); + */ } void CntHistoryView::activateView(const CntViewParameters &viewParameters) @@ -77,40 +84,35 @@ //group box HbGroupBox* groupBox = static_cast(findWidget(QString("cnt_groupbox_history"))); - QString text; - if (mContact->localId() == contactManager()->selfContactId()) { - //My card - text.append(hbTrId("All history")); - } - else { - text.append(hbTrId("History: ")); - text.append(contactManager()->synthesizeDisplayLabel(contact)); - } + QString text = hbTrId("History with %1").arg(contactManager()->synthesizedDisplayLabel(contact)); groupBox->setHeading(text); //construct listview mHistoryListView = static_cast(findWidget(QString("cnt_listview_history"))); - //QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); - //db.setDatabaseName(db_path); - //db.open(); - //bubble graphics - create our custom list view item to have different bubbles //for incoming and outgoing messages CntHistoryViewItem *item = new CntHistoryViewItem; mHistoryListView->setItemPrototype(item); //ownership is taken + connect(mHistoryListView, SIGNAL(longPressed(HbAbstractViewItem *, const QPointF &)), + this, SLOT(longPressed(HbAbstractViewItem *, const QPointF &))); + connect(mHistoryListView, SIGNAL(activated(const QModelIndex &)), + this, SLOT(pressed(const QModelIndex &))); - //create and set model for the list mHistoryModel = new MobHistoryModel(contact.localId(), contactManager()); mHistoryListView->setModel(mHistoryModel); //ownership is not taken //start listening to the events amount changing in the model connect(mHistoryModel, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(updateScrollingPosition())); + connect(mHistoryModel, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), + this, SLOT(rowsRemoved(const QModelIndex &, int, int))); + connect(mHistoryModel, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), + this, SLOT(updateScrollingPosition())); } /*! -Called after new items were added to comm history view +Called after new items are added to or removed from comm history view */ void CntHistoryView::updateScrollingPosition() { @@ -118,4 +120,62 @@ mHistoryListView->scrollTo(mHistoryModel->index(rowCnt - 1, 0), HbAbstractItemView::PositionAtBottom); } + +/*! +Add actions to menu +*/ +void CntHistoryView::addMenuItems() +{ + CntActions* acts = actions(); + acts->clearActionList(); + acts->actionList() << acts->baseAction("cnt:clearhistory"); + acts->addActionsToMenu(menu()); + + connect(acts->baseAction("cnt:clearhistory"), SIGNAL(triggered()), + this, SLOT (clearHistory())); +} + +/* +Clear communications history +*/ +void CntHistoryView::clearHistory() +{ + mHistoryModel->clearHistory(); +} + +/*! +Called when a list item is longpressed +*/ +void CntHistoryView::longPressed(HbAbstractViewItem *item, const QPointF &coords) +{ + Q_UNUSED(item); + + HbMenu* menu = new HbMenu(); + HbAction* clearAction = menu->addAction(hbTrId("txt_phob_menu_clear_history")); + + HbAction* selectedAction = menu->exec(coords); + + if (selectedAction && selectedAction == clearAction) { + // Clear comm history + mHistoryModel->clearHistory(); + } + + menu->deleteLater(); +} + +void CntHistoryView::pressed(const QModelIndex &index) +{ + QVariant itemType = mHistoryModel->data(index, MobHistoryModel::ItemTypeRole); + + if (itemType.toInt() == MobHistoryModel::CallLog) { + // Make a call + QVariant v = mHistoryModel->data(index, MobHistoryModel::PhoneNumberRole); + QString service("com.nokia.services.telephony"); + QString type("dial(QString)"); + XQServiceRequest snd(service, type, false); + snd << v.toString(); + snd.send(); + } +} + // end of file diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cnthistoryviewitemwidget.cpp --- a/phonebookui/pbkcommonui/src/cnthistoryviewitemwidget.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cnthistoryviewitemwidget.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -22,8 +22,8 @@ #include #include -#define INCOMING_EVENT_FRAME ":/bubble/qtg_fr_convlist_received_normal" -#define OUTGOING_EVENT_FRAME ":/bubble/qtg_fr_convlist_sent_normal" +#define INCOMING_EVENT_FRAME "qtg_fr_convlist_received_normal" +#define OUTGOING_EVENT_FRAME "qtg_fr_convlist_sent_normal" CntHistoryViewItemWidget::CntHistoryViewItemWidget(QGraphicsItem *parent) : HbWidget(parent), diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntimageeditorview.cpp --- a/phonebookui/pbkcommonui/src/cntimageeditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntimageeditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -17,18 +17,19 @@ #include "cntimageeditorview.h" -#include -#include -#include -#include -#include #include -#include #include #include +#include +#include +#include +#include +#include +#include + +#include const char *CNT_IMAGE_XML = ":/xml/contacts_if.docml"; -const int BUTTON_HEIGHT = 50; #define FETCHER_SERVICE "com.nokia.services.media" #define FETCHER_INTERFACE "image" @@ -37,28 +38,40 @@ /*! Constructor */ -CntImageEditorView::CntImageEditorView(CntViewManager *viewManager, QGraphicsItem *parent) : - CntBaseView(viewManager, parent), +CntImageEditorView::CntImageEditorView() : mContact(0), mAvatar(0), mImageLabel(0), - mScrollArea(0), mRequest(0), mThumbnailManager(0), - mContainerWidget(0) + mView(0), + mSoftkey(0), + mRemoveImage(0), + mViewManager(0), + mListView(0), + mModel(0) { bool ok = false; - ok = loadDocument(CNT_IMAGE_XML); + mDocumentLoader.load(CNT_IMAGE_XML, &ok); if (ok) { - QGraphicsWidget *content = findWidget(QString("content")); - setWidget(content); + mView = static_cast(mDocumentLoader.findWidget(QString("view"))); } else { qFatal("Unable to read :/xml/contacts_if.docml"); } + + //back button + mSoftkey = new HbAction(Hb::BackNaviAction, mView); + connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView())); + + // menu action + mRemoveImage = static_cast(mDocumentLoader.findObject("cnt:removeimage")); + connect(mRemoveImage, SIGNAL(triggered()), this, SLOT(removeImage())); + + // thumbnail manager mThumbnailManager = new ThumbnailManager(this); mThumbnailManager->setMode(ThumbnailManager::Default); mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForQuality); @@ -68,61 +81,42 @@ this, SLOT(thumbnailReady(QPixmap, void*, int, int)) ); } -void CntImageEditorView::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error) -{ - Q_UNUSED(data); - Q_UNUSED(id); - Q_UNUSED(error); - QIcon qicon(pixmap); - HbIcon icon(qicon); - mImageLabel->clear(); - mImageLabel->setIcon(icon); -} - /*! Destructor */ CntImageEditorView::~CntImageEditorView() { - delete mImageLabel; - delete mAvatar; - delete mContact; - delete mRequest; -} + mView->deleteLater(); -void CntImageEditorView::resizeEvent(QGraphicsSceneResizeEvent *event) -{ - if (mScrollArea) - { - mContainerWidget->resize(mScrollArea->size().width(), 0); - } - CntBaseView::resizeEvent(event); + delete mAvatar; + mAvatar = 0; + delete mContact; + mContact = 0; + delete mRequest; + mRequest = 0; + delete mRemoveImage; + mRemoveImage = 0; + delete mModel; + mModel = 0; } /*! -Called when user closes the view +Called when activating the view */ -void CntImageEditorView::aboutToCloseView() +void CntImageEditorView::activate( CntAbstractViewManager* aMgr, const CntViewParameters& aArgs ) { - mContact->saveDetail(mAvatar); - - if (mAvatar->avatar().isEmpty()) - { - mContact->removeDetail(mAvatar); - } - viewManager()->previousViewParameters().setSelectedContact(*mContact); - viewManager()->onActivatePreviousView(); -} - -/*! -Called when activating the view (create image label and scroll area with buttons) -*/ -void CntImageEditorView::activateView(const CntViewParameters &viewParameters) -{ - mContact = new QContact(viewParameters.selectedContact()); + if (mView->navigationAction() != mSoftkey) + mView->setNavigationAction(mSoftkey); + + HbMainWindow* window = mView->mainWindow(); + connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation))); + setOrientation(window->orientation()); + + mContact = new QContact(aArgs.selectedContact()); + mViewManager = aMgr; // set the correct image if the contact already has an image set - mImageLabel = static_cast(findWidget(QString("image"))); + mImageLabel = static_cast(mDocumentLoader.findWidget(QString("cnt_image_label"))); QList details = mContact->details(); if (details.count() > 0) @@ -141,37 +135,43 @@ { mAvatar = new QContactAvatar(); mAvatar->setSubType(QContactAvatar::SubTypeImage); + mRemoveImage->setEnabled(false); } - - QGraphicsWidget *w = findWidget(QString("content")); - static_cast(w->layout())->setAlignment(mImageLabel, Qt::AlignCenter); - - // construct listview and the model for it - mScrollArea = static_cast(findWidget(QString("scrollArea"))); - - mContainerWidget = new HbWidget(); - QGraphicsLinearLayout *buttonLayout = new QGraphicsLinearLayout(Qt::Vertical); - buttonLayout->setContentsMargins(0, 0, 0, 0); + + // set up the list + mListView = static_cast(mDocumentLoader.findWidget(QString("cnt_listview"))); + + connect(mListView, SIGNAL(activated(const QModelIndex&)), this, + SLOT(listViewActivated(const QModelIndex&))); + + HbFrameBackground frame; + frame.setFrameGraphicsName("qtg_fr_list_normal"); + frame.setFrameType(HbFrameDrawer::NinePieces); + mListView->itemPrototypes().first()->setDefaultFrame(frame); + + mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::LargeIcon); + + mModel = new QStandardItemModel(); + populateModel(mModel); + mListView->setModel(mModel); +} - HbPushButton *newPhoto = new HbPushButton(HbIcon(":/icons/qgn_indi_ai_nt_camera.svg"), - hbTrId("txt_phob_list_take_a_new_photo"), Qt::Horizontal); - newPhoto->setPreferredHeight(BUTTON_HEIGHT); - newPhoto->setPreferredWidth(300); - newPhoto->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); - connect(newPhoto, SIGNAL(clicked()), this, SLOT(openCamera())); - buttonLayout->addItem(newPhoto); +void CntImageEditorView::deactivate() +{ + +} - HbPushButton *gallery = new HbPushButton(HbIcon(":/icons/qgn_prop_tutor_gallery.svg"), - hbTrId("Choose from Gallery"), Qt::Horizontal); - gallery->setPreferredHeight(BUTTON_HEIGHT); - gallery->setPreferredWidth(300); - gallery->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); - connect(gallery, SIGNAL(clicked()), this, SLOT(openGallery())); - buttonLayout->addItem(gallery); - - mContainerWidget->setLayout(buttonLayout); - mContainerWidget->setPreferredWidth(mScrollArea->size().width()); - mScrollArea->setContentWidget(mContainerWidget); +void CntImageEditorView::populateModel(QStandardItemModel *model) +{ + QStandardItem *newPhoto = new QStandardItem(); + newPhoto->setText(hbTrId("txt_phob_list_take_a_new_photo")); + newPhoto->setData(HbIcon("qtg_large_camera"), Qt::DecorationRole); + model->appendRow(newPhoto); + + QStandardItem *fromGallery = new QStandardItem(); + fromGallery->setText(hbTrId("txt_phob_list_chooce_from_gallery")); + fromGallery->setData(HbIcon("qtg_large_photos"), Qt::DecorationRole); + model->appendRow(fromGallery); } /*! @@ -194,9 +194,36 @@ } mRequest = mAppManager.create(FETCHER_SERVICE, FETCHER_INTERFACE, FETCHER_OPERATION, false); + if ( mRequest ) + { + connect(mRequest, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleImageChange(const QVariant&))); + mRequest->send(); + } +} - connect(mRequest, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleImageChange(const QVariant&))); - mRequest->send(); +/*! +Called when user closes the view +*/ +void CntImageEditorView::showPreviousView() +{ + mContact->saveDetail(mAvatar); + + if (mAvatar->avatar().isEmpty()) + { + mContact->removeDetail(mAvatar); + } + + CntViewParameters args; + args.setSelectedContact( *mContact ); + mViewManager->back( args ); +} + +void CntImageEditorView::removeImage() +{ + mAvatar->setAvatar(QString()); + mImageLabel->clear(); + mImageLabel->setIcon(HbIcon("qtg_large_avatar")); + mRemoveImage->setEnabled(false); } /*! @@ -208,5 +235,55 @@ { mAvatar->setAvatar(value.toString()); mThumbnailManager->getThumbnail(value.toString()); + mRemoveImage->setEnabled(true); + } +} + +void CntImageEditorView::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error) +{ + Q_UNUSED(data); + Q_UNUSED(id); + if (!error) + { + QIcon qicon(pixmap); + HbIcon icon(qicon); + mImageLabel->clear(); + mImageLabel->setIcon(icon); } } + +void CntImageEditorView::setOrientation(Qt::Orientation orientation) +{ + if (orientation == Qt::Vertical) + { + // reading "portrait" section + mDocumentLoader.load(CNT_IMAGE_XML, "portrait"); + } + else + { + // reading "landscape" section + mDocumentLoader.load(CNT_IMAGE_XML, "landscape"); + } +} + +/*! +Figure out which item was selected according to row number +*/ +void CntImageEditorView::listViewActivated(const QModelIndex &index) +{ + if (index.isValid()) + { + int row = index.row(); + switch(row) + { + case 0: // first item is always "take photo" + openCamera(); + break; + case 1: // and the second one is always "choose from gallery" + openGallery(); + break; + default: + break; + } + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntmainwindow.cpp --- a/phonebookui/pbkcommonui/src/cntmainwindow.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntmainwindow.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -19,7 +19,7 @@ #include "cntmainwindow.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntviewparameters.h" #include @@ -28,7 +28,7 @@ { if (defaultView != CntViewParameters::noView) { - mViewManager = new CntViewManager(this,defaultView); + mViewManager = new CntDefaultViewManager(this,defaultView); } } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntmodelprovider.cpp --- a/phonebookui/pbkcommonui/src/cntmodelprovider.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntmodelprovider.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -102,10 +102,12 @@ QList sortOrders; QContactSortOrder sortOrderFirstName; sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldFirst); + sortOrderFirstName.setCaseSensitivity(Qt::CaseInsensitive); sortOrders.append(sortOrderFirstName); QContactSortOrder sortOrderLastName; sortOrderLastName.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldLast); + sortOrderLastName.setCaseSensitivity(Qt::CaseInsensitive); sortOrders.append(sortOrderLastName); mContactModel=new MobCntModel(contactManager(), QContactFilter(), sortOrders); diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntmycardselectionview.cpp --- a/phonebookui/pbkcommonui/src/cntmycardselectionview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntmycardselectionview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -24,6 +24,10 @@ CntMyCardSelectionView::CntMyCardSelectionView(CntViewManager *viewManager, QGraphicsItem *parent, HbAbstractItemView::SelectionMode newMode) : CntBaseSelectionView(viewManager, parent, newMode) { + QContactDetailFilter contactsFilter; + contactsFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + contactsFilter.setValue(QString(QLatin1String(QContactType::TypeContact))); + contactModel()->setFilterAndSortOrder(contactsFilter); contactModel()->showMyCard(false); } @@ -40,7 +44,8 @@ */ void CntMyCardSelectionView::aboutToCloseView() { - viewManager()->onActivatePreviousView(); + CntViewParameters args; + viewManager()->back( args ); } @@ -53,7 +58,7 @@ { QContact contact = contactModel()->contact(index); contactManager()->setSelfContactId(contact.localId()); - viewManager()->onActivateView(CntViewParameters::namesView); + viewManager()->changeView(CntViewParameters::namesView); } } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntmycardview.cpp --- a/phonebookui/pbkcommonui/src/cntmycardview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntmycardview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -16,73 +16,101 @@ */ #include "cntmycardview.h" +#include "qtpbkglobal.h" #include +#include +#include +#include const char *CNT_MYCARD_UI_XML = ":/xml/contacts_mc.docml"; -CntMyCardView::CntMyCardView(CntViewManager *viewManager, QGraphicsItem *parent) : CntBaseView(viewManager, parent), mContact(0) -{ +CntMyCardView::CntMyCardView() : + mContact(0), + mViewManager(0), + mView(0), + mSoftkey(0) +{ bool ok = false; - ok=loadDocument(CNT_MYCARD_UI_XML); + mDocumentLoader.load(CNT_MYCARD_UI_XML, &ok); if (ok) { - - QGraphicsWidget *w = findWidget(QString("view")); - setWidget(w); + mView = static_cast(mDocumentLoader.findWidget(QString("view"))); } else { qFatal("Unable to read :/xml/contacts_mc.docml"); } + + //back button + mSoftkey = new HbAction(Hb::BackNaviAction, mView); + connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView())); } CntMyCardView::~CntMyCardView() { + mView->deleteLater(); + delete mContact; + mContact = 0; } /*! Activates a previous view */ -void CntMyCardView::aboutToCloseView() +void CntMyCardView::showPreviousView() { - viewManager()->onActivateView(CntViewParameters::namesView); + CntViewParameters args; + mViewManager->back(args); } /* Activates a default view */ -void CntMyCardView::activateView(const CntViewParameters &aViewParameters) +void CntMyCardView::activate(CntAbstractViewManager* aMgr, const CntViewParameters& aArgs) { - mContact = new QContact(aViewParameters.selectedContact()); + if (mView->navigationAction() != mSoftkey) + mView->setNavigationAction(mSoftkey); - HbPushButton *newButton = static_cast(findWidget(QString("cnt_button_new"))); + HbMainWindow* window = mView->mainWindow(); + connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation))); + setOrientation(window->orientation()); + + mContact = new QContact(aArgs.selectedContact()); + mViewManager = aMgr; + + HbPushButton *newButton = static_cast(mDocumentLoader.findWidget(QString("cnt_button_new"))); connect(newButton, SIGNAL(clicked()), this, SLOT(openNameEditor())); - HbPushButton *chooseButton = static_cast(findWidget(QString("cnt_button_choose"))); + HbPushButton *chooseButton = static_cast(mDocumentLoader.findWidget(QString("cnt_button_choose"))); connect(chooseButton, SIGNAL(clicked()), this, SLOT(openMyCardSelectionView())); QContactDetailFilter filter; filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); filter.setValue(QLatin1String(QContactType::TypeContact)); - if (contactManager()->contacts(filter).isEmpty()) + + if (mViewManager->contactManager( SYMBIAN_BACKEND )->contactIds(filter).isEmpty()) { chooseButton->setEnabled(false); } } +void CntMyCardView::deactivate() +{ + +} + void CntMyCardView::setOrientation(Qt::Orientation orientation) { - if( orientation == Qt::Vertical ) + if (orientation == Qt::Vertical) { // reading "portrait" section - loadDocument(CNT_MYCARD_UI_XML, "portrait"); + mDocumentLoader.load(CNT_MYCARD_UI_XML, "portrait"); } else { // reading "landscape" section - loadDocument(CNT_MYCARD_UI_XML, "landscape"); + mDocumentLoader.load(CNT_MYCARD_UI_XML, "landscape"); } } @@ -92,12 +120,13 @@ void CntMyCardView::openNameEditor() { //create a new my card contact - contactManager()->saveContact(mContact); - contactManager()->setSelfContactId(mContact->localId()); + QContactManager* mgr = mViewManager->contactManager( SYMBIAN_BACKEND ); + mgr->saveContact(mContact); + mgr->setSelfContactId(mContact->localId()); //open the contact editor CntViewParameters viewParameters(CntViewParameters::editView); viewParameters.setSelectedContact(*mContact); - viewManager()->onActivateView(viewParameters); + mViewManager->changeView(viewParameters); } /*! @@ -106,7 +135,7 @@ void CntMyCardView::openMyCardSelectionView() { CntViewParameters viewParameters(CntViewParameters::myCardSelectionView); - viewManager()->onActivateView(viewParameters); + mViewManager->changeView(viewParameters); } // EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntnameeditormodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntnameeditormodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,103 @@ +/* +* 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 "cntnameeditormodel.h" +#include "cntdetailconst.h" +#include +#include + +CntNameEditorModel::CntNameEditorModel(QContact* aContact) : + CntDetailEditorModel(aContact) +{ + QList nameList = mContact->details (); + if (nameList.isEmpty()) { + QContactName emptyName; + nameList.append(emptyName); + } + + QList nickList = mContact->details (); + if (nickList.isEmpty()) { + QContactNickname nick; + nickList.append(nick); + } + + // Only one name and nickname is supported + iName = nameList.first(); + iNick = nickList.first(); + + HbDataFormModelItem::DataItemType text = HbDataFormModelItem::TextItem; + HbDataFormModelItem* firstname = new HbDataFormModelItem(text, qtTrId("First name")); + HbDataFormModelItem* lastname = new HbDataFormModelItem(text, qtTrId("Last name")); + HbDataFormModelItem* middlename = new HbDataFormModelItem(text,qtTrId("Middle name")); + HbDataFormModelItem* nickname = new HbDataFormModelItem(text, qtTrId("Nick name")); + HbDataFormModelItem* prefix = new HbDataFormModelItem(text, qtTrId("Prefix")); + HbDataFormModelItem* suffix = new HbDataFormModelItem(text, qtTrId("Suffix")); + + firstname->setContentWidgetData("text", iName.firstName()); + firstname->setContentWidgetData("maxLength", CNT_FIRSTNAME_MAXLENGTH); + lastname->setContentWidgetData("text", iName.lastName()); + lastname->setContentWidgetData("maxLength", CNT_LASTNAME_MAXLENGTH); + middlename->setContentWidgetData("text", iName.middleName()); + middlename->setContentWidgetData("maxLength", CNT_MIDDLENAME_MAXLENGTH); + nickname->setContentWidgetData("text", iNick.nickname()); + nickname->setContentWidgetData("maxLength", CNT_NICKNAME_MAXLENGTH); + prefix->setContentWidgetData("text", iName.prefix()); + prefix->setContentWidgetData("maxLength", CNT_PREFIX_MAXLENGTH); + suffix->setContentWidgetData("text", iName.suffix()); + suffix->setContentWidgetData("maxLength", CNT_SUFFIX_MAXLENGTH); + + HbDataFormModelItem* root = invisibleRootItem(); + appendDataFormItem(firstname, root); + appendDataFormItem(lastname, root); + appendDataFormItem(middlename, root); + appendDataFormItem(nickname, root); + appendDataFormItem(prefix, root); + appendDataFormItem(suffix, root); +} + +CntNameEditorModel::~CntNameEditorModel() +{ +} + +void CntNameEditorModel::saveContactDetails() +{ + HbDataFormModelItem* root = invisibleRootItem(); + iName.setFirstName( root->childAt( 0 )->contentWidgetData("text").toString().trimmed() ); + iName.setLastName( root->childAt( 1 )->contentWidgetData("text").toString().trimmed() ); + iName.setMiddleName( root->childAt( 2 )->contentWidgetData("text").toString().trimmed() ); + iNick.setNickname( root->childAt( 3 )->contentWidgetData("text").toString().trimmed() ); + iName.setPrefix( root->childAt( 4 )->contentWidgetData("text").toString().trimmed() ); + iName.setSuffix( root->childAt( 5 )->contentWidgetData("text").toString().trimmed() ); + + mContact->saveDetail( &iName ); + mContact->saveDetail( &iNick ); + + // remove empty details + if (iName.firstName().isEmpty() && + iName.lastName().isEmpty() && + iName.middleName().isEmpty() && + iName.prefix().isEmpty() && + iName.suffix().isEmpty()) + { + mContact->removeDetail( &iName ); + } + if(iNick.nickname().isEmpty()) + { + mContact->removeDetail( &iNick ); + } +} + +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntnamesview.cpp --- a/phonebookui/pbkcommonui/src/cntnamesview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntnamesview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -1,262 +1,70 @@ /* -* 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: -* -*/ + * 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 "cntnamesview.h" -#include "qtpbkglobal.h" - -#include -#include -#include -#include -#include - -#include +#include "cntnamesview_p.h" +#include "cntviewparameters.h" -/*! -\class CntNamesView -\brief - -This is the namesview class that shows list of contacts for the user. View contains banner for OVI and a listview that shows actual contacts. -There is also toolbar and menu for navigating between different views. Instance of this class is created by our viewmanager but view itself is -owned by the mainwindow which will also delete it in the end. - -*/ - -/*! -Constructor, initialize member variables. -\a viewManager is the parent that creates this view. \a parent is a pointer to parent QGraphicsItem (by default this is 0) +#include -*/ -CntNamesView::CntNamesView(CntViewManager *viewManager, QGraphicsItem *parent) - : CntBaseListView(viewManager, parent), - mSearchPanel(0), - mEmptyListLabel(0) -{ - connect(commands(), SIGNAL(commandExecuted(QString, QContact)), - this, SLOT(handleExecutedCommand(QString, QContact))); -} - -/*! -Destructor -*/ -CntNamesView::~CntNamesView() +CntNamesView::CntNamesView() : +d_ptr( new CntNamesViewPrivate() ) { - if (mSearchPanel) - { - delete mSearchPanel; - mSearchPanel = 0; - } - delete mEmptyListLabel; -} - -void CntNamesView::aboutToCloseView() -{ - if (mSearchPanel) - { - closeFind(); - } - else - { - qApp->quit(); - } + Q_D(CntNamesView); + d->q_ptr = this; } /*! -Add actions also to toolbar -*/ -void CntNamesView::addActionsToToolBar() + Destructor + */ +CntNamesView::~CntNamesView() { - //Add Action to the toolbar - actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:nameslist") << actions()->baseAction("cnt:collections") - << actions()->baseAction("cnt:find") << actions()->baseAction("cnt:activitystream"); - actions()->addActionsToToolBar(toolBar()); - - actions()->baseAction("cnt:nameslist")->setEnabled(false); - - connect(actions()->baseAction("cnt:collections"), SIGNAL(triggered()), - this, SLOT(openCollections())); - - connect(actions()->baseAction("cnt:find"), SIGNAL(triggered()), - this, SLOT(showFind())); -} - -void CntNamesView::openCollections() -{ - CntViewParameters viewParameters(CntViewParameters::collectionView); - viewManager()->onActivateView(viewParameters); -} - -void CntNamesView::showFind() -{ - if (mSearchPanel == 0) - { - toolBar()->hide(); - mSearchPanel = new HbSearchPanel(); - setBannerName(hbTrId("txt_phob_subtitle_find_all_contacts")); - banner()->setVisible(true); - listLayout()->addItem(mSearchPanel); - contactModel()->showMyCard(false); - setFilter(QString()); - - connect(mSearchPanel, SIGNAL(exitClicked()), this, SLOT(closeFind())); - connect(mSearchPanel, SIGNAL(criteriaChanged(QString)), this, SLOT(setFilter(QString))); - } + Q_D(CntNamesView); + delete d; } -void CntNamesView::setFilter(const QString &filterString) +void CntNamesView::activate(CntAbstractViewManager* aMgr, const CntViewParameters& aArgs) { - QStringList searchList = filterString.split(QRegExp("\\s+"), QString::SkipEmptyParts); + Q_D(CntNamesView); + d->activate( aMgr, aArgs ); +} - /*QContactDetailFilter findFilter; - findFilter.setDetailDefinitionName(QContactDisplayLabel::DefinitionName, QContactDisplayLabel::FieldLabel); - findFilter.setMatchFlags(QContactFilter::MatchStartsWith); - findFilter.setValue(searchList); - QContactDetailFilter typeFilter; - typeFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); - QString typeContact = QContactType::TypeContact; - typeFilter.setValue(typeContact); - - QContactIntersectionFilter filter; - filter.append(findFilter); - filter.append(typeFilter);*/ - - QContactDetailFilter filter; - filter.setDetailDefinitionName(QContactDisplayLabel::DefinitionName, QContactDisplayLabel::FieldLabel); - filter.setMatchFlags(QContactFilter::MatchStartsWith); - filter.setValue(searchList); - - contactModel()->setFilterAndSortOrder(filter); - - if (!contactModel()->rowCount()) - { - listLayout()->removeItem(listView()); - listView()->setVisible(false); - if (mEmptyListLabel == 0) - { - mEmptyListLabel = new HbTextItem(hbTrId("(no matching contacts)")); - mEmptyListLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); - mEmptyListLabel->setFontSpec(HbFontSpec(HbFontSpec::Primary)); - mEmptyListLabel->setAlignment(Qt::AlignCenter); - listLayout()->insertItem(1, mEmptyListLabel); - } - } - else - { - listLayout()->removeItem(mEmptyListLabel); - delete mEmptyListLabel; - mEmptyListLabel = 0; - listLayout()->insertItem(1, listView()); - listView()->setVisible(true); - } +void CntNamesView::deactivate() +{ + Q_D(CntNamesView); + d->deactivate(); } -void CntNamesView::closeFind() +HbView* CntNamesView::view() const { - if( mSearchPanel) - { - listLayout()->removeItem(mEmptyListLabel); - delete mEmptyListLabel; - mEmptyListLabel = 0; - - listLayout()->removeItem(banner()); - banner()->setVisible(false); - listLayout()->removeItem(mSearchPanel); - listLayout()->addItem(listView()); - listView()->setVisible(true); - - QContactDetailFilter filter; - filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); - QString typeContact = QContactType::TypeContact; - filter.setValue(typeContact); - - contactModel()->setFilterAndSortOrder(filter); - contactModel()->showMyCard(true); - - mSearchPanel->deleteLater(); - mSearchPanel = 0; - toolBar()->show(); - } -} - -/*! -Add actions to menu -*/ -void CntNamesView::addMenuItems() -{ - actions()->clearActionList(); - - actions()->actionList() << actions()->baseAction("cnt:newcontact") << actions()->baseAction("cnt:import"); - actions()->addActionsToMenu(menu()); - - connect(actions()->baseAction("cnt:newcontact"), SIGNAL(triggered()), - commands(), SLOT (newContact())); - connect(actions()->baseAction("cnt:import"), SIGNAL(triggered()), - commands(), SLOT (importFromSim())); + Q_D(const CntNamesView); + return d->mView; } -void CntNamesView::handleExecutedCommand(QString command, QContact contact) -{ - if (command == "delete") - { - QString name = contactManager()->synthesizeDisplayLabel(contact); - HbNotificationDialog::launchDialog(hbTrId("txt_phob_dpophead_1_deleted").arg(name)); - } +bool CntNamesView::isDefault() const +{ + Q_D(const CntNamesView); + return d->mIsDefault; } - -void CntNamesView::activateView(const CntViewParameters &viewParameters) -{ - addSoftkeyAction(); - - QContactDetailFilter filter; - filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); - QString typeContact = QContactType::TypeContact; - filter.setValue(typeContact); - - contactModel()->setFilterAndSortOrder(filter); - contactModel()->showMyCard(true); - - if (listView()->model() == 0) - { - setDataModel(); - } - - if (viewParameters.selectedAction() == "save") - { - QString name = contactManager()->synthesizeDisplayLabel(viewParameters.selectedContact()); - HbNotificationDialog::launchDialog(hbTrId("txt_phob_dpophead_contact_1_saved").arg(name)); - - listView()->scrollTo(contactModel()->indexOfContact(viewParameters.selectedContact())); - } - else if (viewParameters.selectedAction() == "delete") - { - QString name = contactManager()->synthesizeDisplayLabel(viewParameters.selectedContact()); - HbNotificationDialog::launchDialog(hbTrId("txt_phob_dpophead_1_deleted").arg(name)); - } - else if (viewParameters.selectedAction() == "failed") - { - HbNotificationDialog::launchDialog(hbTrId("SAVING FAILED!")); - } +CntViewParameters::ViewId CntNamesView::viewId() const +{ + Q_D(const CntNamesView); + return d->mId; } - -void CntNamesView::deActivateView() -{ - closeFind(); - listView()->setModel(0); -} + // end of file diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntnamesview_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntnamesview_p.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,511 @@ +/* +* 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 "cntnamesview_p.h" +#include "cntaction.h" +#include "qtpbkglobal.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +const char *CNT_CONTACTLIST_XML = ":/xml/contacts_namelist.docml"; + +CntNamesViewPrivate::CntNamesViewPrivate() : + QObject(), + mViewManager(0), + mListModel(0), + mView(0), + mListView(0), + mEmptyList(0), + mBanner(0), + mSearchPanel(0), + mLoader(0), + mLayout(0), + mVirtualKeyboard(0), + mMenuBuilder(0), + mIsDefault(true), + mId( CntViewParameters::namesView ) +{ + bool ok; + document()->load( CNT_CONTACTLIST_XML, &ok); + if (!ok) { + qFatal("Unable to read %S", CNT_CONTACTLIST_XML); + } + mView = static_cast (document()->findWidget("view")); + + mVirtualKeyboard = new HbStaticVkbHost(mView); + connect(mVirtualKeyboard, SIGNAL(keypadOpened()), this, SLOT(handleKeypadOpen())); + connect(mVirtualKeyboard, SIGNAL(keypadClosed()), this, SLOT(handleKeypadClose())); + + mSoftkey = new HbAction(Hb::BackNaviAction, mView); + + HbAction* newContact = static_cast (document()->findObject("cnt:newcontact")); + HbAction* findContacts = static_cast (document()->findObject("cnt:find")); + HbAction* groups = static_cast (document()->findObject("cnt:groups")); + HbAction* importSim = static_cast (document()->findObject("cnt:importsim")); + + connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView())); + connect(newContact, SIGNAL(triggered()), this, SLOT(createNewContact())); + connect(findContacts, SIGNAL(triggered()), this, SLOT(showFinder())); + connect(groups, SIGNAL(triggered()), this, SLOT(showCollectionView())); + connect( importSim, SIGNAL(triggered()), this, SLOT(importSim()) ); + connect(list(), SIGNAL(longPressed(HbAbstractViewItem*,QPointF)), this, + SLOT(showContextMenu(HbAbstractViewItem*,QPointF))); + connect(list(), SIGNAL(activated (const QModelIndex&)), this, + SLOT(showContactView(const QModelIndex&))); + +} + +CntNamesViewPrivate::~CntNamesViewPrivate() +{ + mView->deleteLater(); + + delete mListModel; + mListModel = 0; + + delete mListView; + mListView = 0; + + delete mSearchPanel; + mSearchPanel = 0; + + delete mEmptyList; + mEmptyList = 0; + + delete mBanner; + mBanner = 0; + + delete mLoader; + mLoader = 0; + + delete mVirtualKeyboard; + mVirtualKeyboard = 0; + + delete mMenuBuilder; + mMenuBuilder = 0; +} + +void CntNamesViewPrivate::activate(CntAbstractViewManager* aMgr, const CntViewParameters& aArgs) +{ + mViewManager = aMgr; + if (!mListModel) { + QContactSortOrder sortOrderFirstName; + sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName, + QContactName::FieldFirst); + + QContactSortOrder sortOrderLastName; + sortOrderLastName.setDetailDefinitionName(QContactName::DefinitionName, + QContactName::FieldLast); + + QList sortOrders; + sortOrders.append(sortOrderFirstName); + sortOrders.append(sortOrderLastName); + + mListModel = new MobCntModel(mViewManager->contactManager(SYMBIAN_BACKEND), QContactFilter(), sortOrders); + + QContactDetailFilter filter; + filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + + QString typeContact = QContactType::TypeContact; + filter.setValue(typeContact); + + mListModel->setFilterAndSortOrder(filter); + mListModel->showMyCard(true); + } + + list()->setModel(mListModel); + + mMenuBuilder = new CntActionMenuBuilder( mListModel->myCardId() ); + connect( mMenuBuilder, SIGNAL(deleteContact(QContact&)), this, SLOT(deleteContact(QContact&)) ); + connect( mMenuBuilder, SIGNAL(editContact(QContact&)), this, SLOT(showContactEditorView(QContact&)) ); + connect( mMenuBuilder, SIGNAL(openContact(QContact&)), this, SLOT(showContactView(QContact&)) ); + connect( mMenuBuilder, SIGNAL(performContactAction(QContact&,QString)), this, SLOT(executeAction(QContact&,QString))); + + if ( mView->navigationAction() != mSoftkey) + { + mView->setNavigationAction(mSoftkey); + } + + QContactManager* contactManager = aMgr->contactManager( SYMBIAN_BACKEND ); + QString action = aArgs.selectedAction(); + if ( action == "save" ) + { + QString name = contactManager->synthesizedDisplayLabel( aArgs.selectedContact() ); + HbNotificationDialog::launchDialog(qtTrId("Contact \"%1\" saved").arg(name)); + + scrollTo( aArgs.selectedContact() ); + } + + else if ( aArgs.selectedAction() == "delete" ) + { + QString name = contactManager->synthesizedDisplayLabel( aArgs.selectedContact() ); + HbNotificationDialog::launchDialog(qtTrId("%1 deleted").arg(name)); + } + else if ( aArgs.selectedAction() == "failed") + { + HbNotificationDialog::launchDialog(qtTrId("SAVING FAILED!")); + } +} + +void CntNamesViewPrivate::deactivate() +{ + hideFinder(); + + // Don't delete the model, default views will retain it between + // activate/deactivate. do it in destructor. + list()->setModel(NULL); + + delete mMenuBuilder; + mMenuBuilder = 0; + + // delete the hbsearch since we can not empty text from outside. + delete mSearchPanel; + mSearchPanel = 0; +} + +void CntNamesViewPrivate::scrollTo(const QContact &aContact) +{ + if (mListModel) + { + QModelIndex index = mListModel->indexOfContact(aContact); + + if (index.isValid()) + { + list()->scrollTo(index); + } + } +} +void CntNamesViewPrivate::setFilter(const QString &filterString) +{ + QStringList searchList = filterString.split(QRegExp("\\s+"), QString::SkipEmptyParts); + QContactDetailFilter filter; + filter.setDetailDefinitionName(QContactDisplayLabel::DefinitionName, + QContactDisplayLabel::FieldLabel); + filter.setMatchFlags(QContactFilter::MatchStartsWith); + filter.setValue(searchList); + + mListModel->setFilterAndSortOrder(filter); + + if (mListModel->rowCount() == 0) { + layout()->removeItem(list()); + layout()->insertItem(1, emptyLabel()); + list()->setVisible(false); + emptyLabel()->setVisible(true); + } + else { + layout()->removeItem(emptyLabel()); + layout()->insertItem(1, list()); + emptyLabel()->setVisible(false); + list()->setVisible(true); + } + mListModel->showMyCard(false); +} + +void CntNamesViewPrivate::handleKeypadOpen() +{ + qreal searchHeight = search()->size().height(); + qreal bannerHeight = groupBox()->size().height(); + qreal heightToSet = mView->size().height() - mVirtualKeyboard->keyboardArea().height() + - searchHeight - bannerHeight; + + list()->setMaximumHeight(heightToSet); + emptyLabel()->setMaximumHeight(heightToSet); +} + +void CntNamesViewPrivate::handleKeypadClose() +{ + list()->setMaximumHeight(mView->size().height()); + emptyLabel()->setMaximumHeight(mView->size().height()); +} + +void CntNamesViewPrivate::showBanner(const QString aText) +{ + layout()->insertItem(0, groupBox()); + groupBox()->setHeading(aText); + groupBox()->setVisible(true); +} + +void CntNamesViewPrivate::hideBanner() +{ + layout()->removeItem(groupBox()); + groupBox()->setVisible(false); +} + +void CntNamesViewPrivate::showFinder() +{ + showBanner(hbTrId("txt_phob_subtitle_find_all_contacts")); + + mView->toolBar()->hide(); + setFilter(QString()); + + list()->setVisible(true); + layout()->addItem(search()); + search()->setVisible(true); + + mListModel->showMyCard(false); +} + +void CntNamesViewPrivate::hideFinder() +{ + layout()->removeItem(emptyLabel()); + layout()->removeItem(search()); + emptyLabel()->setVisible(false); + search()->setVisible(false); + + hideBanner(); + + layout()->addItem(list()); + list()->setVisible(true); + + QContactDetailFilter filter; + filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + QString typeContact = QContactType::TypeContact; + filter.setValue(typeContact); + + mListModel->setFilterAndSortOrder(filter); + mListModel->showMyCard(true); + + mView->toolBar()->show(); +} + +bool CntNamesViewPrivate::isFinderVisible() +{ + return search()->isVisible(); +} + +void CntNamesViewPrivate::showPreviousView() +{ + if ( !isFinderVisible() ) + { + qApp->quit(); + } + hideFinder(); +} + +void CntNamesViewPrivate::createNewContact() +{ + QContact newContact; + showContactEditorView(newContact); +} + +void CntNamesViewPrivate::showContactView( const QModelIndex& aIndex ) +{ + QContact c = mListModel->contact(aIndex); + showContactView( c ); +} + +void CntNamesViewPrivate::showContactView( QContact& aContact ) +{ + CntViewParameters args(CntViewParameters::commLauncherView); + if (aContact.localId() == mListModel->myCardId() && aContact.details().count() <= 4) + { + args.setNextViewId(CntViewParameters::myCardView); + } + + args.setSelectedContact(aContact); + mViewManager->changeView(args); +} + +void CntNamesViewPrivate::showContextMenu(HbAbstractViewItem* aItem, QPointF aPoint) +{ + QContact contact = mListModel->contact(aItem->modelIndex()); + mMenuBuilder->execActionMenu( contact, aPoint ); +} + +void CntNamesViewPrivate::executeAction( QContact& aContact, QString aAction ) +{ + CntAction* other = new CntAction( aAction ); + connect(other, SIGNAL(actionExecuted(CntAction*)), this, SLOT(actionExecuted(CntAction*))); + other->execute(aContact, QContactDetail()); +} + +void CntNamesViewPrivate::actionExecuted(CntAction* aAction) +{ + aAction->deleteLater(); +} + +void CntNamesViewPrivate::deleteContact(QContact& aContact) +{ + QContactManager* manager = mViewManager->contactManager( SYMBIAN_BACKEND ); + QString name = manager->synthesizedDisplayLabel(aContact); + + HbMessageBox *note = new HbMessageBox( + hbTrId("txt_phob_info_delete_1").arg(name), + HbMessageBox::MessageTypeQuestion); + + note->setPrimaryAction(new HbAction(hbTrId("txt_phob_button_delete"), note)); + note->setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), note)); + + HbAction *selected = note->exec(); + if (selected == note->primaryAction()) + { + manager->removeContact(aContact.localId()); + HbNotificationDialog::launchDialog(hbTrId("txt_phob_dpophead_1_deleted").arg(name)); + } + delete note; +} + +void CntNamesViewPrivate::showContactEditorView(QContact& aContact) +{ + CntViewParameters args(CntViewParameters::editView); + args.setSelectedContact(aContact); + + mViewManager->changeView(args); +} + +void CntNamesViewPrivate::showCollectionView() +{ + CntViewParameters args(CntViewParameters::collectionView); + mViewManager->changeView(args); +} + +void CntNamesViewPrivate::importSim() +{ + int copied(0); + int failed(0); + QContactManager* simManager = mViewManager->contactManager( SIM_BACKEND ); + QContactManager* symbianManager = mViewManager->contactManager( SYMBIAN_BACKEND ); + + QList contactIds = simManager->contactIds(); + if (contactIds.count() == 0) { + HbMessageBox::information("Nothing to copy: SIM card is empty or not accessible."); + return; + } + + foreach(QContactLocalId id, contactIds) { + QContact contact = simManager->contact(id); + if (contact.localId() > 0) { + //delete local id before saving to different storage + QScopedPointer contactId(new QContactId()); + contactId->setLocalId(0); + contactId->setManagerUri(QString()); + contact.setId(*contactId); + + // custom label contains name information, save it to the first name + QList names = contact.details(QContactName::DefinitionName); + if (names.count() > 0) { + QContactName name = static_cast(names.at(0)); + name.setFirstName(name.customLabel()); + name.setCustomLabel(QString()); + contact.saveDetail(&name); + } + + if (symbianManager->saveContact(&contact)) { + copied++; + } + else { + failed++; + } + } + else { + failed++; + } + } + + QString resultMessage; + resultMessage.setNum(copied); + resultMessage.append(" contact copied, "); + resultMessage.append(QString().setNum(failed)); + resultMessage.append(" failed."); + + HbMessageBox::information(resultMessage); +} + + +//// lazy accessors +HbListView* CntNamesViewPrivate::list() +{ + if (!mListView) { + mListView = static_cast (mLoader->findWidget("listView")); + HbListViewItem *prototype = mListView->listItemPrototype(); + prototype->setGraphicsSize(HbListViewItem::Thumbnail); + + mListView->setFrictionEnabled(true); + mListView->setScrollingStyle(HbScrollArea::PanOrFlick); + mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::Thumbnail); + + HbFrameBackground frame; + frame.setFrameGraphicsName("qtg_fr_list_normal"); + frame.setFrameType(HbFrameDrawer::NinePieces); + mListView->itemPrototypes().first()->setDefaultFrame(frame); + } + return mListView; +} + +HbTextItem* CntNamesViewPrivate::emptyLabel() +{ + if (!mEmptyList) { + mEmptyList = new HbTextItem(hbTrId("(no matching contacts)")); + mEmptyList->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + mEmptyList->setFontSpec(HbFontSpec(HbFontSpec::Primary)); + mEmptyList->setAlignment(Qt::AlignCenter); + } + return mEmptyList; +} +HbGroupBox* CntNamesViewPrivate::groupBox() +{ + if (!mBanner) + mBanner = new HbGroupBox(); + return mBanner; +} + +HbSearchPanel* CntNamesViewPrivate::search() +{ + if (!mSearchPanel) { + mSearchPanel = new HbSearchPanel(); + connect(mSearchPanel, SIGNAL(exitClicked()), this, SLOT(hideFinder())); + connect(mSearchPanel, SIGNAL(criteriaChanged(QString)), this, SLOT(setFilter(QString))); + } + return mSearchPanel; +} +QGraphicsLinearLayout* CntNamesViewPrivate::layout() +{ + if (!mLayout) { + QGraphicsWidget *w = mLoader->findWidget(QString("content")); + mLayout = static_cast (w->layout()); + } + return mLayout; +} + +HbDocumentLoader* CntNamesViewPrivate::document() +{ + if (!mLoader) { + mLoader = new HbDocumentLoader(); + } + return mLoader; +} + +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntnoteeditormodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntnoteeditormodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,62 @@ +/* +* 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 "cntnoteeditormodel.h" +#include "cntdetailmodelitem.h" +#include + +CntNoteEditorModel::CntNoteEditorModel( QContact* aContact ) : +CntDetailEditorModel( aContact ) + { + QList noteList = mContact->details(); + if ( noteList.isEmpty() ) + { + QContactNote emptyNote; + noteList.append( emptyNote ); + } + + HbDataFormModelItem* root = invisibleRootItem(); + foreach ( QContactNote note, noteList ) + { + CntDetailModelItem* item = new CntDetailModelItem( note, qtTrId("Note") ); + appendDataFormItem( item, root ); + } + } + +CntNoteEditorModel::~CntNoteEditorModel() + { + } + +void CntNoteEditorModel::insertDetailField() +{ + QContactNote emptyNote; + appendDataFormItem( new CntDetailModelItem(emptyNote, qtTrId("Note")), invisibleRootItem() ); +} + +void CntNoteEditorModel::saveContactDetails() +{ + HbDataFormModelItem* root = invisibleRootItem(); + + int count( root->childCount() ); + for ( int i(0); i < count; i++ ) { + CntDetailModelItem* detail = static_cast( root->childAt(i) ); + QContactNote note = detail->detail(); + if ( note.note().length() > 0 ) { + mContact->saveDetail( ¬e ); + } + } +} +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntnoteeditorviewitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntnoteeditorviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,62 @@ +/* +* 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 "cntnoteeditorviewitem.h" +#include "cntdetailconst.h" +#include "cntdetailmodelitem.h" +#include +#include +#include + +CntNoteEditorViewItem::CntNoteEditorViewItem( QGraphicsItem* aParent ) : +CntDetailViewItem(aParent) + { + } + +CntNoteEditorViewItem::~CntNoteEditorViewItem() + { + } + +HbAbstractViewItem* CntNoteEditorViewItem::createItem() + { + return new CntNoteEditorViewItem( *this ); + } + +void CntNoteEditorViewItem::textChanged(const QString& aText) + { + HbDataFormModel* model = static_cast(itemView()->model()); + CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); + QContactNote detail = item->detail(); + detail.setNote( aText ); + item->setDetail( detail ); + } + +HbWidget* CntNoteEditorViewItem::createCustomWidget() + { + HbDataFormModel* model = static_cast(itemView()->model()); + CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); + QContactNote detail = item->detail(); + + mEdit = new HbLineEdit(); + connect( mEdit, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString)) ); + + mEdit->setMaxLength( CNT_NOTE_EDITOR_MAXLENGTH ); + mEdit->setMinRows( CNT_NOTE_EDITOR_MIN_ROWCOUNT ); + mEdit->setText( detail.note() ); + + return mEdit; + } +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntonlineaccounteditorview.cpp --- a/phonebookui/pbkcommonui/src/cntonlineaccounteditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntonlineaccounteditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -58,34 +58,29 @@ QStandardItem *internet = new QStandardItem; internet->setText(hbTrId("Internet call")); internet->setData(internetSubType, Qt::UserRole); - internet->setData(":/icons/qgn_prop_nrtyp_voip.svg", Qt::UserRole+2); internet->setData(CNT_ONLINEACCOUNT_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(internet); QStandardItem *internethome = new QStandardItem; internethome->setText(hbTrId("Internet call (home)")); internethome->setData(internetSubType, Qt::UserRole); internethome->setData(contextHome, Qt::UserRole+1); - internethome->setData(":/icons/qgn_prop_nrtyp_voip.svg", Qt::UserRole+2); internethome->setData(CNT_ONLINEACCOUNT_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(internethome); QStandardItem *internetwork = new QStandardItem; internetwork->setText(hbTrId("Internet call (work)")); internetwork->setData(internetSubType, Qt::UserRole); internetwork->setData(contextWork, Qt::UserRole+1); - internetwork->setData(":/icons/qgn_prop_nrtyp_voip.svg", Qt::UserRole+2); internetwork->setData(CNT_ONLINEACCOUNT_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(internetwork); QStandardItem *sip = new QStandardItem; sip->setText(hbTrId("SIP")); sip->setData(sipSubType, Qt::UserRole); - sip->setData(":/icons/qgn_prop_nrtyp_sip.svg", Qt::UserRole+2); sip->setData(CNT_ONLINEACCOUNT_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(sip); QStandardItem *shareVideo = new QStandardItem; shareVideo->setText(hbTrId("Share Video")); shareVideo->setData(shareVideoSubType, Qt::UserRole); - shareVideo->setData(":/icons/qgn_prop_nrtyp_swis.svg", Qt::UserRole+2); shareVideo->setData(CNT_ONLINEACCOUNT_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(shareVideo); diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntphonenumbereditorview.cpp --- a/phonebookui/pbkcommonui/src/cntphonenumbereditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntphonenumbereditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -62,88 +62,75 @@ QStandardItem *mobile = new QStandardItem; mobile->setText(hbTrId("txt_phob_dblist_mobile")); mobile->setData(mobileSubType, Qt::UserRole); - mobile->setData(":/icons/qgn_prop_nrtyp_mobile.svg", Qt::UserRole+2); mobile->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(mobile); QStandardItem *mobilehome = new QStandardItem; mobilehome->setText(hbTrId("txt_phob_dblist_mobile_home")); mobilehome->setData(mobileSubType, Qt::UserRole); mobilehome->setData(contextHome, Qt::UserRole+1); - mobilehome->setData(":/icons/qgn_prop_nrtyp_mobile.svg", Qt::UserRole+2); mobilehome->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(mobilehome); QStandardItem *mobilework = new QStandardItem; mobilework->setText(hbTrId("txt_phob_dblist_mobile_work")); mobilework->setData(mobileSubType, Qt::UserRole); mobilework->setData(contextWork, Qt::UserRole+1); - mobilework->setData(":/icons/qgn_prop_nrtyp_mobile.svg", Qt::UserRole+2); mobilework->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(mobilework); QStandardItem *land = new QStandardItem; - land->setText(hbTrId("Landline")); + land->setText(hbTrId("Phone")); land->setData(landLineSubType, Qt::UserRole); - land->setData(":/icons/qgn_prop_nrtyp_phone.svg", Qt::UserRole+2); land->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(land); QStandardItem *landhome = new QStandardItem; - landhome->setText(hbTrId("Landline (home)")); + landhome->setText(hbTrId("Phone (home)")); landhome->setData(landLineSubType, Qt::UserRole); landhome->setData(contextHome, Qt::UserRole+1); - landhome->setData(":/icons/qgn_prop_nrtyp_phone.svg", Qt::UserRole+2); landhome->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(landhome); QStandardItem *landwork = new QStandardItem; - landwork->setText(hbTrId("Landline (work)")); + landwork->setText(hbTrId("Phone (work)")); landwork->setData(landLineSubType, Qt::UserRole); landwork->setData(contextWork, Qt::UserRole+1); - landwork->setData(":/icons/qgn_prop_nrtyp_phone.svg", Qt::UserRole+2); landwork->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(landwork); QStandardItem *fax = new QStandardItem; fax->setText(hbTrId("txt_phob_dblist_fax")); fax->setData(faxSubType, Qt::UserRole); - fax->setData(":/icons/qgn_prop_nrtyp_fax.svg", Qt::UserRole+2); fax->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(fax); QStandardItem *faxhome = new QStandardItem; faxhome->setText(hbTrId("txt_phob_dblist_fax_home")); faxhome->setData(faxSubType, Qt::UserRole); faxhome->setData(contextHome, Qt::UserRole+1); - faxhome->setData(":/icons/qgn_prop_nrtyp_fax.svg", Qt::UserRole+2); faxhome->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(faxhome); QStandardItem *faxwork = new QStandardItem; faxwork->setText(hbTrId("txt_phob_dblist_fax_work")); faxwork->setData(faxSubType, Qt::UserRole); faxwork->setData(contextWork, Qt::UserRole+1); - faxwork->setData(":/icons/qgn_prop_nrtyp_fax.svg", Qt::UserRole+2); faxwork->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(faxwork); QStandardItem *pager = new QStandardItem; pager->setText(hbTrId("Pager number")); pager->setData(pagerSubType, Qt::UserRole); - pager->setData(":/icons/qgn_prop_nrtyp_pager.svg", Qt::UserRole+2); pager->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(pager); QStandardItem *carPhone = new QStandardItem; carPhone->setText(hbTrId("Car phone")); carPhone->setData(carPhoneSubType, Qt::UserRole); - carPhone->setData(":/icons/qgn_prop_nrtyp_car.svg", Qt::UserRole+2); carPhone->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(carPhone); QStandardItem *assistant = new QStandardItem; assistant->setText(hbTrId("Assistant number")); assistant->setData(assistantSubType, Qt::UserRole); - assistant->setData(":/icons/qgn_prop_nrtyp_assistant.svg", Qt::UserRole+2); assistant->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(assistant); QStandardItem *dtmf = new QStandardItem; dtmf->setText(hbTrId("DTMF")); dtmf->setData(dtmfSubType, Qt::UserRole); - dtmf->setData(":/icons/qgn_prop_empty.svg", Qt::UserRole+2); dtmf->setData(CNT_DTMF_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(dtmf); diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntphonenumbermodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntphonenumbermodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,94 @@ +/* +* 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 "cntphonenumbermodel.h" +#include "cntdetailconst.h" +#include "cntdetailmodelitem.h" +#include +#include + +CntPhoneNumberModel::CntPhoneNumberModel( QContact* aContact, QObject* aParent ) : +CntDetailEditorModel( aContact ) + { + setParent( aParent ); + + QList all; + foreach ( QContactDetail detail, mContact->details() ) + all.append( detail ); + + foreach ( QContactDetail detail, mContact->details() ) + all.append( detail ); + + // if there's no details, add + if ( all.isEmpty() ) + { + QContactPhoneNumber number; + number.setSubTypes( QContactPhoneNumber::SubTypeMobile ); + + all.append( number ); + } + + HbDataFormModelItem* root = invisibleRootItem(); + // add all phone numbers & online accounts to model + foreach ( QContactDetail contactDetail, all ) + { + CntDetailModelItem* item = new CntDetailModelItem( contactDetail ); + appendDataFormItem(item, root ); + } + } + +void CntPhoneNumberModel::insertDetailField() +{ + QContactPhoneNumber number; + number.setSubTypes( QContactPhoneNumber::SubTypeMobile ); + + appendDataFormItem( new CntDetailModelItem(number), invisibleRootItem() ); +} + +void CntPhoneNumberModel::saveContactDetails() +{ + HbDataFormModelItem* root = invisibleRootItem(); + int count( root->childCount() ); + for ( int i = 0; i < count; i++ ) { + CntDetailModelItem* item = static_cast( root->childAt(i) ); + QContactDetail detail = item->detail(); + + if ( detail.definitionName() == QContactPhoneNumber::DefinitionName ) + { + QContactPhoneNumber phonenumber = detail; + if ( phonenumber.number().length() > 0 ) { + mContact->saveDetail( &phonenumber ); + } + } + else if ( detail.definitionName() == QContactOnlineAccount::DefinitionName ) + { + QContactOnlineAccount account = detail; + if ( account.accountUri().length() > 0 ) { + mContact->saveDetail( &account ); + } + } + else { + /* should never be here */ + qWarning() << "Unknown: " << detail.definitionName(); + } + } +} + +CntPhoneNumberModel::~CntPhoneNumberModel() + { + } + +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntphonenumberviewitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntphonenumberviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,369 @@ +/* +* 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 "cntdetailconst.h" +#include "cntphonenumberviewitem.h" +#include "cntdetailmodelitem.h" +#include "cntdetaileditormodel.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +CntPhoneNumberViewItem::CntPhoneNumberViewItem( QGraphicsItem* aParent ) : +CntDetailViewItem( aParent ), +mBox(0), +mEdit(0), +mFilter( 0 ) + { + } + +CntPhoneNumberViewItem::~CntPhoneNumberViewItem() + { + delete mFilter; + } + +HbAbstractViewItem* CntPhoneNumberViewItem::createItem() + { + return new CntPhoneNumberViewItem( *this ); + } + +void CntPhoneNumberViewItem::indexChanged( int aIndex ) + { + QString subType = mBox->itemData( aIndex, DetailSubType ).toString(); + QString context = mBox->itemData( aIndex, DetailContext ).toString(); + + // check that if current QContactDetail contains the changed subtype + HbDataFormModel* model = static_cast(itemView()->model()); + CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); + + QStringList contextList; + if ( !context.isEmpty() ) + contextList << context; + + // check if we switched to QContactOnlineAccount subtype + if ( subType == QContactOnlineAccount::SubTypeSip || + subType == QContactOnlineAccount::SubTypeSipVoip || + subType == QContactOnlineAccount::SubTypeVideoShare ) + { + qDebug() << "QContactOnlineAccount(" << subType << ")"; + constructOnlineAccount( item, subType, contextList ); + } + else + { + qDebug() << "QContactPhoneNumber(" << subType << ")"; + constructPhoneNumber( item, subType, contextList ); + } + } + +void CntPhoneNumberViewItem::textChanged( QString aText ) + { + qDebug() << "textChanged( " << aText << " )"; + HbDataFormModel* model = static_cast(itemView()->model()); + CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); + QContactDetail detail = item->detail(); + if ( detail.definitionName() == QContactPhoneNumber::DefinitionName ) + { + QContactPhoneNumber number = detail; + number.setNumber( aText ); + item->setDetail( number ); + } + + if ( detail.definitionName() == QContactOnlineAccount::DefinitionName ) + { + QContactOnlineAccount account = detail; + account.setAccountUri( aText ); + item->setDetail( account ); + } + } + +HbWidget* CntPhoneNumberViewItem::createCustomWidget() + { + QGraphicsLinearLayout* layout = new QGraphicsLinearLayout( itemView()->mainWindow()->orientation() ); + HbWidget* widget = new HbWidget(); + mBox = new HbComboBox(); + mEdit = new HbLineEdit(); + mFilter = new HbEditorInterface( mEdit ); + + widget->setLayout( layout ); + layout->addItem( mBox ); + layout->addItem( mEdit ); + + connect( mBox, SIGNAL(currentIndexChanged(int)), this, SLOT(indexChanged(int)) ); + connect( mEdit, SIGNAL(textChanged(QString)),this, SLOT(textChanged(QString)) ); + + HbDataFormModel* model = static_cast(itemView()->model()); + CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); + + // select correct index + QContactDetail detail = item->detail(); + QStringList context; + QString subType; + QString value; + if ( detail.definitionName() == QContactPhoneNumber::DefinitionName ) + { + mEdit->setMaxLength( CNT_PHONENUMBER_EDITOR_MAXLENGTH ); + QContactPhoneNumber phone = detail; + subType = phone.subTypes().isEmpty() ? "" : phone.subTypes().first(); + if ( !phone.contexts().isEmpty() ) + context << phone.contexts().first(); + value = phone.number(); + } + + if ( detail.definitionName() == QContactOnlineAccount::DefinitionName ) + { + mEdit->setMaxLength( CNT_ONLINEACCOUNT_EDITOR_MAXLENGTH ); + QContactOnlineAccount account = detail; + subType = account.subTypes().isEmpty() ? "" : account.subTypes().first(); + if (!account.contexts().isEmpty()) + context << account.contexts().first(); + value = account.accountUri(); + } + + mEdit->setText( value ); + constructSubtypeModel( subType, context ); + + return widget; + } + +void CntPhoneNumberViewItem::constructPhoneNumber( CntDetailModelItem* aItem, QString aSubType, QStringList aContext ) + { + mFilter->setFilter( HbPhoneNumberFilter::instance() ); + mFilter->setUpAsPhoneNumberEditor(); + mEdit->setMaxLength( CNT_PHONENUMBER_EDITOR_MAXLENGTH ); + + QContactDetail detail = aItem->detail(); + + // check if the detail type needs to changed + if ( detail.definitionName() == QContactOnlineAccount::DefinitionName ) + { + // also we need to remove the old online account and replace it + // with phonenumber + CntDetailEditorModel* model = static_cast( aItem->model() ); + QContact* contact = model->contact(); + contact->removeDetail( &detail ); + + QContactPhoneNumber number; + number.setSubTypes( aSubType ); + number.setContexts( aContext ); + aItem->setDetail( number ); + } + else + { + QContactPhoneNumber number = detail; + number.setSubTypes( aSubType ); + number.setContexts( aContext ); + aItem->setDetail( number ); + } + qDebug() << mEdit->text(); + } + +void CntPhoneNumberViewItem::constructOnlineAccount( CntDetailModelItem* aItem, QString aSubType, QStringList aContext ) + { + mFilter->setFilter( HbEmailAddressFilter::instance() ); + mFilter->setUpAsCompletingEmailField(); + mEdit->setMaxLength( CNT_ONLINEACCOUNT_EDITOR_MAXLENGTH ); + + QContactDetail detail = aItem->detail(); + // check if the detail type needs to changed + if ( detail.definitionName() == QContactPhoneNumber::DefinitionName ) + { + // also we need to remove the old phonenumber and replace it + // with online account + CntDetailEditorModel* model = static_cast( aItem->model() ); + QContact* contact = model->contact(); + contact->removeDetail( &detail ); + + QContactOnlineAccount account; + account.setSubTypes( aSubType ); + account.setContexts( aContext ); + account.setAccountUri( mEdit->text() ); + aItem->setDetail( account ); + } + else + { + QContactOnlineAccount account = detail; + account.setSubTypes( aSubType ); + account.setContexts( aContext ); + account.setAccountUri( mEdit->text() ); + aItem->setDetail( account ); + } + qDebug() << mEdit->text(); + } + +void CntPhoneNumberViewItem::constructSubtypeModel( QString aSubType, QStringList aContext ) + { + QStandardItemModel* model = new QStandardItemModel(); + + QString contextHome = QContactDetail::ContextHome; + QString contextWork = QContactDetail::ContextWork; + + QString subTypeMobile = QContactPhoneNumber::SubTypeMobile; + QString subTypeLandline = QContactPhoneNumber::SubTypeLandline; + QString subTypeFax = QContactPhoneNumber::SubTypeFacsimile; + QString subTypePager = QContactPhoneNumber::SubTypePager; + QString subTypeCarPhone = QContactPhoneNumber::SubTypeCar; + QString subTypeDtmf = QContactPhoneNumber::SubTypeDtmfMenu; + QString subTypeAssistant = QContactPhoneNumber::SubTypeAssistant; + + QString subTypeInternet = QContactOnlineAccount::SubTypeSipVoip; + QString subTypeSIP = QContactOnlineAccount::SubTypeSip; + QString subTypeVideoShare = QContactOnlineAccount::SubTypeVideoShare; + + QStandardItem *mobile = new QStandardItem; + mobile->setText(hbTrId("txt_phob_dblist_mobile")); + mobile->setData(subTypeMobile, DetailSubType); + mobile->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(mobile); + + QStandardItem *mobilehome = new QStandardItem; + mobilehome->setText(hbTrId("txt_phob_dblist_mobile_home")); + mobilehome->setData(subTypeMobile, DetailSubType); + mobilehome->setData(contextHome, DetailContext); + mobilehome->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(mobilehome); + + QStandardItem *mobilework = new QStandardItem; + mobilework->setText(hbTrId("txt_phob_dblist_mobile_work")); + mobilework->setData(subTypeMobile, DetailSubType); + mobilework->setData(contextWork, DetailContext); + mobilework->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(mobilework); + + QStandardItem *land = new QStandardItem; + land->setText(hbTrId("txt_phob_setlabel_val_phone")); + land->setData(subTypeLandline, DetailSubType); + land->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(land); + + QStandardItem *landhome = new QStandardItem; + landhome->setText(hbTrId("txt_phob_setlabel_val_phone_home")); + landhome->setData(subTypeLandline, DetailSubType); + landhome->setData(contextHome, DetailContext); + landhome->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(landhome); + + QStandardItem *landwork = new QStandardItem; + landwork->setText(hbTrId("txt_phob_setlabel_val_phone_work")); + landwork->setData(subTypeLandline, DetailSubType); + landwork->setData(contextWork, DetailContext); + landwork->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(landwork); + + QStandardItem *fax = new QStandardItem; + fax->setText(hbTrId("txt_phob_dblist_fax")); + fax->setData(subTypeFax, DetailSubType); + fax->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(fax); + + QStandardItem *faxhome = new QStandardItem; + faxhome->setText(hbTrId("txt_phob_dblist_fax_home")); + faxhome->setData(subTypeFax, DetailSubType); + faxhome->setData(contextHome, DetailContext); + faxhome->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(faxhome); + + QStandardItem *faxwork = new QStandardItem; + faxwork->setText(hbTrId("txt_phob_dblist_fax_work")); + faxwork->setData(subTypeFax, DetailSubType); + faxwork->setData(contextWork, DetailContext); + faxwork->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(faxwork); + + QStandardItem *pager = new QStandardItem; + pager->setText(hbTrId("txt_phob_setlabel_val_pager")); + pager->setData(subTypePager, DetailSubType); + pager->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(pager); + + QStandardItem *assistant = new QStandardItem; + assistant->setText(hbTrId("txt_phob_setlabel_val_assistant")); + assistant->setData(subTypeAssistant, DetailSubType); + assistant->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(assistant); + + QStandardItem *carPhone = new QStandardItem; + carPhone->setText(hbTrId("txt_phob_setlabel_val_car")); + carPhone->setData(subTypeCarPhone, DetailSubType); + carPhone->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(carPhone); + +// QStandardItem *dtmf = new QStandardItem; +// dtmf->setText(hbTrId("DTMF")); +// dtmf->setData(subTypeDtmf, DetailSubType); +// dtmf->setData(CNT_DTMF_EDITOR_MAXLENGTH, DetailMaxLength); +// model->appendRow(dtmf); + + QStandardItem *internet = new QStandardItem; + internet->setText(qtTrId("Internet call")); + internet->setData(subTypeInternet, DetailSubType); + internet->setData(CNT_ONLINEACCOUNT_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(internet); + + QStandardItem *internethome = new QStandardItem; + internethome->setText(hbTrId("Internet call (home)")); + internethome->setData(subTypeInternet, DetailSubType); + internethome->setData(contextHome, DetailContext); + internethome->setData(CNT_ONLINEACCOUNT_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(internethome); + + QStandardItem *internetwork = new QStandardItem; + internetwork->setText(hbTrId("Internet call (work)")); + internetwork->setData(subTypeInternet, DetailSubType); + internetwork->setData(contextWork, DetailContext); + internetwork->setData(CNT_ONLINEACCOUNT_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(internetwork); + + QStandardItem *sip = new QStandardItem; + sip->setText(hbTrId("SIP")); + sip->setData(subTypeSIP, DetailSubType); + sip->setData(CNT_ONLINEACCOUNT_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(sip); + +// QStandardItem *shareVideo = new QStandardItem; +// shareVideo->setText(qtTrId("Share Video")); +// shareVideo->setData(subTypeVideoShare, DetailSubType); +// shareVideo->setData(CNT_ONLINEACCOUNT_EDITOR_MAXLENGTH, DetailMaxLength); +// model->appendRow(shareVideo); + + mBox->setModel( model ); + + // search the selected index to be set + QString context = aContext.isEmpty() ? "" : aContext.first(); + for ( int i(0); i < model->rowCount(); i++ ) + { + if ( model->item(i)->data( DetailSubType ).toString() == aSubType && + model->item(i)->data( DetailContext ).toString() == context ) + { + mBox->setCurrentIndex( i ); + break; + } + } + } +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cnturleditormodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cnturleditormodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,64 @@ +/* +* 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 "cnturleditormodel.h" +#include "cntdetailmodelitem.h" + +#include + +CntUrlEditorModel::CntUrlEditorModel(QContact* aContact) : + CntDetailEditorModel(aContact) +{ + QList urlList = mContact->details (); + if (urlList.isEmpty()) { + QContactUrl url; + url.setSubType(QContactUrl::SubTypeHomePage); + urlList.append(url); + } + + foreach( QContactUrl contactUrl, urlList ) { + CntDetailModelItem* item = new CntDetailModelItem(contactUrl); + appendDataFormItem(item, invisibleRootItem()); + } +} + +CntUrlEditorModel::~CntUrlEditorModel() +{ +} + +void CntUrlEditorModel::insertDetailField() +{ + QContactUrl url; + url.setSubType(QContactUrl::SubTypeHomePage); + + appendDataFormItem( new CntDetailModelItem(url), invisibleRootItem() ); +} + +void CntUrlEditorModel::saveContactDetails() +{ + HbDataFormModelItem* root = invisibleRootItem(); + + int count(root->childCount()); + for (int i(0); i < count; i++) { + CntDetailModelItem* detail = static_cast (root->childAt(i)); + QContactUrl url = detail->detail(); + if (url.url().length() > 0) { + mContact->saveDetail(&url); + } + } +} +// End of File + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cnturleditorview.cpp --- a/phonebookui/pbkcommonui/src/cnturleditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cnturleditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -56,21 +56,18 @@ QStandardItem *url = new QStandardItem; url->setText(hbTrId("txt_phob_dblist_url")); url->setData(urlField, Qt::UserRole); - url->setData(":/icons/qgn_prop_nrtyp_url.svg", Qt::UserRole+2); url->setData(CNT_URL_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(url); QStandardItem *urlhome = new QStandardItem; urlhome->setText(hbTrId("txt_phob_dblist_url_home")); urlhome->setData(urlField, Qt::UserRole); urlhome->setData(contextHome, Qt::UserRole+1); - urlhome->setData(":/icons/qgn_prop_nrtyp_url.svg", Qt::UserRole+2); urlhome->setData(CNT_URL_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(urlhome); QStandardItem *urlwork = new QStandardItem; urlwork->setText(hbTrId("txt_phob_dblist_url_work")); urlwork->setData(urlField, Qt::UserRole); urlwork->setData(contextWork, Qt::UserRole+1); - urlwork->setData(":/icons/qgn_prop_nrtyp_url.svg", Qt::UserRole+2); urlwork->setData(CNT_URL_EDITOR_MAXLENGTH, Qt::UserRole+3); fieldModel->appendRow(urlwork); diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cnturleditorviewitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cnturleditorviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,142 @@ +/* +* 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 "cnturleditorviewitem.h" +#include "cntdetailmodelitem.h" +#include "cntdetailconst.h" +#include +#include +#include +#include +#include +#include +#include + +CntUrlEditorViewItem::CntUrlEditorViewItem( QGraphicsItem* aParent ) : +CntDetailViewItem( aParent ) + { + + } + +CntUrlEditorViewItem::~CntUrlEditorViewItem() + { + + } + +HbAbstractViewItem* CntUrlEditorViewItem::createItem() + { + return new CntUrlEditorViewItem(*this); + } + +HbWidget* CntUrlEditorViewItem::createCustomWidget() + { + QGraphicsLinearLayout* layout = new QGraphicsLinearLayout(Qt::Vertical); + HbWidget* widget = new HbWidget(); + mBox = new HbComboBox(); + mEdit = new HbLineEdit(); + mEdit->setMaxLength( CNT_URL_EDITOR_MAXLENGTH ); + + widget->setLayout( layout ); + layout->addItem( mBox ); + layout->addItem( mEdit ); + + connect( mBox, SIGNAL(currentIndexChanged(int)), this, SLOT(indexChanged(int)) ); + connect( mEdit, SIGNAL(textChanged(QString)),this, SLOT(textChanged(QString)) ); + + HbDataFormModel* model = static_cast(itemView()->model()); + CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); + QContactUrl detail = item->detail(); + + HbEditorInterface editorInterface( mEdit ); + editorInterface.setFilter( HbUrlFilter::instance() ); + + constructSubTypeModel( detail.contexts() ); + + mEdit->setText( detail.url() ); + + return widget; + } + +void CntUrlEditorViewItem::indexChanged( int aIndex ) + { + QString context = mBox->itemData( aIndex, DetailContext ).toString(); + HbDataFormModel* model = static_cast(itemView()->model()); + CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); + + QContactUrl url = item->detail(); + + QStringList contextList; + if ( !context.isEmpty() ) + contextList << context; + + url.setContexts( contextList ); + + item->setDetail( url ); + } + +void CntUrlEditorViewItem::textChanged( QString aText ) + { + HbDataFormModel* model = static_cast(itemView()->model()); + CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); + + QContactUrl url = item->detail(); + url.setUrl( aText ); + item->setDetail( url ); + } + +void CntUrlEditorViewItem::constructSubTypeModel( QStringList aContext ) + { + QStandardItemModel* model = new QStandardItemModel(); + + QString contextHome = QContactDetail::ContextHome; + QString contextWork = QContactDetail::ContextWork; + QString fieldAddress = QContactUrl::FieldUrl; + + QStandardItem *noContext = new QStandardItem; + noContext->setText(qtTrId("URL")); + noContext->setData(fieldAddress, DetailSubType); + noContext->setData(CNT_URL_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(noContext); + + QStandardItem *home = new QStandardItem; + home->setText(qtTrId("URL (home)")); + home->setData(fieldAddress, DetailSubType); + home->setData(contextHome, DetailContext); + home->setData(CNT_URL_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(home); + + QStandardItem *work = new QStandardItem; + work->setText(qtTrId("URL (work)")); + work->setData(fieldAddress, DetailSubType); + work->setData(contextWork, DetailContext); + work->setData(CNT_URL_EDITOR_MAXLENGTH, DetailMaxLength); + model->appendRow(work); + + mBox->setModel( model ); + + // search the selected index to be set + QString context = aContext.isEmpty() ? "" : aContext.first(); + for ( int i(0); i < model->rowCount(); i++ ) + { + if ( model->item(i)->data( DetailContext ).toString() == context ) + { + mBox->setCurrentIndex( i ); + break; + } + } + } + +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntviewmanager.cpp --- a/phonebookui/pbkcommonui/src/cntviewmanager.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntviewmanager.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -1,40 +1,28 @@ /* -* 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: -* -*/ + * 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 "cntviewmanager.h" #include "cntbaseview.h" #include "cntmainwindow.h" #include "cntnamesview.h" -#include "cntcollectionview.h" -#include "cntfavoritesview.h" -#include "cntfavoritesselectionview.h" +#include "cntfavoritesmemberview.h" #include "cntcontactcardview.h" -#include "cntemaileditorview.h" -#include "cntnameseditorview.h" -#include "cnturleditorview.h" -#include "cntcompanyeditorview.h" -#include "cntphonenumbereditorview.h" #include "cntonlineaccounteditorview.h" -#include "cntnoteeditorview.h" -#include "cntfamilydetaileditorview.h" -#include "cntaddresseditorview.h" -#include "cntdateeditorview.h" -#include "cntimageeditorview.h" #include "cnteditview.h" #include "cntmycardview.h" #include "cntmycardselectionview.h" @@ -43,175 +31,107 @@ #include "cntgroupactionsview.h" #include "cnthistoryview.h" +// new editors +#include "cnteditorfactory.h" #include /*! -\class CntViewManager -\brief -View manager is a class between mainwindow and different views. It is used to provide navigation between views and also creating the views for the mainwindow. -Pointer to viewmanager is passed to each created view and therefore they can access also QMainWindow that is normally not possible. This is needed e.g. when we want to -change or activate view from some other view. + \class CntViewManager + \brief + View manager is a class between mainwindow and different views. It is used to provide navigation between views and also creating the views for the mainwindow. + Pointer to viewmanager is passed to each created view and therefore they can access also QMainWindow that is normally not possible. This is needed e.g. when we want to + change or activate view from some other view. -*/ - + */ /*! -Constructor -*/ -CntViewManager::CntViewManager(CntMainWindow *mainWindow, CntViewParameters::ViewId defaultView): - mMainWindow(mainWindow), + Constructor + */ +CntViewManager::CntViewManager(CntMainWindow *mainWindow, CntViewParameters::ViewId defaultView) : + mMainWindow(mainWindow), mDefaultView(0), - mDefaultViewId(CntViewParameters::noView) + mEditorFactory(0), + mCurrentViewId(CntViewParameters::noView) { - // load styles + Q_UNUSED( defaultView ); + mEditorFactory = new CntEditorFactory(this); HbStyleLoader::registerFilePath(":/style"); - - if (defaultView!=CntViewParameters::noView) - { - //set the default view - setDefaultView(defaultView); - - //activate the view - CntViewParameters viewParameters(defaultView); - setPreviousViewParameters(mDefaultView, viewParameters); - mDefaultView->activateView(viewParameters); - } } /*! -Destructor -*/ + Destructor + */ CntViewManager::~CntViewManager() { - + delete mEditorFactory; } /*! -\return Pointer to mainwindow -*/ + \return Pointer to mainwindow + */ CntMainWindow *CntViewManager::mainWindow() { return mMainWindow; } /*! -Set the default view -*/ + Set the default view + */ void CntViewManager::setDefaultView(CntViewParameters::ViewId defaultView) { - CntBaseView *view = getView(defaultView); + CntViewParameters args(defaultView); + CntBaseView *view = getView(args); - if (view && view != mDefaultView) - { + if (view && view != mDefaultView) { addViewToWindow(view); // delete the old default view if it exists - if (mDefaultView) - { + if (mDefaultView) { mainWindow()->removeView(mDefaultView); mDefaultView->setParent(0); mDefaultView->deleteLater(); } //set the new view as default - mDefaultViewId = defaultView; + mCurrentViewId = defaultView; mDefaultView = view; } } -//save previous view's parameters -void CntViewManager::setPreviousViewParameters(const CntBaseView *currentView, const CntViewParameters &previousViewParameters) +void CntViewManager::removeDepracatedCurrentView() { - if (currentView) - { - mPreviousViewParameters = previousViewParameters; - - //set current view to be the activated when call previous - mPreviousViewParameters.setNextViewId(currentView->viewId()); - - //previous view is the view that is being actiavated - mPreviousViewParameters.setPreviousViewId(previousViewParameters.nextViewId()); + CntBaseView* oldView(NULL); + // note that if current view is with "New API", its "changeView" must have + // been called, thus, the remove view is already called + if (isDepracatedView(mCurrentViewId)) { + oldView = static_cast (mainWindow()->currentView()); + if (oldView) + removeViewFromWindow(oldView); } } - -//return previous view's parameters -CntViewParameters &CntViewManager::previousViewParameters() -{ - return mPreviousViewParameters; -} - - /*! -Activate view based on \a id -View's will be kept in QStack locally, but ownership is in main window. -NamesView is kept in stack & memory all the time -*/ -void CntViewManager::onActivateView(int aViewId) -{ - CntViewParameters viewParameters; - viewParameters.setNextViewId(static_cast(aViewId)); - - onActivateView(viewParameters); -} - -void CntViewManager::onActivateView(const CntViewParameters &viewParameters) -{ - //get the old view - CntBaseView *oldView = static_cast(mainWindow()->currentView()); - - // fetch the new view and activate it - CntBaseView *newView = getView(viewParameters.nextViewId()); - - if (newView) - { - newView->setPreferredSize(oldView->size()); - addViewToWindow(newView); - - if (oldView == mDefaultView) - { - oldView->deActivateView(); - } - - if (oldView) - { - setPreviousViewParameters(oldView, viewParameters); - removeViewFromWindow(oldView); - } - newView->activateView(viewParameters); - } -} - -void CntViewManager::onActivatePreviousView() -{ - onActivateView(previousViewParameters()); -} - -/*! -Add \a view to main window and set it as current view -*/ + Add \a view to main window and set it as current view + */ void CntViewManager::addViewToWindow(CntBaseView *view) { // add view to mainwindow and set it as current one - if (view) - { + if (view) { //if not default view add the view to main window - if (view != mDefaultView) - { + if (view != mDefaultView) { view->setupView(); mainWindow()->addView(view); } //set the view as current - mainWindow()->setCurrentView( view ); + mainWindow()->setCurrentView(view); } } /*! -Remove \a view from main window and delete it -*/ + Remove \a view from main window and delete it + */ void CntViewManager::removeViewFromWindow(CntBaseView *view) { - if (view && view != mDefaultView) - { + if (view && view != mDefaultView) { mainWindow()->removeView(view); view->setParent(0); view->deleteLater(); @@ -219,145 +139,109 @@ } /*! -Create a view based on ID. \Return pointer to new object if success, 0 if not. -*/ -CntBaseView *CntViewManager::getView(CntViewParameters::ViewId id) + Create a view based on ID. \Return pointer to new object if success, 0 if not. + */ +CntBaseView *CntViewManager::getView(const CntViewParameters &aArgs) { CntBaseView* view(0); + CntViewParameters::ViewId id = aArgs.nextViewId(); - //return default view if it exists - if (id == mDefaultViewId && mDefaultView) + switch (id) { + case CntViewParameters::FavoritesMemberView: + { + view = new CntFavoritesMemberView(this); + break; + } + case CntViewParameters::commLauncherView: + { + view = new CntContactCardView(this); + break; + } + case CntViewParameters::emailEditorView: + { + view = mEditorFactory->createEmailEditorView(aArgs.selectedContact()); + break; + } + case CntViewParameters::namesEditorView: { - view = mDefaultView; + view = mEditorFactory->createNameEditorView(aArgs.selectedContact()); + break; + } + case CntViewParameters::urlEditorView: + { + view = mEditorFactory->createUrlEditorView(aArgs.selectedContact()); + break; } - - //return any other view - else + case CntViewParameters::companyEditorView: + { + view = mEditorFactory->createCompanyEditorView(aArgs.selectedContact()); + break; + } + case CntViewParameters::phoneNumberEditorView: + { + view = mEditorFactory->createNumberEditorView(aArgs.selectedContact()); + break; + } + case CntViewParameters::onlineAccountEditorView: + { + view = new CntOnlineAccountEditorView(this); + break; + } + case CntViewParameters::noteEditorView: { - switch (id) - { - case CntViewParameters::namesView: - { - view = new CntNamesView(this); - break; - } - case CntViewParameters::collectionView: - { - view = new CntCollectionView(this); - break; - } - case CntViewParameters::collectionFavoritesView: - { - view = new CntFavoritesView(this); - break; - } - case CntViewParameters::collectionFavoritesSelectionView: - { - view = new CntFavoritesSelectionView(this); - break; - } - case CntViewParameters::commLauncherView: - { - view = new CntContactCardView(this); - break; - } - case CntViewParameters::emailEditorView: - { - view = new CntEmailEditorView(this); - break; - } - case CntViewParameters::namesEditorView: - { - view = new CntNamesEditorView(this); - break; - } - case CntViewParameters::urlEditorView: - { - view = new CntUrlEditorView(this); - break; - } - case CntViewParameters::companyEditorView: - { - view = new CntCompanyEditorView(this); - break; - } - case CntViewParameters::phoneNumberEditorView: - { - view = new CntPhoneNumberEditorView(this); - break; - } - case CntViewParameters::onlineAccountEditorView: - { - view = new CntOnlineAccountEditorView(this); - break; - } - case CntViewParameters::noteEditorView: - { - view = new CntNoteEditorView(this); - break; - } - case CntViewParameters::familyDetailEditorView: - { - view = new CntFamilyDetailEditorView(this); - break; - } - case CntViewParameters::addressEditorView: - { - view = new CntAddressEditorView(this); - break; - } - case CntViewParameters::dateEditorView: - { - view = new CntDateEditorView(this); - break; - } - case CntViewParameters::imageEditorView: - { - view = new CntImageEditorView(this); - break; - } - case CntViewParameters::editView: - { - view = new CntEditView(this); - break; - } - case CntViewParameters::myCardSelectionView: - { - view = new CntMyCardSelectionView(this); - break; - } - case CntViewParameters::myCardView: - { - view = new CntMyCardView(this); - break; - } - case CntViewParameters::groupEditorView: - { - view = new CntGroupEditorView(this); - break; - } - case CntViewParameters::groupMemberView: - { - view = new CntGroupMemberView(this); - break; - } - case CntViewParameters::groupActionsView: - { - view = new CntGroupActionsView(this); - break; - } - case CntViewParameters::historyView: - { - view = new CntHistoryView(this); - break; - } - default: - { - break; - } - } + view = mEditorFactory->createNoteEditorView(aArgs.selectedContact()); + break; + } + case CntViewParameters::familyDetailEditorView: + { + view = mEditorFactory->createFamilyEditorView(aArgs.selectedContact()); + break; + } + case CntViewParameters::addressEditorView: + { + view = mEditorFactory->createAddressEditorView(aArgs.selectedContact()); + break; + } + case CntViewParameters::dateEditorView: + { + view = mEditorFactory->createDateEditorView(aArgs.selectedContact()); + break; + } + case CntViewParameters::editView: + { + view = new CntEditView(this); + break; } - + case CntViewParameters::myCardSelectionView: + { + view = new CntMyCardSelectionView(this); + break; + } + case CntViewParameters::groupEditorView: + { + view = new CntGroupEditorView(this); + break; + } + case CntViewParameters::groupMemberView: + { + view = new CntGroupMemberView(this); + break; + } + case CntViewParameters::groupActionsView: + { + view = new CntGroupActionsView(this); + break; + } + case CntViewParameters::historyView: + { + view = new CntHistoryView(this); + break; + } + default: + { + break; + } + } return view; } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntviewnavigator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntviewnavigator.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,87 @@ +/* +* 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 "cntviewnavigator.h" +#include + +CntViewNavigator::CntViewNavigator( QObject* aParent ) : QObject( aParent ), +iTop( CntViewParameters::noView ) +{ +} + +CntViewNavigator::~CntViewNavigator() +{ +} + +void CntViewNavigator::next( const CntViewParameters::ViewId& aId ) +{ + iViewStack.push( aId ); +} + +const CntViewParameters::ViewId& CntViewNavigator::back() +{ + qDebug() << "CntViewParameters::back() - IN"; + iTop = CntViewParameters::noView; + // Check if exception is set for current view item. Exception + // means that instead of one step back, we go back until that + // execption value is located. So all items that are jumped over, + // their history will be eared. + if ( !iViewStack.isEmpty() ) + { + CntViewParameters::ViewId top = iViewStack.top(); + + // If any exception defined for the current (top) view + if ( iExceptions.contains( top ) ) + { + iTop = iExceptions.value( top ); + // cleanup the history until the exception value is found + while ( !iViewStack.isEmpty() ) + { + if ( iTop == iViewStack.top() ) + { + break; // don't pop the exception it self. + } + iViewStack.pop(); + } + } + // No exceptions defined, go one step back + else + { + iViewStack.pop(); + if ( !iViewStack.isEmpty() ) + { + iTop = iViewStack.top(); + } + } + } + qDebug() << "CntViewParameters::back() - OUT"; + return iTop; +} + +void CntViewNavigator::addException( const CntViewParameters::ViewId& aCurrent, const CntViewParameters::ViewId& aBack ) +{ + iExceptions.insert( aCurrent, aBack ); +} + +void CntViewNavigator::removeException( const CntViewParameters::ViewId& aCurrent ) +{ + if ( iExceptions.contains(aCurrent) ) + { + iExceptions.remove( aCurrent ); + } +} + +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/src/cntviewparameters.cpp --- a/phonebookui/pbkcommonui/src/cntviewparameters.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/src/cntviewparameters.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -16,6 +16,7 @@ */ #include "cntviewparameters.h" +#include CntViewParameters::CntViewParameters(CntViewParameters::ViewId activateView, CntViewParameters::ViewId previousViewId) : mActivateViewId(activateView), @@ -31,13 +32,14 @@ mContact = viewParameters.selectedContact(); mDetail = viewParameters.selectedDetail(); mGroupContact = viewParameters.selectedGroupContact(); + mParams = viewParameters.parameters(); } CntViewParameters::~CntViewParameters() { } -void CntViewParameters::setNextViewId(const ViewId activateViewId) +void CntViewParameters::setNextViewId(const CntViewParameters::ViewId& activateViewId) { mActivateViewId = activateViewId; } @@ -96,3 +98,13 @@ { return mGroupContact; } + +void CntViewParameters::setParameters(const QMap& aMap) +{ + mParams = aMap; +} + +QMap CntViewParameters::parameters() const +{ + return mParams; +} diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_addresseditor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_addresseditor.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,62 @@ +/* +* 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: +* +*/ +/* + * t_addresseditor.h + * + * Created on: Feb 3, 2010 + * Author: juhapaal + */ + +#ifndef T_ADDRESSEDITOR_H_ +#define T_ADDRESSEDITOR_H_ + +#include + +class CntAddressModel; +class HbDataForm; + +#include +#include "qtpbkglobal.h" + +QTM_BEGIN_NAMESPACE +class QContact; +QTM_END_NAMESPACE +QTM_USE_NAMESPACE + + +class T_AddressEditorTest : public QObject + { + Q_OBJECT + +private slots: + void init(); + void cleanup(); + +private slots: + // tests + void testAddressModelWithDefaultData(); + void testAddressModelWithData(); + void testAddressCustomViewItem(); + +private: + void testItemLayout( CntAddressModel* aModel ); + +private: + QContact* mContact; + HbDataForm* mForm; + }; +#endif /* T_URLEDITOR_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcollectionlistmodel.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcollectionlistmodel.h Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcollectionlistmodel.h Fri Apr 16 14:53:18 2010 +0300 @@ -28,14 +28,19 @@ private slots: - void initTestCase(); - void createNoUserGroups(); - void createWithUserGroups(); + void init(); + void cleanup(); + + void data(); + void rowCount(); void removeRows(); void removeGroup(); - void cleanupTestCase(); - + void initializeStaticGroups(); + void initializeUserGroups(); + void isFavoriteGroupCreated(); + void favoriteGroupId(); + private: CntCollectionListModel *mModel; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcollectionview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcollectionview.h Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcollectionview.h Fri Apr 16 14:53:18 2010 +0300 @@ -17,35 +17,28 @@ #include -class CntMainWindow; -class CntViewManager; +class TestViewManager; class CntCollectionView; class TestCntCollectionView: public QObject { - Q_OBJECT + Q_OBJECT private slots: - void initTestCase(); - void createClasses(); - - void aboutToCloseView(); + void init(); + void cleanup(); - void handleExecutedCommand(); - - void addActionsToToolBar(); - void setDataModel(); - - void onLongPressed(); - void onListViewActivated(); - - void cleanupTestCase(); + void testActivate(); + void testShowPreviousView(); + void testOpenEmptyFavoritesGroup(); + void testOpenUserGroup(); + void testShowContextMenu(); + void testRefreshDataModel(); + private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; + TestViewManager *mViewManager; CntCollectionView *mCollectionView; }; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcontactcarddatacontainer.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcontactcarddatacontainer.h Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcontactcarddatacontainer.h Fri Apr 16 14:53:18 2010 +0300 @@ -35,6 +35,7 @@ void initializeData(); void addSeparator(); void initializeDetailsData(); + void initializeDetailsDataWithMaptile(); void actionDetails(); void supportsDetail(); void cleanupTestCase(); diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcontactcardview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcontactcardview.h Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcontactcardview.h Fri Apr 16 14:53:18 2010 +0300 @@ -32,6 +32,10 @@ void activateView(); void addActionsToToolBar(); + void addMenuItems(); + void setAsFavorite(); + void removeFromFavorite(); + void isFavoriteGroupCreated(); void cleanupTestCase(); diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntdefaultviewfactory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntdefaultviewfactory.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,41 @@ +/* +* 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: +* +*/ + +#ifndef T_CNTDEFAULTVIEWFACTORY_H_ +#define T_CNTDEFAULTVIEWFACTORY_H_ + +#include + +class CntDefaultViewFactory; + +class T_CntDefaultViewFactory : public QObject +{ + Q_OBJECT +public: + T_CntDefaultViewFactory(); + ~T_CntDefaultViewFactory(); + +private slots: + void init(); + void cleanup(); + + void testViewCreation(); + +private: + CntDefaultViewFactory* mFactory; +}; +#endif /* T_CNTDEFAULTVIEWFACTORY_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntdefaultviewmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntdefaultviewmanager.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,46 @@ +/* +* 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: +* +*/ + +#ifndef T_CNTDEFAULTVIEWMANAGER_H_ +#define T_CNTDEFAULTVIEWMANAGER_H_ + +#include + +class CntDefaultViewManager; +class CntMainWindow; + +class T_CntDefaultViewManager : public QObject +{ + Q_OBJECT + +public: + T_CntDefaultViewManager(); + ~T_CntDefaultViewManager(); + +private slots: + void initTestCase(); + void cleanupTestCase(); + void testChangeView(); + void testBack(); + void testGetContactManager(); + void testIsDepracatedView(); + +private: + CntDefaultViewManager* mManager; + CntMainWindow* mWindow; +}; +#endif /* T_CNTDEFAULTVIEWMANAGER_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntfavoritesmemberview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntfavoritesmemberview.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,48 @@ +/* +* 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 + +class CntMainWindow; +class CntViewManager; +class CntFavoritesMemberView; + +class TestCntFavoritesMemberView: public QObject +{ + Q_OBJECT + +private slots: + + void initTestCase(); + void init(); + void cleanup(); + void cleanupTestCase(); + + void activateView(); + void addMenuItems(); + void aboutToCloseView(); + void manageFavorites(); + void openContact(); + void editContact(); + void removeFromFavorites(); + +private: + CntMainWindow *mWindow; + CntViewManager *mViewManager; + CntFavoritesMemberView *mFavoritesMemberView; + + }; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntfavoritesview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntfavoritesview.h Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntfavoritesview.h Fri Apr 16 14:53:18 2010 +0300 @@ -28,16 +28,12 @@ private slots: void initTestCase(); - void createClasses(); + void init(); + void cleanup(); - void openFetch(); void openNamesList(); void aboutToCloseView(); - - void addActionsToToolBar(); - - // these two are actually already covered with tests above - void cleanupTestCase(); + void activateView(); private: diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupactionsview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupactionsview.h Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupactionsview.h Fri Apr 16 14:53:18 2010 +0300 @@ -31,15 +31,9 @@ void createClasses(); void aboutToCloseView(); void addActionsToToolBar(); - void deleteGroup(); - void groupMembers(); - void openNamesView(); - void openCollections(); + void addMenuItems(); void editGroup(); void activateView(); - void manageMembers(); - void editGroupDetails(); - void cleanupTestCase(); private: diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupdeletepopup.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupdeletepopup.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,46 @@ +/* +* 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 +#include "qmobilityglobal.h" +#include "cntgroupdeletepopup.h" + +QTM_BEGIN_NAMESPACE +class QContactManager; +class QContact; +QTM_END_NAMESPACE + +QTM_USE_NAMESPACE + +class TestCntGroupDeletePopup: public QObject +{ + Q_OBJECT + +private slots: + + void init(); + + void populateListOfGroup(); + void deleteGroup(); + + void cleanup(); + +private: + + QContactManager *mManager; + CntGroupDeletePopup *mPopup; + }; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupdeletepopupmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupdeletepopupmodel.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,45 @@ +/* +* 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 +#include + +QTM_USE_NAMESPACE + +class CntGroupDeletePopupModel; + +class TestCntGroupDeletePopupModel : public QObject +{ + Q_OBJECT + +private slots: + + void init(); + void cleanup(); + + void initializeGroupsList(); + void isFavoriteGroupCreated(); + void favoriteGroupId(); + void rowCount(); + void contact(); + void data(); + +private: + + CntGroupDeletePopupModel *mModel; + QContactManager *mManager; +}; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupmemberview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupmemberview.h Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupmemberview.h Fri Apr 16 14:53:18 2010 +0300 @@ -44,11 +44,11 @@ void addActionsToToolBar(); void deleteGroup(); void removeFromGroup(); - + void groupActions(); + void addMenuItems(); + void editContact(); void onLongPressed(); void onListViewActivated(); - void viewDetailsOfGroupContact(); - void callNamesList(); void editGroup(); void activateView(); diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupselectionpopup.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupselectionpopup.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,58 @@ +/* +* 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 +#include "qmobilityglobal.h" +#include "cntgroupselectionpopup.h" + +class MobCntModel; + + +QTM_BEGIN_NAMESPACE +class QContactManager; +class QContact; +QTM_END_NAMESPACE + +QTM_USE_NAMESPACE + +class TestCntGroupSelectionPopup: public QObject +{ + Q_OBJECT + +private slots: + + void init(); + + void populateListOfContact(); + void saveNewGroup(); + void saveOldGroup(); + + void closeFind(); + void setFilter(); + + void cleanup(); + +private: + + void deletePopup(); + +private: + + QContactManager *mManager; + // MobCntModel *mCntModel; + CntGroupSelectionPopup *mPopup; + }; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntnamelist.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntnamelist.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,50 @@ +/* +* 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: +* +*/ + +#ifndef T_CNTNAMELIST_H_ +#define T_CNTNAMELIST_H_ + +#include + +class CntNamesView; +class TestViewManager; + +class T_CntNameListTest : public QObject +{ + Q_OBJECT + +public: + T_CntNameListTest(); + ~T_CntNameListTest(); + +private slots: + void init(); + void cleanup(); + + void testNameList(); + void testCreateNewContact(); + void testShowPreviousView(); + void testShowCollectionView(); + void testShowFinder(); + void testShowContactCard(); + void testShowContextMenu(); + +private: + CntNamesView* mView; + TestViewManager* mManager; +}; +#endif /* T_CNTNAMELIST_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntnavigator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntnavigator.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,43 @@ +/* +* 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: +* +*/ + +#ifndef T_CNTNAVIGATOR_H_ +#define T_CNTNAVIGATOR_H_ + +#include + +class CntViewNavigator; +class T_NavigatorTest : public QObject +{ + Q_OBJECT + +public: + T_NavigatorTest(); + ~T_NavigatorTest(); + +private slots: + void init(); + void cleanup(); + + void testWithoutExceptions(); + void testWithExecptions(); + + +private: + CntViewNavigator* mNavigator; +}; +#endif /* T_CNTNAVIGATOR_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_companyeditor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_companyeditor.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,55 @@ +/* +* 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: +* +*/ +/* + * t_companyeditor.h + * + * Created on: Feb 8, 2010 + * Author: juhapaal + */ + +#ifndef T_COMPANYEDITOR_H_ +#define T_COMPANYEDITOR_H_ + +#include + +#include +#include "qtpbkglobal.h" + +class HbDataForm; +QTM_BEGIN_NAMESPACE +class QContact; +QTM_END_NAMESPACE +QTM_USE_NAMESPACE + +class T_CompanyEditorTest : public QObject + { + Q_OBJECT + +private slots: + void init(); + void cleanup(); + +private slots: + void testCompanyModelWithDefaultData(); + void testCompanyModelWithData(); + +private: + QContact* mContact; + HbDataForm* mForm; + }; + +#endif /* T_COMPANYEDITOR_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_dateeditor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_dateeditor.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,59 @@ +/* +* 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: +* +*/ +/* + * t_dateeditor.h + * + * Created on: Feb 8, 2010 + * Author: juhapaal + */ + +#ifndef T_DATEEDITOR_H_ +#define T_DATEEDITOR_H_ + +#include +#include +#include +#include "qtpbkglobal.h" + +class HbDataForm; + +QTM_BEGIN_NAMESPACE +class QContact; +QTM_END_NAMESPACE +QTM_USE_NAMESPACE + +class T_DateEditorTest : public QObject + { + Q_OBJECT + +private slots: + void init(); + void cleanup(); + +private slots:// tests + void testDateModelWithDefaultData(); + void testDateModelWithData(); + void testDatelViewItem_Swahili(); + void testDatelViewItem_English(); + +private: + QContact* mContact; + HbDataForm* mForm; + QLocale mLocale; + }; + +#endif /* T_DATEEDITOR_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_emaileditor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_emaileditor.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,58 @@ +/* +* 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: +* +*/ +/* + * t_emaileditor.h + * + * Created on: Feb 2, 2010 + * Author: juhapaal + */ + +#ifndef T_EMAILEDITOR_H_ +#define T_EMAILEDITOR_H_ + +#include +#include +#include "qtpbkglobal.h" + +class HbDataForm; +QTM_BEGIN_NAMESPACE +class QContact; +QTM_END_NAMESPACE +QTM_USE_NAMESPACE + +class T_EmailEditorTest : public QObject + { + Q_OBJECT + +private slots: + void init(); + void cleanup(); + +private slots: + // tests + void testEmailModelWithDefaultData(); + void testEmailModelWithData(); + void testInsertModelItem(); + void testEmailViewItem(); + void testEmailViewItemComboChange(); + void testEmailViewItemLineEdit(); + +private: + QContact* mContact; + HbDataForm* mForm; + }; +#endif /* T_EMAILEDITOR_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_familyeditor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_familyeditor.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,56 @@ +/* +* 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: +* +*/ +/* + * t_familyeditor.h + * + * Created on: Feb 8, 2010 + * Author: juhapaal + */ + +#ifndef T_FAMILYEDITOR_H_ +#define T_FAMILYEDITOR_H_ + +#include +#include +#include + +#include +#include "qtpbkglobal.h" + +QTM_BEGIN_NAMESPACE +class QContact; +QTM_END_NAMESPACE +QTM_USE_NAMESPACE + +class T_FamilyEditorTest : public QObject + { + Q_OBJECT + +private slots: // framework functions + void init(); + void cleanup(); + +private slots: // test functions + void testFamilyModelWithDefaultData(); + void testFamilyModelWithData(); + +private: // data + QContact* mContact; + HbDataForm* mForm; + }; + +#endif /* T_FAMILYEDITOR_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_nameeditor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_nameeditor.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,53 @@ +/* +* 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: +* +*/ +/* + * t_nameditor.h + * + * Created on: Feb 5, 2010 + * Author: juhapaal + */ + +#ifndef T_NAMEDITOR_H_ +#define T_NAMEDITOR_H_ + +#include +#include +#include "qtpbkglobal.h" + +class HbDataForm; +QTM_BEGIN_NAMESPACE +class QContact; +QTM_END_NAMESPACE +QTM_USE_NAMESPACE + +class T_NameEditorTest : public QObject + { + Q_OBJECT + +private slots: + void init(); + void cleanup(); + +private slots: + void testNameModelDefaultData(); + void testNameModelData(); + +private: + QContact* mContact; + HbDataForm* mForm; + }; +#endif /* T_NAMEDITOR_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_namelist.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_namelist.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,48 @@ +/* +* 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: +* +*/ + +#ifndef T_NAMELIST_H_ +#define T_NAMELIST_H_ + +#include + +class TestViewManager; +class CntNamesView; +class CntNamesViewPrivate; + +class T_NameListTest : public QObject +{ + Q_OBJECT + +public: + T_NameListTest(); + ~T_NameListTest(); + +private slots: + void init(); + void cleanup(); + void testPublicNamesList(); + + void testBanner(); + void testFinder(); + void testKeyboard(); + +private: + TestViewManager* mViewManager; + CntNamesViewPrivate* mNamesPrivate; +}; +#endif /* T_NAMELIST_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_noteeditor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_noteeditor.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,56 @@ +/* +* 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: +* +*/ +/* + * t_noteeditor.h + * + * Created on: Feb 5, 2010 + * Author: juhapaal + */ + +#ifndef T_NOTEEDITOR_H_ +#define T_NOTEEDITOR_H_ + +#include +#include +#include "qtpbkglobal.h" + +class HbDataForm; +QTM_BEGIN_NAMESPACE +class QContact; +QTM_END_NAMESPACE +QTM_USE_NAMESPACE + +class T_NoteEditorTest : public QObject + { + Q_OBJECT + +private slots: + void init(); + void cleanup(); + +private slots: + // tests + void testNoteModelWithDefaultData(); + void testNoteModelWithData(); + void testNoteViewItem(); + void testNoteViewItemMaxLengths(); + void testInsertAndSaveNote(); +private: + QContact* mContact; + HbDataForm* mForm; + }; +#endif /* T_NOTEEDITOR_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_numbereditor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_numbereditor.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,55 @@ +/* +* 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: +* +*/ +/* + * t_phonenumbertest.h + * + * Created on: Feb 1, 2010 + * Author: juhapaal + */ + +#ifndef T_PHONENUMBERTEST_H_ +#define T_PHONENUMBERTEST_H_ + +#include +#include +#include "qtpbkglobal.h" + +class HbDataForm; +QTM_BEGIN_NAMESPACE +class QContact; +QTM_END_NAMESPACE +QTM_USE_NAMESPACE + +class T_NumberEditorTest : public QObject + { + Q_OBJECT + +private slots: + void init(); + void cleanup(); + +private slots: + void testPhoneNumberModelWithDefaultData(); + void testPhoneNumberModelWithData(); + void testInsertPhoneNumber(); + void testPhoneNumberViewItem(); + +private: + QContact* mContact; + HbDataForm* mForm; + }; +#endif /* T_PHONENUMBERTEST_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_urleditor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_urleditor.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,57 @@ +/* +* 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: +* +*/ +/* + * t_urleditor.h + * + * Created on: Feb 3, 2010 + * Author: juhapaal + */ + +#ifndef T_URLEDITOR_H_ +#define T_URLEDITOR_H_ + +#include +#include +#include "qtpbkglobal.h" + +class HbDataForm; +QTM_BEGIN_NAMESPACE +class QContact; +QTM_END_NAMESPACE +QTM_USE_NAMESPACE + +class T_UrlEditorTest : public QObject + { + Q_OBJECT + +private slots: + void init(); + void cleanup(); + +private slots: + // tests + void testUrlModelWithDefaultData(); + void testUrlModelWithData(); + void testUrlViewItem(); + void testUrlViewItemComboChange(); + void testUrlViewItemLineEdit(); + +private: + QContact* mContact; + HbDataForm* mForm; + }; +#endif /* T_URLEDITOR_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/main.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/main.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/main.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -39,7 +39,7 @@ #include "t_cnteditviewheadingitem.h" #include "t_cntemaileditorview.h" #include "t_cntfamilydetaileditorview.h" -#include "t_cntfavoritesselectionview.h" +#include "t_cntfavoritesmemberview.h" #include "t_cntfavoritesview.h" #include "t_cntgroupactionsview.h" #include "t_cntgroupeditorview.h" @@ -49,7 +49,6 @@ #include "t_cntmycardselectionview.h" #include "t_cntmycardview.h" #include "t_cntnameseditorview.h" -#include "t_cntnamesview.h" #include "t_cntnoteeditorview.h" #include "t_cntonlineaccounteditorview.h" #include "t_cntphonenumbereditorview.h" @@ -60,7 +59,23 @@ #include "t_cntviewparameters.h" #include "t_cntcommhistoryview.h" #include "t_cntgroupselectionpopup.h" +#include "t_cntgroupdeletepopupmodel.h" +#include "t_cntgroupdeletepopup.h" +#include "t_addresseditor.h" +#include "t_companyeditor.h" +#include "t_dateeditor.h" +#include "t_emaileditor.h" +#include "t_familyeditor.h" +#include "t_nameeditor.h" +#include "t_noteeditor.h" +#include "t_numbereditor.h" +#include "t_urleditor.h" + +#include "t_cntnavigator.h" +#include "t_namelist.h" +#include "t_cntdefaultviewfactory.h" +#include "t_cntdefaultviewmanager.h" #include @@ -76,7 +91,40 @@ QApplication app(argc, argv); TestRunner testRunner("ut_pbkcommonui"); - + + T_NameListTest namesTest; + testRunner.runTests( namesTest ); + + T_NavigatorTest navigatorTest; + testRunner.runTests( navigatorTest ); + + T_FamilyEditorTest family; + testRunner.runTests( family ); + + T_DateEditorTest date; + testRunner.runTests( date ); + + T_CompanyEditorTest company; + testRunner.runTests( company ); + + T_NameEditorTest name; + testRunner.runTests( name ); + + T_NoteEditorTest note; + testRunner.runTests( note ); + + T_NumberEditorTest test; + testRunner.runTests( test ); + + T_EmailEditorTest email; + testRunner.runTests( email ); + + T_UrlEditorTest url; + testRunner.runTests( url ); + + T_AddressEditorTest addr; + testRunner.runTests( addr ); + TestCntModelProvider ut_cntModelProvider; testRunner.runTests(ut_cntModelProvider); @@ -86,18 +134,18 @@ TestCntActions ut_cntActions; testRunner.runTests(ut_cntActions); - TestCntAddressEditorView ut_cntAddressEditorView; - testRunner.runTests(ut_cntAddressEditorView); - TestCntBaseDetailEditorView ut_cntBaseDetailEditorView; testRunner.runTests(ut_cntBaseDetailEditorView); + + // This was getting hanged in after stubbing HBMainwindow + // but changing the position helped + // Need to check if stubbing is really needed +// TestCntBaseListView ut_cntBaseListView; +// testRunner.runTests(ut_cntBaseListView); - TestCntBaseListView ut_cntBaseListView; - testRunner.runTests(ut_cntBaseListView); -/* TestCntBaseSelectionView ut_cntBaseSelectionView; testRunner.runTests(ut_cntBaseSelectionView); -*/ + TestCntBaseView ut_cntBaseView; testRunner.runTests(ut_cntBaseView); @@ -110,9 +158,6 @@ TestCntCommands ut_cntCommands; testRunner.runTests(ut_cntCommands); - TestCntCompanyEditorView ut_cntCompanyEditorView; - testRunner.runTests(ut_cntCompanyEditorView); - TestCntContactCardDataContainer ut_cntContactCardDataContainer; testRunner.runTests(ut_cntContactCardDataContainer); @@ -125,35 +170,20 @@ TestCntContactCardView ut_cntContactCardView; testRunner.runTests(ut_cntContactCardView); - TestCntDateEditorView ut_cntDateEditorView; - testRunner.runTests(ut_cntDateEditorView); - TestCntDetailPopup ut_cntDetailPopup; testRunner.runTests(ut_cntDetailPopup); - TestCntEditorDataModelItem ut_cntEditorDataModelItem; - testRunner.runTests(ut_cntEditorDataModelItem); - - TestCntEditorDataViewItem ut_cntEditorDataViewItem; - testRunner.runTests(ut_cntEditorDataViewItem); - - TestCntEditViewDetailItem ut_cntEditViewDetailItem; - testRunner.runTests(ut_cntEditViewDetailItem); - TestCntEditViewHeadingItem ut_cntEditViewHeadingItem; testRunner.runTests(ut_cntEditViewHeadingItem); - TestCntEmailEditorView ut_cntEmailEditorView; - testRunner.runTests(ut_cntEmailEditorView); - - TestCntFamilyDetailEditorView ut_cntFamilyDetailEditorView; - testRunner.runTests(ut_cntFamilyDetailEditorView); - - TestCntFavoritesSelectionView ut_cntFavoritesSelectionView; - testRunner.runTests(ut_cntFavoritesSelectionView); + TestCntFavoritesMemberView ut_cntFavoritesMemberView; + testRunner.runTests(ut_cntFavoritesMemberView); TestCntFavoritesView ut_cntFavoritesView; - testRunner.runTests(ut_cntFavoritesView); + testRunner.runTests(ut_cntFavoritesView); + + TestCntGroupActionsView ut_cntGroupActionsView; + testRunner.runTests(ut_cntGroupActionsView); TestCntGroupEditorView ut_cntGroupEditorView; testRunner.runTests(ut_cntGroupEditorView); @@ -163,12 +193,18 @@ TestCntGroupSelectionPopup ut_cntgroupselectionpopup; testRunner.runTests(ut_cntgroupselectionpopup); + + TestCntGroupDeletePopupModel ut_cntgroupdeletepopup; + testRunner.runTests(ut_cntgroupdeletepopup); + + TestCntGroupDeletePopup ut_cntgroupdeletepopupmodel; + testRunner.runTests(ut_cntgroupdeletepopupmodel); TestCntImageEditorView ut_cntImageEditorView; testRunner.runTests(ut_cntImageEditorView); - TestCntMainWindow ut_cntMainWindow; - testRunner.runTests(ut_cntMainWindow); +// TestCntMainWindow ut_cntMainWindow; +// testRunner.runTests(ut_cntMainWindow); TestCntMyCardSelectionView ut_cntMyCardSelectionView; testRunner.runTests(ut_cntMyCardSelectionView); @@ -176,26 +212,26 @@ TestCntMyCardView ut_cntMyCardView; testRunner.runTests(ut_cntMyCardView); - TestCntNamesEditorView ut_cntNamesEditorView; - testRunner.runTests(ut_cntNamesEditorView); +// This was getting hanged in close find after stubbing HBMainwindow +// Need to check if stubbing is really needed +// TestCntNamesView ut_cntNamesView; +// testRunner.runTests(ut_cntNamesView); - TestCntNamesView ut_cntNamesView; - testRunner.runTests(ut_cntNamesView); - TestCntNoteEditorView ut_cntNoteEditorView; - testRunner.runTests(ut_cntNoteEditorView); +// TestCntNoteEditorView ut_cntNoteEditorView; +// testRunner.runTests(ut_cntNoteEditorView); TestCntOnlineAccountEditorView ut_cntOnlineAccountEditorView; testRunner.runTests(ut_cntOnlineAccountEditorView); - TestCntPhoneNumberEditorView ut_cntPhoneNumberEditorView; - testRunner.runTests(ut_cntPhoneNumberEditorView); +// TestCntPhoneNumberEditorView ut_cntPhoneNumberEditorView; +// testRunner.runTests(ut_cntPhoneNumberEditorView); TestCntSnapshotWidget ut_cntSnapshotWidget; testRunner.runTests(ut_cntSnapshotWidget); - TestCntUrlEditorView ut_cntUrlEditorView; - testRunner.runTests(ut_cntUrlEditorView); +// TestCntUrlEditorView ut_cntUrlEditorView; +// testRunner.runTests(ut_cntUrlEditorView); TestCntViewParameters ut_cntViewParameters; testRunner.runTests(ut_cntViewParameters); diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_addresseditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_addresseditor.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,189 @@ +/* +* 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 "t_addresseditor.h" +#include "cntdetailconst.h" +#include "cntaddressmodel.h" +#include "cntaddressviewitem.h" +#include +#include +#include +#include + +void T_AddressEditorTest::init() + { + mContact = new QContact(); + mForm = new HbDataForm(); + } + +void T_AddressEditorTest::cleanup() + { + delete mForm; + } + +void T_AddressEditorTest::testAddressModelWithDefaultData() + { + CntAddressModel* model = new CntAddressModel( mContact ); + CntAddressViewItem* viewItem = new CntAddressViewItem(); + mForm->setModel( model, viewItem ); + + testItemLayout( model ); + delete model; + } + +void T_AddressEditorTest::testAddressModelWithData() + { + QContactAddress* address = new QContactAddress(); + address->setContexts( QContactAddress::ContextHome ); + address->setStreet( "Karakaari 7" ); + address->setPostcode( "02320" ); + address->setLocality("Espoo"); + address->setRegion( "Uudenmaanlääni" ); + address->setCountry( "Finland" ); + mContact->saveDetail( address ); + + CntAddressModel* model = new CntAddressModel( mContact ); + CntAddressViewItem* viewItem = new CntAddressViewItem(); + mForm->setModel( model, viewItem ); + + testItemLayout( model ); + + HbDataFormModelItem* context = model->itemFromIndex( model->index(0, 0) ); + QCOMPARE( context->type(), HbDataFormModelItem::GroupItem ); + QCOMPARE( context->label(), QString("Address") ); + // WITH MAP LOCATION PICKER +// QVERIFY(context->childAt( 1 )->contentWidgetData("text").toString() == QString("") ); +// QVERIFY(context->childAt( 1 )->contentWidgetData("maxLength").toInt() == CNT_STREET_MAXLENGTH ); +// QVERIFY(context->childAt( 2 )->contentWidgetData("text").toString() == QString("") ); +// QVERIFY(context->childAt( 2 )->contentWidgetData("maxLength").toInt() == CNT_POSTCODE_MAXLENGTH ); +// QVERIFY(context->childAt( 3 )->contentWidgetData("text").toString() == QString("") ); +// QVERIFY(context->childAt( 3 )->contentWidgetData("maxLength").toInt() == CNT_LOCALITY_MAXLENGTH ); +// QVERIFY(context->childAt( 4 )->contentWidgetData("text").toString() == QString("") ); +// QVERIFY(context->childAt( 4 )->contentWidgetData("maxLength").toInt() == CNT_REGION_MAXLENGTH ); +// QVERIFY(context->childAt( 5 )->contentWidgetData("text").toString() == QString("") ); +// QVERIFY(context->childAt( 5 )->contentWidgetData("maxLength").toInt() == CNT_COUNTRY_MAXLENGTH ); + + QVERIFY(context->childAt( 0 )->contentWidgetData("text").toString() == QString("") ); + QVERIFY(context->childAt( 0 )->contentWidgetData("maxLength").toInt() == CNT_STREET_MAXLENGTH ); + QVERIFY(context->childAt( 1 )->contentWidgetData("text").toString() == QString("") ); + QVERIFY(context->childAt( 1 )->contentWidgetData("maxLength").toInt() == CNT_POSTCODE_MAXLENGTH ); + QVERIFY(context->childAt( 2 )->contentWidgetData("text").toString() == QString("") ); + QVERIFY(context->childAt( 2 )->contentWidgetData("maxLength").toInt() == CNT_LOCALITY_MAXLENGTH ); + QVERIFY(context->childAt( 3 )->contentWidgetData("text").toString() == QString("") ); + QVERIFY(context->childAt( 3 )->contentWidgetData("maxLength").toInt() == CNT_REGION_MAXLENGTH ); + QVERIFY(context->childAt( 4 )->contentWidgetData("text").toString() == QString("") ); + QVERIFY(context->childAt( 4 )->contentWidgetData("maxLength").toInt() == CNT_COUNTRY_MAXLENGTH ); + + HbDataFormModelItem* contextHome = model->itemFromIndex( model->index(1, 0) ); + QCOMPARE( contextHome->type(), HbDataFormModelItem::GroupItem ); + QCOMPARE( contextHome->label(), QString("Address (home)") ); + // WITH MAP LOCATION PICKER +// QVERIFY(contextHome->childAt( 1 )->contentWidgetData("text").toString() == QString("Karakaari 7") ); +// QVERIFY(contextHome->childAt( 2 )->contentWidgetData("text").toString() == QString("02320") ); +// QVERIFY(contextHome->childAt( 3 )->contentWidgetData("text").toString() == QString("Espoo") ); +// QVERIFY(contextHome->childAt( 4 )->contentWidgetData("text").toString() == QString("Uudenmaanlääni") ); +// QVERIFY(contextHome->childAt( 5 )->contentWidgetData("text").toString() == QString("Finland") ); + + QVERIFY(contextHome->childAt( 0 )->contentWidgetData("text").toString() == QString("Karakaari 7") ); + QVERIFY(contextHome->childAt( 1 )->contentWidgetData("text").toString() == QString("02320") ); + QVERIFY(contextHome->childAt( 2 )->contentWidgetData("text").toString() == QString("Espoo") ); + QVERIFY(contextHome->childAt( 3 )->contentWidgetData("text").toString() == QString("Uudenmaanlääni") ); + QVERIFY(contextHome->childAt( 4 )->contentWidgetData("text").toString() == QString("Finland") ); + + HbDataFormModelItem* contextWork = model->itemFromIndex( model->index(2, 0) ); + QCOMPARE( contextWork->type(), HbDataFormModelItem::GroupItem ); + QCOMPARE( contextWork->label(), QString("Address (work)") ); + // WITH MAP LOCATION PICKER +// QVERIFY(contextWork->childAt( 1 )->contentWidgetData("text").toString() == QString("") ); +// QVERIFY(contextWork->childAt( 2 )->contentWidgetData("text").toString() == QString("") ); +// QVERIFY(contextWork->childAt( 3 )->contentWidgetData("text").toString() == QString("") ); +// QVERIFY(contextWork->childAt( 4 )->contentWidgetData("text").toString() == QString("") ); +// QVERIFY(contextWork->childAt( 5 )->contentWidgetData("text").toString() == QString("") ); + + QVERIFY(contextWork->childAt( 0 )->contentWidgetData("text").toString() == QString("") ); + QVERIFY(contextWork->childAt( 1 )->contentWidgetData("text").toString() == QString("") ); + QVERIFY(contextWork->childAt( 2 )->contentWidgetData("text").toString() == QString("") ); + QVERIFY(contextWork->childAt( 3 )->contentWidgetData("text").toString() == QString("") ); + QVERIFY(contextWork->childAt( 4 )->contentWidgetData("text").toString() == QString("") ); + + model->saveContactDetails(); + delete model; + } + +void T_AddressEditorTest::testAddressCustomViewItem() + { + } + +void T_AddressEditorTest::testItemLayout( CntAddressModel* aModel ) + { + HbDataFormModelItem* noContext = aModel->itemFromIndex( aModel->index(0, 0) ); + QCOMPARE( noContext->type(), HbDataFormModelItem::GroupItem ); + QCOMPARE( noContext->label(), QString("Address") ); +// QCOMPARE( noContext->childCount(), 6 ); // WITH MAP LOCATION PICKER +// QCOMPARE( noContext->childAt(0)->type(), HbDataFormModelItem::CustomItemBase ); +// QCOMPARE( noContext->childAt(1)->type(), HbDataFormModelItem::TextItem ); +// QCOMPARE( noContext->childAt(2)->type(), HbDataFormModelItem::TextItem ); +// QCOMPARE( noContext->childAt(3)->type(), HbDataFormModelItem::TextItem ); +// QCOMPARE( noContext->childAt(4)->type(), HbDataFormModelItem::TextItem ); +// QCOMPARE( noContext->childAt(5)->type(), HbDataFormModelItem::TextItem ); + + QCOMPARE( noContext->childCount(), 5 ); + QCOMPARE( noContext->childAt(0)->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( noContext->childAt(1)->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( noContext->childAt(2)->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( noContext->childAt(3)->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( noContext->childAt(4)->type(), HbDataFormModelItem::TextItem ); + + HbDataFormModelItem* contextHome = aModel->itemFromIndex( aModel->index(1, 0) ); + QCOMPARE( contextHome->type(), HbDataFormModelItem::GroupItem ); + QCOMPARE( contextHome->label(), QString("Address (home)") ); + +// QCOMPARE( contextHome->childCount(), 6 ); // WITH MAP LOCATION PICKER +// QCOMPARE( contextHome->childAt(0)->type(), HbDataFormModelItem::CustomItemBase ); +// QCOMPARE( contextHome->childAt(1)->type(), HbDataFormModelItem::TextItem ); +// QCOMPARE( contextHome->childAt(2)->type(), HbDataFormModelItem::TextItem ); +// QCOMPARE( contextHome->childAt(3)->type(), HbDataFormModelItem::TextItem ); +// QCOMPARE( contextHome->childAt(4)->type(), HbDataFormModelItem::TextItem ); +// QCOMPARE( contextHome->childAt(5)->type(), HbDataFormModelItem::TextItem ); + + QCOMPARE( contextHome->childCount(), 5 ); + QCOMPARE( contextHome->childAt(0)->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( contextHome->childAt(1)->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( contextHome->childAt(2)->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( contextHome->childAt(3)->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( contextHome->childAt(4)->type(), HbDataFormModelItem::TextItem ); + + HbDataFormModelItem* contextWork = aModel->itemFromIndex( aModel->index(2, 0) ); + QCOMPARE( contextWork->type(), HbDataFormModelItem::GroupItem ); + QCOMPARE( contextWork->label(), QString("Address (work)") ); +// QCOMPARE( contextWork->childCount(), 6 );// WITH MAP LOCATION PICKER +// QCOMPARE( contextWork->childAt(0)->type(), HbDataFormModelItem::CustomItemBase ); +// QCOMPARE( contextWork->childAt(1)->type(), HbDataFormModelItem::TextItem ); +// QCOMPARE( contextWork->childAt(2)->type(), HbDataFormModelItem::TextItem ); +// QCOMPARE( contextWork->childAt(3)->type(), HbDataFormModelItem::TextItem ); +// QCOMPARE( contextWork->childAt(4)->type(), HbDataFormModelItem::TextItem ); +// QCOMPARE( contextWork->childAt(5)->type(), HbDataFormModelItem::TextItem ); + + QCOMPARE( contextWork->childCount(), 5 ); + QCOMPARE( contextWork->childAt(0)->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( contextWork->childAt(1)->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( contextWork->childAt(2)->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( contextWork->childAt(3)->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( contextWork->childAt(4)->type(), HbDataFormModelItem::TextItem ); + + } + +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntaddresseditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntaddresseditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntaddresseditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -261,8 +261,7 @@ void TestCntAddressEditorView::cleanupTestCase() { - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); delete mViewManager; mViewManager = 0; delete mAddressEditorView; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbasedetaileditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbasedetaileditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbasedetaileditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,7 +21,7 @@ #include #include "hbstubs_helper.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include #include @@ -36,7 +36,7 @@ void TestCntBaseDetailEditorView::createClasses() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mBaseDetailEditorView = new CntBaseDetailEditorTestView(mViewManager, 0); mWindow->addView(mBaseDetailEditorView); mWindow->setCurrentView(mBaseDetailEditorView); @@ -83,7 +83,7 @@ void TestCntBaseDetailEditorView::activateView() { - CntViewParameters params(CntViewParameters::namesView, CntViewParameters::collectionView); // these don't matter.. + CntViewParameters params(CntViewParameters::namesView); // this doesnt' matter.. QContact contact; params.setSelectedContact(contact); params.setSelectedAction("dummy"); @@ -100,8 +100,7 @@ void TestCntBaseDetailEditorView::cleanupTestCase() { - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); delete mViewManager; mViewManager = 0; } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbaselistview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbaselistview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbaselistview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,7 +21,7 @@ #include #include -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "hbstubs_helper.h" @@ -36,7 +36,7 @@ void TestCntBaseListView::createClasses() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mBaseListView = new CntBaseListTestView(mViewManager, 0); mWindow->addView(mBaseListView); mWindow->setCurrentView(mBaseListView); @@ -286,10 +286,11 @@ void TestCntBaseListView::cleanupTestCase() { +delete mBaseListView; +mBaseListView = 0; delete mViewManager; mViewManager = 0; - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); } // EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbaseselectionview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbaseselectionview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbaseselectionview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,7 +21,7 @@ #include #include -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "t_cntbaseselectionview.h" @@ -36,7 +36,7 @@ void TestCntBaseSelectionView::createClasses() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mSelectionView = new CntBaseSelectionTestView(mViewManager, 0); mWindow->addView(mSelectionView); mWindow->setCurrentView(mSelectionView); @@ -110,8 +110,7 @@ void TestCntBaseSelectionView::cleanupTestCase() { - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); delete mViewManager; mViewManager = 0; } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbaseview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbaseview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbaseview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,7 +21,7 @@ #include #include -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "hbstubs_helper.h" @@ -38,7 +38,7 @@ void TestCntBaseView::createClasses() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mBaseView = new CntBaseTestView(mViewManager); mWindow->addView(mBaseView); mWindow->setCurrentView(mBaseView); @@ -83,7 +83,7 @@ void TestCntBaseView::addSoftkeyAction() { mBaseView->addSoftkeyAction(); - QVERIFY(mBaseView->mSoftKeyBackAction == mWindow->softKeyAction(Hb::SecondarySoftKey)); + QVERIFY(mBaseView->mSoftKeyBackAction == mBaseView->navigationAction()); } void TestCntBaseView::clearToolBar() @@ -144,8 +144,7 @@ void TestCntBaseView::cleanupTestCase() { - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); delete mViewManager; mViewManager = 0; } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcollectionlistmodel.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcollectionlistmodel.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcollectionlistmodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,68 +21,74 @@ #include "cntcollectionlistmodel.h" #include "t_cntcollectionlistmodel.h" -void TestCntCollectionListModel::initTestCase() -{ +void TestCntCollectionListModel::init() +{ // clear all contacts/groups from database mManager = new QContactManager("symbian"); - QList ids = mManager->contacts(); + QList ids = mManager->contactIds(); mManager->removeContacts(&ids); -} - -void TestCntCollectionListModel::createNoUserGroups() -{ - mModel = new CntCollectionListModel(mManager); - QVERIFY(mModel->rowCount() == 1); - delete mModel; - mModel = 0; -} - -void TestCntCollectionListModel::createWithUserGroups() -{ - // create a group and add two members in it - QContact firstGroup; - firstGroup.setType(QContactType::TypeGroup); - QContactName firstGroupName; - firstGroupName.setCustomLabel("groupname"); - firstGroup.saveDetail(&firstGroupName); - mManager->saveContact(&firstGroup); - - QContact firstGroupContact; - QContactName firstGroupContactName; - firstGroupContactName.setFirst("firstname"); - firstGroupContact.saveDetail(&firstGroupContactName); - mManager->saveContact(&firstGroupContact); + +// mModel = new CntCollectionListModel(mManager); +// QVERIFY(mModel->rowCount() == 1); - QContact secondGroupContact; - QContactName secondGroupContactName; - secondGroupContactName.setFirst("very long name to make the for-loop break out"); - secondGroupContact.saveDetail(&secondGroupContactName); - mManager->saveContact(&secondGroupContact); - - QContactRelationship relationship; - relationship.setRelationshipType(QContactRelationship::HasMember); - relationship.setFirst(firstGroup.id()); - relationship.setSecond(firstGroupContact.id()); - QContactRelationship relationship2; - relationship2.setRelationshipType(QContactRelationship::HasMember); - relationship2.setFirst(firstGroup.id()); - relationship2.setSecond(secondGroupContact.id()); +} +// +//void TestCntCollectionListModel::createNoUserGroups() +//{ +// mModel = new CntCollectionListModel(mManager); +// QVERIFY(mModel->rowCount() == 1); +// delete mModel; +// mModel = 0; +//} - // save relationship - mManager->saveRelationship(&relationship); - mManager->saveRelationship(&relationship2); - - // also create an empty unnamed group - QContact secondGroup; - secondGroup.setType(QContactType::TypeGroup); - mManager->saveContact(&secondGroup); - - mModel = new CntCollectionListModel(mManager); - QVERIFY(mModel->rowCount() == 3); -} +//void TestCntCollectionListModel::createWithUserGroups() +//{ +// // create a group and add two members in it +// QContact firstGroup; +// firstGroup.setType(QContactType::TypeGroup); +// QContactName firstGroupName; +// firstGroupName.setCustomLabel("groupname"); +// firstGroup.saveDetail(&firstGroupName); +// mManager->saveContact(&firstGroup); +// +// QContact firstGroupContact; +// QContactName firstGroupContactName; +// firstGroupContactName.setFirst("firstname"); +// firstGroupContact.saveDetail(&firstGroupContactName); +// mManager->saveContact(&firstGroupContact); +// +// QContact secondGroupContact; +// QContactName secondGroupContactName; +// secondGroupContactName.setFirst("very long name to make the for-loop break out"); +// secondGroupContact.saveDetail(&secondGroupContactName); +// mManager->saveContact(&secondGroupContact); +// +// QContactRelationship relationship; +// relationship.setRelationshipType(QContactRelationship::HasMember); +// relationship.setFirst(firstGroup.id()); +// relationship.setSecond(firstGroupContact.id()); +// QContactRelationship relationship2; +// relationship2.setRelationshipType(QContactRelationship::HasMember); +// relationship2.setFirst(firstGroup.id()); +// relationship2.setSecond(secondGroupContact.id()); +// +// // save relationship +// mManager->saveRelationship(&relationship); +// mManager->saveRelationship(&relationship2); +// +// // also create an empty unnamed group +// QContact secondGroup; +// secondGroup.setType(QContactType::TypeGroup); +// mManager->saveContact(&secondGroup); +// +// mModel = new CntCollectionListModel(mManager); +// QVERIFY(mModel->rowCount() == 3); +//} void TestCntCollectionListModel::data() { + mModel = new CntCollectionListModel(mManager); + QVariant var; QModelIndex index = mModel->index(-1); // invalid index @@ -92,8 +98,16 @@ index = mModel->index(100); // invalid index var = mModel->data(index, Qt::DisplayRole); QVERIFY(var.isNull()); + + //create a group and add two members in it + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("groupname"); + firstGroup.saveDetail(&firstGroupName); + mManager->saveContact(&firstGroup); - index = mModel->index(1); // first user group + index = mModel->index(0); // first user group var = mModel->data(index, Qt::DisplayRole); QVERIFY(var.canConvert()); @@ -109,17 +123,55 @@ void TestCntCollectionListModel::removeRows() { + + // create a group and add two members in it + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("groupname"); + firstGroup.saveDetail(&firstGroupName); + mManager->saveContact(&firstGroup); + + // create a group and add two members in it + QContact secondGroup; + secondGroup.setType(QContactType::TypeGroup); + QContactName secondGroupName; + secondGroupName.setCustomLabel("grouptwo"); + secondGroup.saveDetail(&secondGroupName); + mManager->saveContact(&secondGroup); + + mModel = new CntCollectionListModel(mManager); + QVERIFY(!mModel->removeRow(-1)); QVERIFY(!mModel->removeRow(100)); QVERIFY(mModel->removeRow(1)); - QVERIFY(mModel->rowCount() == 2); + QVERIFY(mModel->rowCount() == 2); // fav + one grp } void TestCntCollectionListModel::removeGroup() { + + // create a group and add two members in it + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("groupname"); + firstGroup.saveDetail(&firstGroupName); + mManager->saveContact(&firstGroup); + + // create a group and add two members in it + QContact secondGroup; + secondGroup.setType(QContactType::TypeGroup); + QContactName secondGroupName; + secondGroupName.setCustomLabel("groupname"); + secondGroup.saveDetail(&secondGroupName); + mManager->saveContact(&secondGroup); + + mModel = new CntCollectionListModel(mManager); + mModel->removeGroup(100); - QVERIFY(mModel->rowCount() == 2); + QVERIFY(mModel->rowCount() == 3); QContactDetailFilter groupFilter; groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); @@ -127,13 +179,88 @@ QList groupContactIds = mManager->contacts(groupFilter); mModel->removeGroup(groupContactIds.at(1)); // first one has already been removed, take the second one - QVERIFY(mModel->rowCount() == 1); + QVERIFY(mModel->rowCount() == 2); } -void TestCntCollectionListModel::cleanupTestCase() +void TestCntCollectionListModel::initializeStaticGroups() + { + mModel = new CntCollectionListModel(mManager); + QVERIFY(mModel->rowCount() == 1); + } + +void TestCntCollectionListModel::isFavoriteGroupCreated() + { + mModel = new CntCollectionListModel(mManager); + QVERIFY(mModel->isFavoriteGroupCreated() == true); + + // clear all contacts/groups from database. This will remove favorite grp also + QList ids = mManager->contactIds(); + mManager->removeContacts(&ids); + QVERIFY(mModel->isFavoriteGroupCreated() == false); + + } +void TestCntCollectionListModel::favoriteGroupId() + { + mModel = new CntCollectionListModel(mManager); + QContact contact; + QList ids = mManager->contactIds(); + QVERIFY(ids.count() == 1); + for(int i = 0 ; i< ids.count();i++) + { + contact = mManager->contact( ids.at(i) ); + } + int contactId = contact.localId(); + + QVERIFY(mModel->favoriteGroupId() == contactId); + } + +void TestCntCollectionListModel::rowCount() + { + mModel = new CntCollectionListModel(mManager); + + QVERIFY(mModel->rowCount() == 1);// fav static group + + + // create a group and add two members in it + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("Group1"); + firstGroup.saveDetail(&firstGroupName); + mManager->saveContact(&firstGroup); + int favGrpId = firstGroup.localId(); + + mModel->initializeUserGroups(); + + QVERIFY(mModel->rowCount() == 2); + + } +void TestCntCollectionListModel::initializeUserGroups() + { + mModel = new CntCollectionListModel(mManager); + + QVERIFY(mModel->rowCount() == 1); // fav group is created + + // create a group and add two members in it + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("groupname"); + firstGroup.saveDetail(&firstGroupName); + mManager->saveContact(&firstGroup); + mModel->initializeUserGroups(); + + QVERIFY(mModel->rowCount() == 2); // fav + 'groupname' group is created + + + } + +void TestCntCollectionListModel::cleanup() { + delete mModel; + mModel = 0; // clear all contacts/groups from database - QList ids = mManager->contacts(); + QList ids = mManager->contactIds(); mManager->removeContacts(&ids); delete mManager; } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcollectionview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcollectionview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcollectionview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -18,158 +18,117 @@ #include #include #include -#include +#include +#include +#include #include "cntcollectionview.h" -#include "cntviewmanager.h" +#include "cntcollectionlistmodel.h" #include "cntmainwindow.h" #include "hbstubs_helper.h" #include "t_cntcollectionview.h" -void TestCntCollectionView::initTestCase() +void TestCntCollectionView::init() { - mWindow = 0; + mViewManager = new TestViewManager(); + mCollectionView = new CntCollectionView(); + + QVERIFY(mCollectionView != 0); + + CntViewParameters args( CntViewParameters::collectionView ); + mCollectionView->activate( mViewManager, args ); +} + +void TestCntCollectionView::cleanup() +{ + mCollectionView->deactivate(); + delete mViewManager; mViewManager = 0; + delete mCollectionView; mCollectionView = 0; } -void TestCntCollectionView::createClasses() +void TestCntCollectionView::testActivate() { - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); - mCollectionView = new CntCollectionView(mViewManager); - mWindow->addView(mCollectionView); - mWindow->setCurrentView(mCollectionView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mCollectionView != 0); + // activate already called in init() + QVERIFY(mCollectionView->mListView->model() != 0); + QVERIFY(mCollectionView->mView != 0); + QVERIFY(mCollectionView->mView->navigationAction() == mCollectionView->mSoftkey); + QVERIFY(!mCollectionView->mDeleteGroupsAction->isEnabled()); + + QContact group; + group.setType(QContactType::TypeGroup); + QContactName groupName; + groupName.setCustomLabel("group"); + group.saveDetail(&groupName); + mViewManager->contactManager("symbiam")->saveContact(&group); + + mCollectionView->mDeleteGroupsAction->setEnabled(true); + CntViewParameters args( CntViewParameters::collectionView ); + mCollectionView->activate( mViewManager, args ); + + QVERIFY(mCollectionView->mDeleteGroupsAction->isEnabled()); + QVERIFY(mCollectionView->mView->navigationAction() == mCollectionView->mSoftkey); } -void TestCntCollectionView::aboutToCloseView() +void TestCntCollectionView::testShowPreviousView() { - mCollectionView->aboutToCloseView(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::namesView); + mCollectionView->showPreviousView(); } -void TestCntCollectionView::handleExecutedCommand() +void TestCntCollectionView::testOpenEmptyFavoritesGroup() { - delete mCollectionView; - mCollectionView = 0; + QModelIndex favIndex = mCollectionView->mListView->model()->index(0, 0); - mCollectionView = new CntCollectionView(mViewManager, 0); - mWindow->addView(mCollectionView); - mWindow->setCurrentView(mCollectionView); - - QList ids = mCollectionView->contactManager()->contacts(); - mCollectionView->contactManager()->removeContacts(&ids); - + mCollectionView->openGroup(favIndex); +} + +void TestCntCollectionView::testOpenUserGroup() +{ QContact firstGroup; firstGroup.setType(QContactType::TypeGroup); QContactName firstGroupName; firstGroupName.setCustomLabel("groupname"); firstGroup.saveDetail(&firstGroupName); - mCollectionView->contactManager()->saveContact(&firstGroup); - mCollectionView->setDataModel(); - mCollectionView->handleExecutedCommand("dummy", QContact()); - QVERIFY(mCollectionView->listView()->model()->rowCount() == 2); + mViewManager->contactManager("symbiam")->saveContact(&firstGroup); + mCollectionView->refreshDataModel(); - QContactDetailFilter groupFilter; - groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); - groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup))); - - QList groupContactIds = mCollectionView->contactManager()->contacts(groupFilter); - mCollectionView->handleExecutedCommand("delete", mCollectionView->contactManager()->contact(groupContactIds.at(0))); - QVERIFY(mCollectionView->listView()->model()->rowCount() == 1); -} - -void TestCntCollectionView::addActionsToToolBar() -{ - HbStubHelper::reset(); - mCollectionView->addActionsToToolBar(); - QVERIFY(HbStubHelper::widgetActionsCount() == 4); + QModelIndex userGroupIndex = mCollectionView->mListView->model()->index(1, 0); + + mCollectionView->openGroup(userGroupIndex); } -void TestCntCollectionView::setDataModel() +void TestCntCollectionView::testShowContextMenu() { - mWindow->removeView(mCollectionView); - delete mCollectionView; - mCollectionView = 0; - - mCollectionView = new CntCollectionView(mViewManager, 0); - mWindow->addView(mCollectionView); - mWindow->setCurrentView(mCollectionView); - - mCollectionView->setDataModel(); - QVERIFY(mCollectionView->listView()->model() != 0); -} - -void TestCntCollectionView::onLongPressed() -{ - mWindow->removeView(mCollectionView); - delete mCollectionView; - mCollectionView = 0; - - mCollectionView = new CntCollectionView(mViewManager, 0); - mWindow->addView(mCollectionView); - mWindow->setCurrentView(mCollectionView); - - QList ids = mCollectionView->contactManager()->contacts(); - mCollectionView->contactManager()->removeContacts(&ids); - QContact firstGroup; firstGroup.setType(QContactType::TypeGroup); QContactName firstGroupName; firstGroupName.setCustomLabel("groupname"); firstGroup.saveDetail(&firstGroupName); - mCollectionView->contactManager()->saveContact(&firstGroup); - mCollectionView->setDataModel(); - QModelIndex favIndex = mCollectionView->listView()->model()->index(0, 0); + mViewManager->contactManager("symbiam")->saveContact(&firstGroup); + mCollectionView->refreshDataModel(); + + QModelIndex favIndex = mCollectionView->mListView->model()->index(0, 0); HbStubHelper::reset(); - mCollectionView->onLongPressed(mCollectionView->listView()->itemByIndex(favIndex), QPointF()); - QVERIFY(HbStubHelper::widgetActionsCount() == 2); + mCollectionView->showContextMenu(mCollectionView->mListView->itemByIndex(favIndex), QPointF()); + QVERIFY(HbStubHelper::widgetActionsCount() == 1); - QModelIndex userGroupIndex = mCollectionView->listView()->model()->index(1, 0); + QModelIndex userGroupIndex = mCollectionView->mListView->model()->index(1, 0); HbStubHelper::reset(); - mCollectionView->onLongPressed(mCollectionView->listView()->itemByIndex(userGroupIndex), QPointF()); - QVERIFY(HbStubHelper::widgetActionsCount() == 3); + mCollectionView->showContextMenu(mCollectionView->mListView->itemByIndex(userGroupIndex), QPointF()); + QVERIFY(HbStubHelper::widgetActionsCount() == 2); } -void TestCntCollectionView::onListViewActivated() +void TestCntCollectionView::testRefreshDataModel() { - QModelIndex favIndex = mCollectionView->listView()->model()->index(0, 0); - - mCollectionView->onListViewActivated(favIndex); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionFavoritesView); - - delete mCollectionView; - mCollectionView = 0; - - mCollectionView = new CntCollectionView(mViewManager, 0); - mWindow->addView(mCollectionView); - mWindow->setCurrentView(mCollectionView); - - mCollectionView->setDataModel(); - - QModelIndex userGroupIndex = mCollectionView->listView()->model()->index(1, 0); - - mCollectionView->onListViewActivated(userGroupIndex); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::groupActionsView); -} - -void TestCntCollectionView::cleanupTestCase() -{ - delete mViewManager; - mViewManager = 0; - delete mWindow; - mWindow = 0; + mCollectionView->refreshDataModel(); + QVERIFY(mCollectionView->mListView->model() == mCollectionView->mModel); } // EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcommands.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcommands.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcommands.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,7 +21,7 @@ #include "cntcommands.h" #include "t_cntcommands.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntbaseview.h" #include "cntmainwindow.h" @@ -30,7 +30,7 @@ void TestCntCommands::initTestCase() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::namesView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::namesView); mManager = new QContactManager("symbian"); mSimManager = new QContactManager("symbiansim"); mCommands = new CntCommands(*mViewManager, mManager, mSimManager); @@ -107,9 +107,8 @@ { delete mViewManager; mViewManager = 0; - delete mWindow; - mWindow = 0; - delete mCommands; + // ORBIT BUG - so deleting main window removed + mWindow->deleteLater(); mCommands = 0; delete mManager; mManager = 0; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcommhistoryview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcommhistoryview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcommhistoryview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -20,7 +20,7 @@ #include #include "cnthistoryview.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "mobhistorymodel.h" @@ -37,7 +37,7 @@ void TestCntCommHistoryView::createClasses() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mHistoryView = new CntHistoryView(mViewManager,0); QVERIFY(mHistoryView->findWidget("content") != 0); @@ -49,7 +49,7 @@ void TestCntCommHistoryView::aboutToCloseView() { mWindow = new CntMainWindow(0, CntViewParameters::commLauncherView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::commLauncherView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::commLauncherView); mHistoryView = new CntHistoryView(mViewManager,0); mWindow->addView(mHistoryView); @@ -59,7 +59,12 @@ mHistoryView->mContact = c; mHistoryView->aboutToCloseView(); QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::commLauncherView); - delete c; + //delete c; + + mWindow->deleteLater(); + mViewManager = 0; + delete mHistoryView; + mHistoryView = 0; } void TestCntCommHistoryView::activateView() @@ -99,8 +104,7 @@ void TestCntCommHistoryView::cleanupTestCase() { - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); delete mViewManager; mViewManager = 0; delete mHistoryView; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcompanyeditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcompanyeditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcompanyeditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,7 +21,7 @@ #include #include "cntcompanyeditorview.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "t_cntcompanyeditorview.h" @@ -35,7 +35,7 @@ void TestCntCompanyEditorView::createClasses() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mCompanyEditorView = new CntCompanyEditorView(mViewManager, 0); mWindow->addView(mCompanyEditorView); mWindow->setCurrentView(mCompanyEditorView); @@ -127,9 +127,7 @@ void TestCntCompanyEditorView::cleanupTestCase() { - delete mWindow; - mWindow = 0; - delete mViewManager; + mWindow->deleteLater(); mViewManager = 0; delete mCompanyEditorView; mCompanyEditorView = 0; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcontactcarddatacontainer.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcontactcarddatacontainer.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcontactcarddatacontainer.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -127,7 +127,7 @@ QVariantList values1 = mDataContainer->mDataPointer->mDataList.value(1); QVERIFY(values1[0].toString().compare("message") == 0); - QVERIFY(values1[1].toString().compare("send message", Qt::CaseInsensitive) == 0); + QVERIFY(values1[1].toString().compare(hbTrId("txt_phob_menu_send_message"), Qt::CaseInsensitive) == 0); QVERIFY(values1[2].toString().compare("1234567890") == 0); QVariantList values2 = mDataContainer->mDataPointer->mDataList.value(2); @@ -223,7 +223,6 @@ day->setDate(QDate(1,1,1)); contact->saveDetail(day); QContactAddress* address = new QContactAddress(); - address->setContexts("h"); address->setPostOfficeBox("1"); address->setStreet("s"); address->setPostcode("12345"); @@ -235,26 +234,36 @@ //calls also mDataContainer->initializeDetailsData() createClass(contact); - QVERIFY(mDataContainer->mDataPointer->mDataList.count() == 4); + //If location feature enabled , datalist will have additional item( maptile image ) + if ( mDataContainer->mLocationFeatureEnabled ) + { + //TODO: check this after location integration is in the build! + QVERIFY(mDataContainer->mDataPointer->mDataList.count() == 4 ); + } + else + { + QVERIFY(mDataContainer->mDataPointer->mDataList.count() == 4); + } + QVERIFY(mDataContainer->mDataPointer->mDataList.count() == mDataContainer->rowCount() ); //separator QVariantList values = mDataContainer->mDataPointer->mDataList.value(0); - QVERIFY(values[0].toString().compare("Details") == 0); + QVERIFY(values[0].toString().compare(hbTrId("txt_phob_subtitle_details")) == 0); QVariantList values1 = mDataContainer->mDataPointer->mDataList.value(1); QVERIFY(values1[0].toString().compare("") == 0); - QVERIFY(values1[1].toString().compare("Address (h):") == 0); + QVERIFY(values1[1].toString().compare(hbTrId("txt_phob_formlabel_address")) == 0); QVERIFY(values1[2].toString().compare("1 s 12345 l r c") == 0); QVariantList values2 = mDataContainer->mDataPointer->mDataList.value(2); QVERIFY(values2[0].toString().compare("") == 0); - QVERIFY(values2[1].toString().compare("Birthday:") == 0); + QVERIFY(values2[1].toString().compare(hbTrId("txt_phob_formlabel_birthday")) == 0); QVERIFY(values2[2].toString().compare(day->date().toString("dd MMMM yyyy")) == 0); QVariantList values3 = mDataContainer->mDataPointer->mDataList.value(3); QVERIFY(values3[0].toString().compare("") == 0); - QVERIFY(values3[1].toString().compare("Note:") == 0); + QVERIFY(values3[1].toString().compare(hbTrId("txt_phob_formlabel_note2")) == 0); QVERIFY(values3[2].toString().compare(note->note()) == 0); delete contact; @@ -273,18 +282,71 @@ //calls also mDataContainer->initializeDetailsData() createClass(contact); - QVERIFY(mDataContainer->mDataPointer->mDataList.count() == 2); + //If location feature enabled , datalist will have additional item( maptile image ) + if ( mDataContainer->mLocationFeatureEnabled ) + { + //TODO: check this after location integration is in the build! + QVERIFY(mDataContainer->mDataPointer->mDataList.count() == 2 ); + } + else + { + QVERIFY(mDataContainer->mDataPointer->mDataList.count() == 2); + } QVERIFY(mDataContainer->mDataPointer->mDataList.count() == mDataContainer->rowCount()); values = mDataContainer->mDataPointer->mDataList.value(1); QVERIFY(values[0].toString().compare("") == 0); - QVERIFY(values[1].toString().compare("Address:") == 0); + QVERIFY(values[1].toString().compare(hbTrId("txt_phob_formlabel_address")) == 0); QVERIFY(values[2].toString().compare("sweden") == 0); delete contact; delete address; } +void TestCntContactCardDataContainer::initializeDetailsDataWithMaptile() +{ + QContact* contact = new QContact(); + + //Set the contact Id + QContactId contactId ; + contactId.setLocalId( 2222 ); + + QContactAddress* address = new QContactAddress(); + address->setLocality("Helsinki"); + address->setCountry("Finland"); + contact->saveDetail(address); + + //calls also mDataContainer->initialsizeDetailsData() + createClass(contact); + + QVariantList values; + + //If location feature enabled , datalist will have additional item( maptile image ) + if ( mDataContainer->mLocationFeatureEnabled ) + { + //TODO: check this after location integration is in the build! + QVERIFY(mDataContainer->mDataPointer->mDataList.count() == 2); + /* + values = mDataContainer->mDataPointer->mDataList.value(2); + QVERIFY(values[0].toString().compare("22223.png") == 0); + */ + } + else + { + QVERIFY(mDataContainer->mDataPointer->mDataList.count() == 2); + } + + QVERIFY(mDataContainer->mDataPointer->mDataList.count() == mDataContainer->rowCount()); + + values = mDataContainer->mDataPointer->mDataList.value(1); + QVERIFY(values[0].toString().compare("") == 0); + QVERIFY(values[1].toString().compare(hbTrId("txt_phob_formlabel_address")) == 0); + QVERIFY(values[2].toString().compare("Helsinki Finland") == 0); + + delete contact; + delete address; +} + void TestCntContactCardDataContainer::cleanupTestCase() { delete mDataContainer; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcontactcardview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcontactcardview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcontactcardview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,7 +21,7 @@ #include #include "cntcontactcardview.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "t_cntcontactcardview.h" @@ -37,7 +37,7 @@ void TestCntContactCardView::createClasses() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mContactCardView = new CntContactCardView(mViewManager,0); //check that docml @@ -129,11 +129,175 @@ QVERIFY(mContactCardView->actions()->actionList().count() == 3); } +void TestCntContactCardView::addMenuItems() +{ + delete mContactCardView; + mContactCardView=0; + + mContactCardView= new CntContactCardView(mViewManager,0); + + mContactCardView->addMenuItems(); + QVERIFY(mContactCardView->actions()->actionList().count() == 6); +} + +void TestCntContactCardView::setAsFavorite() +{ +int favoriteGroupId =-1; + delete mContactCardView; + mContactCardView=0; + + mContactCardView= new CntContactCardView(mViewManager,0); + + QList ids = mContactCardView->contactManager()->contactIds(); + mContactCardView->contactManager()->removeContacts(&ids); + + QContact* contact = new QContact(); + QContactName* name = new QContactName(); + name->setFirst("first"); + contact->saveDetail(name); + mContactCardView->contactManager()->saveContact(contact); + int contactid = contact->localId(); + + //set view parameters and create contact + CntViewParameters viewParameters(CntViewParameters::noView); + viewParameters.setSelectedContact(*contact); + mContactCardView->activateView(viewParameters); + mContactCardView->setAsFavorite(); + + QContactDetailFilter groupFilter; + groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup))); + + QList groupContactIds = mContactCardView->contactManager()->contactIds(groupFilter); + QContact favcontact; + if (!groupContactIds.isEmpty()) + { + for(int i = 0;i < groupContactIds.count();i++) + { + favcontact = mContactCardView->contactManager()->contact(groupContactIds.at(i)); + QContactName contactName = favcontact.detail(); + QString groupName = contactName.customLabel(); + if(groupName.compare("Favorites") == 0) + { + favoriteGroupId = groupContactIds.at(i); + break; + } + } + } + + int favcontactid11 = favcontact.localId(); + + QContactRelationshipFilter filter; + filter.setRelationshipType(QContactRelationship::HasMember); + filter.setRelatedContactId(favcontact.id()); + filter.setRelatedContactRole(QContactRelationshipFilter::First); + + QList mContactsList = mContactCardView->contactManager()->contacts(filter); + int count = mContactsList.count(); + QVERIFY(count == 1); +} + +void TestCntContactCardView::removeFromFavorite() +{ + int favoriteGroupId =-1; + delete mContactCardView; + mContactCardView=0; + + mContactCardView= new CntContactCardView(mViewManager,0); + QList ids = mContactCardView->contactManager()->contactIds(); + mContactCardView->contactManager()->removeContacts(&ids); + + // create a group and add two members in it + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("Favorites"); + firstGroup.saveDetail(&firstGroupName); + mContactCardView->contactManager()->saveContact(&firstGroup); + + QContact* contact = new QContact(); + QContactName* name = new QContactName(); + name->setFirst("first"); + contact->saveDetail(name); + mContactCardView->contactManager()->saveContact(contact); + int contactid = contact->localId(); + + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(firstGroup.id()); + relationship.setSecond(contact->id()); + + // save relationship + mContactCardView->contactManager()->saveRelationship(&relationship); + + QContactRelationshipFilter filter; + filter.setRelationshipType(QContactRelationship::HasMember); + filter.setRelatedContactId(firstGroup.id()); + filter.setRelatedContactRole(QContactRelationshipFilter::First); + + QList mContactsList = mContactCardView->contactManager()->contacts(filter); + int count = mContactsList.count(); + QVERIFY(count == 1); + + //set view parameters and create contact + CntViewParameters viewParameters(CntViewParameters::noView); + viewParameters.setSelectedContact(*contact); + mContactCardView->activateView(viewParameters); + mContactCardView->removeFromFavorite(); + + QContactDetailFilter groupFilter; + groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup))); + + QList groupContactIds = mContactCardView->contactManager()->contactIds(groupFilter); + QContact favcontact; + + QContactRelationshipFilter filter1; + filter1.setRelationshipType(QContactRelationship::HasMember); + filter1.setRelatedContactId(firstGroup.id()); + filter1.setRelatedContactRole(QContactRelationshipFilter::First); + + QList mContactsList1 = mContactCardView->contactManager()->contacts(filter1); + int count1 = mContactsList1.count(); + QVERIFY(count1 == 0); +} + +void TestCntContactCardView::isFavoriteGroupCreated() + { + delete mContactCardView; + mContactCardView=0; + + mContactCardView= new CntContactCardView(mViewManager,0); + QList ids = mContactCardView->contactManager()->contactIds(); + mContactCardView->contactManager()->removeContacts(&ids); + + QContact* contact = new QContact(); + QContactName* name = new QContactName(); + name->setFirst("first"); + contact->saveDetail(name); + mContactCardView->contactManager()->saveContact(contact); + int contactid = contact->localId(); + + // create a group and add two members in it + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("Favorites"); + firstGroup.saveDetail(&firstGroupName); + mContactCardView->contactManager()->saveContact(&firstGroup); + + //set view parameters and create contact + CntViewParameters viewParameters(CntViewParameters::noView); + viewParameters.setSelectedContact(*contact); + mContactCardView->activateView(viewParameters); + QVERIFY(mContactCardView->isFavoriteGroupCreated() == true); + } + + void TestCntContactCardView::cleanupTestCase() { - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); delete mViewManager; mViewManager = 0; delete mContactCardView; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntdateeditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntdateeditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntdateeditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -20,7 +20,7 @@ #include #include "cntdateeditorview.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "t_cntdateeditorview.h" @@ -34,7 +34,7 @@ void TestCntDateEditorView::createClasses() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mDateEditorView = new CntDateEditorView(mViewManager, 0); mWindow->addView(mDateEditorView); mWindow->setCurrentView(mDateEditorView); @@ -115,8 +115,7 @@ void TestCntDateEditorView::cleanupTestCase() { - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); delete mViewManager; mViewManager = 0; delete mDateEditorView; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntdetailpopup.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntdetailpopup.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntdetailpopup.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -17,7 +17,7 @@ #include #include -#include +#include #include #include @@ -62,7 +62,7 @@ void TestCntDetailPopup::listItemSelected() { // take the first item - QModelIndex index = mPopup->mListModel->index(0); + QModelIndex index = mPopup->mListModel->index(0,0); mPopup->listItemSelected(index); QVERIFY(!mPopup->selectedDetail().isEmpty()); diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cnteditordataviewitem.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cnteditordataviewitem.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cnteditordataviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,7 +21,7 @@ #include #include -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "cnteditordataviewitem.h" @@ -30,7 +30,7 @@ void TestCntEditorDataViewItem::initTestCase() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mTestView = new CntDetailEditorTestView(mViewManager, 0); mWindow->addView(mTestView); mWindow->setCurrentView(mTestView); @@ -298,8 +298,7 @@ void TestCntEditorDataViewItem::cleanupTestCase() { - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); delete mViewManager; mViewManager = 0; } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntemaileditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntemaileditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntemaileditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -155,8 +155,7 @@ void TestCntEmailEditorView::cleanupTestCase() { - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); delete mViewManager; mViewManager = 0; delete mEmailEditorView; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntfamilydetaileditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntfamilydetaileditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntfamilydetaileditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -107,8 +107,7 @@ void TestCntFamilyDetailEditorView::cleanupTestCase() { - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); delete mViewManager; mViewManager = 0; delete mFamilyDetailEditorView; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntfavoritesmemberview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntfavoritesmemberview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,262 @@ +/* +* 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 +#include +#include + +#include "cntdefaultviewmanager.h" +#include "cntmainwindow.h" + +#include "t_cntfavoritesmemberview.h" +#include "cntfavoritesmemberview.h" +#include "hbstubs_helper.h" + +void TestCntFavoritesMemberView::initTestCase() +{ + mWindow = 0; + mViewManager = 0; + mFavoritesMemberView = 0; +} + +void TestCntFavoritesMemberView::init() +{ + mWindow = new CntMainWindow(0, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); + mFavoritesMemberView = new CntFavoritesMemberView(mViewManager, 0); + mWindow->addView(mFavoritesMemberView); + mWindow->setCurrentView(mFavoritesMemberView); + + QList ids = mFavoritesMemberView->contactManager()->contactIds(); + mFavoritesMemberView->contactManager()->removeContacts(&ids); + + // check that we have a view + QVERIFY(mWindow != 0); + QVERIFY(mViewManager != 0); + QVERIFY(mFavoritesMemberView != 0); + QVERIFY(mFavoritesMemberView->findWidget("content") != 0); +} + +void TestCntFavoritesMemberView::cleanup() +{ + QList ids = mFavoritesMemberView->contactManager()->contactIds(); + mFavoritesMemberView->contactManager()->removeContacts(&ids); + delete mViewManager; + mViewManager = 0; + mWindow->deleteLater(); +} + +void TestCntFavoritesMemberView::cleanupTestCase() +{ +} + + +void TestCntFavoritesMemberView::activateView() +{ + CntViewParameters params(CntViewParameters::FavoritesMemberView); + + //Create Fav grp + QContact favoriteGroup; + favoriteGroup.setType(QContactType::TypeGroup); + QContactName favoriteGroupName; + favoriteGroupName.setCustomLabel("Favorites"); + favoriteGroup.saveDetail(&favoriteGroupName); + mFavoritesMemberView->contactManager()->saveContact(&favoriteGroup); + + // create and save contact to the group + QContact firstContact; + firstContact.setType(QContactType::TypeContact); + mFavoritesMemberView->contactManager()->saveContact(&firstContact); + + // save the group + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(favoriteGroup.id()); + relationship.setSecond(firstContact.id()); + + mFavoritesMemberView->contactManager()->saveRelationship(&relationship); + + // set contact as the group id + params.setSelectedContact(favoriteGroup); + + // call activate view + mFavoritesMemberView->activateView(params); + + QVERIFY(mFavoritesMemberView->findWidget("content")->layout()->count() == 2); +} + +void TestCntFavoritesMemberView::addMenuItems() +{ + HbStubHelper::reset(); + mFavoritesMemberView->addMenuItems(); + + QVERIFY(HbStubHelper::widgetActionsCount() == 1); +} + +void TestCntFavoritesMemberView::aboutToCloseView() +{ + mFavoritesMemberView->aboutToCloseView(); + //QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); +} + +void TestCntFavoritesMemberView::manageFavorites() +{ +// mWindow->addView(mFavoritesMemberView); +// mWindow->setCurrentView(mFavoritesMemberView); +// +// // create a group +// QContact firstGroup; +// firstGroup.setType(QContactType::TypeGroup); +// QContactName firstGroupName; +// firstGroupName.setCustomLabel("Favorites"); +// firstGroup.saveDetail(&firstGroupName); +// mFavoritesMemberView->contactManager()->saveContact(&firstGroup); +// +// QContact firstContact; +// QContactName firstContactName; +// firstContactName.setFirst("firstname"); +// firstContact.saveDetail(&firstContactName); +// mFavoritesMemberView->contactManager()->saveContact(&firstContact); +// +// mFavoritesMemberView->manageFavorites(); + + // what to verify ? +} + +void TestCntFavoritesMemberView::openContact() +{ + CntViewParameters params(CntViewParameters::FavoritesMemberView); + // create a group + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("Favorites"); + firstGroup.saveDetail(&firstGroupName); + mFavoritesMemberView->contactManager()->saveContact(&firstGroup); + + // create and save contact to the group + QContact firstContact; + firstContact.setType(QContactType::TypeContact); + mFavoritesMemberView->contactManager()->saveContact(&firstContact); + + // save the group + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(firstGroup.id()); + relationship.setSecond(firstContact.id()); + + mFavoritesMemberView->contactManager()->saveRelationship(&relationship); + + // set contact as the group id + params.setSelectedContact(firstGroup); + + // call activate view + mFavoritesMemberView->activateView(params); + + QModelIndex favIndex = mFavoritesMemberView->contactModel()->index(0); + + mFavoritesMemberView->openContact(favIndex); + + QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::commLauncherView); + +} + +void TestCntFavoritesMemberView::editContact() +{ + CntViewParameters params(CntViewParameters::FavoritesMemberView); + // create a group + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("Favorites"); + firstGroup.saveDetail(&firstGroupName); + mFavoritesMemberView->contactManager()->saveContact(&firstGroup); + + // create and save contact to the group + QContact firstContact; + firstContact.setType(QContactType::TypeContact); + mFavoritesMemberView->contactManager()->saveContact(&firstContact); + + // save the group + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(firstGroup.id()); + relationship.setSecond(firstContact.id()); + + mFavoritesMemberView->contactManager()->saveRelationship(&relationship); + + // set contact as the group id + params.setSelectedContact(firstGroup); + + // call activate view + mFavoritesMemberView->activateView(params); + + QModelIndex favIndex = mFavoritesMemberView->contactModel()->index(0); + + mFavoritesMemberView->editContact(favIndex); + + QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::editView); + +} + +void TestCntFavoritesMemberView::removeFromFavorites() +{ + CntViewParameters params(CntViewParameters::FavoritesMemberView); + // create a group + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("Favorites"); + firstGroup.saveDetail(&firstGroupName); + mFavoritesMemberView->contactManager()->saveContact(&firstGroup); + + // create and save contact to the group + QContact firstContact; + firstContact.setType(QContactType::TypeContact); + mFavoritesMemberView->contactManager()->saveContact(&firstContact); + + // save the group + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(firstGroup.id()); + relationship.setSecond(firstContact.id()); + + mFavoritesMemberView->contactManager()->saveRelationship(&relationship); + + // set contact as the group id + params.setSelectedContact(firstGroup); + + // call activate view + mFavoritesMemberView->activateView(params); + + QModelIndex favIndex = mFavoritesMemberView->contactModel()->index(0); + + mFavoritesMemberView->removeFromFavorites(favIndex); + + // Use relationship filter to get list of contacts in the relationship (if any) + QContactRelationshipFilter filter2; + filter2.setRelationshipType(QContactRelationship::HasMember); + filter2.setRelatedContactRole(QContactRelationshipFilter::First); + filter2.setRelatedContactId(firstGroup.id()); + + QList contactsList = mFavoritesMemberView->contactManager()->contactIds(filter2); + int count = contactsList.count(); + + QVERIFY(count == 0); +} + +// EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntfavoritesselectionview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntfavoritesselectionview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/* -* 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 -#include - -#include "cntviewmanager.h" -#include "cntmainwindow.h" - -#include "t_cntfavoritesselectionview.h" -#include "cntfavoritesselectionview.h" - -void TestCntFavoritesSelectionView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mSelectionView = 0; -} - -void TestCntFavoritesSelectionView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); - mSelectionView = new CntFavoritesSelectionView(mViewManager, 0); - mWindow->addView(mSelectionView); - mWindow->setCurrentView(mSelectionView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mSelectionView != 0); -} - -void TestCntFavoritesSelectionView::aboutToCloseView() -{ - mSelectionView->aboutToCloseView(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); -} - -void TestCntFavoritesSelectionView::cleanupTestCase() -{ - delete mViewManager; - mViewManager = 0; - delete mWindow; - mWindow = 0; -} - -// EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntfavoritesview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntfavoritesview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntfavoritesview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -18,26 +18,26 @@ #include #include #include -#include #include "cntfavoritesview.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "t_cntfavoritesview.h" +#include "cntgroupselectionpopup.h" #include "hbstubs_helper.h" void TestCntFavoritesView::initTestCase() { - mWindow = 0; + /*mWindow = 0; mViewManager = 0; - mFavoritesView = 0; + mFavoritesView = 0;*/ } -void TestCntFavoritesView::createClasses() +void TestCntFavoritesView::init() { - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + /*mWindow = new CntMainWindow(0, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mFavoritesView = new CntFavoritesView(mViewManager, 0); mWindow->addView(mFavoritesView); mWindow->setCurrentView(mFavoritesView); @@ -45,57 +45,71 @@ // check that we have a view QVERIFY(mWindow != 0); QVERIFY(mViewManager != 0); - QVERIFY(mFavoritesView != 0); + QVERIFY(mFavoritesView != 0);*/ } -void TestCntFavoritesView::openFetch() +void TestCntFavoritesView::activateView() { - mFavoritesView->openFetch(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == - CntViewParameters::collectionFavoritesSelectionView); + /*CntViewParameters params(CntViewParameters::collectionFavoritesView); + + //Create Fav grp + QContact favoriteGroup; + favoriteGroup.setType(QContactType::TypeGroup); + QContactName favoriteGroupName; + favoriteGroupName.setCustomLabel("Favorites"); + favoriteGroup.saveDetail(&favoriteGroupName); + mFavoritesView->contactManager()->saveContact(&favoriteGroup); + + // set contact as the group id + params.setSelectedContact(favoriteGroup); + + mFavoritesView->activateView(params); + + + QVERIFY(mFavoritesView->findWidget("cnt_button_new")->isEnabled());*/ } void TestCntFavoritesView::openNamesList() { - delete mFavoritesView; - mFavoritesView = 0; +// mWindow->addView(mFavoritesView); +// mWindow->setCurrentView(mFavoritesView); +// +// // create a group +// QContact firstGroup; +// firstGroup.setType(QContactType::TypeGroup); +// QContactName firstGroupName; +// firstGroupName.setCustomLabel("Favorites"); +// firstGroup.saveDetail(&firstGroupName); +// mFavoritesView->contactManager()->saveContact(&firstGroup); +// +// QContact firstContact; +// QContactName firstContactName; +// firstContactName.setFirst("firstname"); +// firstContact.saveDetail(&firstContactName); +// mFavoritesView->contactManager()->saveContact(&firstContact); +// +// mFavoritesView->openNamesList(); +// +// // what to verify ? - mFavoritesView = new CntFavoritesView(mViewManager, 0); - mWindow->addView(mFavoritesView); - mWindow->setCurrentView(mFavoritesView); - - mFavoritesView->openNamesList(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == - CntViewParameters::namesView); } void TestCntFavoritesView::aboutToCloseView() { - delete mFavoritesView; - mFavoritesView = 0; - - mFavoritesView = new CntFavoritesView(mViewManager, 0); - mWindow->addView(mFavoritesView); + /*mWindow->addView(mFavoritesView); mWindow->setCurrentView(mFavoritesView); mFavoritesView->aboutToCloseView(); QVERIFY(static_cast(mWindow->currentView())->viewId() == - CntViewParameters::collectionView); -} - -void TestCntFavoritesView::addActionsToToolBar() -{ - HbStubHelper::reset(); - mFavoritesView->addActionsToToolBar(); - QVERIFY(HbStubHelper::widgetActionsCount() == 3); + CntViewParameters::collectionView);*/ } -void TestCntFavoritesView::cleanupTestCase() + +void TestCntFavoritesView::cleanup() { + /*delete mFavoritesView; + mFavoritesView = 0; delete mViewManager; mViewManager = 0; - delete mWindow; - mWindow = 0; + mWindow->deleteLater();*/ } - -// EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupactionsview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupactionsview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupactionsview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -20,7 +20,7 @@ #include #include #include "cntgroupactionsview.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "hbstubs_helper.h" #include @@ -36,8 +36,10 @@ void TestCntGroupActionsView::createClasses() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mGroupActionsView = new CntGroupActionsView(mViewManager); + mWindow->addView(mGroupActionsView); + mWindow->setCurrentView(mGroupActionsView); // check that we have a view QVERIFY(mWindow != 0); @@ -47,9 +49,7 @@ void TestCntGroupActionsView::aboutToCloseView() { - - mGroupActionsView->aboutToCloseView(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); + } void TestCntGroupActionsView::editGroup() @@ -68,119 +68,21 @@ QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::groupEditorView); } -void TestCntGroupActionsView::groupMembers() -{ - // create a group - QContact firstGroup; - firstGroup.setType(QContactType::TypeGroup); - QContactName firstGroupName; - firstGroupName.setCustomLabel("groupname"); - firstGroup.saveDetail(&firstGroupName); - mGroupActionsView->contactManager()->saveContact(&firstGroup); - - mGroupActionsView->mGroupContact = &firstGroup; - - //call group members - mGroupActionsView->groupMembers(); - - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::groupMemberView); - -} - -void TestCntGroupActionsView::openNamesView() -{ - mGroupActionsView->openNamesView(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::namesView); -} - - - -void TestCntGroupActionsView::manageMembers() -{ - // create a group - QContact firstGroup; - firstGroup.setType(QContactType::TypeGroup); - QContactName firstGroupName; - firstGroupName.setCustomLabel("groupname"); - firstGroup.saveDetail(&firstGroupName); - mGroupActionsView->contactManager()->saveContact(&firstGroup); - - mGroupActionsView->mGroupContact = &firstGroup; - - //call group members - mGroupActionsView->groupMembers(); - - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::groupMemberView); - -} - -void TestCntGroupActionsView::editGroupDetails() -{ - // create a group - QContact firstGroup; - firstGroup.setType(QContactType::TypeGroup); - QContactName firstGroupName; - firstGroupName.setCustomLabel("groupname"); - firstGroup.saveDetail(&firstGroupName); - mGroupActionsView->contactManager()->saveContact(&firstGroup); - - mGroupActionsView->mGroupContact = &firstGroup; - - mGroupActionsView->editGroup(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::groupEditorView); -} - -void TestCntGroupActionsView::deleteGroup() -{ - - // create a group - QContact firstGroup; - firstGroup.setType(QContactType::TypeGroup); - QContactName firstGroupName; - firstGroupName.setCustomLabel("groupname"); - firstGroup.saveDetail(&firstGroupName); - mGroupActionsView->contactManager()->saveContact(&firstGroup); - mGroupActionsView->mGroupContact = &firstGroup; - - // create and save contact to the group - QContact firstContact; - firstContact.setType(QContactType::TypeContact); - mGroupActionsView->contactManager()->saveContact(&firstContact); - - QContactRelationship relationship; - relationship.setRelationshipType(QContactRelationship::HasMember); - relationship.setFirst(firstGroup.id()); - relationship.setSecond(firstContact.id()); - mGroupActionsView->contactManager()->saveRelationship(&relationship); - - // delete the group - mGroupActionsView->deleteGroup(); - - // do a group filter and check if group is there - QContactDetailFilter groupFilter; - groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); - groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup))); - - QList groupContactIds = mGroupActionsView->contactManager()->contacts(groupFilter); - int count = groupContactIds.count(); - - QVERIFY(groupContactIds.count() != 0); - -} - -void TestCntGroupActionsView::openCollections() -{ - mGroupActionsView->openCollections(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); -} - - void TestCntGroupActionsView::addActionsToToolBar() { HbStubHelper::reset(); mGroupActionsView->addActionsToToolBar(); - QVERIFY(HbStubHelper::widgetActionsCount() == 3); + QVERIFY(HbStubHelper::widgetActionsCount() == 0); +} + +void TestCntGroupActionsView::addMenuItems() +{ + + HbStubHelper::reset(); + mGroupActionsView->addMenuItems(); + + QVERIFY(HbStubHelper::widgetActionsCount() == 1); } @@ -195,7 +97,6 @@ mGroupActionsView->activateView(viewParameters); QVERIFY(mGroupActionsView->mGroupContact != 0); - QVERIFY(mGroupActionsView->mHeadingItem != 0); QVERIFY(mGroupActionsView->mDataContainer != 0); QVERIFY(mGroupActionsView->mScrollArea != 0); QVERIFY(mGroupActionsView->mContainerWidget != 0); @@ -217,7 +118,6 @@ mGroupActionsView->activateView(newViewParameters); QVERIFY(mGroupActionsView->mGroupContact != 0); - QVERIFY(mGroupActionsView->mHeadingItem != 0); QVERIFY(mGroupActionsView->mDataContainer != 0); QVERIFY(mGroupActionsView->mScrollArea != 0); QVERIFY(mGroupActionsView->mContainerWidget != 0); @@ -232,8 +132,10 @@ { delete mViewManager; mViewManager = 0; - delete mWindow; - mWindow = 0; + mWindow ->deleteLater(); + //mWindow = 0; + delete mGroupActionsView; + mGroupActionsView = 0; } // EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupdeletepopup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupdeletepopup.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,98 @@ +/* +* 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 +#include +#include +#include + +#include +#include "cntgroupdeletepopupmodel.h" + +#include "t_cntgroupdeletepopup.h" + +void TestCntGroupDeletePopup::init() +{ + // clear all contacts/groups from database + mManager = new QContactManager("symbian"); + + QList ids = mManager->contactIds(); + QMap errorMapHandle; + mManager->removeContacts(&ids,&errorMapHandle); + } + + + +void TestCntGroupDeletePopup::populateListOfGroup() +{ + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("groupname"); + firstGroup.saveDetail(&firstGroupName); + mManager->saveContact(&firstGroup); + + mPopup = new CntGroupDeletePopup(mManager); + mPopup->populateListOfGroup(); + QVERIFY(mPopup->mListView != 0); + QVERIFY(mPopup->mListView->selectionMode() == HbAbstractItemView::MultiSelection); + + } + + +void TestCntGroupDeletePopup::deleteGroup() +{ + // create a group + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("first gp"); + firstGroup.saveDetail(&firstGroupName); + mManager->saveContact(&firstGroup); + + mPopup = new CntGroupDeletePopup(mManager); + mPopup->populateListOfGroup(); + CntGroupDeletePopupModel *model = new CntGroupDeletePopupModel(mManager); + model->initializeGroupsList(); + QModelIndex index = model->index(0); + mPopup->mListView->selectionModel()->select(index, QItemSelectionModel::Select); + + mPopup->deleteGroup(); + + QContactDetailFilter groupFilter; + groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup))); + + QList groupContactIds = mManager->contactIds(groupFilter); + int count = groupContactIds.count(); + QVERIFY(count == 0); +} + + + +void TestCntGroupDeletePopup::cleanup() +{ + delete mPopup; + mPopup = 0; + QList ids = mManager->contactIds(); + mManager->removeContacts(&ids); + delete mManager; + mManager = 0; + } + + +// EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupdeletepopupmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupdeletepopupmodel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,186 @@ +/* +* 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 +#include + +#include "cntgroupdeletepopupmodel.h" +#include "t_cntgroupdeletepopupmodel.h" + +void TestCntGroupDeletePopupModel::init() +{ + // clear all contacts/groups from database + mManager = new QContactManager("symbian"); + QList ids = mManager->contactIds(); + mManager->removeContacts(&ids); + + mModel = new CntGroupDeletePopupModel(mManager); + QVERIFY(mModel->rowCount() == 0); + + +} + +void TestCntGroupDeletePopupModel::cleanup() +{ + delete mModel; + mModel = 0; + // clear all contacts/groups from database + QList ids = mManager->contactIds(); + mManager->removeContacts(&ids); + + delete mManager; +} + +void TestCntGroupDeletePopupModel::initializeGroupsList() +{ + // create a group and add two members in it + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("Favorites"); + firstGroup.saveDetail(&firstGroupName); + mManager->saveContact(&firstGroup); + + QContact secondGroup; + secondGroup.setType(QContactType::TypeGroup); + QContactName secondGroupName; + secondGroupName.setCustomLabel("groupOne"); + secondGroup.saveDetail(&secondGroupName); + mManager->saveContact(&secondGroup); + + QContact thirdGroup; + thirdGroup.setType(QContactType::TypeGroup); + QContactName thirdGroupName; + thirdGroupName.setCustomLabel("groupTwo"); + thirdGroup.saveDetail(&thirdGroupName); + mManager->saveContact(&thirdGroup); + + mModel->isFavoriteGroupCreated(); + mModel->initializeGroupsList(); + + QVERIFY(mModel->rowCount() == 2); //fav should not be listed +} + +void TestCntGroupDeletePopupModel::data() +{ + QVariant var; + + QModelIndex index = mModel->index(-1); // invalid index + var = mModel->data(index, Qt::DisplayRole); + QVERIFY(var.isNull()); + + index = mModel->index(100); // invalid index + var = mModel->data(index, Qt::DisplayRole); + QVERIFY(var.isNull()); + + QContact secondGroup; + secondGroup.setType(QContactType::TypeGroup); + QContactName secondGroupName; + secondGroupName.setCustomLabel("groupOne"); + secondGroup.saveDetail(&secondGroupName); + mManager->saveContact(&secondGroup); + + mModel->isFavoriteGroupCreated(); + mModel->initializeGroupsList(); + + index = mModel->index(0); // first user group + var = mModel->data(index, Qt::DisplayRole); + QVERIFY(var.canConvert()); + + var = mModel->data(index, Qt::UserRole); + QVERIFY(var.canConvert()); + + var = mModel->data(index, Qt::UserRole+1); + QVERIFY(var.isNull()); +} + +void TestCntGroupDeletePopupModel::isFavoriteGroupCreated() +{ + QVERIFY(mModel->isFavoriteGroupCreated() == false); + + // create a group and add two members in it + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("Favorites"); + firstGroup.saveDetail(&firstGroupName); + mManager->saveContact(&firstGroup); + + mModel->isFavoriteGroupCreated(); + + QVERIFY(mModel->isFavoriteGroupCreated() == true); +} + +void TestCntGroupDeletePopupModel::favoriteGroupId() +{ + QVERIFY(mModel->favoriteGroupId() == -1); + + // create a group and add two members in it + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("Favorites"); + firstGroup.saveDetail(&firstGroupName); + mManager->saveContact(&firstGroup); + + mModel->isFavoriteGroupCreated(); + mModel->initializeGroupsList(); + + int favGrpId = firstGroup.localId(); + + QVERIFY(mModel->favoriteGroupId() == favGrpId); +} + +void TestCntGroupDeletePopupModel::rowCount() +{ + QVERIFY(mModel->rowCount() == 0); + + // create a group and add two members in it + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("Group1"); + firstGroup.saveDetail(&firstGroupName); + mManager->saveContact(&firstGroup); + int favGrpId = firstGroup.localId(); + + mModel->isFavoriteGroupCreated(); + mModel->initializeGroupsList(); + + QVERIFY(mModel->rowCount() == 1); +} +void TestCntGroupDeletePopupModel::contact() +{ + + // create a group and add two members in it + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("GroupOne"); + firstGroup.saveDetail(&firstGroupName); + mManager->saveContact(&firstGroup); + + int groupId = firstGroup.localId(); + + mModel->isFavoriteGroupCreated(); + mModel->initializeGroupsList(); + QModelIndex index = mModel->index(0); + QContact group = mModel->contact(index); + + QVERIFY(group.localId() == groupId); +} + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupeditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupeditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupeditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -20,7 +20,7 @@ #include #include "cntgroupeditorview.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "t_cntgroupeditorview.h" @@ -34,7 +34,7 @@ void TestCntGroupEditorView::createClasses() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mGroupEditorView = new CntGroupEditorView(mViewManager, 0); mWindow->addView(mGroupEditorView); mWindow->setCurrentView(mGroupEditorView); @@ -58,8 +58,7 @@ // empty detail isn't saved mGroupEditorView->aboutToCloseView(); qDebug() << mGroupEditorView->mContact->details().count(); - QVERIFY(mGroupEditorView->mContact->details().count() == 1); - + QVERIFY(mGroupEditorView->mContact->details().count() == 0); // Group name groupName->setCustomLabel("Group Name"); @@ -87,6 +86,7 @@ //Check count is 2 QVERIFY(mGroupEditorView->formModel()->rowCount(QModelIndex()) == 2); + delete mGroupEditorView; mGroupEditorView = 0; } @@ -109,13 +109,12 @@ mGroupEditorView->initializeForm(); QVERIFY(mGroupEditorView->formModel()->rowCount(QModelIndex()) == 2); - } void TestCntGroupEditorView::cleanupTestCase() { - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); + //mWindow = 0; delete mViewManager; mViewManager = 0; delete mGroupEditorView; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupmemberselectionview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupmemberselectionview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupmemberselectionview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -63,7 +63,7 @@ mGroupMemberSelectionView->mContact = &firstGroup; mGroupMemberSelectionView->aboutToCloseView(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); + //QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); } void TestCntGroupMemberSelectionView::saveGroup() @@ -94,7 +94,7 @@ // Use relationship filter to get list of contacts in the relationship (if any) QContactRelationshipFilter filter; filter.setRelationshipType(QContactRelationship::HasMember); - filter.setRole(QContactRelationshipFilter::Second); // should be second here + filter.setRole(QContactRelationshipFilter::First); filter.setOtherParticipantId(firstContact.id()); QList mContactsList = mGroupMemberSelectionView->contactManager()->contacts(filter); @@ -119,7 +119,7 @@ void TestCntGroupMemberSelectionView::OnCancel() { mGroupMemberSelectionView->OnCancel(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); + //QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); } @@ -176,8 +176,5 @@ { delete mViewManager; mViewManager = 0; - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); } - -// EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupmemberview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupmemberview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupmemberview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,7 +21,7 @@ #include #include "cntgroupmemberview.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "hbstubs_helper.h" @@ -40,7 +40,7 @@ void TestCntGroupMemberView::createClasses() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mGroupMemberView = new CntGroupMemberView(mViewManager); mWindow->addView(mGroupMemberView); mWindow->setCurrentView(mGroupMemberView); @@ -53,18 +53,9 @@ void TestCntGroupMemberView::aboutToCloseView() { - // create a group - QContact firstGroup; - firstGroup.setType(QContactType::TypeGroup); - QContactName firstGroupName; - firstGroupName.setCustomLabel("groupname"); - firstGroup.saveDetail(&firstGroupName); - mGroupMemberView->contactManager()->saveContact(&firstGroup); - - mGroupMemberView->mGroupContact = &firstGroup; - - mGroupMemberView->aboutToCloseView(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::groupActionsView); + QFAIL( "Commented code below panic'd when executed." ); +// mGroupMemberView->aboutToCloseView(); + //QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); } @@ -147,16 +138,66 @@ void TestCntGroupMemberView::handleExecutedCommand() { mGroupMemberView->handleExecutedCommand("delete", QContact()); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); + //QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); } void TestCntGroupMemberView::addActionsToToolBar() { HbStubHelper::reset(); mGroupMemberView->addActionsToToolBar(); - QVERIFY(HbStubHelper::widgetActionsCount() == 2); + QVERIFY(HbStubHelper::widgetActionsCount() == 3); +} + +void TestCntGroupMemberView::groupActions() +{ + mGroupMemberView->groupActions(); + QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::groupActionsView); +} + + +/*! +Add actions to menu +*/ +void TestCntGroupMemberView::addMenuItems() +{ + HbStubHelper::reset(); + mGroupMemberView->addMenuItems(); + + QVERIFY(HbStubHelper::widgetActionsCount() == 1); + + } +void TestCntGroupMemberView::editContact() +{ + // create a group + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("groupname"); + firstGroup.saveDetail(&firstGroupName); + mGroupMemberView->contactManager()->saveContact(&firstGroup); + + // create and save contact to the group + QContact firstContact; + firstContact.setType(QContactType::TypeContact); + mGroupMemberView->contactManager()->saveContact(&firstContact); + + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(firstGroup.id()); + relationship.setSecond(firstContact.id()); + + mGroupMemberView->contactManager()->saveRelationship(&relationship); + + // get index of the contcat to be removed + //QModelIndex contactIndex = mGroupMemberView->listView()->model()->index(0, 0); + QModelIndex index = mGroupMemberView->contactModel()->indexOfContact(firstContact); + //remove from group + mGroupMemberView->editContact(index); + + QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::editView); +} void TestCntGroupMemberView::onLongPressed() { @@ -191,27 +232,6 @@ } -void TestCntGroupMemberView::viewDetailsOfGroupContact() -{ - - // create a contact - QContact firstContact; - firstContact.setType(QContactType::TypeContact); - mGroupMemberView->contactManager()->saveContact(&firstContact); - - QModelIndex index = mGroupMemberView->contactModel()->indexOfContact(firstContact); - - mGroupMemberView->viewDetailsOfGroupContact(index); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::commLauncherView); - -} - -void TestCntGroupMemberView::callNamesList() -{ - mGroupMemberView->callNamesList(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::namesView); -} - void TestCntGroupMemberView::editGroup() { @@ -285,8 +305,8 @@ { delete mViewManager; mViewManager = 0; - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); + mGroupMemberView = 0; } // EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupselectionpopup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupselectionpopup.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,270 @@ +/* +* 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 +#include +#include +#include + +#include + + +#include "t_cntgroupselectionpopup.h" + +void TestCntGroupSelectionPopup::init() +{ + // clear all contacts/groups from database + mManager = new QContactManager("symbian"); + + QList ids = mManager->contactIds(); + QMap errorMapHandle; + mManager->removeContacts(&ids,&errorMapHandle); + } + +void TestCntGroupSelectionPopup::populateListOfContact() +{ + // create and save contact to the group + QContact firstContact; + firstContact.setType(QContactType::TypeContact); + mManager->saveContact(&firstContact); + + // create a group + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("groupname"); + firstGroup.saveDetail(&firstGroupName); + mManager->saveContact(&firstGroup); + + mPopup = new CntGroupSelectionPopup(mManager, &firstGroup); + mPopup->populateListOfContact(); + + QVERIFY(mPopup->mListView != 0); + QVERIFY(mPopup->mListView->selectionMode() == HbAbstractItemView::MultiSelection); + deletePopup(); + +} + +void TestCntGroupSelectionPopup::saveNewGroup() +{ + // create a group + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("groupname"); + firstGroup.saveDetail(&firstGroupName); + bool ret= mManager->saveContact(&firstGroup); + + // create and save contact to the group + QContact firstContact; + firstContact.setType(QContactType::TypeContact); + ret= mManager->saveContact(&firstContact); + + // set selection model, and saveGroup + + mPopup = new CntGroupSelectionPopup(mManager, &firstGroup); + mPopup->populateListOfContact(); + + QModelIndex index = mPopup->mCntModel->indexOfContact(firstContact); + mPopup->mListView->selectionModel()->select(index, QItemSelectionModel::Select); + + mPopup->saveNewGroup(); + + // Use relationship filter to get list of contacts in the relationship (if any) + QContactRelationshipFilter filter; + filter.setRelationshipType(QContactRelationship::HasMember); + filter.setRelatedContactRole(QContactRelationshipFilter::First); + filter.setRelatedContactId(firstGroup.id()); + + QList mContactsList = mManager->contactIds(filter); + int count = mContactsList.count(); + QVERIFY(count == 1); + deletePopup(); +} + + + +void TestCntGroupSelectionPopup::saveOldGroup() +{ + // create a group and add two members in it + QContact firstGroup; + firstGroup.setType(QContactType::TypeGroup); + QContactName firstGroupName; + firstGroupName.setCustomLabel("groupname"); + firstGroup.saveDetail(&firstGroupName); + mManager->saveContact(&firstGroup); + + QContact firstGroupContact; + QContactName firstGroupContactName; + firstGroupContactName.setFirst("firstname"); + firstGroupContact.saveDetail(&firstGroupContactName); + mManager->saveContact(&firstGroupContact); + + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(firstGroup.id()); + relationship.setSecond(firstGroupContact.id()); + + // save relationship + mManager->saveRelationship(&relationship); + + QContact secondContact; + secondContact.setType(QContactType::TypeContact); + QContactName secondContactName; + secondContactName.setFirst("Secondname"); + secondContact.saveDetail(&secondContactName); + mManager->saveContact(&secondContact); + + // set selection model, and saveGroup + + mPopup = new CntGroupSelectionPopup(mManager, &firstGroup); + mPopup->populateListOfContact(); + + QModelIndex index = mPopup->mCntModel->indexOfContact(secondContact); + mPopup->mListView->selectionModel()->select(index, QItemSelectionModel::Select); + + mPopup->saveOldGroup(); + + // Use relationship filter to get list of contacts in the relationship (if any) + QContactRelationshipFilter filter; + filter.setRelationshipType(QContactRelationship::HasMember); + filter.setRelatedContactRole(QContactRelationshipFilter::First); + filter.setRelatedContactId(firstGroup.id()); + + QList mContactsList = mManager->contactIds(filter); + int count = mContactsList.count(); + QVERIFY(count == 2); + + delete mPopup; + mPopup = 0; + mPopup = new CntGroupSelectionPopup(mManager, &firstGroup); + mPopup->populateListOfContact(); + + index = mPopup->mCntModel->indexOfContact(firstGroupContact); + mPopup->mListView->selectionModel()->select(index, QItemSelectionModel::Deselect); + + mPopup->saveOldGroup(); + + // Use relationship filter to get list of contacts in the relationship (if any) + QContactRelationshipFilter filter2; + filter2.setRelationshipType(QContactRelationship::HasMember); + filter2.setRelatedContactRole(QContactRelationshipFilter::First); + filter2.setRelatedContactId(firstGroup.id()); + + mContactsList.clear(); + mContactsList = mManager->contactIds(filter2); + count = mContactsList.count(); + + QVERIFY(count == 1); + deletePopup(); +} + +void TestCntGroupSelectionPopup::closeFind() + { + // Create some group of contacts... + QContact dummyGroup; + dummyGroup.setType(QContactType::TypeGroup); + QContactName dummyGroupName; + dummyGroupName.setCustomLabel("groupname"); + dummyGroup.saveDetail(&dummyGroupName); + mManager->saveContact(&dummyGroup); + + mPopup = new CntGroupSelectionPopup(mManager, &dummyGroup); + + mPopup->closeFind(); + // Y need ? + //in src code its was mSearchPanel->deleteLater(); mSearchPanel = 0 ; + // since its delete later one should not set it to 0 + //QVERIFY(!mPopup->mSearchPanel); + QVERIFY(!mPopup->mEmptyListLabel); + + // Check that calling it for the second time + // doesn't break anything. + mPopup->closeFind(); + // QVERIFY(!mPopup->mSearchPanel); + QVERIFY(!mPopup->mEmptyListLabel); + deletePopup(); + } + +void TestCntGroupSelectionPopup::setFilter() + { + // Create some group of contacts... + QContact dummyGroup; + dummyGroup.setType(QContactType::TypeGroup); + QContactName dummyGroupName; + dummyGroupName.setCustomLabel("groupname"); + dummyGroup.saveDetail(&dummyGroupName); + mManager->saveContact(&dummyGroup); + + mPopup = new CntGroupSelectionPopup(mManager, &dummyGroup); + QList ids = mManager->contactIds(); + mManager->removeContacts(&ids); + + + QContact contact1; + QContactName name1; + name1.setFirst("abc"); + contact1.saveDetail(&name1); + + QContact contact2; + QContactName name2; + name2.setFirst("acb"); + contact2.saveDetail(&name2); + + mManager->saveContact(&contact1); + mManager->saveContact(&contact2); + + mPopup->populateListOfContact(); + + mPopup->setFilter(name2.first()); + + int count1 = mPopup->mCntModel->rowCount(); + + QVERIFY(!mPopup->mEmptyListLabel); + QVERIFY(mPopup->mCntModel->rowCount() == 1); + + mPopup->setFilter("abc"); + count1 = mPopup->mCntModel->rowCount(); + QVERIFY(!mPopup->mEmptyListLabel); + QVERIFY(mPopup->mCntModel->rowCount() == 1); + + mPopup->setFilter("abcd"); + count1 = mPopup->mCntModel->rowCount(); + QVERIFY(mPopup->mEmptyListLabel); + QVERIFY(mPopup->mCntModel->rowCount() == 0); + + mPopup->setFilter("abcde"); + count1 = mPopup->mCntModel->rowCount(); + QVERIFY(mPopup->mEmptyListLabel); + QVERIFY(mPopup->mCntModel->rowCount() == 0); + } + +void TestCntGroupSelectionPopup::cleanup() +{ + QList ids = mManager->contactIds(); + mManager->removeContacts(&ids); + delete mManager; + mManager = 0; + } + +void TestCntGroupSelectionPopup::deletePopup() + { + delete mPopup; + mPopup = 0; + } + +// EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntimageeditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntimageeditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntimageeditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,25 +21,25 @@ #include #include "cntimageeditorview.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "qthighway_stub_helper.h" void TestCntImageEditorView::initTestCase() { - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + /*mWindow = new CntMainWindow(0, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mImageEditorView = new CntImageEditorView(mViewManager); mWindow->addView(mImageEditorView); mWindow->setCurrentView(mImageEditorView); - QVERIFY(mImageEditorView != 0); + QVERIFY(mImageEditorView != 0);*/ } void TestCntImageEditorView::aboutToCloseView() { - QContact *contact= new QContact(); + /*QContact *contact= new QContact(); QContactAvatar *avatar = new QContactAvatar(); mImageEditorView->mAvatar = avatar; mImageEditorView->mContact = contact; @@ -57,13 +57,13 @@ mWindow->removeView(mImageEditorView); mImageEditorView = new CntImageEditorView(mViewManager); - QVERIFY(mImageEditorView != 0); + QVERIFY(mImageEditorView != 0);*/ } void TestCntImageEditorView::activateView() { // no avatar set - CntViewParameters params(CntViewParameters::namesView, CntViewParameters::collectionView); // these don't matter.. + /*CntViewParameters params(CntViewParameters::namesView, CntViewParameters::collectionView); // these don't matter.. QContact contact; params.setSelectedContact(contact); @@ -91,24 +91,24 @@ mImageEditorView->activateView(params2); QVERIFY(mImageEditorView->mAvatar != 0); - QVERIFY(mImageEditorView->mAvatar->avatar() == "dummypath"); + QVERIFY(mImageEditorView->mAvatar->avatar() == "dummypath");*/ } void TestCntImageEditorView::openGallery() { - QtHighwayStubHelper::reset(); + /*QtHighwayStubHelper::reset(); mImageEditorView->openGallery(); QVERIFY(QtHighwayStubHelper::service() == "com.nokia.services.media"); QVERIFY(QtHighwayStubHelper::message() == "image"); QVERIFY(QtHighwayStubHelper::operation() == "fetch(QVariantMap,QVariant)"); delete mImageEditorView; - mImageEditorView = 0; + mImageEditorView = 0;*/ } void TestCntImageEditorView::handleImageChange() { - mImageEditorView = new CntImageEditorView(mViewManager); + /*mImageEditorView = new CntImageEditorView(mViewManager); QVERIFY(mImageEditorView != 0); QContact *contact= new QContact(); @@ -129,17 +129,16 @@ var2.setValue(temp); mImageEditorView->handleImageChange(var2); - QVERIFY(mImageEditorView->mAvatar->avatar() == "test"); + QVERIFY(mImageEditorView->mAvatar->avatar() == "test");*/ } void TestCntImageEditorView::cleanupTestCase() { - delete mWindow; - mWindow = 0; + /*mWindow->deleteLater(); delete mViewManager; mViewManager = 0; delete mImageEditorView; - mImageEditorView = 0; + mImageEditorView = 0;*/ } // EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmainwindow.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmainwindow.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmainwindow.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -35,9 +35,6 @@ mWindow = new CntMainWindow(); QVERIFY(mWindow != 0); QVERIFY(mWindow->mViewManager != 0); - delete mWindow; - mWindow = 0; - mWindow = new CntMainWindow(0, CntViewParameters::noView); QVERIFY(mWindow != 0); QVERIFY(mWindow->mViewManager == 0); @@ -65,8 +62,7 @@ void TestCntMainWindow::cleanupTestCase() { - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); } // EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmycardselectionview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmycardselectionview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmycardselectionview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,9 +21,8 @@ #include #include -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" -#include "cntcollectionview.h" void TestCntMyCardSelectionView::initTestCase() { @@ -35,7 +34,7 @@ void TestCntMyCardSelectionView::createClasses() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mMyCardSelectionView = new CntMyCardSelectionView(mViewManager, 0); mWindow->addView(mMyCardSelectionView); mWindow->setCurrentView(mMyCardSelectionView); @@ -48,9 +47,11 @@ void TestCntMyCardSelectionView::aboutToCloseView() { - mViewManager->previousViewParameters().setNextViewId(CntViewParameters::collectionView); + CntViewParameters args; + mViewManager->back( args ); + mMyCardSelectionView->aboutToCloseView(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); + //QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); this can't be right anyways? } void TestCntMyCardSelectionView::onListViewActivated() @@ -79,7 +80,7 @@ QModelIndex notEmpty = mMyCardSelectionView->contactModel()->indexOfContact(contact); mMyCardSelectionView->onListViewActivated(notEmpty); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::namesView); + QVERIFY(mMyCardSelectionView->contactManager()->selfContactId() == contact.localId()); } @@ -87,8 +88,5 @@ { delete mViewManager; mViewManager = 0; - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); } - -// EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmycardview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmycardview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmycardview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,7 +21,7 @@ #include #include "cntmycardview.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "hbstubs_helper.h" @@ -37,87 +37,86 @@ void TestCntMyCardView::createClasses() { - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); - mMyCardView = new CntMyCardView(mViewManager); - mWindow->addView(mMyCardView); - mWindow->setCurrentView(mMyCardView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mMyCardView != 0); +// mWindow = new CntMainWindow(0, CntViewParameters::noView); +// mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); +// mMyCardView = new CntMyCardView(mViewManager); +// mWindow->addView(mMyCardView); +// mWindow->setCurrentView(mMyCardView); +// +// // check that we have a view +// QVERIFY(mWindow != 0); +// QVERIFY(mViewManager != 0); +// QVERIFY(mMyCardView != 0); } void TestCntMyCardView::activateView() { - QList ids = mMyCardView->contactManager()->contacts(); - mMyCardView->contactManager()->removeContacts(&ids); - - CntViewParameters viewParameters(CntViewParameters::noView); - - mMyCardView->activateView(viewParameters); - QVERIFY(!mMyCardView->findWidget("cnt_button_choose")->isEnabled()); - - mWindow->removeView(mMyCardView); - delete mMyCardView; - mMyCardView = 0; - - mMyCardView = new CntMyCardView(mViewManager); - mWindow->addView(mMyCardView); - mWindow->setCurrentView(mMyCardView); - - QContact contact; - QContactName name; - name.setFirst("first"); - contact.saveDetail(&name); - mMyCardView->contactManager()->saveContact(&contact); - - mMyCardView->activateView(viewParameters); - QVERIFY(mMyCardView->findWidget("cnt_button_choose")->isEnabled()); +// QList ids = mMyCardView->contactManager()->contacts(); +// mMyCardView->contactManager()->removeContacts(&ids); +// +// CntViewParameters viewParameters(CntViewParameters::noView); +// +// mMyCardView->activateView(viewParameters); +// QVERIFY(!mMyCardView->findWidget("cnt_button_choose")->isEnabled()); +// +// mWindow->removeView(mMyCardView); +// delete mMyCardView; +// mMyCardView = 0; +// +// mMyCardView = new CntMyCardView(mViewManager); +// mWindow->addView(mMyCardView); +// mWindow->setCurrentView(mMyCardView); +// +// QContact contact; +// QContactName name; +// name.setFirst("first"); +// contact.saveDetail(&name); +// mMyCardView->contactManager()->saveContact(&contact); +// +// mMyCardView->activateView(viewParameters); +// QVERIFY(mMyCardView->findWidget("cnt_button_choose")->isEnabled()); } void TestCntMyCardView::openNameEditor() { - mMyCardView->openNameEditor(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::editView); - QVERIFY(mMyCardView->contactManager()->selfContactId() != 0); +// mMyCardView->openNameEditor(); +// QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::editView); +// QVERIFY(mMyCardView->contactManager()->selfContactId() != 0); } void TestCntMyCardView::openMyCardSelectionView() { - mWindow->removeView(mWindow->currentView()); - delete mMyCardView; - mMyCardView = 0; - - mMyCardView = new CntMyCardView(mViewManager); - mWindow->addView(mMyCardView); - mWindow->setCurrentView(mMyCardView); - - mMyCardView->openMyCardSelectionView(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::myCardSelectionView); +// mWindow->removeView(mWindow->currentView()); +// delete mMyCardView; +// mMyCardView = 0; +// +// mMyCardView = new CntMyCardView(mViewManager); +// mWindow->addView(mMyCardView); +// mWindow->setCurrentView(mMyCardView); +// +// mMyCardView->openMyCardSelectionView(); +// QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::myCardSelectionView); } void TestCntMyCardView::aboutToCloseView() { - mWindow->removeView(mWindow->currentView()); - delete mMyCardView; - mMyCardView = 0; - - mMyCardView = new CntMyCardView(mViewManager); - mWindow->addView(mMyCardView); - mWindow->setCurrentView(mMyCardView); - - mMyCardView->aboutToCloseView(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::namesView); +// mWindow->removeView(mWindow->currentView()); +// delete mMyCardView; +// mMyCardView = 0; +// +// mMyCardView = new CntMyCardView(mViewManager); +// mWindow->addView(mMyCardView); +// mWindow->setCurrentView(mMyCardView); +// +// mMyCardView->aboutToCloseView(); +// QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::namesView); } void TestCntMyCardView::cleanupTestCase() { - delete mViewManager; - mViewManager = 0; - delete mWindow; - mWindow = 0; +// delete mViewManager; +// mViewManager = 0; +// mWindow->deleteLater(); } // EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntnameseditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntnameseditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntnameseditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -20,7 +20,7 @@ #include #include "cntnameseditorview.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "t_cntnameseditorview.h" @@ -34,7 +34,7 @@ void TestCntNamesEditorView::createClasses() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mNamesEditorView = new CntNamesEditorView(mViewManager, 0); mWindow->addView(mNamesEditorView); mWindow->setCurrentView(mNamesEditorView); @@ -141,8 +141,7 @@ void TestCntNamesEditorView::cleanupTestCase() { - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); delete mViewManager; mViewManager = 0; delete mNamesEditorView; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntnamesview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntnamesview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,234 +0,0 @@ -/* -* 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 -#include -#include - -#include "cntnamesview.h" -#include "cntviewmanager.h" -#include "cntmainwindow.h" -#include "t_cntnamesview.h" - -#include "hbstubs_helper.h" - -void TestCntNamesView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mNamesView = 0; -} - -void TestCntNamesView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); - mNamesView = new CntNamesView(mViewManager, 0); - mWindow->addView(mNamesView); - mWindow->setCurrentView(mNamesView); - - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mNamesView != 0); -} - -void TestCntNamesView::addActionsToToolBar() -{ - HbStubHelper::reset(); - mNamesView->addActionsToToolBar(); - QVERIFY(HbStubHelper::widgetActionsCount() == 4); -} - -void TestCntNamesView::addMenuItems() -{ - HbStubHelper::reset(); - mNamesView->addMenuItems(); - QVERIFY(HbStubHelper::widgetActionsCount() == 2); -} - -void TestCntNamesView::openCollections() -{ - mNamesView->openCollections(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); -} - -void TestCntNamesView::handleExecutedCommand() -{ - cleanupTestCase(); - createClasses(); - - QContact contact; - HbStubHelper::reset(); - mNamesView->handleExecutedCommand("dummy", contact); - QVERIFY(!HbStubHelper::notificationDialogOpened()); - - HbStubHelper::reset(); - mNamesView->handleExecutedCommand("delete", contact); - QVERIFY(HbStubHelper::notificationDialogOpened()); -} - -void TestCntNamesView::activateView() -{ - cleanupTestCase(); - createClasses(); - - QList ids = mNamesView->contactManager()->contacts(); - mNamesView->contactManager()->removeContacts(&ids); - - QContact contact; - QContactName name; - name.setFirst("first"); - contact.saveDetail(&name); - mNamesView->contactManager()->saveContact(&contact); - - HbStubHelper::reset(); - CntViewParameters viewParameters(CntViewParameters::noView); - mNamesView->activateView(viewParameters); - QVERIFY(mNamesView->mSoftKeyBackAction == mWindow->softKeyAction(Hb::SecondarySoftKey)); - QVERIFY(!HbStubHelper::notificationDialogOpened()); - - cleanupTestCase(); - createClasses(); - - HbStubHelper::reset(); - viewParameters.setSelectedAction("delete"); - mNamesView->activateView(viewParameters); - QVERIFY(HbStubHelper::notificationDialogOpened()); - - cleanupTestCase(); - createClasses(); - - HbStubHelper::reset(); - viewParameters.setSelectedAction("failed"); - mNamesView->activateView(viewParameters); - QVERIFY(HbStubHelper::notificationDialogOpened()); - - cleanupTestCase(); - createClasses(); - - HbStubHelper::reset(); - viewParameters.setSelectedAction("save"); - viewParameters.setSelectedContact(contact); - mNamesView->setDataModel(); // required for the list to have a model... - mNamesView->activateView(viewParameters); - QVERIFY(HbStubHelper::notificationDialogOpened()); -} - -void TestCntNamesView::showFind() -{ - cleanupTestCase(); - createClasses(); - - mNamesView->showFind(); - QVERIFY(mNamesView->mSearchPanel); - QVERIFY(mNamesView->banner()->isVisible()); - QVERIFY(!mNamesView->contactModel()->myCardStatus()); - QVERIFY(!mNamesView->toolBar()->isVisible()); - - // calling it a second time shouldn't break it - mNamesView->showFind(); - QVERIFY(mNamesView->mSearchPanel); - QVERIFY(mNamesView->banner()->isVisible()); - QVERIFY(!mNamesView->contactModel()->myCardStatus()); - QVERIFY(!mNamesView->toolBar()->isVisible()); -} - -void TestCntNamesView::closeFind() -{ - cleanupTestCase(); - createClasses(); - - mNamesView->showFind(); // make find pane visible first - - mNamesView->closeFind(); - QVERIFY(!mNamesView->mSearchPanel); - QVERIFY(!mNamesView->mEmptyListLabel); - QVERIFY(!mNamesView->banner()->isVisible()); - QVERIFY(mNamesView->contactModel()->myCardStatus()); - QVERIFY(mNamesView->toolBar()->isVisible()); - - // calling it a second time shouldn't break it deAc - mNamesView->closeFind(); - QVERIFY(!mNamesView->mSearchPanel); - QVERIFY(!mNamesView->mEmptyListLabel); - QVERIFY(!mNamesView->banner()->isVisible()); - QVERIFY(mNamesView->contactModel()->myCardStatus()); - QVERIFY(mNamesView->toolBar()->isVisible()); -} - -void TestCntNamesView::deActivateView() -{ - cleanupTestCase(); - createClasses(); - - mNamesView->showFind(); // make find pane visible first - - mNamesView->deActivateView(); - QVERIFY(!mNamesView->mSearchPanel); - QVERIFY(!mNamesView->mEmptyListLabel); - QVERIFY(!mNamesView->banner()->isVisible()); - QVERIFY(mNamesView->contactModel()->myCardStatus()); - QVERIFY(mNamesView->toolBar()->isVisible()); -} - -void TestCntNamesView::setFilter() -{ - cleanupTestCase(); - createClasses(); - - QList ids = mNamesView->contactManager()->contacts(); - mNamesView->contactManager()->removeContacts(&ids); - - QContact contact1; - QContactName name1; - name1.setFirst("abc"); - contact1.saveDetail(&name1); - - QContact contact2; - QContactName name2; - name2.setFirst("acb"); - contact2.saveDetail(&name2); - - mNamesView->contactManager()->saveContact(&contact1); - mNamesView->contactManager()->saveContact(&contact2); - - mNamesView->showFind(); // calls setFilter(QString()) - QVERIFY(!mNamesView->mEmptyListLabel); - QVERIFY(mNamesView->contactModel()->rowCount() == 2); - - mNamesView->setFilter("abc"); - QVERIFY(!mNamesView->mEmptyListLabel); - QVERIFY(mNamesView->contactModel()->rowCount() == 1); - - mNamesView->setFilter("abcd"); - QVERIFY(mNamesView->mEmptyListLabel); - QVERIFY(mNamesView->contactModel()->rowCount() == 0); - - mNamesView->setFilter("abcde"); - QVERIFY(mNamesView->mEmptyListLabel); - QVERIFY(mNamesView->contactModel()->rowCount() == 0); -} - -void TestCntNamesView::cleanupTestCase() -{ - delete mViewManager; - mViewManager = 0; - delete mWindow; - mWindow = 0; -} - -// EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntnavigator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntnavigator.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,92 @@ +/* +* 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 "t_cntnavigator.h" +#include "cntviewnavigator.h" +T_NavigatorTest::T_NavigatorTest() : QObject() +{ + +} + +T_NavigatorTest::~T_NavigatorTest() +{ + +} + +void T_NavigatorTest::init() +{ + mNavigator = new CntViewNavigator( NULL ); +} + +void T_NavigatorTest::cleanup() +{ + delete mNavigator; +} + + void T_NavigatorTest::testWithoutExceptions() + { + mNavigator->next( CntViewParameters::namesView ); + mNavigator->next( CntViewParameters::commLauncherView ); + QCOMPARE( mNavigator->back(), CntViewParameters::namesView ); + QCOMPARE( mNavigator->back(), CntViewParameters::noView ); + + mNavigator->next( CntViewParameters::namesView ); + mNavigator->next( CntViewParameters::commLauncherView ); + mNavigator->next( CntViewParameters::editView ); + + QCOMPARE( mNavigator->back(), CntViewParameters::commLauncherView ); + QCOMPARE( mNavigator->back(), CntViewParameters::namesView ); + QCOMPARE( mNavigator->back(), CntViewParameters::noView ); + + mNavigator->next( CntViewParameters::namesView ); + mNavigator->next( CntViewParameters::commLauncherView ); + mNavigator->next( CntViewParameters::editView ); + + QCOMPARE( mNavigator->back(), CntViewParameters::commLauncherView ); + + mNavigator->next( CntViewParameters::emailEditorView ); + mNavigator->next( CntViewParameters::addressEditorView ); + + QCOMPARE( mNavigator->back(), CntViewParameters::emailEditorView ); + QCOMPARE( mNavigator->back(), CntViewParameters::commLauncherView ); + QCOMPARE( mNavigator->back(), CntViewParameters::namesView ); + QCOMPARE( mNavigator->back(), CntViewParameters::noView ); + } + + void T_NavigatorTest::testWithExecptions() + { + mNavigator->addException( CntViewParameters::editView, CntViewParameters::namesView ); + + mNavigator->next( CntViewParameters::namesView ); + mNavigator->next( CntViewParameters::commLauncherView ); + mNavigator->next( CntViewParameters::editView ); + + QCOMPARE( mNavigator->back(), CntViewParameters::namesView ); + mNavigator->next( CntViewParameters::commLauncherView ); + QCOMPARE( mNavigator->back(), CntViewParameters::namesView ); + QCOMPARE( mNavigator->back(), CntViewParameters::noView ); + + mNavigator->removeException( CntViewParameters::editView ); + + mNavigator->next( CntViewParameters::namesView ); + mNavigator->next( CntViewParameters::commLauncherView ); + mNavigator->next( CntViewParameters::editView ); + + QCOMPARE( mNavigator->back(), CntViewParameters::commLauncherView ); + QCOMPARE( mNavigator->back(), CntViewParameters::namesView ); + QCOMPARE( mNavigator->back(), CntViewParameters::noView ); + } +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntonlineaccounteditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntonlineaccounteditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntonlineaccounteditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,7 +21,7 @@ #include #include "cntonlineaccounteditorview.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "t_cntonlineaccounteditorview.h" @@ -35,7 +35,7 @@ void TestCntOnlineAccountEditorView::createClasses() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mOnlineAccountEditorView = new CntOnlineAccountEditorView(mViewManager, 0); mWindow->addView(mOnlineAccountEditorView); mWindow->setCurrentView(mOnlineAccountEditorView); @@ -161,8 +161,7 @@ void TestCntOnlineAccountEditorView::cleanupTestCase() { - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); delete mViewManager; mViewManager = 0; delete mOnlineAccountEditorView; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntphonenumbereditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntphonenumbereditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntphonenumbereditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -20,7 +20,7 @@ #include #include "cntphonenumbereditorview.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "t_cntphonenumbereditorview.h" @@ -34,7 +34,7 @@ void TestCntPhoneNumberEditorView::createClasses() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mPhoneNumberEditorView = new CntPhoneNumberEditorView(mViewManager, 0); mWindow->addView(mPhoneNumberEditorView); mWindow->setCurrentView(mPhoneNumberEditorView); @@ -157,8 +157,7 @@ void TestCntPhoneNumberEditorView::cleanupTestCase() { - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); delete mViewManager; mViewManager = 0; delete mPhoneNumberEditorView; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cnturleditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cnturleditorview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cnturleditorview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -21,7 +21,7 @@ #include #include "cnturleditorview.h" -#include "cntviewmanager.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "t_cnturleditorview.h" @@ -35,7 +35,7 @@ void TestCntUrlEditorView::createClasses() { mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); mUrlEditorView = new CntUrlEditorView(mViewManager, 0); mWindow->addView(mUrlEditorView); mWindow->setCurrentView(mUrlEditorView); @@ -154,8 +154,7 @@ void TestCntUrlEditorView::cleanupTestCase() { - delete mWindow; - mWindow = 0; + mWindow->deleteLater(); delete mViewManager; mViewManager = 0; delete mUrlEditorView; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntviewmanager.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntviewmanager.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntviewmanager.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -20,8 +20,8 @@ #include #include -#include "cntcollectionview.h" -#include "cntviewmanager.h" +#include "cnthistoryview.h" +#include "cntdefaultviewmanager.h" #include "cntmainwindow.h" #include "cntbaseview.h" @@ -39,11 +39,11 @@ void TestCntViewManager::createViewManager() { mMainWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mMainWindow); + mViewManager = new CntDefaultViewManager(mMainWindow, CntViewParameters::defaultView); QVERIFY(mViewManager->mDefaultView == mViewManager->getView(CntViewParameters::namesView)); - QVERIFY(mViewManager->mDefaultViewId == CntViewParameters::namesView); - QVERIFY(mMainWindow->currentView() == mViewManager->mDefaultView); + // QVERIFY(mViewManager->mDefaultViewId == CntViewParameters::namesView); + // QVERIFY(mMainWindow->currentView() == mViewManager->mDefaultView); } void TestCntViewManager::mainWindow() @@ -56,83 +56,83 @@ void TestCntViewManager::setDefaultView() { // this should do nothing, check that namesView is still there - mViewManager->setDefaultView(CntViewParameters::noView); - QVERIFY(mViewManager->mDefaultView == mViewManager->getView(CntViewParameters::namesView)); - QVERIFY(mViewManager->mDefaultViewId == CntViewParameters::namesView); - QVERIFY(mMainWindow->currentView() == mViewManager->mDefaultView); + //mViewManager->setDefaultView(CntViewParameters::noView); + //QVERIFY(mViewManager->mDefaultView == mViewManager->getView(CntViewParameters::namesView)); + //QVERIFY(mViewManager->mDefaultViewId == CntViewParameters::namesView); + //QVERIFY(mMainWindow->currentView() == mViewManager->mDefaultView); // this shouldn't do any re-assigning either since namesView is the default view already - mViewManager->setDefaultView(CntViewParameters::namesView); - QVERIFY(mViewManager->mDefaultView == mViewManager->getView(CntViewParameters::namesView)); - QVERIFY(mViewManager->mDefaultViewId == CntViewParameters::namesView); - QVERIFY(mMainWindow->currentView() == mViewManager->mDefaultView); + //mViewManager->setDefaultView(CntViewParameters::namesView); + //QVERIFY(mViewManager->mDefaultView == mViewManager->getView(CntViewParameters::namesView)); + //QVERIFY(mViewManager->mDefaultViewId == CntViewParameters::namesView); + //QVERIFY(mMainWindow->currentView() == mViewManager->mDefaultView); - mViewManager->setDefaultView(CntViewParameters::collectionView); - QVERIFY(mViewManager->mDefaultView == mViewManager->getView(CntViewParameters::collectionView)); - QVERIFY(mViewManager->mDefaultViewId == CntViewParameters::collectionView); - QVERIFY(mMainWindow->currentView() == mViewManager->mDefaultView); + //mViewManager->setDefaultView(CntViewParameters::historyView); + //QVERIFY(mViewManager->mDefaultView == mViewManager->getView(CntViewParameters::historyView)); + //QVERIFY(mViewManager->mDefaultViewId == CntViewParameters::historyView); + //QVERIFY(mMainWindow->currentView() == mViewManager->mDefaultView); } void TestCntViewManager::setPreviousViewParameters() { - CntViewParameters viewParameters(CntViewParameters::namesView); - mViewManager->setPreviousViewParameters(mViewManager->getView(CntViewParameters::collectionView), viewParameters); - - QVERIFY(mViewManager->previousViewParameters().nextViewId() == CntViewParameters::collectionView); - QVERIFY(mViewManager->previousViewParameters().previousViewId() == viewParameters.nextViewId()); - - CntViewParameters params(CntViewParameters::editView); - mViewManager->setPreviousViewParameters(0, params); - - // verify that nothing was changed - QVERIFY(mViewManager->previousViewParameters().nextViewId() == CntViewParameters::collectionView); - QVERIFY(mViewManager->previousViewParameters().previousViewId() == viewParameters.nextViewId()); +// CntViewParameters viewParameters(CntViewParameters::namesView); +// mViewManager->setPreviousViewParameters(mViewManager->getView(CntViewParameters::collectionView), viewParameters); +// +// QVERIFY(mViewManager->previousViewParameters().nextViewId() == CntViewParameters::collectionView); +// QVERIFY(mViewManager->previousViewParameters().previousViewId() == viewParameters.nextViewId()); +// +// CntViewParameters params(CntViewParameters::editView); +// mViewManager->setPreviousViewParameters(0, params); +// +// // verify that nothing was changed +// QVERIFY(mViewManager->previousViewParameters().nextViewId() == CntViewParameters::collectionView); +// QVERIFY(mViewManager->previousViewParameters().previousViewId() == viewParameters.nextViewId()); } void TestCntViewManager::onActivateViewId() { - delete mViewManager; - delete mMainWindow; - mViewManager = 0; - mMainWindow = 0; - - mMainWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mMainWindow, CntViewParameters::collectionView); - - QVERIFY(static_cast(mMainWindow->currentView())->viewId() != - CntViewParameters::myCardView); - - mViewManager->onActivateView(static_cast(CntViewParameters::myCardView)); - - QVERIFY(static_cast(mMainWindow->currentView())->viewId() == - CntViewParameters::myCardView); +// delete mViewManager; +// delete mMainWindow; +// mViewManager = 0; +// mMainWindow = 0; +// +// mMainWindow = new CntMainWindow(0, CntViewParameters::noView); +// mViewManager = new CntDefaultViewManager(mMainWindow, CntViewParameters::collectionView); +// +// QVERIFY(static_cast(mMainWindow->currentView())->viewId() != +// CntViewParameters::myCardView); +// +// mViewManager->onActivateView(static_cast(CntViewParameters::myCardView)); +// +// QVERIFY(static_cast(mMainWindow->currentView())->viewId() == +// CntViewParameters::myCardView); } void TestCntViewManager::onActivateViewParams() { - // activating an empty view does nothing, just here to verify it - CntViewParameters viewParameters(CntViewParameters::noView); - mViewManager->onActivateView(viewParameters); - - QVERIFY(static_cast(mMainWindow->currentView())->viewId() != - CntViewParameters::myCardSelectionView); - - CntViewParameters viewParameters2(CntViewParameters::myCardSelectionView); - mViewManager->onActivateView(viewParameters2); - - QVERIFY(static_cast(mMainWindow->currentView())->viewId() == - CntViewParameters::myCardSelectionView); +// // activating an empty view does nothing, just here to verify it +// CntViewParameters viewParameters(CntViewParameters::noView); +// mViewManager->onActivateView(viewParameters); +// +// QVERIFY(static_cast(mMainWindow->currentView())->viewId() != +// CntViewParameters::myCardSelectionView); +// +// CntViewParameters viewParameters2(CntViewParameters::myCardSelectionView); +// mViewManager->onActivateView(viewParameters2); +// +// QVERIFY(static_cast(mMainWindow->currentView())->viewId() == +// CntViewParameters::myCardSelectionView); } void TestCntViewManager::onActivatePreviousView() { - QVERIFY(static_cast(mMainWindow->currentView())->viewId() != - CntViewParameters::myCardView); - - mViewManager->onActivatePreviousView(); - - QVERIFY(static_cast(mMainWindow->currentView())->viewId() == - CntViewParameters::myCardView); +// QVERIFY(static_cast(mMainWindow->currentView())->viewId() != +// CntViewParameters::myCardView); +// +// mViewManager->onActivatePreviousView(); +// +// QVERIFY(static_cast(mMainWindow->currentView())->viewId() == +// CntViewParameters::myCardView); } void TestCntViewManager::addViewToWindow() @@ -143,12 +143,12 @@ mMainWindow = 0; mMainWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mMainWindow, CntViewParameters::noView); + mViewManager = new CntDefaultViewManager(mMainWindow, CntViewParameters::noView); mViewManager->addViewToWindow(0); QVERIFY(mMainWindow->currentView() == 0); - CntBaseView *view = new CntCollectionView(mViewManager); + CntBaseView *view = new CntHistoryView(mViewManager); mViewManager->addViewToWindow(view); @@ -173,29 +173,9 @@ mMainWindow = 0; mMainWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mMainWindow, CntViewParameters::noView); - - CntBaseView *view = mViewManager->getView(CntViewParameters::namesView); - QVERIFY(view->viewId() == CntViewParameters::namesView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::collectionView); - QVERIFY(view->viewId() == CntViewParameters::collectionView); - delete view; - view = 0; + mViewManager = new CntDefaultViewManager(mMainWindow, CntViewParameters::noView); - view = mViewManager->getView(CntViewParameters::collectionFavoritesView); - QVERIFY(view->viewId() == CntViewParameters::collectionFavoritesView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::collectionFavoritesSelectionView); - QVERIFY(view->viewId() == CntViewParameters::collectionFavoritesSelectionView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::commLauncherView); + CntBaseView *view = mViewManager->getView(CntViewParameters::commLauncherView); QVERIFY(view->viewId() == CntViewParameters::commLauncherView); delete view; view = 0; @@ -250,11 +230,6 @@ delete view; view = 0; - view = mViewManager->getView(CntViewParameters::imageEditorView); - QVERIFY(view->viewId() == CntViewParameters::imageEditorView); - delete view; - view = 0; - view = mViewManager->getView(CntViewParameters::editView); QVERIFY(view->viewId() == CntViewParameters::editView); delete view; @@ -265,11 +240,6 @@ delete view; view = 0; - view = mViewManager->getView(CntViewParameters::myCardView); - QVERIFY(view->viewId() == CntViewParameters::myCardView); - delete view; - view = 0; - view = mViewManager->getView(CntViewParameters::groupEditorView); QVERIFY(view->viewId() == CntViewParameters::groupEditorView); delete view; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntviewparameters.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntviewparameters.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntviewparameters.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -41,9 +41,9 @@ void TestCntViewParameters::setNextViewId() { - CntViewParameters params(CntViewParameters::namesView, CntViewParameters::collectionView); - params.setNextViewId(CntViewParameters::editView); - QVERIFY(params.nextViewId() == CntViewParameters::editView); + //CntViewParameters params(CntViewParameters::namesView, CntViewParameters::collectionView); + //params.setNextViewId(CntViewParameters::editView); + //QVERIFY(params.nextViewId() == CntViewParameters::editView); } void TestCntViewParameters::setPreviousViewId() diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_companyeditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_companyeditor.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,113 @@ +/* +* 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 "t_companyeditor.h" +#include "cntcompanyeditormodel.h" +#include "cntdetailconst.h" +#include +#include + +#include +#include +#include + +void T_CompanyEditorTest::init() + { + mContact = new QContact(); + mForm = new HbDataForm(); + } + +void T_CompanyEditorTest::cleanup() + { + delete mForm; + } + +void T_CompanyEditorTest::testCompanyModelWithDefaultData() + { + CntCompanyEditorModel* model = new CntCompanyEditorModel( mContact ); + mForm->setModel( model ); + + HbDataFormModelItem* company = model->itemFromIndex( model->index(0, 0) ); + QCOMPARE( company->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( company->label(), QString("Company") ); + QVERIFY( company->contentWidgetData("maxLength") == CNT_ORGANIZATION_MAXLENGTH ); + + HbDataFormModelItem* jobTitle = model->itemFromIndex( model->index(1, 0) ); + QCOMPARE( jobTitle->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( jobTitle->label(), QString("Job title") ); + QVERIFY( jobTitle->contentWidgetData("maxLength") == CNT_JOBTITLE_MAXLENGTH ); + + HbDataFormModelItem* department = model->itemFromIndex( model->index(2, 0) ); + QCOMPARE( department->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( department->label(), QString("Department") ); + QVERIFY( department->contentWidgetData("maxLength") == CNT_DEPARTMENT_MAXLENGTH ); + + HbDataFormModelItem* assistant = model->itemFromIndex( model->index(3, 0) ); + QCOMPARE( assistant->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( assistant->label(), QString("Assistant name") ); + QVERIFY( assistant->contentWidgetData("maxLength") == CNT_ASSISTANT_MAXLENGTH ); + } + +void T_CompanyEditorTest::testCompanyModelWithData() + { + QContactOrganization* org = new QContactOrganization(); + org->setName( "Nokia" ); + org->setTitle( "Software Developer" ); + org->setAssistantName( "No Assistant" ); + + QStringList departments; + departments << "Devices"; + org->setDepartment( departments ); + + mContact->saveDetail( org ); + + CntCompanyEditorModel* model = new CntCompanyEditorModel( mContact ); + mForm->setModel( model ); + + HbDataFormModelItem* company = model->itemFromIndex( model->index(0, 0) ); + QCOMPARE( company->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( company->label(), QString("Company") ); + QVERIFY( company->contentWidgetData("text") == "Nokia" ); + + HbDataFormModelItem* jobTitle = model->itemFromIndex( model->index(1, 0) ); + QCOMPARE( jobTitle->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( jobTitle->label(), QString("Job title") ); + QVERIFY( jobTitle->contentWidgetData("text") == "Software Developer" ); + + HbDataFormModelItem* department = model->itemFromIndex( model->index(2, 0) ); + QCOMPARE( department->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( department->label(), QString("Department") ); + QVERIFY( department->contentWidgetData("text") == "Devices" ); + + HbDataFormModelItem* assistant = model->itemFromIndex( model->index(3, 0) ); + QCOMPARE( assistant->type(), HbDataFormModelItem::TextItem ); + QCOMPARE( assistant->label(), QString("Assistant name") ); + QVERIFY( assistant->contentWidgetData("text") == "No Assistant" ); + + model->saveContactDetails(); + + QList companies = mContact->details(); + QCOMPARE( companies.size(), 1 ); + + QContactOrganization nokia = companies.first(); + QVERIFY( nokia.name() == "Nokia" ); + QVERIFY( nokia.title() == "Software Developer" ); + QVERIFY( nokia.assistantName() == "No Assistant" ); + QCOMPARE( nokia.department().size(), 1 ); + + delete model; + } +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_dateeditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_dateeditor.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,148 @@ +/* +* 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 "t_dateeditor.h" +#include "cntdetailconst.h" +#include "cntdetailmodelitem.h" +#include "cntdateeditormodel.h" +#include "cntdateeditorviewitem.h" + +#include +#include +#include + +#include +#include +#include +#include + +void T_DateEditorTest::init() +{ + mContact = new QContact(); + mForm = new HbDataForm(); + mLocale = QLocale::system(); +} + +void T_DateEditorTest::cleanup() +{ + mForm->deleteLater(); +} + +// tests +void T_DateEditorTest::testDateModelWithDefaultData() +{ + CntDateEditorModel* model = new CntDateEditorModel(mContact); + CntDateEditorViewItem* view = new CntDateEditorViewItem(); + + mForm->setModel(model, view); + + HbDataFormModelItem* bdItem = model->itemFromIndex(model->index(0, 0)); + QVERIFY( bdItem->type() == HbDataFormModelItem::CustomItemBase ); + QVERIFY( bdItem->label() == "Birthday" ); + + HbDataFormModelItem* anniversaryItem = model->itemFromIndex( model->index(1,0) ); + QVERIFY( anniversaryItem->type() == HbDataFormModelItem::CustomItemBase ); + QVERIFY( anniversaryItem->label() == "Anniversary" ); + } + +void T_DateEditorTest::testDateModelWithData() + { + QContactBirthday* birthday = new QContactBirthday(); + birthday->setDate( QDate(1976,10,13) ); + mContact->saveDetail( birthday ); + + QContactAnniversary* anniversary = new QContactAnniversary(); + anniversary->setOriginalDate( QDate(1977,3,27) ); + mContact->saveDetail( anniversary ); + + CntDateEditorModel* model = new CntDateEditorModel( mContact ); + CntDateEditorViewItem* view = new CntDateEditorViewItem(); + mForm->setModel( model, view ); + + CntDetailModelItem* bdItem = static_cast(model->itemFromIndex( model->index(0,0) )); + QVERIFY( bdItem->type() == HbDataFormModelItem::CustomItemBase ); + QVERIFY( bdItem->label() == "Birthday" ); + QContactBirthday b = bdItem->detail(); + QVERIFY( b.date() == QDate(1976,10,13) ); + + CntDetailModelItem* anniversaryItem = static_cast(model->itemFromIndex( model->index(1,0) )); + QVERIFY( anniversaryItem->type() == HbDataFormModelItem::CustomItemBase ); + QVERIFY( anniversaryItem->label() == "Anniversary" ); + QContactAnniversary a = anniversaryItem->detail(); + QVERIFY( a.originalDate() == QDate(1977,3,27) ); + } + +// this doesn't test any swahili, it was impossible to change the system +// locale. Should be tested perhaps with default locale? +void T_DateEditorTest::testDatelViewItem_Swahili() + { + QContactBirthday* birthday = new QContactBirthday(); + birthday->setDate( QDate(1976,10,13) ); + mContact->saveDetail( birthday ); + + QContactAnniversary* anniversary = new QContactAnniversary(); + anniversary->setOriginalDate( QDate(1977,3,27) ); + mContact->saveDetail( anniversary ); + + CntDateEditorModel* model = new CntDateEditorModel( mContact ); + CntDateEditorViewItem* view = new CntDateEditorViewItem(); + mForm->setModel( model, view ); + + CntDateEditorViewItem* birthdayItem = static_cast(mForm->itemByIndex( model->index(0,0))); + QVERIFY( birthdayItem->mButton->text() == mLocale.toString(QDate(1976,10,13)) ); + + CntDateEditorViewItem* anniversaryItem = static_cast(mForm->itemByIndex( model->index(1,0))); + QVERIFY( anniversaryItem->mButton->text() == mLocale.toString(QDate(1977,3,27)) ); + } + +void T_DateEditorTest::testDatelViewItem_English() + { + QContactBirthday* birthday = new QContactBirthday(); + birthday->setDate( QDate(1976,10,13) ); + mContact->saveDetail( birthday ); + + QContactAnniversary* anniversary = new QContactAnniversary(); + anniversary->setOriginalDate( QDate(1977,3,27) ); + mContact->saveDetail( anniversary ); + + CntDateEditorModel* model = new CntDateEditorModel( mContact ); + CntDateEditorViewItem* view = new CntDateEditorViewItem(); + mForm->setModel( model, view ); + + // Note that default locale is now Swahili (see init()) + CntDateEditorViewItem* birthdayItem = static_cast(mForm->itemByIndex( model->index(0,0))); + QString txt = birthdayItem->mButton->text(); + QVERIFY( birthdayItem->mButton->text() == mLocale.toString(QDate(1976,10,13)) ); + + CntDateEditorViewItem* anniversaryItem = static_cast(mForm->itemByIndex( model->index(1,0))); + QVERIFY( anniversaryItem->mButton->text() == mLocale.toString(QDate(1977,3,27)) ); + + model->saveContactDetails(); + + QList bds = mContact->details(); + QCOMPARE( bds.size(), 1 ); + QContactBirthday b = bds.first(); + QCOMPARE( b.date(), QDate(1976, 10,13) ); + + QList as = mContact->details(); + QCOMPARE( as.size(), 1 ); + QContactAnniversary a = as.first(); + QCOMPARE( a.originalDate(), QDate(1977,3,27) ); + + delete model; + } + +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_emaileditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_emaileditor.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,195 @@ +/* +* 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 "t_emaileditor.h" +#include "cntdetailconst.h" +#include "cntemaileditormodel.h" +#include "cntemaileditorviewitem.h" +#include "cntdetailmodelitem.h" + +#include +#include +#include +#include +#include +#include + +void T_EmailEditorTest::init() + { + mContact = new QContact(); + mForm = new HbDataForm(); + } + +void T_EmailEditorTest::cleanup() + { + delete mForm; + } + +void T_EmailEditorTest::testEmailModelWithDefaultData() + { + CntEmailEditorModel* model = new CntEmailEditorModel( mContact ); + // now there should be one default phonenumber with subtype Mobile. + HbDataFormModelItem* root = model->invisibleRootItem(); + QVERIFY( root->childCount() == 1 ); + + CntDetailModelItem* defaultItem = static_cast(root->childAt( 0 )); + QContactDetail mobile = defaultItem->detail(); + QVERIFY( mobile.definitionName() == QContactEmailAddress::DefinitionName ); + + QContactEmailAddress address = static_cast( mobile ); + QVERIFY( address.emailAddress() == "" ); + + delete model; + } + +void T_EmailEditorTest::testEmailModelWithData() + { + QContactEmailAddress* address = new QContactEmailAddress(); + address->setEmailAddress( "phonebook@nokia.com" ); + mContact->saveDetail( address ); + + CntEmailEditorModel* model = new CntEmailEditorModel( mContact ); + HbDataFormModelItem* root = model->invisibleRootItem(); + QVERIFY( root->childCount() == 1 ); + + CntDetailModelItem* defaultItem = static_cast(root->childAt( 0 )); + QContactDetail emailAddress = defaultItem->detail(); + QVERIFY( emailAddress.definitionName() == QContactEmailAddress::DefinitionName ); + QContactEmailAddress email = emailAddress; + + QVERIFY( email.emailAddress() == "phonebook@nokia.com" ); + + model->saveContactDetails(); + + delete model; + } + +void T_EmailEditorTest::testInsertModelItem() +{ + CntEmailEditorModel* model = new CntEmailEditorModel( mContact ); + HbDataFormModelItem* root = model->invisibleRootItem(); + QVERIFY( root->childCount() == 1 ); // the default one + + model->insertDetailField(); + + QVERIFY ( root->childCount() == 2 ); + + delete model; +} + +void T_EmailEditorTest::testEmailViewItem() + { + QContactEmailAddress* address = new QContactEmailAddress(); + address->setContexts( QContactDetail::ContextWork ); + address->setEmailAddress( "phonebook@nokia.com" ); + mContact->saveDetail( address ); + + CntEmailEditorModel* model = new CntEmailEditorModel( mContact ); + CntEmailEditorViewItem* item = new CntEmailEditorViewItem(); + + mForm->setModel( model, item ); + + // select the first item from the view + QModelIndex index = model->index(0, 0 ); + CntEmailEditorViewItem* first = static_cast(mForm->itemByIndex( index )); + + // the given landline number should be selected in combobox + int currentIndex = first->mBox->currentIndex(); + QString text = first->mBox->itemText( currentIndex ); + QVERIFY( text == "Email (work)" ); + + QString value = first->mEdit->text(); + QVERIFY( value == "phonebook@nokia.com" ); + + // changing the text should affect to current detail + QSignalSpy spy( first->mEdit, SIGNAL(textChanged(QString))); + first->mEdit->setText( "nokia@phonebook.com" ); + QCOMPARE( spy.count(), 1 ); + + CntDetailModelItem* modelItem = static_cast(model->itemFromIndex( index )); + QContactEmailAddress testItem = modelItem->detail(); + QString n = testItem.emailAddress(); + QVERIFY( n == "nokia@phonebook.com" ); + } + +void T_EmailEditorTest::testEmailViewItemComboChange() + { + QContactEmailAddress* address = new QContactEmailAddress(); + address->setContexts( QContactDetail::ContextHome ); + address->setEmailAddress( "phonebook@nokia.com" ); + mContact->saveDetail( address ); + + CntEmailEditorModel* model = new CntEmailEditorModel( mContact ); + CntEmailEditorViewItem* item = new CntEmailEditorViewItem(); + + mForm->setModel( model, item ); + + // select the first item from the view + QModelIndex index = model->index(0, 0 ); + CntEmailEditorViewItem* first = static_cast(mForm->itemByIndex( index )); + + QAbstractItemModel* boxModel = first->mBox->model(); + int selectedIndex = 0; + for ( int i(0); i < boxModel->rowCount(); i++ ) + { + QModelIndex modelIndex = boxModel->index( i, 0 ); + QString cntx = boxModel->data(modelIndex, DetailContext).toString(); + if ( cntx == QContactEmailAddress::ContextWork ) + { + selectedIndex = i; + break; + } + } + + QSignalSpy boxSpy( first->mBox, SIGNAL(currentIndexChanged(int)) ); + first->mBox->setCurrentIndex( selectedIndex ); + QCOMPARE( boxSpy.count(), 1 ); // check that index was really changed + + index = model->index(0, 0 ); + CntDetailModelItem* modelItem = static_cast(model->itemFromIndex(index) ); + QContactEmailAddress email = modelItem->detail(); + QVERIFY( email.contexts().isEmpty() == false ); + QVERIFY( email.contexts().first() == QContactEmailAddress::ContextWork ); + } + +void T_EmailEditorTest::testEmailViewItemLineEdit() + { + QContactEmailAddress* address = new QContactEmailAddress(); + address->setContexts( QContactDetail::ContextHome ); + address->setEmailAddress( "phonebook@nokia.com" ); + mContact->saveDetail( address ); + + CntEmailEditorModel* model = new CntEmailEditorModel( mContact ); + CntEmailEditorViewItem* item = new CntEmailEditorViewItem(); + + mForm->setModel( model, item ); + + // select the first item from the view + QModelIndex index = model->index(0, 0 ); + CntEmailEditorViewItem* first = static_cast(mForm->itemByIndex( index )); + QVERIFY( first->mEdit->maxLength() == CNT_EMAIL_EDITOR_MAXLENGTH ); + + // change the line edit text + QSignalSpy editSpy( first->mEdit, SIGNAL(textChanged(QString)) ); + first->mEdit->setText( "nokia@phonebook.com" ); + QCOMPARE( editSpy.count(), 1 ); + + // check that model also contains the updated text + CntDetailModelItem* modelItem = static_cast(model->itemFromIndex( index )); + QContactEmailAddress a = modelItem->detail(); + QVERIFY( a.emailAddress() == "nokia@phonebook.com" ); + } +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_familyeditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_familyeditor.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,86 @@ +/* +* 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 "t_familyeditor.h" +#include "cntfamilyeditormodel.h" +#include "cntdetailconst.h" + +#include +#include +#include +#include + +void T_FamilyEditorTest::init() + { + mContact = new QContact(); + mForm = new HbDataForm(); + } + +void T_FamilyEditorTest::cleanup() + { + delete mForm; + } + + void T_FamilyEditorTest::testFamilyModelWithDefaultData() + { + CntFamilyEditorModel* model = new CntFamilyEditorModel( mContact ); + mForm->setModel( model ); + + HbDataFormModelItem* spouse = model->itemFromIndex( model->index(0,0) ); // spouse + QVERIFY( spouse->type() == HbDataFormModelItem::TextItem ); + QVERIFY( spouse->label() == "Spouse" ); + QVERIFY( spouse->contentWidgetData("text") == "" ); + QVERIFY( spouse->contentWidgetData("maxLength") == CNT_SPOUSE_MAXLENGTH ); + + HbDataFormModelItem* children = model->itemFromIndex( model->index(1,0) ); // children + QVERIFY( children->type() == HbDataFormModelItem::TextItem ); + QVERIFY( children->label() == "Children" ); + QVERIFY( children->contentWidgetData("text") == "" ); + QVERIFY( children->contentWidgetData("maxLength") == CNT_CHILDREN_MAXLENGTH ); + } + + void T_FamilyEditorTest::testFamilyModelWithData() + { + QContactFamily* family = new QContactFamily(); + family->setSpouse( "MySpouse" ); + + QStringList childrenList; + childrenList << "ScreamingBaby" << "CryBaby" << "WiningBaby"; + family->setChildren( childrenList ); + + mContact->saveDetail( family ); + + CntFamilyEditorModel* model = new CntFamilyEditorModel( mContact ); + mForm->setModel( model ); + + HbDataFormModelItem* spouse = model->itemFromIndex( model->index(0,0) ); // spouse + QVERIFY( spouse->type() == HbDataFormModelItem::TextItem ); + QVERIFY( spouse->label() == "Spouse" ); + QVERIFY( spouse->contentWidgetData("text") == "MySpouse" ); + QVERIFY( spouse->contentWidgetData("maxLength") == CNT_SPOUSE_MAXLENGTH ); + + HbDataFormModelItem* children = model->itemFromIndex( model->index(1,0) ); // children + QVERIFY( children->type() == HbDataFormModelItem::TextItem ); + QVERIFY( children->label() == "Children" ); + QVERIFY( children->contentWidgetData("text") == "ScreamingBaby, CryBaby, WiningBaby" ); + QVERIFY( children->contentWidgetData("maxLength") == CNT_CHILDREN_MAXLENGTH ); + + model->saveContactDetails(); + + delete model; + } + + // End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_nameeditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_nameeditor.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,101 @@ +/* +* 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 "t_nameeditor.h" +#include "cntdetailconst.h" +#include +#include +#include +#include +#include "cntnameeditormodel.h" +#include + +void T_NameEditorTest::init() + { + mContact = new QContact(); + mForm = new HbDataForm(); + } + +void T_NameEditorTest::cleanup() + { + delete mForm; + } + +void T_NameEditorTest::testNameModelDefaultData() + { + CntNameEditorModel* model = new CntNameEditorModel( mContact ); + mForm->setModel( model ); + + HbDataFormModelItem* root = model->invisibleRootItem(); + QCOMPARE( root->childCount(), 6 ); + + for ( int i(0); i < root->childCount(); i++ ) + { + HbDataFormModelItem* item = model->itemFromIndex( model->index(i,0) ); + QCOMPARE( item->type(), HbDataFormModelItem::TextItem ); + QVERIFY( item->contentWidgetData("text") == "" ); + } + delete model; + } + +void T_NameEditorTest::testNameModelData() + { + QContactName* name = new QContactName(); + name->setFirst( "Juhapekka" ); + name->setLast( "Aaltonen" ); + name->setMiddle( "Antero" ); + name->setSuffix( "Jr" ); + name->setPrefix( "Mr"); + + QContactNickname* nick = new QContactNickname(); + nick->setNickname( "SuperGeek" ); + mContact->saveDetail( nick ); + mContact->saveDetail( name ); + + CntNameEditorModel* model = new CntNameEditorModel( mContact ); + mForm->setModel( model ); + + HbDataFormModelItem* root = model->invisibleRootItem(); + QCOMPARE( root->childCount(), 6 ); + + HbDataFormModelItem* firstname = model->itemFromIndex( model->index(0,0) ); + QVERIFY(firstname->contentWidgetData("text") == "Juhapekka" ); + QVERIFY(firstname->contentWidgetData("maxLength") == CNT_FIRSTNAME_MAXLENGTH ); + + HbDataFormModelItem* lastname = model->itemFromIndex( model->index(1,0) ); + QVERIFY(lastname->contentWidgetData("text") == "Aaltonen" ); + QVERIFY(lastname->contentWidgetData("maxLength") == CNT_LASTNAME_MAXLENGTH ); + + HbDataFormModelItem* middlename = model->itemFromIndex( model->index(2,0) ); + QVERIFY(middlename->contentWidgetData("text") == "Antero" ); + QVERIFY(middlename->contentWidgetData("maxLength") == CNT_MIDDLENAME_MAXLENGTH ); + + HbDataFormModelItem* nickname = model->itemFromIndex( model->index(3,0) ); + QVERIFY(nickname->contentWidgetData("text") == "SuperGeek" ); + QVERIFY(nickname->contentWidgetData("maxLength") == CNT_NICKNAME_MAXLENGTH ); + + HbDataFormModelItem* prefix = model->itemFromIndex( model->index(4,0) ); + QVERIFY(prefix->contentWidgetData("text") == "Mr" ); + QVERIFY(prefix->contentWidgetData("maxLength") == CNT_PREFIX_MAXLENGTH ); + + HbDataFormModelItem* suffix = model->itemFromIndex( model->index(5,0) ); + QVERIFY(suffix->contentWidgetData("text") == "Jr" ); + QVERIFY(suffix->contentWidgetData("maxLength") == CNT_SUFFIX_MAXLENGTH ); + + model->saveContactDetails(); + delete model; + } +// End of Filoe diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_namelist.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_namelist.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,109 @@ +/* +* 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 "t_namelist.h" +#include "cntnamesview.h" +#include "cntnamesview_p.h" +#include "hbstubs_helper.h" + +#include +#include +#include +#include +#include +#include +#include + + +T_NameListTest::T_NameListTest() +{ +} + +T_NameListTest::~T_NameListTest() +{ +} + +void T_NameListTest::init() +{ + mViewManager = new TestViewManager(); + mNamesPrivate = new CntNamesViewPrivate(); + + CntViewParameters args; + mNamesPrivate->activate( mViewManager, args ); +} + +void T_NameListTest::cleanup() +{ + mNamesPrivate->deactivate(); + delete mViewManager; + delete mNamesPrivate; +} + +void T_NameListTest::testPublicNamesList() +{ + CntNamesView* namesView = new CntNamesView(); + + CntViewParameters args( CntViewParameters::namesView ); + namesView->activate( mViewManager, args ); + + QVERIFY( namesView->isDefault() ); + QVERIFY( namesView->view() ); + QCOMPARE( namesView->viewId(), CntViewParameters::namesView ); + + namesView->deactivate(); + delete namesView; +} + +void T_NameListTest::testBanner() +{ + QString str( "GroupBoxText" ); + mNamesPrivate->showBanner( str ); + QVERIFY( mNamesPrivate->groupBox()->isVisible() ); + QCOMPARE(mNamesPrivate->groupBox()->titleText(), str); + + mNamesPrivate->hideBanner(); + QVERIFY( !mNamesPrivate->groupBox()->isVisible() ); +} + +void T_NameListTest::testFinder() +{ + mNamesPrivate->showFinder(); + QVERIFY( mNamesPrivate->search()->isVisible() ); + QVERIFY( mNamesPrivate->isFinderVisible() ); + + mNamesPrivate->hideFinder(); + QVERIFY( !mNamesPrivate->search()->isVisible() ); + QVERIFY( !mNamesPrivate->isFinderVisible() ); + + mNamesPrivate->setFilter( "Abc" ); + QVERIFY( !mNamesPrivate->isFinderVisible() ); +} + +void T_NameListTest::testKeyboard() +{ + HbListView* list = mNamesPrivate->list(); + HbTextItem* text = mNamesPrivate->emptyLabel(); + + qreal maxListHeight = list->maximumHeight(); + qreal maxTextHeight = text->maximumHeight(); + + mNamesPrivate->showFinder(); + mNamesPrivate->hideFinder(); + + // Impossible to make programmatically a mouse click/tap on searchpanel. +} +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_noteeditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_noteeditor.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,121 @@ +/* +* 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 "t_noteeditor.h" +#include "cntdetailconst.h" +#include "cntdetailmodelitem.h" +#include "cntnoteeditormodel.h" +#include "cntnoteeditorviewitem.h" +#include +#include +#include +#include +#include + +#include +#include + +void T_NoteEditorTest::init() + { + mContact = new QContact(); + mForm = new HbDataForm(); + } + +void T_NoteEditorTest::cleanup() + { + delete mForm; + } + +void T_NoteEditorTest::testNoteModelWithDefaultData() + { + CntNoteEditorModel* model = new CntNoteEditorModel( mContact ); + mForm->setModel( model ); + + CntDetailModelItem* item = static_cast(model->itemFromIndex( model->index(0,0) )); + QVERIFY( item->type() == HbDataFormModelItem::CustomItemBase ); + QVERIFY( item->label() == QString("Note") ); + + QContactNote note = item->detail(); + QVERIFY( note.note() == "" ); + + delete model; + } + +void T_NoteEditorTest::testNoteModelWithData() + { + QContactNote* qNote = new QContactNote(); + qNote->setNote( "Ime parsaa" ); + mContact->saveDetail( qNote ); + + CntNoteEditorModel* model = new CntNoteEditorModel( mContact ); + mForm->setModel( model ); + + CntDetailModelItem* item = static_cast(model->itemFromIndex( model->index(0,0) )); + QVERIFY( item->type() == HbDataFormModelItem::CustomItemBase ); + QVERIFY( item->label() == QString("Note") ); + + QContactNote note = item->detail(); + QVERIFY( note.note() == "Ime parsaa" ); + + delete model; + } + +void T_NoteEditorTest::testNoteViewItem() + { + QContactNote* qNote = new QContactNote(); + qNote->setNote( "Ime parsaa" ); + mContact->saveDetail( qNote ); + + CntNoteEditorModel* model = new CntNoteEditorModel( mContact ); + mForm->setModel( model, new CntNoteEditorViewItem() ); + + CntNoteEditorViewItem* viewItem = static_cast(mForm->itemByIndex( model->index(0,0) )); + QVERIFY( viewItem->mEdit->text() == "Ime parsaa" ); + + QSignalSpy spy( viewItem->mEdit, SIGNAL(textChanged(QString)) ); + viewItem->mEdit->setText( "diipadaapa" ); + QCOMPARE( spy.count(), 1 ); + + CntDetailModelItem* item = static_cast(model->itemFromIndex( model->index(0,0) )); + QContactNote noteItem = item->detail(); + QVERIFY( noteItem.note() == "diipadaapa" ); + } + +void T_NoteEditorTest::testNoteViewItemMaxLengths() + { + CntNoteEditorModel* model = new CntNoteEditorModel( mContact ); + mForm->setModel( model, new CntNoteEditorViewItem() ); + + CntNoteEditorViewItem* viewItem = static_cast(mForm->itemByIndex( model->index(0,0) )); + QCOMPARE( viewItem->mEdit->maxLength(), CNT_NOTE_EDITOR_MAXLENGTH ); + } + +void T_NoteEditorTest::testInsertAndSaveNote() +{ + CntNoteEditorModel* model = new CntNoteEditorModel( mContact ); + mForm->setModel( model, new CntNoteEditorViewItem() ); + + model->insertDetailField(); + CntNoteEditorViewItem* viewItem = static_cast( mForm->itemByIndex(model->index(0,0)) ); + viewItem->mEdit->setText( "Suut makiaksi" ); + model->saveContactDetails(); + + QContact* contact = model->contact(); + QList notes = contact->details(); + QVERIFY( notes.size() == 1 ); // size should be 1 since the first (default) note is not saved becase it has no data in it. + QVERIFY( notes.first().note() == "Suut makiaksi" ); +} +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_numbereditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_numbereditor.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,180 @@ +/* +* 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 "t_numbereditor.h" +#include "cntdetailconst.h" +#include "cntdetailmodelitem.h" +#include "cntphonenumbermodel.h" +#include "cntphonenumberviewitem.h" + +#include +#include +#include +#include +#include + +void T_NumberEditorTest::init() + { + mContact = new QContact(); + mForm = new HbDataForm(); + } + +void T_NumberEditorTest::cleanup() + { + delete mForm; + } + + // tests +void T_NumberEditorTest::testPhoneNumberModelWithDefaultData() + { + CntPhoneNumberModel* model = new CntPhoneNumberModel( mContact ); + // now there should be one default phonenumber with subtype Mobile. + HbDataFormModelItem* root = model->invisibleRootItem(); + QVERIFY( root->childCount() == 1 ); + + CntDetailModelItem* defaultItem = static_cast(root->childAt( 0 )); + QContactDetail mobile = defaultItem->detail(); + QVERIFY( mobile.definitionName() == QContactPhoneNumber::DefinitionName ); + QContactPhoneNumber number = static_cast( mobile ); + QStringList subTypes = number.subTypes(); + QVERIFY( subTypes.count() == 1 ); + QVERIFY( subTypes.first() == QContactPhoneNumber::SubTypeMobile ); + + delete model; + } + +void T_NumberEditorTest::testPhoneNumberModelWithData() + { + QContactPhoneNumber* number = new QContactPhoneNumber(); + number->setSubTypes( QContactPhoneNumber::SubTypeLandline ); + number->setNumber( "1234" ); + mContact->saveDetail( number ); + + CntPhoneNumberModel* model = new CntPhoneNumberModel( mContact ); + HbDataFormModelItem* root = model->invisibleRootItem(); + QVERIFY( root->childCount() == 1 ); + CntDetailModelItem* defaultItem = static_cast(root->childAt( 0 )); + QContactDetail mobile = defaultItem->detail(); + QVERIFY( mobile.definitionName() == QContactPhoneNumber::DefinitionName ); + QContactPhoneNumber nro = static_cast( mobile ); + QStringList subTypes = nro.subTypes(); + QVERIFY( subTypes.first() == QContactPhoneNumber::SubTypeLandline ); + QVERIFY( nro.number() == "1234" ); + + delete model; + } + +void T_NumberEditorTest::testInsertPhoneNumber() +{ + QContactPhoneNumber* number = new QContactPhoneNumber(); + number->setSubTypes( QContactPhoneNumber::SubTypeLandline ); + number->setNumber( "1234" ); + mContact->saveDetail( number ); + + CntPhoneNumberModel* model = new CntPhoneNumberModel( mContact ); + HbDataFormModelItem* root = model->invisibleRootItem(); + QVERIFY( root->childCount() == 1 ); + + model->insertDetailField(); + QVERIFY( root->childCount() == 2 ); + + model->saveContactDetails(); + QList nros = mContact->details(); + QVERIFY( nros.size() == 1 ); + + delete model; +} + +void T_NumberEditorTest::testPhoneNumberViewItem() + { + QContactPhoneNumber* number = new QContactPhoneNumber(); + number->setSubTypes( QContactPhoneNumber::SubTypeLandline ); + number->setNumber( "1234" ); + mContact->saveDetail( number ); + + CntPhoneNumberModel* model = new CntPhoneNumberModel( mContact ); + CntPhoneNumberViewItem* item = new CntPhoneNumberViewItem(); + mForm->setModel( model, item ); + + // select the first item from the view + QModelIndex index = model->index(0, 0 ); + CntPhoneNumberViewItem* first = static_cast(mForm->itemByIndex( index )); + + // the given landline number should be selected in combobox + int currentIndex = first->mBox->currentIndex(); + QString text = first->mBox->itemText( currentIndex ); + QVERIFY( text == hbTrId("txt_phob_setlabel_val_phone") ); + + // the given landline number should be in the text field + QString value = first->mEdit->text(); + QVERIFY( value == "1234" ); + + // changing the text should affect to current detail + QSignalSpy editSpy( first->mEdit, SIGNAL(textChanged(QString))); + first->mEdit->setText( "5678" ); + QCOMPARE( editSpy.count(), 1 ); + + CntDetailModelItem* modelItem = static_cast(model->itemFromIndex( index )); + QContactPhoneNumber testItem = modelItem->detail(); + QString n = testItem.number(); + QVERIFY( n == "5678" ); + + // change the combo box index back to first one, and check that subtype is correct + QSignalSpy boxSpy( first->mBox, SIGNAL(currentIndexChanged(int)) ); + // Since we are still on 'Landline' index, search for the 'Mobile (home)' and set it. + QAbstractItemModel* itemModel = first->mBox->model(); + int selectedIndex = 0; + for ( int i(0); i < itemModel->rowCount(); i++ ) + { + QModelIndex modelIndex = itemModel->index(i, 0); + if ( itemModel->data(modelIndex, DetailSubType ).toString() == QContactPhoneNumber::SubTypeMobile && + itemModel->data(modelIndex, DetailContext ).toString() == QContactDetail::ContextHome ) + { + selectedIndex = i; + break; + } + } + first->mBox->setCurrentIndex( selectedIndex ); + QCOMPARE( boxSpy.count(), 1 ); + boxSpy.clear(); + // Now check that the model detail item contains the correct subtype + testItem = modelItem->detail(); + QVERIFY( testItem.subTypes().isEmpty() == false ); + QVERIFY( testItem.subTypes().first() == QContactPhoneNumber::SubTypeMobile ); + QVERIFY( testItem.contexts().isEmpty() == false ); + QVERIFY( testItem.contexts().first() == QContactDetail::ContextHome ); + QVERIFY( first->mEdit->maxLength() == CNT_PHONENUMBER_EDITOR_MAXLENGTH ); + // test online account + selectedIndex = 0; + for ( int i(0); i < itemModel->rowCount(); i++ ) + { + QModelIndex modelIndex = itemModel->index(i, 0); + if ( itemModel->data(modelIndex, DetailSubType ).toString() == QContactOnlineAccount::SubTypeSip && + itemModel->data(modelIndex, DetailContext ).toString() == "" ) + { + selectedIndex = i; + break; + } + } + first->mBox->setCurrentIndex( selectedIndex ); + QCOMPARE( boxSpy.count(), 1 ); + + QContactOnlineAccount accountItem = modelItem->detail(); + QVERIFY( accountItem.subTypes().isEmpty() == false ); + QVERIFY( accountItem.subTypes().first() == QContactOnlineAccount::SubTypeSip ); + QVERIFY( accountItem.contexts().isEmpty() == true ); + QVERIFY( first->mEdit->maxLength() == CNT_ONLINEACCOUNT_EDITOR_MAXLENGTH ); + } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_urleditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_urleditor.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,176 @@ +/* +* 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 "t_urleditor.h" +#include "cntdetailconst.h" +#include "cnturleditormodel.h" +#include "cnturleditorviewitem.h" +#include "cntdetailmodelitem.h" + +#include +#include +#include +#include +#include +#include + +void T_UrlEditorTest::init() + { + mContact = new QContact(); + mForm = new HbDataForm(); + } + +void T_UrlEditorTest::cleanup() + { + delete mForm; + } + +void T_UrlEditorTest::testUrlModelWithDefaultData() + { + CntUrlEditorModel* model = new CntUrlEditorModel( mContact ); + // now there should be one default phonenumber with subtype Mobile. + HbDataFormModelItem* root = model->invisibleRootItem(); + QVERIFY( root->childCount() == 1 ); + + CntDetailModelItem* defaultItem = static_cast(root->childAt( 0 )); + QContactDetail mobile = defaultItem->detail(); + QVERIFY( mobile.definitionName() == QContactUrl::DefinitionName ); + + QContactUrl url = static_cast( mobile ); + QVERIFY( url.url() == "" ); + delete model; + } + +void T_UrlEditorTest::testUrlModelWithData() + { + QContactUrl* url = new QContactUrl(); + url->setUrl( "www.nokia.com" ); + mContact->saveDetail( url ); + + CntUrlEditorModel* model = new CntUrlEditorModel( mContact ); + HbDataFormModelItem* root = model->invisibleRootItem(); + QVERIFY( root->childCount() == 1 ); + + CntDetailModelItem* defaultItem = static_cast(root->childAt( 0 )); + QContactUrl urlAddress = defaultItem->detail(); + QVERIFY( urlAddress.definitionName() == QContactUrl::DefinitionName ); + QVERIFY( urlAddress.url() == "www.nokia.com" ); + + delete model; + } + +void T_UrlEditorTest::testUrlViewItem() + { + QContactUrl* url = new QContactUrl(); + url->setContexts( QContactDetail::ContextWork ); + url->setUrl( "www.nokia.com" ); + mContact->saveDetail( url ); + + CntUrlEditorModel* model = new CntUrlEditorModel( mContact ); + CntUrlEditorViewItem* item = new CntUrlEditorViewItem(); + mForm->setModel( model, item ); + + // select the first item from the view + QModelIndex index = model->index(0, 0 ); + CntUrlEditorViewItem* first = static_cast(mForm->itemByIndex( index )); + + // the given landline number should be selected in combobox + int currentIndex = first->mBox->currentIndex(); + QString text = first->mBox->itemText( currentIndex ); + QVERIFY( text == "URL (work)" ); + + QString value = first->mEdit->text(); + QVERIFY( value == "www.nokia.com" ); + + // changing the text should affect to current detail + QSignalSpy spy( first->mEdit, SIGNAL(textChanged(QString))); + first->mEdit->setText( "www.apple.com (sorry)" ); + QCOMPARE( spy.count(), 1 ); + + CntDetailModelItem* modelItem = static_cast(model->itemFromIndex( index )); + QContactUrl testItem = modelItem->detail(); + QString n = testItem.url(); + QVERIFY( n == "www.apple.com (sorry)" ); + } + +void T_UrlEditorTest::testUrlViewItemComboChange() + { + QContactUrl* url = new QContactUrl(); + url->setContexts( QContactDetail::ContextHome ); + url->setUrl( "www.nokia.com" ); + mContact->saveDetail( url ); + + CntUrlEditorModel* model = new CntUrlEditorModel( mContact ); + CntUrlEditorViewItem* item = new CntUrlEditorViewItem(); + + mForm->setModel( model, item ); + + // select the first item from the view + QModelIndex index = model->index(0, 0 ); + CntUrlEditorViewItem* first = static_cast(mForm->itemByIndex( index )); + + QAbstractItemModel* boxModel = first->mBox->model(); + int selectedIndex = 0; + for ( int i(0); i < boxModel->rowCount(); i++ ) + { + QModelIndex modelIndex = boxModel->index( i, 0 ); + QString cntx = boxModel->data(modelIndex, DetailContext).toString(); + if ( cntx == QContactUrl::ContextWork ) + { + selectedIndex = i; + break; + } + } + + QSignalSpy boxSpy( first->mBox, SIGNAL(currentIndexChanged(int)) ); + first->mBox->setCurrentIndex( selectedIndex ); + QCOMPARE( boxSpy.count(), 1 ); // check that index was really changed + + index = model->index(0, 0 ); + CntDetailModelItem* modelItem = static_cast(model->itemFromIndex(index) ); + QContactUrl urlAddress = modelItem->detail(); + QVERIFY( urlAddress.contexts().isEmpty() == false ); + QVERIFY( urlAddress.contexts().first() == QContactUrl::ContextWork ); + } + +void T_UrlEditorTest::testUrlViewItemLineEdit() + { + QContact* c = new QContact(); + QContactUrl* url = new QContactUrl(); + url->setContexts( QContactDetail::ContextHome ); + url->setUrl( "www.nokia.com" ); + c->saveDetail( url ); + + CntUrlEditorModel* model = new CntUrlEditorModel( c ); + CntUrlEditorViewItem* item = new CntUrlEditorViewItem(); + + HbDataForm* form = new HbDataForm(); + form->setModel( model, item ); + + // select the first item from the view + QModelIndex index = model->index(0, 0 ); + CntUrlEditorViewItem* first = static_cast(form->itemByIndex( index )); + QVERIFY( first->mEdit->maxLength() == CNT_URL_EDITOR_MAXLENGTH ); + + QSignalSpy spy( first->mEdit, SIGNAL(textChanged(QString)) ); + first->mEdit->setText( "www.phonebook.com" ); + QCOMPARE( spy.count(), 1 ); + + CntDetailModelItem* modelItem = static_cast(model->itemFromIndex(index) ); + QContactUrl urlItem = modelItem->detail(); + QVERIFY( urlItem.url() == "www.phonebook.com" ); + } +// End of File diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/testrunner.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/testrunner.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/testrunner.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -78,6 +78,30 @@ printf("All passed.\n\n"); } fflush(stdout); + + //To write in file + QFile file("C:\\TestResult.txt"); + if(file.open(QIODevice::WriteOnly)) + { + QTextStream ts( &file ); + ts << "Tests executed: " << mTestCount << "\n"; + if (mErrors.count() > 0) + { + ts <<"Failures : " << mErrors.count() << "\n"; + foreach(QString error, mErrors) + { + ts << error.toUtf8().data(); + } + ts << "\n"; + } + else + { + ts<< "All passed.\n\n"; + } + + ts << endl; + file.close(); + } } void TestRunner::parse(const QString& fileName) diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/stubs/hbstubs.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/stubs/hbstubs.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/stubs/hbstubs.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -28,7 +28,37 @@ bool dialogOpened = false; Qt::Orientation windowOrientation = Qt::Vertical; +HbMainWindow* testWindow = 0; +HbView* testView = 0; +int testViewCount = 0; +HbAction* testSoftkeyAction = 0; +TestViewManager::TestViewManager() +{ + mManager = new QContactManager(); +} + +TestViewManager::~TestViewManager() +{ + delete mManager; +} + +void TestViewManager::changeView( const CntViewParameters& aArgs ) +{ + Q_UNUSED( aArgs ); +} + +void TestViewManager::back( const CntViewParameters& aArgs ) +{ + Q_UNUSED( aArgs ); +} + +QContactManager* TestViewManager::contactManager(const QString& aType) +{ + Q_UNUSED(aType); + return mManager; +} + void HbStubHelper::reset() { actionCount = 0; @@ -88,16 +118,11 @@ actionCount = 0; } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// -void HbMainWindow::setOrientation(Qt::Orientation orientation) -{ - windowOrientation = orientation; -} - -Qt::Orientation HbMainWindow::orientation() const -{ - return windowOrientation; -} class MobHistoryModelData : public QSharedData { @@ -133,3 +158,99 @@ Q_UNUSED(parent); return 3; } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +HbMainWindow::HbMainWindow(QWidget *parent, Hb::WindowFlags windowFlags) : d_ptr(0) +{ + Q_UNUSED(parent) + Q_UNUSED(windowFlags) + testViewCount = 0; + testView = 0; + testWindow = this; +} + +HbMainWindow::~HbMainWindow() +{ + // testView = 0; + testWindow = 0; +} + +void HbMainWindow::setOrientation(Qt::Orientation orientation, bool animate) +{ + Q_UNUSED( animate ) + + windowOrientation = orientation; +} + +Qt::Orientation HbMainWindow::orientation() const +{ + return windowOrientation; +} + + +QRectF HbMainWindow::layoutRect() const +{ + return QRectF(0, 0, 100, 100); +} + +HbAction* HbMainWindow::softKeyAction(Hb::SoftKeyId key) const +{ + Q_UNUSED(key) + return testSoftkeyAction; +} + +void HbMainWindow::addSoftKeyAction(Hb::SoftKeyId key, HbAction *action) +{ + Q_UNUSED(key) + Q_UNUSED(action) + testSoftkeyAction = action; +} + +void HbMainWindow::removeSoftKeyAction(Hb::SoftKeyId key, HbAction *action) +{ + Q_UNUSED(key) + Q_UNUSED(action) + testSoftkeyAction = 0; +} + +HbView *HbMainWindow::addView(QGraphicsWidget *widget) +{ + Q_UNUSED(widget) + testViewCount++; +} + +void HbMainWindow::setCurrentView(HbView *view, bool animate,Hb::ViewSwitchFlags flags) +{ + Q_UNUSED(animate) + Q_UNUSED(flags); + testView = view; +} + +void HbMainWindow::removeView(QGraphicsWidget *widget) +{ + Q_UNUSED(widget) + testViewCount--; +} + +int HbMainWindow::viewCount() const +{ + return testViewCount; +} +HbView *HbMainWindow::currentView() const +{ + return testView; +} + +QList HbMainWindow::views() const +{ + QList result; + for ( int i=0; i class CntBaseView; class CntServiceHandler; -class CntServiceViewManager : public CntViewManager +class CntServiceViewManager : public CntDefaultViewManager { Q_OBJECT @@ -43,7 +43,7 @@ void launchAssignContactCard(QContact contact, QContactDetail detail); private: - CntBaseView *getView(CntViewParameters::ViewId id); + CntBaseView *getView(const CntViewParameters &aArgs); private: CntServiceHandler *mServiceHandler; diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/phonebookservices/src/cntserviceassigncontactcardview.cpp --- a/phonebookui/phonebookservices/src/cntserviceassigncontactcardview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/phonebookservices/src/cntserviceassigncontactcardview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -88,7 +88,7 @@ { CntViewParameters viewParameters(CntViewParameters::serviceEditView); viewParameters.setSelectedContact(*mContact); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } /*! @@ -98,7 +98,7 @@ { CntViewParameters viewParameters(CntViewParameters::serviceContactSelectionView); viewParameters.setSelectedDetail(mDetail); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } void CntServiceAssignContactCardView::activateView(const CntViewParameters &viewParameters) diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/phonebookservices/src/cntservicecontactcardview.cpp --- a/phonebookui/phonebookservices/src/cntservicecontactcardview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/phonebookservices/src/cntservicecontactcardview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -45,7 +45,7 @@ { CntViewParameters viewParameters(CntViewParameters::serviceSubEditView); viewParameters.setSelectedContact(*mContact); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } /*! diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp --- a/phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -60,7 +60,7 @@ CntServicesContact servicesContact; //get the name - servicesContact.mDisplayName = contactManager()->synthesizeDisplayLabel(contact); + servicesContact.mDisplayName = contactManager()->synthesizedDisplayLabel(contact); //get the phonenumber QList phonenumbers = contact.details(); @@ -90,6 +90,20 @@ mServiceHandler->completeFetch(serviceList); } +void CntServiceContactFetchView::activateView(const CntViewParameters &aArgs) +{ + // Set action filter + QMap map = aArgs.parameters(); + QString filter = map.value(CntViewParameters::Filter).toString(); + QString action = map.value(CntViewParameters::Action).toString(); + setActionFilter(action, filter); + + // Set title of the view. + QString title = map.value(CntViewParameters::Title).toString(); + setTitle(title); + + CntBaseSelectionView::activateView(aArgs); +} void CntServiceContactFetchView::setActionFilter(QString action, QString filter) { diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/phonebookservices/src/cntservicecontactselectionview.cpp --- a/phonebookui/phonebookservices/src/cntservicecontactselectionview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/phonebookservices/src/cntservicecontactselectionview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -38,7 +38,7 @@ QContact contact = contactModel()->contact(aIndex); contact.saveDetail(&mDetail); viewParameters.setSelectedContact(contact); - viewManager()->onActivateView(viewParameters); + viewManager()->changeView(viewParameters); } void CntServiceContactSelectionView::aboutToCloseView() @@ -60,6 +60,8 @@ contactModel()->showMyCard(false); } mDetail = viewParameters.selectedDetail(); + + CntBaseSelectionView::activateView(viewParameters); } // EOF diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/phonebookservices/src/cntservicesubeditview.cpp --- a/phonebookui/phonebookservices/src/cntservicesubeditview.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/phonebookservices/src/cntservicesubeditview.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -42,9 +42,9 @@ contactManager()->saveContact(contact()); } - CntViewParameters viewParameters(CntViewParameters::serviceContactCardView); + CntViewParameters viewParameters;//(CntViewParameters::serviceContactCardView); viewParameters.setSelectedContact(*contact()); - viewManager()->onActivateView(viewParameters); + viewManager()->back(viewParameters); } /*! @@ -53,9 +53,9 @@ void CntServiceSubEditView::discardAllChanges() { QContact oldContact = contactManager()->contact(contact()->localId()); - CntViewParameters viewParameters(CntViewParameters::serviceContactCardView); + CntViewParameters viewParameters;//(CntViewParameters::serviceContactCardView); viewParameters.setSelectedContact(oldContact); - viewManager()->onActivateView(viewParameters); + viewManager()->back(viewParameters); } /* diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/phonebookservices/src/cntserviceviewmanager.cpp --- a/phonebookui/phonebookservices/src/cntserviceviewmanager.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/phonebookservices/src/cntserviceviewmanager.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -31,7 +31,7 @@ Constructor */ CntServiceViewManager::CntServiceViewManager(CntMainWindow *mainWindow, CntViewParameters::ViewId defaultView, CntServiceHandler *aHandler): - CntViewManager(mainWindow, defaultView), + CntDefaultViewManager(mainWindow, defaultView), mServiceHandler(aHandler) { connect(mServiceHandler, SIGNAL(launchFetch(const QString&, const QString&, const QString&)), @@ -56,16 +56,13 @@ */ void CntServiceViewManager::launchFetch(const QString &title, const QString &action, const QString &filter) { - CntBaseView *view = getView(CntViewParameters::serviceContactFetchView); - if (view) - { - //add view to main window - addViewToWindow(view); - view->setTitle(title); - static_cast(view)->setActionFilter(action, filter); - CntViewParameters viewParameters(CntViewParameters::noView); - view->activateView(viewParameters); - } + CntViewParameters params(CntViewParameters::serviceContactFetchView); + QMap map; + map.insert(CntViewParameters::Action, QVariant(action)); + map.insert(CntViewParameters::Filter, QVariant(filter)); + map.insert(CntViewParameters::Title, QVariant(title)); + params.setParameters(map); + changeView(params); } /*! @@ -73,15 +70,9 @@ */ void CntServiceViewManager::launchEditor(QContact contact) { - CntBaseView *view = getView(CntViewParameters::serviceEditView); - if (view) - { - //add view to main window - addViewToWindow(view); - CntViewParameters viewParameters(CntViewParameters::noView); - viewParameters.setSelectedContact(contact); - view->activateView(viewParameters); - } + CntViewParameters params(CntViewParameters::serviceEditView); + params.setSelectedContact(contact); + changeView(params); } /*! @@ -89,15 +80,9 @@ */ void CntServiceViewManager::launchContactSelection(QContactDetail detail) { - CntBaseView *view = getView(CntViewParameters::serviceContactSelectionView); - if (view) - { - //add view to main window - addViewToWindow(view); - CntViewParameters viewParameters(CntViewParameters::noView); - viewParameters.setSelectedDetail(detail); - view->activateView(viewParameters); - } + CntViewParameters params(CntViewParameters::serviceContactSelectionView); + params.setSelectedDetail(detail); + changeView(params); } /*! @@ -105,15 +90,9 @@ */ void CntServiceViewManager::launchContactCard(QContact contact) { - CntBaseView *view = getView(CntViewParameters::serviceContactCardView); - if (view) - { - //add view to main window - addViewToWindow(view); - CntViewParameters viewParameters(CntViewParameters::noView); - viewParameters.setSelectedContact(contact); - view->activateView(viewParameters); - } + CntViewParameters params(CntViewParameters::serviceContactCardView); + params.setSelectedContact(contact); + changeView(params); } /*! @@ -121,24 +100,20 @@ */ void CntServiceViewManager::launchAssignContactCard(QContact contact, QContactDetail detail) { - CntBaseView *view = getView(CntViewParameters::serviceAssignContactCardView); - if (view) - { - //add view to main window - addViewToWindow(view); - CntViewParameters viewParameters(CntViewParameters::noView); - viewParameters.setSelectedContact(contact); - viewParameters.setSelectedDetail(detail); - view->activateView(viewParameters); - } + CntViewParameters params(CntViewParameters::serviceAssignContactCardView); + params.setSelectedContact(contact); + params.setSelectedDetail(detail); + changeView(params); } /*! Create a view based on ID. \Return pointer to new object if success, 0 if not. */ -CntBaseView *CntServiceViewManager::getView(CntViewParameters::ViewId id) +CntBaseView *CntServiceViewManager::getView(const CntViewParameters &aArgs) { CntBaseView* view(0); + + CntViewParameters::ViewId id = aArgs.nextViewId(); switch (id) { @@ -180,7 +155,7 @@ } default: { - view = CntViewManager::getView(id); + view = CntDefaultViewManager::getView( aArgs ); break; } } diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/phonebookui.pro --- a/phonebookui/phonebookui.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/phonebookui.pro Fri Apr 16 14:53:18 2010 +0300 @@ -19,7 +19,7 @@ TEMPLATE = subdirs -SUBDIRS = pbkcommonui phonebookapp phonebookservices +SUBDIRS = mobhistorymodel pbkcommonui phonebookapp phonebookservices CONFIG += ordered deploy.path = /epoc32/rom/include/core/app/ @@ -29,7 +29,14 @@ "$${LITERAL_HASH}include " \ "./rom/phonebookservices.iby CORE_APP_LAYER_IBY_EXPORT_PATH(phonebookservices.iby)" \ "./rom/pbk.iby CORE_APP_LAYER_IBY_EXPORT_PATH(pbk.iby)" \ - "./rom/pbkresources.iby LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(pbkresources.iby)" + "./rom/pbkresources.iby LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(pbkresources.iby)" + +exists(confml/phonebook.confml) :BLD_INF_RULES.prj_exports += "confml/phonebook.confml CONFML_EXPORT_PATH(phonebook.confml,uda_content)" +exists(implml/phonebook.implml) :BLD_INF_RULES.prj_exports += "implml/phonebook.implml CRML_EXPORT_PATH(phonebook.implml,uda_content)" +exists(content/SQLite__Contacts.zip) :BLD_INF_RULES.prj_exports += "content/SQLite__Contacts.zip CRML_EXPORT_PATH(../content/zip/,uda_content)" + + DEPLOYMENT += romfiles + diff -r 0ba2181d7c28 -r 76a2435edfd4 phonebookui/rom/pbk.iby --- a/phonebookui/rom/pbk.iby Fri Mar 19 09:27:18 2010 +0200 +++ b/phonebookui/rom/pbk.iby Fri Apr 16 14:53:18 2010 +0300 @@ -25,11 +25,14 @@ // Engine file=ABI_DIR\BUILD_DIR\qtcontacts.dll SHARED_LIB_DIR\qtcontacts.dll UNPAGED +file=ABI_DIR\BUILD_DIR\qtversit.dll SHARED_LIB_DIR\qtversit.dll UNPAGED file=ABI_DIR\BUILD_DIR\mobcntmodel.dll SHARED_LIB_DIR\mobcntmodel.dll UNPAGED file=ABI_DIR\BUILD_DIR\mobhistorymodel.dll SHARED_LIB_DIR\mobhistorymodel.dll UNPAGED file=ABI_DIR\BUILD_DIR\mobapicontactspluginsymbian.dll SHARED_LIB_DIR\mobapicontactspluginsymbian.dll UNPAGED file=ABI_DIR\BUILD_DIR\mobapicontactspluginsymbiansim.dll SHARED_LIB_DIR\mobapicontactspluginsymbiansim.dll UNPAGED file=ABI_DIR\BUILD_DIR\mobcntactionsplugin.dll SHARED_LIB_DIR\mobcntactionsplugin.dll UNPAGED +file=ABI_DIR\BUILD_DIR\cntmaptileservice.dll SHARED_LIB_DIR\cntmaptileservice.dll UNPAGED +file=ABI_DIR\BUILD_DIR\simutility.dll SHARED_LIB_DIR\simutility.dll UNPAGED // UI file=ABI_DIR\BUILD_DIR\pbkcommonui.dll SHARED_LIB_DIR\pbkcommonui.dll UNPAGED diff -r 0ba2181d7c28 -r 76a2435edfd4 pimprotocols/phonebooksync/Test/TE_Sync/TE_Sync_Config.txt --- a/pimprotocols/phonebooksync/Test/TE_Sync/TE_Sync_Config.txt Fri Mar 19 09:27:18 2010 +0200 +++ b/pimprotocols/phonebooksync/Test/TE_Sync/TE_Sync_Config.txt Fri Apr 16 14:53:18 2010 +0300 @@ -1,4 +1,4 @@ -# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# Copyright (c) 2002-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" @@ -11,7 +11,6 @@ # Contributors: # # Description: -# # SIM TSY configuration file for TE_SYNC. # Note that WriteContactToICCExceedMaxNameTestL and # WriteContactToICCNumLettersTestL need to be commented out with this config file diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/config.pri --- a/qtcontactsmobility/config.pri Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/config.pri Fri Apr 16 14:53:18 2010 +0300 @@ -13,3 +13,4 @@ contains(mobility_modules,versit): mobility_modules *= contacts lbt_enabled = no snap_enabled = no +symbiancntsim_enabled = yes diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/config.tests/networkmanager/main.cpp --- a/qtcontactsmobility/config.tests/networkmanager/main.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/config.tests/networkmanager/main.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -38,7 +38,9 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - +#if defined(QT_NO_DBUS) +sjkp //error is no QtDBus +#endif #include int main(int argc, char** argv) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/config.tests/networkmanager/networkmanager.pro --- a/qtcontactsmobility/config.tests/networkmanager/networkmanager.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/config.tests/networkmanager/networkmanager.pro Fri Apr 16 14:53:18 2010 +0300 @@ -9,3 +9,6 @@ # Input SOURCES += main.cpp +!contains(QT_CONFIG,dbus): { + DEFINES += QT_NO_DBUS +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/config.tests/symbiancntsim/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/config.tests/symbiancntsim/main.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +int main(int argc, char** argv) +{ + RMobilePhone s; + + return 0; +} + diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/config.tests/symbiancntsim/symbiancntsim.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/config.tests/symbiancntsim/symbiancntsim.pro Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,15 @@ +###################################################################### +# Automatically generated by qmake (2.01a) Wed 18. Nov 17:41:48 2009 +###################################################################### + +CONFIG -= qt +TEMPLATE = app +TARGET = +DEPENDPATH += . +INCLUDEPATH += . + +# Input +SOURCES += main.cpp + +INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE +LIBS += -letel -letelmm diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/configure --- a/qtcontactsmobility/configure Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/configure Fri Apr 16 14:53:18 2010 +0300 @@ -63,7 +63,7 @@ LIB_PATH="lib" BIN_PATH="bin" MAC_SDK= -MOBILITY_MODULES="bearer location contacts multimedia publishsubscribe versit messaging systeminfo serviceframework" +MOBILITY_MODULES="bearer location contacts multimedia publishsubscribe versit messaging systeminfo serviceframework sensors" MOBILITY_MODULES_UNPARSED= usage() @@ -166,7 +166,7 @@ MOBILITY_MODULES= for m in $MOBILITY_MODULES_UNPARSED; do case "$m" in - bearer|contacts|location|messaging|multimedia|publishsubscribe|serviceframework|systeminfo|versit) + bearer|contacts|location|messaging|multimedia|publishsubscribe|serviceframework|systeminfo|versit|sensors) MOBILITY_MODULES="$MOBILITY_MODULES $m"; ;; *) @@ -384,7 +384,6 @@ #remove old headers rm -rf $shadowpath/include mkdir $shadowpath/include -$relpath/bin/syncheaders $shadowpath/include $relpath/src/global for module in $MOBILITY_MODULES; do case "$module" in bearer) @@ -423,6 +422,9 @@ $relpath/bin/syncheaders $shadowpath/include $relpath/src/contacts/requests $relpath/bin/syncheaders $shadowpath/include $relpath/src/contacts/filters ;; + sensors) + $relpath/bin/syncheaders $shadowpath/include $relpath/src/sensors + ;; *) echo "Cannot generate headers for $module" ;; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/configure.bat --- a/qtcontactsmobility/configure.bat Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/configure.bat Fri Apr 16 14:53:18 2010 +0300 @@ -56,7 +56,7 @@ set BUILD_UNITTESTS=no set BUILD_EXAMPLES=no set BUILD_DOCS=yes -set MOBILITY_MODULES=bearer location contacts multimedia publishsubscribe versit messaging systeminfo serviceframework +set MOBILITY_MODULES=bearer location contacts multimedia publishsubscribe versit messaging systeminfo serviceframework sensors set MOBILITY_MODULES_UNPARSED= set VC_TEMPLATE_OPTION= set QT_PATH= @@ -241,9 +241,11 @@ ) else if %FIRST% == systeminfo ( echo Systeminfo selected ) else if %FIRST% == serviceframework ( - echo SerficeFramework selected + echo ServiceFramework selected ) else if %FIRST% == versit ( echo Versit selected ^(implies Contacts^) +) else if %FIRST% == sensors ( + echo Sensors selected ) else ( echo Unknown module %FIRST% goto errorTag @@ -430,6 +432,7 @@ REM compile tests go here. call :compileTest LBT lbt call :compileTest SNAP snap +call :compileTest SymbianContactSIM symbiancntsim echo End of compile tests echo. echo. @@ -477,6 +480,8 @@ perl -S %SOURCE_PATH%\bin\syncheaders %BUILD_PATH%\include %SOURCE_PATH%\src\contacts\requests perl -S %SOURCE_PATH%\bin\syncheaders %BUILD_PATH%\include %SOURCE_PATH%\src\contacts\filters perl -S %SOURCE_PATH%\bin\syncheaders %BUILD_PATH%\include %SOURCE_PATH%\src\contacts\details +) else if %FIRST% == sensors ( + perl -S %SOURCE_PATH%\bin\syncheaders %BUILD_PATH%\include %SOURCE_PATH%\src\sensors ) if "%REMAINING%" == "" ( diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/examples.pri --- a/qtcontactsmobility/examples/examples.pri Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/examples/examples.pri Fri Apr 16 14:53:18 2010 +0300 @@ -29,3 +29,10 @@ LIBS+= -L$$OUTPUT_DIR/lib QMAKE_RPATHDIR+=$$OUTPUT_DIR/lib INCLUDEPATH+= $$QT_MOBILITY_SOURCE_TREE/src/global + +maemo6 { + DEFINES+= Q_WS_MAEMO_6 +} +maemo5 { + DEFINES+= Q_WS_MAEMO_5 +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/examples.pro --- a/qtcontactsmobility/examples/examples.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/examples/examples.pro Fri Apr 16 14:53:18 2010 +0300 @@ -19,16 +19,24 @@ #Location examples contains(mobility_modules,location) { - SUBDIRS += logfilepositionsource - contains(QT_CONFIG, webkit) { - SUBDIRS += fetchgooglemaps - } + SUBDIRS += logfilepositionsource \ + satellitedialog + contains(mobility_modules,bearer) { + SUBDIRS += flickrdemo \ + weatherinfo \ + lightmaps + contains(QT_CONFIG, webkit) { + SUBDIRS += fetchgooglemaps + } + } } #Contacts examples contains(mobility_modules,contacts) { - SUBDIRS += samplephonebook \ - incomingcalls + SUBDIRS += samplephonebook + contains(QT_CONFIG, declarative) { + SUBDIRS += qmlcontacts + } } #Publish and Subscribe examples @@ -47,22 +55,39 @@ #Multimedia contains(mobility_modules,multimedia) { #disabled on Symbian due to missing backend - !symbian:SUBDIRS += \ + SUBDIRS += \ radio \ player \ cameracapture \ slideshow \ streamplayer \ audiorecorder + + contains (QT_CONFIG, declarative) { + SUBDIRS += \ + declarativemusic \ + declarativevideo + } } #Messaging examples contains(mobility_modules,messaging) { contains(qmf_enabled,yes)|wince*|win32|symbian|maemo6 { - !win32-g++:SUBDIRS += \ - keepintouch\ - querymessages\ - writemessage\ - serviceactions + !win32-g++ { + SUBDIRS += \ + querymessages \ + writemessage \ + serviceactions + + contains(mobility_modules,contacts) { + SUBDIRS += keepintouch + } + } } } + +# Sensors API examples +contains(mobility_modules,sensors) { + SUBDIRS += sensors +} + diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/incomingcalls/filterdialog.cpp --- a/qtcontactsmobility/examples/incomingcalls/filterdialog.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,263 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "filterdialog.h" - -#include "qtcontacts.h" -#include - -FilterDialog::FilterDialog(QWidget* parent) - : QWidget(parent) -{ - vertLayout = new QVBoxLayout; - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - setMinimumSize(320,320); - - state = -1; // not yet opened. - noFiltersYet = true; - expressionSoFar = ""; - - setWindowTitle(tr("Contact Search")); - value = new QLineEdit; - field = new QComboBox; - match = new QComboBox; - join = new QComboBox; - expression = new QLabel(tr("Cumulative Expression:")); - expression->setWordWrap(true); - - cancel = new QPushButton(tr("Cancel")); - add = new QPushButton(tr("Add Filter")); - done = new QPushButton(tr("Done")); - - connect(cancel, SIGNAL(clicked()), this, SLOT(cancelClicked())); - connect(add, SIGNAL(clicked()), this, SLOT(addClicked())); - connect(done, SIGNAL(clicked()), this, SLOT(doneClicked())); - - field->addItem(tr("Name")); - field->addItem(tr("Phone Number")); - field->addItem(tr("Email Address")); - - match->addItem(tr("Exact Match")); - match->addItem(tr("Starts With")); - match->addItem(tr("Contains")); - match->addItem(tr("Ends With")); - - join->addItem(tr("AND")); - join->addItem(tr("OR")); - - formLayout = new QFormLayout; - formLayout->addRow("Search String:", value); - formLayout->addRow("In Field:", field); - formLayout->addRow("With Criteria:", match); - formLayout->addRow("Join Method:", join); - - btnLayout = new QHBoxLayout; - btnLayout->addWidget(cancel); - btnLayout->addWidget(add); - btnLayout->addWidget(done); - - vertLayout->addLayout(formLayout); - vertLayout->addWidget(expression); - formLayout->addRow(btnLayout); - - setLayout(vertLayout); -} - -FilterDialog::~FilterDialog() -{ -} - -QContactFilter FilterDialog::filter() const -{ - return total; -} - -int FilterDialog::status() const -{ - // -1 = cancelled - // 0 = in progress - // 1 = accepted - return state; -} - -void FilterDialog::cancelClicked() -{ - total = QContactIntersectionFilter(); - noFiltersYet = true; - state = -1; - hide(); - emit hidden(); -} - -void FilterDialog::addClicked() -{ - state = 0; - - QString exprName; - QString exprMatch; - QString exprJoin; - - QContactDetailFilter fil; - QString defName; - QString fieldName; - switch (field->currentIndex()) { - case 0: - { - // name - defName = QString(QLatin1String(QContactDisplayLabel::DefinitionName)); - fieldName = QString(QLatin1String(QContactDisplayLabel::FieldLabel)); - - exprName = "NAME"; - } - break; - - case 1: - { - // phone number - defName = QString(QLatin1String(QContactPhoneNumber::DefinitionName)); - fieldName = QString(QLatin1String(QContactPhoneNumber::FieldNumber)); - - exprName = "PHONENUMBER"; - } - break; - - default: - { - // email address - defName = QString(QLatin1String(QContactEmailAddress::DefinitionName)); - fieldName = QString(QLatin1String(QContactEmailAddress::FieldEmailAddress)); - - exprName = "EMAILADDRESS"; - } - break; - - } - fil.setDetailDefinitionName(defName, fieldName); - fil.setValue(value->text()); - - QContactFilter::MatchFlags matchFlags; - switch (match->currentIndex()) { - case 0: - { - matchFlags |= QContactFilter::MatchExactly; - - exprMatch = "EQUALS"; - } - break; - - case 1: - { - matchFlags |= QContactFilter::MatchStartsWith; - - exprMatch = "STARTSWITH"; - } - break; - - case 2: - { - matchFlags |= QContactFilter::MatchContains; - - exprMatch = "CONTAINS"; - } - break; - - default: - { - matchFlags |= QContactFilter::MatchEndsWith; - - exprMatch = "ENDSWITH"; - } - break; - } - fil.setMatchFlags(matchFlags); - - // if OR then join with OR - noFiltersYet = false; // either way, have added a filter. - if (join->currentIndex() == 1) { - QContactUnionFilter ufil; - ufil << total << fil; - QContactIntersectionFilter ifil; - ifil << ufil; - total = ifil; - - exprJoin = "OR"; - } else { - // otherwise, just AND. - total << fil; - - exprJoin = "AND"; - } - - // set the expression so far - if (!expressionSoFar.isEmpty()) - expressionSoFar += " " + exprJoin + " "; - expressionSoFar += exprName + " " + exprMatch + " \"" + value->text() + "\""; - expression->setText(tr("Cumulative Expression:") + expressionSoFar); - - // now reset the other UI elements. - value->setText(""); - field->setCurrentIndex(0); - match->setCurrentIndex(0); - join->setCurrentIndex(0); -} - -void FilterDialog::doneClicked() -{ - state = 1; - hide(); - emit hidden(); -} - -void FilterDialog::showDialog() -{ - total = QContactIntersectionFilter(); - noFiltersYet = true; - state = 0; - expressionSoFar = ""; - - // now reset the UI elements. - value->setText(""); - field->setCurrentIndex(0); - match->setCurrentIndex(0); - join->setCurrentIndex(0); - expression->setText(tr("Cumulative Expression:")); - show(); -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/incomingcalls/filterdialog.h --- a/qtcontactsmobility/examples/incomingcalls/filterdialog.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#ifndef FILTERDIALOG_H -#define FILTERDIALOG_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include -#include "qcontactfilter.h" -#include "qcontactintersectionfilter.h" - -QT_BEGIN_NAMESPACE -class QLabel; -class QLineEdit; -class QComboBox; -class QPushButton; -class QFormLayout; -class QVBoxLayout; -class QHBoxLayout; -QT_END_NAMESPACE - -QTM_USE_NAMESPACE - -class FilterDialog : public QWidget -{ - Q_OBJECT - -public: - FilterDialog(QWidget *parent = 0); - ~FilterDialog(); - - QContactFilter filter() const; - int status() const; - -signals: - void hidden(); - -public slots: - void showDialog(); - -private slots: - void cancelClicked(); - void addClicked(); - void doneClicked(); - -private: - QLineEdit *value; - QComboBox *field; - QComboBox *match; - QComboBox *join; - QLabel *expression; - QFormLayout *formLayout; - QHBoxLayout *btnLayout; - QVBoxLayout *vertLayout; - - QPushButton *cancel; - QPushButton *add; - QPushButton *done; - - mutable QContactIntersectionFilter total; - mutable bool noFiltersYet; - mutable int state; - mutable QString expressionSoFar; -}; - - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/incomingcalls/incomingcalls.pro --- a/qtcontactsmobility/examples/incomingcalls/incomingcalls.pro Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -###################################################################### -# -# Simple example of how to use the contacts API -# -###################################################################### - -TEMPLATE = app -TARGET = incomingcalls -DEPENDPATH += . -INCLUDEPATH += . ../../src/contacts \ - ../../src/contacts/details \ - ../../src/contacts/requests \ - ../../src/contacts/filters - - -CONFIG += mobility -MOBILITY = contacts - -# Input -SOURCES += main.cpp \ - testmodelui.cpp \ - filterdialog.cpp \ - qcontactlistmodel.cpp - -HEADERS += testmodelui.h \ - filterdialog.h \ - qcontactlistmodel.h \ - qcontactlistmodel_p.h - -include(../examples.pri) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/incomingcalls/main.cpp --- a/qtcontactsmobility/examples/incomingcalls/main.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "testmodelui.h" -#include - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - TestModelUi ui; - ui.show(); - int retn = app.exec(); - return retn; -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/incomingcalls/qcontactlistmodel.cpp --- a/qtcontactsmobility/examples/incomingcalls/qcontactlistmodel.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,650 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qcontactlistmodel.h" -#include "qcontactlistmodel_p.h" - -#include "qcontact.h" -#include "qcontactmanager.h" -#include "qcontactdetails.h" -#include "qcontactrequests.h" -#include "qcontactfilters.h" - -/*! - * Constructs a new QContactListModel which will request data from the given \a manager - * and cache approximately \a cacheSize contacts. - * - * \sa setManager(), setCacheSize() - */ -QContactListModel::QContactListModel(QContactManager* manager, int cacheSize) - : QAbstractListModel(), - d(new QContactListModelPrivate) -{ - setCacheSize(cacheSize); - setManager(manager); -} - -/*! - * Constructs a new copy of the \a other model - */ -QContactListModel::QContactListModel(const QContactListModel& other) - : QAbstractListModel(), d(other.d) -{ -} - -/*! - * Assigns this model to be equal to \a other - */ -QContactListModel& QContactListModel::operator=(const QContactListModel& other) -{ - d = other.d; - return *this; -} - - -/*! - * Cleans up any memory in use by the model - */ -QContactListModel::~QContactListModel() -{ -} - -/*! - * Returns a pointer to the manager from which this model requests contact data - */ -QContactManager* QContactListModel::manager() const -{ - return d->m_manager; -} - -/*! - * Sets the manager from which this model requests contact data to \a manager. - * Any requests made of the old manager will be cancelled and deleted. - * - * \sa backendChanged() - */ -void QContactListModel::setManager(QContactManager* manager) -{ - // first, cancel and delete any requests made of the old manager - QMap updatedRequestCentreRows; - QList requests = d->m_requestCentreRows.keys(); - for (int i = 0; i < requests.size(); i++) { - QContactAbstractRequest* current = requests.at(i); - if (current->manager() == d->m_manager) { - current->cancel(); - delete current; - } else { - updatedRequestCentreRows.insert(current, d->m_requestCentreRows.value(current)); - } - } - d->m_requestCentreRows = updatedRequestCentreRows; - - // secondly, disconnect the signals from the old manager - if (d->m_manager) - d->m_manager->disconnect(this); - - // then set up the new manager. - d->m_manager = manager; - delete d->m_idRequest; - d->m_idRequest = new QContactLocalIdFetchRequest; - connect(d->m_idRequest, SIGNAL(progress(QContactLocalIdFetchRequest*,bool)), this, SLOT(contactIdFetchRequestProgress(QContactLocalIdFetchRequest*,bool))); - d->m_idRequest->setManager(manager); - if (manager) { - connect(manager, SIGNAL(contactsAdded(QList)), this, SLOT(backendChanged())); - connect(manager, SIGNAL(contactsChanged(QList)), this, SLOT(backendChanged())); - connect(manager, SIGNAL(contactsRemoved(QList)), this, SLOT(backendChanged())); - } - - // and kick of a request for the ids. - backendChanged(); -} - -/*! - * Returns the number of contacts that this model will cache - */ -int QContactListModel::cacheSize() const -{ - return (d->m_halfCacheSize * 2); -} - -/*! - * Sets the number of contacts that this model will cache to be approximately \a size contacts. - * The exact size of the cache will be the next higher size which is divisible by 4, or - * \a size if \a size is divisible by 4, unless the next higher size would cause integer overflow. - * Returns true if the cache size was set successfully, and false if a non-positive \a size was - * specified. - * - * \sa cacheSize() - */ -bool QContactListModel::setCacheSize(int size) -{ - // size will be rounded up to nearest where modulo 4 == 0, - // except where doing so would result in integer overflow - // (where it will be rounded down) - if (size > 0) { - // if the cache size is odd, round up to nearest even then test modulo 4 - // this allows us to cache m_halfCacheSize rows either side of currentRow - int modulo4 = size % 4; - if (modulo4 == 0) { - d->m_halfCacheSize = size / 2; - d->m_quarterCacheSize = size / 4; - } else { - int test = size + (4 - modulo4); // avoid integer overflow. - d->m_halfCacheSize = (test < 0 ? (size - modulo4) : (size + 4 - modulo4)); - d->m_halfCacheSize = d->m_halfCacheSize / 2; - d->m_quarterCacheSize = d->m_halfCacheSize / 2; - } - return true; - } - - return false; -} - -/*! - * Returns the policy that the model uses to determine when asynchronous requests should be cleaned up. - * - * \sa setRequestPolicy() - */ -QContactListModel::AsynchronousRequestPolicy QContactListModel::requestPolicy() const -{ - return d->m_requestPolicy; -} - -/*! - * Sets the policy that the model uses to determine when to clean up asynchronous requests to \a policy. - * - * \sa requestPolicy() - */ -void QContactListModel::setRequestPolicy(QContactListModel::AsynchronousRequestPolicy policy) -{ - d->m_requestPolicy = policy; -} - -/*! - * Returns the definition name of the relevant data detail which is cached by the model - * - * \sa setRelevantDetailDefinitionAndFieldNames() - */ -QString QContactListModel::relevantDefinitionName() const -{ - return d->m_relevantDefinitionName; -} - -/*! - * Returns the name of the field of the relevant data detail which is cached by the model - * - * \sa setRelevantDetailDefinitionAndFieldNames() - */ -QString QContactListModel::relevantFieldName() const -{ - return d->m_relevantFieldName; -} - -/*! - * Sets the definition name of the relevant detail which is cached by the model to \a definitionName, - * and the name of the field of such details which is cached to \a fieldName. - * - * \sa relevantDefinitionName(), relevantFieldName() - */ -bool QContactListModel::setRelevantDetailDefinitionAndFieldNames(const QString& definitionName, const QString& fieldName) -{ - if (definitionName.isEmpty() || fieldName.isEmpty()) - return false; - - d->m_relevantDefinitionName = definitionName; - d->m_relevantFieldName = fieldName; - return true; -} - -/*! - * \reimp - */ -int QContactListModel::rowCount(const QModelIndex& parent) const -{ - Q_UNUSED(parent); - return d->m_rowsToIds.count(); -} - -/*! - * \reimp - */ -QVariant QContactListModel::data(const QModelIndex& index, int role) const -{ - if (index.row() == -1) - return QVariant(); - - d->m_currentRow = index.row(); - QContact currentContact = d->m_cache.value(d->m_currentRow); - - // check to see if we need to update our cache - bool cacheUpdateRequired = d->m_cache.isEmpty(); - if ((d->m_halfCacheSize * 2) < d->m_rowsToIds.count()) { - // we cannot fit the entire dataset into our cache; calculate window size. - int maxActiveCacheRow = d->m_currentRow + d->m_quarterCacheSize; - int minActiveCacheRow = d->m_currentRow - d->m_quarterCacheSize; - if (maxActiveCacheRow <= d->m_lastCacheCentreRow) { - cacheUpdateRequired = true; - } else if (minActiveCacheRow >= d->m_lastCacheCentreRow) { - cacheUpdateRequired = true; - } - } - - if (cacheUpdateRequired) { - // the current row will be our new cache centre point. - d->m_lastCacheCentreRow = d->m_currentRow; - - // update our cache - first calculate the new cache window. - int lowerBound = d->m_lastCacheCentreRow - d->m_halfCacheSize; - int upperBound = d->m_lastCacheCentreRow + d->m_halfCacheSize; - - // create a list of rows we need to cache - QList newCacheRows; - if ((upperBound - lowerBound) >= d->m_rowsToIds.count()) { - // we can cache the entire dataset. - newCacheRows = d->m_rowsToIds.keys(); - } else { - // we can only cache a window of the entire dataset. - for (int i = lowerBound; i <= upperBound; i++) { - // wrap-around at top and bottom of cache. - int rowNumber = i; - if (i < 0) - rowNumber += d->m_rowsToIds.count(); - if (i >= d->m_rowsToIds.count()) - rowNumber -= d->m_rowsToIds.count(); - newCacheRows.append(rowNumber); - } - } - - // clean up any old requests depending on policy - // please note that this branching is _slow_; might be best to remove it - // and just always do the default (cancel on cache centrepoint miss)... - if (d->m_requestPolicy != QContactListModel::NeverCancelPolicy) { - QList oldRequests = d->m_requestCentreRows.keys(); - bool cancelRequest = false; - - // we could pull the conditionals outside the loop for better performance... - for (int i = 0; i < oldRequests.size(); i++) { - QContactAbstractRequest* current = oldRequests.at(i); - if (d->m_requestPolicy == QContactListModel::CancelOnCacheUpdatePolicy) { - // immediately cancel since update is required. - cancelRequest = true; - } else if (d->m_requestPolicy == QContactListModel::CancelOnCacheMissPolicy) { - // slow solution... should probably do bounds checking instead of .contains(). - if (!newCacheRows.contains(d->m_requestCentreRows.value(current))) { - cancelRequest = true; - } - } else { - int cacheSize = d->m_halfCacheSize * 2; - int requestCentre = d->m_requestCentreRows.value(current); - int requestWindowMax = (requestCentre + d->m_halfCacheSize) % cacheSize; - int requestWindowMin = (requestCentre - d->m_halfCacheSize) % cacheSize; - // slow solution... should probably do bounds checking instead of .contains(). - if (!newCacheRows.contains(requestWindowMax) && !newCacheRows.contains(requestWindowMin) && !newCacheRows.contains(requestCentre)) { - cancelRequest = true; - } - } - - // cancel (and clean up) the request if required by the policy. - if (cancelRequest) { - current->cancel(); - d->m_requestCentreRows.remove(current); - delete current; - } - - // reset the control variable. - cancelRequest = false; - } - } - - // create "spots" for the cache entries in our cache map - QList oldCacheRows = d->m_cache.keys(); - foreach (int row, newCacheRows) { - if (!d->m_cache.contains(row)) { - QContact temp; - QContactName loadingName; - loadingName.setCustomLabel(QString(tr("Loading..."))); - temp.saveDetail(&loadingName); - d->m_cache.insert(row, temp); - } - } - - // remove any out-of-cache-window contacts we have stored - // and remove from the newCacheRows any rows we already have cached - foreach (int row, oldCacheRows) { - if (row < lowerBound || row > upperBound) { - // don't want to cache this row. - d->m_cache.remove(row); - } - - if (newCacheRows.contains(row)) { - // already have this row in cache. - newCacheRows.removeOne(row); - } - } - - // ensure that the current row's contact is cached; if not create a placeholder. - if (!d->m_cache.contains(d->m_currentRow)) { - QContactName loadingName; - loadingName.setCustomLabel(QString(tr("Loading..."))); - currentContact.saveDetail(&loadingName); - } - - // now fire off an asynchronous request to update our cache - QContactFetchRequest* req = new QContactFetchRequest; - d->m_requestCentreRows.insert(req, d->m_lastCacheCentreRow); - QContactLocalIdFilter idFil; - QList newCacheIds; - for (int i = 0; i < newCacheRows.size(); i++) { - newCacheIds.append(d->m_rowsToIds.value(newCacheRows.at(i))); - } - idFil.setIds(newCacheIds); - req->setFilter(idFil); - req->setManager(d->m_manager); - connect(req, SIGNAL(progress(QContactFetchRequest*, bool)), this, SLOT(contactFetchRequestProgress(QContactFetchRequest*,bool))); - req->start(); - } - - // now return the data being requested. - QVariant ret; - switch (role) { - case QContactListModel::DisplayLabelRole: - { - ret = currentContact.displayLabel(); - } - break; - - case QContactListModel::IdRole: - { - ret = currentContact.id().localId(); - } - break; - - case QContactListModel::AvatarRole: - { - ret = currentContact.detail(QContactAvatar::DefinitionName).value(QContactAvatar::FieldAvatar); - } - break; - - case QContactListModel::PresenceRole: - { - if (d->m_manager == 0) { - // the manager has not been initialised. - break; - } - - // grab the possible presence values; they should be in order from (unknown) to least present to most present. - QContactDetailDefinition presenceDef = d->m_manager->detailDefinition(QContactOnlineAccount::DefinitionName); - QList allowablePresenceValues = presenceDef.fields().value(QContactOnlineAccount::FieldPresence).allowableValues(); - if (presenceDef.isEmpty() || allowablePresenceValues.isEmpty()) { - // the manager does not support presence details. - break; - } - - // calculate the "global presence" of the contact in a naive way. - int bestPresenceSoFar = 0; // unknown - QList presenceDetails = currentContact.details(QContactOnlineAccount::DefinitionName); - foreach (const QContactOnlineAccount& pres, presenceDetails) { - int index = allowablePresenceValues.indexOf(pres.presence()); - if (index > bestPresenceSoFar) { - bestPresenceSoFar = index; - } - } - - ret = QVariant(allowablePresenceValues.at(bestPresenceSoFar)); - } - break; - - case QContactListModel::RelevantDataRole: - { - ret = currentContact.detail(d->m_relevantDefinitionName).value(d->m_relevantFieldName); - } - break; - - default: - break; - } - - // return the requested data, or a default-constructed QVariant if not available. - return ret; -} - -/*! - * \reimp - */ -QVariant QContactListModel::headerData(int section, Qt::Orientation orientation, int role) const -{ - Q_UNUSED(section); - Q_UNUSED(orientation); - - QVariant ret; - switch (role) { - case QContactListModel::DisplayLabelRole: - { - ret = QString(tr("Name")); - } - break; - - case QContactListModel::IdRole: - { - ret = QString(tr("Id")); - } - break; - - case QContactListModel::AvatarRole: - { - ret = QString(tr("Avatar")); - } - break; - - case QContactListModel::PresenceRole: - { - ret = QString(tr("Presence")); - } - break; - - case QContactListModel::RelevantDataRole: - { - // todo: take this as an argument in setRelevant() - ret = QString(tr("Details")); - } - break; - - default: - break; - } - - return ret; -} - -/*! - * \reimp - */ -bool QContactListModel::insertRows(int row, int count, const QModelIndex& parent) -{ - beginInsertRows(parent, row, count); - - // insertion code here. - - endInsertRows(); - - return false; -} - -/*! - * \reimp - */ -bool QContactListModel::removeRows(int row, int count, const QModelIndex& parent) -{ - beginRemoveRows(parent, row, count); - - // removal code here. - - endRemoveRows(); - - return false; -} - -/*! - * Returns the row number at which the data of the contact with the given \a contactId is stored, or - * -1 if no such contact exists in the model - */ -int QContactListModel::contactRow(const QContactLocalId& contactId) const -{ - return d->m_idsToRows.value(contactId, -1); -} - -/*! - * Returns the entire contact which exists in the model at the specified \a index - */ -QContact QContactListModel::contact(const QModelIndex& index) const -{ - if (d->m_manager) - return d->m_manager->contact(d->m_rowsToIds.value(index.row())); - return QContact(); -} - -/*! - * Processes the progress of the \a request. - * If the request is still valid, the results are placed in the cache at the required positions. - * If the cache is updated, the dataChanged() signal is emitted. - * This implementation ignores the \a appendOnly flag. - */ -void QContactListModel::contactFetchRequestProgress(QContactFetchRequest* request, bool appendOnly) -{ - Q_UNUSED(appendOnly); - - // first, check to make sure that the request is still valid. - if (d->m_manager != request->manager() || request->status() == QContactAbstractRequest::Cancelled) { - d->m_requestCentreRows.remove(request); - delete request; - return; // ignore these results. - } - - QMap rowMap; // sorted list of rows changed. - QList fetched = request->contacts(); - foreach (const QContact& c, fetched) { - int fetchedRow = d->m_idsToRows.value(c.id().localId(), -1); - - // see if this row should be cached - if (!d->m_cache.contains(fetchedRow)) - break; // shouldn't cache this row (or already cached); ignore the contact. - - // we need to cache this contact. - d->m_cache.insert(fetchedRow, c); - rowMap.insert(fetchedRow, fetchedRow); - } - - // check to see if the request status is "finished" - clean up. - if (request->status() == QContactAbstractRequest::Finished) { - d->m_requestCentreRows.remove(request); - delete request; - } - - // emit data changed for those that have changed. - QList rows = rowMap.keys(); - while (rows.size() > 0) { - // we want to emit the dataChanged signal as few times as possible - // so, we coalesce the changes into lumps of contiguous changes. - int lowestIndex = rows.at(0); - int highestIndex = rows.at(0); - int nbrAccountedFor = 1; - int nbrRows = rows.size(); - while (nbrAccountedFor < nbrRows) { - int temp = highestIndex; - highestIndex = rows.at(nbrAccountedFor); - if ((highestIndex - temp) > 1) { - highestIndex = temp; - break; - } - nbrAccountedFor += 1; - } - - while (nbrAccountedFor > 0) { - rows.removeFirst(); - nbrAccountedFor -= 1; - } - - // calculate the indices of the boundaries, and emit the signal. - QModelIndex lowerBound = QAbstractItemModel::createIndex(lowestIndex, 0); - QModelIndex upperBound = QAbstractItemModel::createIndex(highestIndex, 0); - emit dataChanged(lowerBound, upperBound); - } -} - -/*! - * Processes the results of a contact id fetch request. - * If the \a appendOnly flag is set, the new data is appended to the existing data - * and the dataChanged() signal is emitted; otherwise, the model emits the reset() signal - * once the new data has been loaded. - */ -void QContactListModel::contactIdFetchRequestProgress(QContactLocalIdFetchRequest* request, bool appendOnly) -{ - // first, if it's not append only, we need to rebuild the entire list + cache. - if (!appendOnly) { - d->m_cache.clear(); - d->m_rowsToIds.clear(); - d->m_idsToRows.clear(); - } - - // then get the results, calculate the start and end indices, and fill our data structures. - QList ids = request->ids(); - int startIndex = d->m_idsToRows.count(); - int endIndex = ids.size(); - for (int i = startIndex; i < endIndex; i++) { - d->m_rowsToIds.insert(i, ids.at(i)); - d->m_idsToRows.insert(ids.at(i), i); - } - - // and if we need to, emit the reset signals. - if (!appendOnly) - reset(); - else - emit dataChanged(QAbstractItemModel::createIndex(startIndex,0), QAbstractItemModel::createIndex(endIndex,0)); -} - -/*! - * Requests data from the new backend. - */ -void QContactListModel::backendChanged() -{ - d->m_idRequest->start(); - d->m_idRequest->waitForFinished(); -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/incomingcalls/qcontactlistmodel.h --- a/qtcontactsmobility/examples/incomingcalls/qcontactlistmodel.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,130 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#ifndef QCONTACTLISTMODEL_H -#define QCONTACTLISTMODEL_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "qtcontactsglobal.h" -#include "qcontact.h" -#include "qcontactphonenumber.h" - -#include -#include - -QTM_BEGIN_NAMESPACE -class QContactManager; -class QContactFetchRequest; -class QContactLocalIdFetchRequest; -QTM_END_NAMESPACE - -QTM_USE_NAMESPACE - -class QContactListModelPrivate; -class QContactListModel : public QAbstractListModel -{ - Q_OBJECT - -public: - QContactListModel(QContactManager* manager = 0, int cacheSize = 50); - QContactListModel(const QContactListModel& other); - QContactListModel& operator=(const QContactListModel& other); - ~QContactListModel(); - - QContactManager* manager() const; - void setManager(QContactManager* manager); - - int cacheSize() const; - bool setCacheSize(int size); - - enum AsynchronousRequestPolicy { - CancelOnCacheUpdatePolicy = 0, // cancel old requests whenever a cache update should occur - CancelOnCacheMissPolicy, // cancel if old centrepoint outside current cache window - CancelOnCompleteCacheMissPolicy, // cancel if no overlap between request and current cache windows - NeverCancelPolicy // never cancel old requests - }; - - AsynchronousRequestPolicy requestPolicy() const; - void setRequestPolicy(AsynchronousRequestPolicy policy = CancelOnCacheMissPolicy); - - QString relevantDefinitionName() const; - QString relevantFieldName() const; - bool setRelevantDetailDefinitionAndFieldNames(const QString& definitionName = QContactPhoneNumber::DefinitionName, const QString& fieldName = QContactPhoneNumber::FieldNumber); - - enum ContactDataRole { - DisplayLabelRole = Qt::DisplayRole, - IdRole = Qt::UserRole, - AvatarRole = Qt::UserRole+1, - PresenceRole = Qt::UserRole+2, - RelevantDataRole = Qt::UserRole+3 - }; - - int rowCount (const QModelIndex& parent = QModelIndex()) const; - QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; - QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; - - bool insertRows(int row, int count, const QModelIndex& parent = QModelIndex()); - bool removeRows(int row, int count, const QModelIndex& parent = QModelIndex()); - - int contactRow(const QContactLocalId& contactId) const; - QContact contact(const QModelIndex& index) const; - -private slots: - void contactFetchRequestProgress(QContactFetchRequest* request, bool appendOnly); - void contactIdFetchRequestProgress(QContactLocalIdFetchRequest* request, bool appendOnly); - void backendChanged(); - -private: - QSharedDataPointer d; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/incomingcalls/qcontactlistmodel_p.h --- a/qtcontactsmobility/examples/incomingcalls/qcontactlistmodel_p.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,137 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#ifndef QCONTACTLISTMODEL_P_H -#define QCONTACTLISTMODEL_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "qtcontactsglobal.h" -#include "qcontactphonenumber.h" -#include "qcontactrequests.h" - -#include "qcontactlistmodel.h" - -#include -#include - -QTM_USE_NAMESPACE - -class QContactListModelPrivate : public QSharedData -{ -public: - QContactListModelPrivate() - : QSharedData(), - m_manager(0), - m_requestPolicy(QContactListModel::CancelOnCacheMissPolicy), - m_halfCacheSize(10), - m_quarterCacheSize(5), - m_lastCacheCentreRow(-1), - m_currentRow(-1), - m_relevantDefinitionName(QString(QLatin1String(QContactPhoneNumber::DefinitionName))), - m_relevantFieldName(QString(QLatin1String(QContactPhoneNumber::FieldNumber))), - m_idRequest(0) - { - } - - QContactListModelPrivate(const QContactListModelPrivate& other) - : QSharedData(other), - m_idsToRows(other.m_idsToRows), - m_rowsToIds(other.m_rowsToIds), - m_manager(other.m_manager), - m_requestPolicy(other.m_requestPolicy), - m_halfCacheSize(other.m_halfCacheSize), - m_quarterCacheSize(other.m_quarterCacheSize), - m_cache(other.m_cache), - m_lastCacheCentreRow(other.m_lastCacheCentreRow), - m_currentRow(other.m_currentRow), - m_requestCentreRows(other.m_requestCentreRows), - m_relevantDefinitionName(other.m_relevantDefinitionName), - m_relevantFieldName(other.m_relevantFieldName), - m_idRequest(other.m_idRequest) - { - } - - ~QContactListModelPrivate() - { - if (m_idRequest) { - m_idRequest->cancel(); - delete m_idRequest; - } - - QList requests = m_requestCentreRows.keys(); - for (int i = 0; i < requests.size(); i++) { - QContactAbstractRequest* current = requests.at(i); - current->cancel(); - m_requestCentreRows.remove(current); - delete current; - } - } - - QMap m_idsToRows; - QMap m_rowsToIds; - - QContactManager* m_manager; - QContactListModel::AsynchronousRequestPolicy m_requestPolicy; - int m_halfCacheSize; - int m_quarterCacheSize; - mutable QMap m_cache; - mutable int m_lastCacheCentreRow; - mutable int m_currentRow; - mutable QMap m_requestCentreRows; - - QString m_relevantDefinitionName; - QString m_relevantFieldName; - - QContactLocalIdFetchRequest* m_idRequest; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/incomingcalls/testmodelui.cpp --- a/qtcontactsmobility/examples/incomingcalls/testmodelui.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,455 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "testmodelui.h" -#include "qtcontacts.h" -#include "qcontactlistmodel.h" -#include "qcontactfetchrequest.h" - -#include - -TestModelView::TestModelView(QContactManager* manager) - : QListView() -{ - model = new QContactListModel(manager); - setModel(model); -} - -TestModelView::~TestModelView() -{ - delete model; -} - -QContactLocalId TestModelView::currentId() const -{ - return QContactLocalId(model->data(currentIndex(), QContactListModel::IdRole).toUInt()); -} - -QVariant TestModelView::currentData(QContactListModel::ContactDataRole role) const -{ - return model->data(currentIndex(), role); -} - -TestModelUi::TestModelUi() - : QWidget() -{ - manager = new QContactManager("memory"); - populateContacts(); - nbrMissedCalls = 0; - talkingToNumber = ""; - - dialog = new FilterDialog; - connect(dialog, SIGNAL(hidden()), this, SLOT(filterFound())); - - fetchRequest = new QContactFetchRequest; - fetchRequest->setManager(manager); - connect(fetchRequest, SIGNAL(progress(QContactFetchRequest*,bool)), this, SLOT(dataAvailable(QContactFetchRequest*,bool))); - filterRequest = new QContactFetchRequest; - filterRequest->setManager(manager); - connect(filterRequest, SIGNAL(progress(QContactFetchRequest*,bool)), this, SLOT(filterResults(QContactFetchRequest*,bool))); - - incomingCallTimer = new QTimer; - incomingCallTimer->setInterval(15000); // 15 seconds between incoming calls. - dialTimer = new QTimer; - dialTimer->setInterval(3000); // they answer after 3 seconds - answerTimer = new QTimer; - answerTimer->setInterval(6000); // missed call after 6 seconds - - connect(incomingCallTimer, SIGNAL(timeout()), this, SLOT(incoming())); - connect(dialTimer, SIGNAL(timeout()), this, SLOT(talking())); - connect(answerTimer, SIGNAL(timeout()), this, SLOT(missedCall())); - incomingCallTimer->start(); - - list = new TestModelView(manager); - textEdit = new QTextEdit; - viewArea = new QStackedWidget; - viewArea->addWidget(list); - viewArea->addWidget(textEdit); - viewArea->setCurrentIndex(0); - - missedCalls = new QLabel; - missedCalls->setAlignment(Qt::AlignLeft); - missedCalls->setText(QString(tr("# Missed Calls:"))); - missedCallsNbr = new QLabel; - missedCallsNbr->setAlignment(Qt::AlignRight); - missedCallsNbr->setText(QString::number(nbrMissedCalls)); - - leftButton = new QPushButton(tr("Dial")); - middleButton = new QPushButton(tr("Find")); - rightButton = new QPushButton(tr("Quit")); - - connect(leftButton, SIGNAL(clicked()), this, SLOT(dial())); - connect(middleButton, SIGNAL(clicked()), this, SLOT(findContact())); - connect(rightButton, SIGNAL(clicked()), this, SLOT(close())); - - QHBoxLayout *missedLayout = new QHBoxLayout; - missedLayout->addWidget(missedCalls); - missedLayout->addWidget(missedCallsNbr); - - QHBoxLayout *btnLayout = new QHBoxLayout; - btnLayout->addWidget(leftButton); - btnLayout->addWidget(middleButton); - btnLayout->addWidget(rightButton); - - QVBoxLayout *listLayout = new QVBoxLayout; - listLayout->addLayout(missedLayout); - listLayout->addWidget(viewArea); - listLayout->addLayout(btnLayout); - - setLayout(listLayout); -} - -TestModelUi::~TestModelUi() -{ - delete fetchRequest; - delete filterRequest; - - delete leftButton; - delete rightButton; - delete list; - delete textEdit; - delete viewArea; - delete dialog; - delete manager; -} - -void TestModelUi::populateContacts() -{ - // generate some fictional contacts. - QStringList nameFirst; - nameFirst << "Adam" << "Adrianna" << "Alex" << "Brett" << "Bob" - << "Carina" << "Christina" << "Carl" << "Daniel" << "Denise" - << "Eric" << "Fred" << "Mario" << "William" << "Zandi"; - QStringList nameLast; - nameLast << "Citizen" << "Civilian" << "Doe" << "Generic" << "Public" << "Unlikely"; - - QStringList phoneFirst; - phoneFirst << "111" << "222" << "333" << "444" << "555" << "666" << "777" << "888" - << "123" << "234" << "345" << "456" << "567" << "678" << "789"; - QStringList phoneLast; - phoneLast << "9876" << "8765" << "7654" << "6543" << "5432" << "4321"; - - QStringList emailFirst; - emailFirst << "testPersonOne" << "testPersonTwo" << "testPersonThree" << "testPersonFour" << "testPersonFive" - << "testPersonSix" << "testPersonSeven" << "testPersonEight" << "testPersonNine" << "testPersonTen" - << "testPersonEleven" << "testPersonTwelve" << "testPersonThirteen" << "testPersonFourteen" << "testPersonFifteen"; - QStringList emailLast; - emailLast << "@test1.nokia.com" << "@test2.nokia.com" << "@test3.nokia.com" - << "@test4.nokia.com" << "@test5.nokia.com" << "@test6.nokia.com"; - - QStringList avatarFirst; - avatarFirst << "party" << "celebration" << "happyface" << "grinning" << "smile" - << "laughing" << "dance" << "serious" << "angry" << "sadface" - << "tree" << "mountain" << "ocean" << "city" << "bridge"; - QStringList avatarLast; - avatarLast << ".png" << ".bmp" << ".jpg" << ".gif" << ".avi" << ".mpg"; - - for (int i = 0; i < 15; i++) { - for (int j = 0; j < 6; j++) { - QContact c; - QContactName n; - QContactPhoneNumber p; - QContactEmailAddress e; - QContactAvatar a; - - n.setFirst(nameFirst.at(i)); - n.setLast(nameLast.at(j)); - p.setNumber(phoneFirst.at(i) + phoneLast.at(j)); - e.setEmailAddress(emailFirst.at(i) + emailLast.at(j)); - a.setAvatar(avatarFirst.at(i) + avatarLast.at(j)); - - c.saveDetail(&n); - c.saveDetail(&p); - c.saveDetail(&e); - c.saveDetail(&a); - - manager->saveContact(&c); - } - } -} - -void TestModelUi::dataAvailable(QContactFetchRequest* request, bool appendOnly) -{ - Q_UNUSED(appendOnly); - - // first, make sure we can use the data. - if (currentState == TestModelUi::WaitingState || request->status() != QContactAbstractRequest::Finished) - return; - - // we assume that we need the extra details. - QString text; - - QList requestData = request->contacts(); - if (requestData.isEmpty() || requestData.at(0).isEmpty()) { - text += "Unknown Contact"; - talkingToDetails = text; - textEdit->setText(talkingToFirstLine + " " + talkingToNumber + "\n\n" + talkingToDetails); - return; - } - - QContact curr = request->contacts().at(0); - QList allDetails = curr.details(); - foreach (const QContactDetail& det, allDetails) { - QString defName = det.definitionName(); - text += defName + ":" + "\n"; - QList fieldKeys = det.values().keys(); - foreach (const QString& key, fieldKeys) { - text += "\t" + key + " = " + det.value(key) + "\n"; - } - text += "\n"; - } - - talkingToName = curr.displayLabel(); - if (currentState == TestModelUi::DialingState) { - talkingToNumber = curr.detail(QContactPhoneNumber::DefinitionName).value(QContactPhoneNumber::FieldNumber); - } - - if (!text.isEmpty()) - text.chop(1); // kill unneeded newline. - talkingToDetails = text; - textEdit->setText(talkingToFirstLine + " " + talkingToName + "\n\n" + talkingToDetails); -} - -void TestModelUi::filterResults(QContactFetchRequest* request, bool appendOnly) -{ - Q_UNUSED(appendOnly); - QList results = request->contacts(); - QString text = "Matching Contacts:\n"; - for (int i = 0; i < results.size(); i++) { - text += "\n" + results.at(i).displayLabel(); - } - textEdit->setText(text); - - if (request->status() == QContactAbstractRequest::Finished) { - if (results.isEmpty()) - textEdit->setText("Matching Contacts:\n\nNo Matches Found!"); - rightButton->setText(tr("Done")); - middleButton->setEnabled(true); - } -} - -void TestModelUi::filterFound() -{ - QContactFilter fil = dialog->filter(); - if (dialog->status() > 0) { - textEdit->setText("Finding Contacts...\n\n"); - filterRequest->cancel(); - filterRequest->setFilter(fil); - filterRequest->start(); - } else { - finishedFindContact(); - } -} - -void TestModelUi::showFilterDialog() -{ - middleButton->setEnabled(false); - textEdit->setText("Selecting search criteria..."); - rightButton->setText(tr("Cancel")); - dialog->showDialog(); -} - -void TestModelUi::findContact() -{ - // complex filtering. - incomingCallTimer->stop(); - dialTimer->stop(); - answerTimer->stop(); - - textEdit->setText("Please select a search criteria (click search)"); - middleButton->disconnect(); - rightButton->disconnect(); - leftButton->setEnabled(false); - middleButton->setEnabled(true); - rightButton->setEnabled(true); - middleButton->setText(tr("Search")); - rightButton->setText(tr("Cancel")); - connect(middleButton, SIGNAL(clicked()), this, SLOT(showFilterDialog())); - connect(rightButton, SIGNAL(clicked()), this, SLOT(finishedFindContact())); - viewArea->setCurrentIndex(1); -} - -void TestModelUi::finishedFindContact() -{ - // only allow them to finish if they close the find contact dialog. - if (dialog->status() == 0) - return; - - hangup(); -} - -void TestModelUi::dial() -{ - // get current index id from view - // change current widget to text - // change buttons to - // ... - incomingCallTimer->stop(); - answerTimer->stop(); - currentState = TestModelUi::DialingState; - - QContactLocalIdFilter fil; - QList fetchIds; - fetchIds << list->currentId(); - fil.setIds(fetchIds); - fetchRequest->cancel(); // if not already stopped. - fetchRequest->setFilter(fil); - fetchRequest->start(); - - talkingToFirstLine = "Dialing"; - talkingToName = list->currentData(QContactListModel::DisplayLabelRole).toString(); - textEdit->setText(talkingToFirstLine + " " + talkingToName + "\n\n" + talkingToDetails); - leftButton->disconnect(); - rightButton->disconnect(); - leftButton->setText(tr("Dial")); - rightButton->setText(tr("Cancel")); - connect(rightButton, SIGNAL(clicked()), this, SLOT(hangup())); - leftButton->setEnabled(false); - middleButton->setEnabled(false); - viewArea->setCurrentIndex(1); - dialTimer->start(); -} - -void TestModelUi::incoming() -{ - // change current widget to text - // change buttons to - // ... - incomingCallTimer->stop(); - dialTimer->stop(); - currentState = TestModelUi::IncomingState; - - // create some phone numbers. about half appear in our contacts, half do not. - QStringList phoneFirst; - phoneFirst << "111" << "222" << "337" << "944" << "555" << "611" << "777" << "855" - << "123" << "234" << "385" << "456" << "587" << "688" << "788"; - QStringList phoneLast; - phoneLast << "9876" << "8765" << "7654" << "9543" << "5432" << "9321"; - - int firstIndex = qrand() % phoneFirst.size(); - int lastIndex = qrand() % phoneLast.size(); - talkingToNumber = phoneFirst.at(firstIndex) + phoneLast.at(lastIndex); - talkingToFirstLine = "Incoming call from"; - textEdit->setText(talkingToFirstLine + " " + talkingToNumber + "\n\n" + talkingToDetails); - - QContactDetailFilter fil; - fil.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldNumber); - fil.setValue(talkingToNumber); - fetchRequest->cancel(); // if not already stopped. - fetchRequest->setFilter(fil); - fetchRequest->start(); - - leftButton->disconnect(); - rightButton->disconnect(); - leftButton->setText(tr("Answer")); - rightButton->setText(tr("Hang Up")); - connect(leftButton, SIGNAL(clicked()), this, SLOT(talking())); - connect(rightButton, SIGNAL(clicked()), this, SLOT(hangup())); - leftButton->setEnabled(true); - middleButton->setEnabled(false); - viewArea->setCurrentIndex(1); - - answerTimer->start(); -} - -void TestModelUi::talking() -{ - // get id of contact from incoming? - // using async contact request with filter? - // change current widget to text - // change buttons to - // ... - incomingCallTimer->stop(); - dialTimer->stop(); - answerTimer->stop(); - currentState = TestModelUi::TalkingState; - - talkingToFirstLine = "Talking to"; - textEdit->setText(talkingToFirstLine + " " + (talkingToName.isEmpty() ? talkingToNumber : talkingToName) + "\n\n" + talkingToDetails); - leftButton->disconnect(); - rightButton->disconnect(); - leftButton->setText(tr("Answer")); - rightButton->setText(tr("Hang Up")); - connect(rightButton, SIGNAL(clicked()), this, SLOT(hangup())); - leftButton->setEnabled(false); - middleButton->setEnabled(false); -} - -void TestModelUi::hangup() -{ - // change current widget to list - // change buttons to - // ... - incomingCallTimer->stop(); - dialTimer->stop(); - answerTimer->stop(); - currentState = TestModelUi::WaitingState; - - talkingToName = ""; - talkingToNumber = ""; - talkingToDetails = ""; - talkingToFirstLine = ""; - textEdit->setText(""); - leftButton->disconnect(); - middleButton->disconnect(); - rightButton->disconnect(); - leftButton->setText(tr("Dial")); - middleButton->setText(tr("Find")); - rightButton->setText(tr("Quit")); - connect(leftButton, SIGNAL(clicked()), this, SLOT(dial())); - connect(middleButton, SIGNAL(clicked()), this, SLOT(findContact())); - connect(rightButton, SIGNAL(clicked()), this, SLOT(close())); - leftButton->setEnabled(true); - middleButton->setEnabled(true); - viewArea->setCurrentIndex(0); - incomingCallTimer->start(); // restart the incoming call timer. -} - -void TestModelUi::missedCall() -{ - // increment missed call count - // change current widget to list - // change buttons to - // ... - nbrMissedCalls += 1; - missedCallsNbr->setText(QString::number(nbrMissedCalls)); - hangup(); -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/incomingcalls/testmodelui.h --- a/qtcontactsmobility/examples/incomingcalls/testmodelui.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,147 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef TESTMODELUI_H -#define TESTMODELUI_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include -#include - -#include "qtcontactsglobal.h" // for QContactLocalId... -#include "qcontactlistmodel.h" -#include "filterdialog.h" - -QT_BEGIN_NAMESPACE -class QStackedWidget; -class QTextEdit; -class QLabel; -class QPushButton; -QT_END_NAMESPACE - -QTM_BEGIN_NAMESPACE -class QContactFetchRequest; -class QContactManager; -QTM_END_NAMESPACE - -QTM_USE_NAMESPACE -class TestModelView : public QListView -{ - Q_OBJECT - -public: - TestModelView(QContactManager* manager = 0); - ~TestModelView(); - - QContactLocalId currentId() const; - QVariant currentData(QContactListModel::ContactDataRole role) const; - -private: - QContactListModel *model; -}; - -class TestModelUi : public QWidget -{ - Q_OBJECT - -public: - TestModelUi(); - ~TestModelUi(); - -public slots: - void populateContacts(); - void dataAvailable(QContactFetchRequest* request, bool appendOnly); - void filterResults(QContactFetchRequest* request, bool appendOnly); - void filterFound(); - - void findContact(); - void showFilterDialog(); - void finishedFindContact(); - void dial(); - void incoming(); - void talking(); - void hangup(); - void missedCall(); - -private: - QContactManager *manager; - FilterDialog *dialog; - TestModelView *list; - QTextEdit *textEdit; - QStackedWidget *viewArea; - QPushButton *leftButton; - QPushButton *middleButton; - QPushButton *rightButton; - - QTimer *incomingCallTimer; // we generate incoming calls from this - QTimer *dialTimer; // we simulate them answering after x seconds - QTimer *answerTimer; // incoming calls are ignored after y seconds - QLabel *missedCalls; // the display label for missed calls - QLabel *missedCallsNbr; // the count is displayed in this widget - int nbrMissedCalls; - - enum CallState { - WaitingState = 0, - IncomingState, - DialingState, - TalkingState - }; - CallState currentState; - - QContactFetchRequest* fetchRequest; - QContactFetchRequest* filterRequest; - QString talkingToName; - QString talkingToNumber; - QString talkingToDetails; - QString talkingToFirstLine; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/ScrollBar.qml --- a/qtcontactsmobility/examples/qml-contacts/ScrollBar.qml Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -import Qt 4.6 - -Item { - id: scrollBar - // The properties that define the scrollbar's state. - // position and pageSize are in the range 0.0 - 1.0. They are relative to the - // height of the page, i.e. a pageSize of 0.5 means that you can see 50% - // of the height of the view. - // orientation can be either 'Vertical' or 'Horizontal' - property real position - property real pageSize - property var orientation : "Vertical" - - // A light, semi-transparent background - Rectangle { - id: background - radius: orientation == 'Vertical' ? (width/2 - 1) : (height/2 - 1) - color: "white"; opacity: 0.3 - anchors.fill: parent - } - // Size the bar to the required size, depending upon the orientation. - Rectangle { - opacity: 0.7 - color: "black" - radius: orientation == 'Vertical' ? (width/2 - 1) : (height/2 - 1) - x: orientation == 'Vertical' ? 1 : (scrollBar.position * (scrollBar.width-2) + 1) - y: orientation == 'Vertical' ? (scrollBar.position * (scrollBar.height-2) + 1) : 1 - width: orientation == 'Vertical' ? (parent.width-2) : (scrollBar.pageSize * (scrollBar.width-2)) - height: orientation == 'Vertical' ? (scrollBar.pageSize * (scrollBar.height-2)) : (parent.height-2) - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/MediaButton.qml --- a/qtcontactsmobility/examples/qml-contacts/contents/MediaButton.qml Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -import Qt 4.6 - -Item { - property var text - signal clicked - - id: container - Image { - id: normal - source: "pics/button.png" - } - Image { - id: pressed - source: "pics/button-pressed.png" - opacity: 0 - } - MouseRegion { - id: clickRegion - anchors.fill: normal - onClicked: { container.clicked(); } - } - Text { - font.bold: true - color: "white" - anchors.centerIn: normal - text: container.text - } - width: normal.width - - states: State { - name: "Pressed" - when: clickRegion.pressed == true - PropertyChanges { target: pressed; opacity: 1 } - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/add.png Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/add.png has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/archive-insert.png Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/archive-insert.png has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/archive-remove.png Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/archive-remove.png has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/button-pressed.png Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/button-pressed.png has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/button.png Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/button.png has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/del.png Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/del.png has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/fruit-salad.jpg Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/fruit-salad.jpg has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/go-down.png Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/go-down.png has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/go-up.png Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/go-up.png has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/hamburger.jpg Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/hamburger.jpg has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/lemonade.jpg Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/lemonade.jpg has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/list-add.png Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/list-add.png has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/list-remove.png Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/list-remove.png has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/moreDown.png Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/moreDown.png has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/moreUp.png Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/moreUp.png has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/pancakes.jpg Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/pancakes.jpg has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/trash.png Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/trash.png has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/contents/pics/vegetable-soup.jpg Binary file qtcontactsmobility/examples/qml-contacts/contents/pics/vegetable-soup.jpg has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/example.qml --- a/qtcontactsmobility/examples/qml-contacts/example.qml Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,181 +0,0 @@ -import QMLContactManagerAsync 1.0 -import QmlContact 1.0 -import Qt 4.6 - -Rectangle { - id: topItem - width: 320 - height: 480 -// border.color: "bg -// border.width: 5 -// radius: 10 - x: 0 - y: 0 - - Script { - function startup() { - print("Hello"); - - print("Num contacts: " + blah.numContacts); - blah.contacts(); - } - function gotContacts(c) { - if(c == undefined){ - //print("Error, got null object for gotContacts"); - return; - } - print("Got contacts: " + c.name); - print(" Available actions: " + c.availableActions); - print(" details: " + c.details);detailsOpacity - print(" context: " + c.context); - var o = c.values("OnlineAccount"); - var q = c.values("Presence"); - var a = c.values("Avatar"); - nameModel.append({"name": c.name, "accountPath": "Account: " + o.AccountPath, "presence": "Status: " + q.Presence, "avatarsource": "file://" + a.Avatar}); - - var j; - for(j in c.details){ - var o = c.values(c.details[j]); - var i; - for(i in o){ - print(" "+ c.details[j] + "/" + i + ": " + o[i]); - } - } - } - function clickedList(index) { - mainList.currentIndex = index; - } - } - Component.onCompleted: startup(); - - QMLContactManagerAsync { - id: "blah" - - manager: "memory" - onDataChanged: print("Data changed!"); - onContactsAdded: print("Contacts added: " + contactIds); - onContactsLoaded: gotContacts(contact); - } - - Component { - id: listdelegate - Rectangle { - id: wrapper - border.width: 2 - radius: 5 - height: 40 - width: topItem.width-2; - property real detailsOpacity: 0 - Row { - Item { - property real contactId: 0 - } - Text { - id: nameTxt - text: name - } - Item { - id: details - opacity: wrapper.detailsOpacity - Text { - y: nameTxt.height - id: accountPathId - text: accountPath - } - Text { - y: accountPathId.y + accountPathId.height - id: presenceId - text: presence - } - } - } - Image { - id: avatar - height: wrapper.height-6 - source: avatarsource - x: wrapper.width - avatar.width - 3 - y: 3 - opacity: details.opacity - fillMode: Image.PreserveAspectFit - } - states: State { - name: "Details" - PropertyChanges { target: wrapper; height: presenceId.y + presenceId.height } - PropertyChanges { target: wrapper; detailsOpacity: 1; } - } - - transitions: Transition { - from: "" - to: "Details" - reversible: true - ParallelAnimation { - NumberAnimation { - duration: 300; property: "detailsOpacity" } - NumberAnimation { - duration: 300; property: "height" } - } - } - MouseRegion { - id: mr - width: topItem.width; - height: wrapper.height; - anchors.centerIn: parent; - onClicked: wrapper.state == "" ? wrapper.state = "Details" : wrapper.state = ""; - } - } - } - - Component { - id: listhighlight - Rectangle { - width: parent.width-8 - height: 40 - color: "lightsteelblue" - radius: 5 - } - } - - ListView { - id: mainList - model: nameModel - width: parent.width; height: parent.height - delegate: listdelegate - highlight: listhighlight - //highlightFollowsCurrentItem: true - focus: true - anchors.fill: parent - highlightMoveSpeed: 5000 - } - - - ListModel { - id: nameModel - } - - // Attach scrollbar to the right edge of the view. - ScrollBar { - id: verticalScrollBar - opacity: 0.1 - orientation: "Vertical" - position: mainList.visibleArea.yPosition - pageSize: mainList.visibleArea.heightRatio - width: 8 - height: mainList.height - anchors.right: mainList.right - // Only show the scrollbar when the view is moving. - states: [ - State { - name: "ShowBars"; when: mainList.moving - PropertyChanges { target: verticalScrollBar; opacity: 1 } - } - ] - transitions: [ Transition { NumberAnimation { property: "opacity"; duration: 400 } } ] - } - - - -} - - - -// ![0] diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/main.cpp --- a/qtcontactsmobility/examples/qml-contacts/main.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** - -** -** -** $QT_END_LICENSE$ - -** -****************************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include "qmlcontactsa.h" -QT_USE_NAMESPACE -QTM_USE_NAMESPACE - -int main(int argc, char ** argv) -{ - QApplication app(argc, argv); - - - QmlEngine engine; - QmlComponent component(&engine, ":example.qml"); -// QMLContactManager *qcm = qobject_cast(component.create()); -// if (qcm) { -// qWarning() << "Available back ends: " << qcm->availableManagers(); -// qWarning() << "Current Backend: " << qcm->manager(); -// //qWarning() << "They wear a" << person->shoeSize() << "sized shoe"; -// } else { -// -// qWarning() << "An error occured"; -// qWarning() << component.errorsString(); -// exit(-1); -// } -// QmlGraphicsItem *qcm = qobject_cast(component.create()); -// if(!qcm){ -// qWarning() << "An error occured"; -// qWarning() << component.errorsString(); -// exit(-1); -// -// } -// qcm->show(); - - QWidget *b = new QWidget; - QVBoxLayout *vbox = new QVBoxLayout; - vbox->setMargin(0); - b->setLayout(vbox); - - QmlView *view = new QmlView(b); - view->setFocusPolicy(Qt::StrongFocus); - view->setContentResizable(true); - view->setUrl(QUrl("qrc:/example.qml")); - view->execute(); - vbox->addWidget(view); - b->resize(800,480); - b->show(); - - return app.exec(); -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/qmlcontact.pro --- a/qtcontactsmobility/examples/qml-contacts/qmlcontact.pro Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -TEMPLATE = app -TARGET = qmlcontacts - -CONFIG += mobility -MOBILITY = contacts - -DEPENDPATH += . -INCLUDEPATH += . \ - ../../include \ - ../../src/contacts \ - ../../src/contacts/requests \ - ../../src/contacts/details \ - ../../src/contacts/filters - -QT += declarative -QT += script - - -# Input -SOURCES += main.cpp \ - qmlcontacts.cpp \ - qmlcontact.cpp -HEADERS += qmlcontactsa.h \ - qmlcontact.h -RESOURCES += qmlcontacts.qrc -OTHER_FILES += example.qml \ - Recipes.qml \ - contents/pics/vegetable-soup.jpg \ - contents/pics/trash.png \ - contents/pics/pancakes.jpg \ - contents/pics/moreUp.png \ - contents/pics/moreDown.png \ - contents/pics/list-remove.png \ - contents/pics/list-add.png \ - contents/pics/lemonade.jpg \ - contents/pics/hamburger.jpg \ - contents/pics/go-up.png \ - contents/pics/go-down.png \ - contents/pics/fruit-salad.jpg \ - contents/pics/del.png \ - contents/pics/button.png \ - contents/pics/button-pressed.png \ - contents/pics/archive-remove.png \ - contents/pics/archive-insert.png \ - contents/pics/add.png - -symbian: { - TARGET.CAPABILITY = ReadUserData \ - WriteUserData \ - ReadDeviceData \ - WriteDeviceData \ - SwEvent -} -include(../examples.pri) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/qmlcontacts.cpp --- a/qtcontactsmobility/examples/qml-contacts/qmlcontacts.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,177 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** - -[sbox-maemo6-i486: ~/w/QMLContacts] > xeyes -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "qmlcontactsa.h" - -#include -#include -#include -#include - -QTM_USE_NAMESPACE - -QTM_BEGIN_NAMESPACE - -// ![0] -QMLContactManagerAsync::QMLContactManagerAsync(QObject *parent) -: QObject(parent) -{ - qc = new QContactManager(); - -} - -QMLContactManagerAsync::~QMLContactManagerAsync() -{ - delete qc; -} - -QString QMLContactManagerAsync::availableManagers() const -{ - return QContactManager::availableManagers().join(" "); -} - -QString QMLContactManagerAsync::manager() -{ - return qc->managerName(); -} - -void QMLContactManagerAsync::setManager(QString manager) -{ - delete qc; - qc = new QContactManager(manager); - if(!qc) - qc = new QContactManager(); - connect(qc, SIGNAL(contactsAdded(QList)), this, SIGNAL(contactsAdded(QList))); - connect(qc, SIGNAL(contactsChanged(QList)), this, SIGNAL(contactsChanged(QList))); - connect(qc, SIGNAL(contactsRemoved(QList)), this, SIGNAL(contactsRemoved(QList))); - connect(qc, SIGNAL(relationshipsAdded(QList)), this, SIGNAL(relationshipsAdded(QList))); - connect(qc, SIGNAL(relationshipsRemoved(QList)), this, SIGNAL(relationshipsRemoved(QList))); - - qWarning() << "Changed backend to: " << manager; -} - - -QString QMLContactManagerAsync::contactListToQString(const QList& contactIds) const -{ - QString list; - int i; - - for (i = 0; i < contactIds.count(); i++) { - list += QString::number(contactIds.at(i)) + " "; - } - - return list; -} - -QStringList QMLContactManagerAsync::contactListToQString(const QList& contact) const -{ - QStringList list; - int i; - - for (i = 0; i < contact.count(); i++) { - list += qc->synthesizeDisplayLabel(contact.at(i)); - } - - return list; -} - -int QMLContactManagerAsync::numContacts() -{ - QList qlid; - - qlid = qc->contacts(); - - return qlid.count(); -} - -void QMLContactManagerAsync::contacts() -{ - m_contactIds.clear(); - QContactFetchRequest* req = new QContactFetchRequest; - QContactLocalIdFilter idFil; - idFil.setIds(qc->contacts()); - req->setFilter(idFil); - req->setManager(qc); - connect(req, SIGNAL(progress(QContactFetchRequest*, bool)), this, SLOT(contactProgress(QContactFetchRequest*,bool))); - req->start(); -} - -void QMLContactManagerAsync::contactProgress(QContactFetchRequest *request, bool appendOnly) -{ - Q_UNUSED(appendOnly); - - // first, check to make sure that the request is still valid. - if (qc != request->manager() || - request->status() == QContactAbstractRequest::Cancelled) { - delete request; - return; // ignore these results. - } - - if(request->contacts().count() > 0) { - QContact c; - foreach(c, request->contacts()) { - //qWarning() << "Local Id: " << c.localId() << " count: " << m_contactIds.count(); - QmlContact qmlc(c); - emit contactsLoaded(&qmlc); - } - } - - // check to see if the request status is "finished" - clean up. - if (request->status() == QContactAbstractRequest::Finished) { - delete request; - emit contactsLoadedDone(); - } - -} - -QString QMLContactManagerAsync::idToName(QString name) -{ - QContact c = qc->contact(name.toInt()); - return qc->synthesizeDisplayLabel(c); -} - -// ![0] - -#include "moc_qmlcontactsa.cpp" - -QTM_END_NAMESPACE -QML_DEFINE_TYPE(QMLContactManagerAsync, 1, 0, QMLContactManagerAsync, QMLContactManagerAsync); diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/qmlcontacts.qrc --- a/qtcontactsmobility/examples/qml-contacts/qmlcontacts.qrc Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ - - - example.qml - contents/MediaButton.qml - ScrollBar.qml - - diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/qml-contacts/qmlcontactsa.h --- a/qtcontactsmobility/examples/qml-contacts/qmlcontactsa.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact - -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef QMLCONTACTS_H -#define QMLCONTACTS_H - -#include -#include - -#include "qmlcontact.h" - -QTM_BEGIN_NAMESPACE -class QContactFetchRequest; -// ![0] -#include - -class QMLContactManagerAsync : public QObject { -Q_OBJECT -Q_PROPERTY(QString availableManagers READ availableManagers) -Q_PROPERTY(QString manager READ manager WRITE setManager) -Q_PROPERTY(int numContacts READ numContacts) -public: - QMLContactManagerAsync(QObject *parent = 0); - ~QMLContactManagerAsync(); - - QString availableManagers() const; - - QString manager(); - void setManager(QString manager); - - Q_INVOKABLE void contacts(); - - int numContacts(); - - Q_INVOKABLE QString idToName(QString name); -// void setName(const QString &); -// -// int shoeSize() const; -// void setShoeSize(int); - -Q_SIGNALS: - void dataChanged(); - void contactsAdded(const QList& contactIds); - void contactsChanged(const QList& contactIds); - void contactsRemoved(const QList& contactIds); - void relationshipsAdded(const QList& contactIds); - void relationshipsRemoved(const QList& contactIds); - - void contactsLoaded(QmlContact *contact); - void contactsLoadedDone(); - -private slots: - - void contactProgress(QContactFetchRequest* request, bool appendOnly); - -private: - QContactManager *qc; - //QStringList m_contacts; - QList m_contactIds; - - QString contactListToQString(const QList& contactIds) const; - QStringList contactListToQString(const QList& contact) const; -}; -QML_DECLARE_TYPE(QMLContactManagerAsync); -// ![0] - -QTM_END_NAMESPACE - -#endif // QMLCONTACTS_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/samplephonebook/contacteditor.cpp --- a/qtcontactsmobility/examples/samplephonebook/contacteditor.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/examples/samplephonebook/contacteditor.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -145,7 +145,7 @@ QContactAddress adr = curr.detail(QContactAddress::DefinitionName); QContactAvatar av = curr.detail(QContactAvatar::DefinitionName); - m_nameEdit->setText(manager->synthesizeDisplayLabel(curr)); + m_nameEdit->setText(manager->synthesizedDisplayLabel(curr)); m_phoneEdit->setText(phn.value(QContactPhoneNumber::FieldNumber)); m_emailEdit->setText(em.value(QContactEmailAddress::FieldEmailAddress)); m_addrEdit->setText(adr.value(QContactAddress::FieldStreet)); // ugly hack. @@ -212,7 +212,7 @@ QString saveNameField = nameField(); if (!saveNameField.isEmpty()) { // if the name has changed (ie, is different to the synthed label) then save it as a custom label. - if (m_nameEdit->text() != m_manager->synthesizeDisplayLabel(curr)) { + if (m_nameEdit->text() != m_manager->synthesizedDisplayLabel(curr)) { nm.setValue(nameField(), m_nameEdit->text()); } } @@ -222,7 +222,6 @@ av.setAvatar(m_newAvatarPath); QPixmap pix(m_newAvatarPath); - bool null = pix.isNull(); av.setPixmap(pix); curr.saveDetail(&nm); diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/samplephonebook/contactlistpage.cpp --- a/qtcontactsmobility/examples/samplephonebook/contactlistpage.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/examples/samplephonebook/contactlistpage.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -40,6 +40,12 @@ ****************************************************************************/ #include "contactlistpage.h" +#ifdef BUILD_VERSIT +#include "qversitreader.h" +#include "qversitcontactimporter.h" +#include "qversitwriter.h" +#include "qversitcontactexporter.h" +#endif #include @@ -58,29 +64,41 @@ m_contactsList = new QListWidget(this); - m_addContactBtn = new QPushButton("Add", this); + QPushButton* m_addContactBtn = new QPushButton("Add", this); connect(m_addContactBtn, SIGNAL(clicked()), this, SLOT(addContactClicked())); - m_editBtn = new QPushButton("Edit", this); + QPushButton* m_editBtn = new QPushButton("Edit", this); connect(m_editBtn, SIGNAL(clicked()), this, SLOT(editClicked())); - m_deleteBtn = new QPushButton("Delete", this); + QPushButton* m_deleteBtn = new QPushButton("Delete", this); connect(m_deleteBtn, SIGNAL(clicked()), this, SLOT(deleteClicked())); - m_filterBtn = new QPushButton("Filter", this); + QPushButton* m_filterBtn = new QPushButton("Filter", this); connect(m_filterBtn, SIGNAL(clicked()), this, SLOT(filterClicked())); + QPushButton* m_importBtn = new QPushButton("Import"); + connect(m_importBtn, SIGNAL(clicked()), this, SLOT(importClicked())); + QPushButton* m_exportBtn = new QPushButton("Export"); + connect(m_exportBtn, SIGNAL(clicked()), this, SLOT(exportClicked())); + QFormLayout *backendLayout = new QFormLayout; backendLayout->addRow("Store:", m_backendsCombo); backendLayout->addRow("Filter:", m_filterActiveLabel); - QHBoxLayout *btnLayout = new QHBoxLayout; - btnLayout->addWidget(m_addContactBtn); - btnLayout->addWidget(m_editBtn); - btnLayout->addWidget(m_deleteBtn); - btnLayout->addWidget(m_filterBtn); + QHBoxLayout *btnLayout1 = new QHBoxLayout; + btnLayout1->addWidget(m_addContactBtn); + btnLayout1->addWidget(m_editBtn); + btnLayout1->addWidget(m_deleteBtn); + btnLayout1->addWidget(m_filterBtn); + + QHBoxLayout *btnLayout2 = new QHBoxLayout; + btnLayout2->addWidget(m_importBtn); + btnLayout2->addWidget(m_exportBtn); QVBoxLayout *bookLayout = new QVBoxLayout; bookLayout->addLayout(backendLayout); bookLayout->addWidget(m_contactsList); - bookLayout->addLayout(btnLayout); + bookLayout->addLayout(btnLayout1); +#ifdef BUILD_VERSIT + bookLayout->addLayout(btnLayout2); +#endif setLayout(bookLayout); @@ -132,7 +150,7 @@ m_currentFilter = filter; m_contactsList->clear(); m_idToListIndex.clear(); - QList contactIds = m_manager->contacts(m_currentFilter); + QList contactIds = m_manager->contactIds(m_currentFilter); foreach (const QContactLocalId& id, contactIds) { QListWidgetItem *currItem = new QListWidgetItem; currContact = m_manager->contact(id); @@ -181,3 +199,52 @@ else QMessageBox::information(this, "Failed!", "Failed to delete contact!"); } + +void ContactListPage::importClicked() +{ +#ifdef BUILD_VERSIT + if (!m_manager) { + qWarning() << "No manager selected; cannot import"; + return; + } + QString fileName = QFileDialog::getOpenFileName(this, + tr("Select vCard file"), ".", tr("vCard files (*.vcf)")); + QFile file(fileName); + file.open(QIODevice::ReadOnly); + if (file.isReadable()) { + QVersitReader reader; + reader.setDevice(&file); + if (reader.startReading() && reader.waitForFinished()) { + QVersitContactImporter importer; + QList contacts = importer.importContacts(reader.results()); + QMap errorMap; + m_manager->saveContacts(&contacts, &errorMap); + rebuildList(m_currentFilter); + } + } +#endif +} + +void ContactListPage::exportClicked() +{ +#ifdef BUILD_VERSIT + if (!m_manager) { + qWarning() << "No manager selected; cannot import"; + return; + } + QList contacts = m_manager->contacts(QList(), QStringList()); + QString fileName = QFileDialog::getSaveFileName(this, tr("Save vCard"), + "./contacts.vcf", + tr("vCards (*.vcf)")); + QFile file(fileName); + file.open(QIODevice::WriteOnly); + if (file.isWritable()) { + QVersitContactExporter exporter; + QList documents = exporter.exportContacts(contacts); + QVersitWriter writer; + writer.setDevice(&file); + writer.startWriting(documents); + writer.waitForFinished(); + } +#endif +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/samplephonebook/contactlistpage.h --- a/qtcontactsmobility/examples/samplephonebook/contactlistpage.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/examples/samplephonebook/contactlistpage.h Fri Apr 16 14:53:18 2010 +0300 @@ -79,6 +79,8 @@ void editClicked(); void filterClicked(); void deleteClicked(); + void importClicked(); + void exportClicked(); private: // elements of the contact list "page" @@ -86,10 +88,7 @@ QLabel *m_filterActiveLabel; QListWidget *m_contactsList; - QPushButton *m_addContactBtn; - QPushButton *m_editBtn; - QPushButton *m_deleteBtn; - QPushButton *m_filterBtn; + // data QContactManager *m_manager; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/samplephonebook/filterpage.cpp --- a/qtcontactsmobility/examples/samplephonebook/filterpage.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/examples/samplephonebook/filterpage.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -79,12 +79,10 @@ filterableFields.append("Email"); m_fieldCriteriaCombo->addItems(filterableFields); - QStringList criteriaTypes; - criteriaTypes.append("Exact Match"); - criteriaTypes.append("Starts With"); - criteriaTypes.append("Ends With"); - criteriaTypes.append("Contains"); - m_criteriaTypeCombo->addItems(criteriaTypes); + m_criteriaTypeCombo->addItem("Equals", QContactFilter::MatchExactly); + m_criteriaTypeCombo->addItem("Contains", QContactFilter::MatchContains); + m_criteriaTypeCombo->addItem("Starts with", QContactFilter::MatchStartsWith); + m_criteriaTypeCombo->addItem("Ends with", QContactFilter::MatchEndsWith); QStringList joinTypes; joinTypes.append("AND"); @@ -178,37 +176,9 @@ fil.setDetailDefinitionName(defName, fieldName); fil.setValue(m_valueCriteriaEdit->text()); - QContactFilter::MatchFlags matchFlags; - switch (m_criteriaTypeCombo->currentIndex()) { - case 0: - { - matchFlags |= QContactFilter::MatchExactly; - exprMatch = "equals"; - } - break; - - case 1: - { - matchFlags |= QContactFilter::MatchStartsWith; - exprMatch = "starts with"; - } - break; - - case 2: - { - matchFlags |= QContactFilter::MatchEndsWith; - exprMatch = "ends with"; - } - break; - - default: - { - matchFlags |= QContactFilter::MatchContains; - exprMatch = "contains"; - } - break; - } - fil.setMatchFlags(matchFlags); + int flag = m_criteriaTypeCombo->itemData(m_criteriaTypeCombo->currentIndex()).toInt(); + fil.setMatchFlags(QContactFilter::MatchFlags(flag)); + exprMatch = m_criteriaTypeCombo->currentText().toLower(); // if OR then join with OR if (m_joinMethodCombo->currentIndex() == 1) { diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/samplephonebook/main.cpp --- a/qtcontactsmobility/examples/samplephonebook/main.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/examples/samplephonebook/main.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -46,11 +46,11 @@ { QApplication app(argc, argv); - PhoneBook *phoneBook = new PhoneBook; + PhoneBook phoneBook; #ifdef Q_OS_SYMBIAN - phoneBook->showMaximized(); + phoneBook.showMaximized(); #else - phoneBook->show(); + phoneBook.show(); #endif return app.exec(); } diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/examples/samplephonebook/samplephonebook.pro --- a/qtcontactsmobility/examples/samplephonebook/samplephonebook.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/examples/samplephonebook/samplephonebook.pro Fri Apr 16 14:53:18 2010 +0300 @@ -6,15 +6,21 @@ TEMPLATE = app TARGET = samplephonebook +include(../examples.pri) DEPENDPATH += . INCLUDEPATH += . \ ../../src/contacts\ ../../src/contacts/filters \ ../../src/contacts/requests \ - ../../src/contacts/details + ../../src/contacts/details \ + ../../src/versit CONFIG += mobility MOBILITY = contacts +contains(mobility_modules,versit) { + MOBILITY += versit + DEFINES += BUILD_VERSIT +} # Input SOURCES += main.cpp \ @@ -34,4 +40,3 @@ WriteDeviceData \ SwEvent } -include(../examples.pri) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/features/deploy.pri --- a/qtcontactsmobility/features/deploy.pri Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/features/deploy.pri Fri Apr 16 14:53:18 2010 +0300 @@ -4,11 +4,30 @@ contains(TEMPLATE,.*lib) { target.path=$$QT_MOBILITY_LIB TARGET = $$qtLibraryTarget($${TARGET}) + + symbian { + middleware { path=$$MW_LAYER_PUBLIC_EXPORT_PATH("") } + app { path=$$APP_LAYER_PUBLIC_EXPORT_PATH("") } + + exportPath=$$EPOCROOT"."$$dirname(path) + nativePath=$$replace(exportPath, /,\) + exists($$nativePath) { + } else { + system($$QMAKE_MKDIR $$nativePath) + } + + for(header, headers.files) { + middleware { BLD_INF_RULES.prj_exports += "$$header $$MW_LAYER_PUBLIC_EXPORT_PATH($$basename(header))"} + app { BLD_INF_RULES.prj_exports += "$$header $$APP_LAYER_PUBLIC_EXPORT_PATH($$basename(header))"} + } + + } + } else { contains(TEMPLATE,.*app):target.path=$$QT_MOBILITY_BIN } -INSTALLS+=headers target +INSTALLS+=target headers mac:contains(QT_CONFIG,qt_framework) { CONFIG += lib_bundle absolute_library_soname @@ -17,5 +36,3 @@ FRAMEWORK_HEADERS.path = Headers QMAKE_BUNDLE_DATA += FRAMEWORK_HEADERS } - - diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/features/mobility.prf.template --- a/qtcontactsmobility/features/mobility.prf.template Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/features/mobility.prf.template Fri Apr 16 14:53:18 2010 +0300 @@ -4,11 +4,11 @@ } else { load(data_caging_paths) contains(MOBILITY, contacts|versit) { - INCLUDEPATH+=$${EPOCROOT}epoc32/include/app + INCLUDEPATH+=$$APP_LAYER_SYSTEMINCLUDE } contains(MOBILITY,bearer|location|publishsubscribe|systeminfo|multimedia|messaging|serviceframework) { - INCLUDEPATH+=$${EPOCROOT}epoc32/include/mw + INCLUDEPATH+=$$MW_LAYER_SYSTEMINCLUDE } } mac: LIBS += -F$${MOBILITY_LIB} @@ -52,12 +52,17 @@ qtAddLibrary(QtVersit) } +contains(MOBILITY, sensors) { + qtAddLibrary(QtSensors) +} + # Add dependency to QtMobility package to all projects besides QtMobility package itself. # Mobility libs have UID3 0x2002AC89 -# self-sgned MObility libs have UID3 0xE002AC89 +# self-signed Mobility libs have UID3 0xE002AC89 symbian:contains(CONFIG, mobility):!contains(TARGET.UID3, 0x2002AC89):!contains(TARGET.UID3, 0xE002AC89) { mobility_default_deployment.pkg_prerules += \ "; Default dependency to QtMobility libraries" \ "(0x2002AC89), 0, 2, 0, {\"QtMobility\"}" DEPLOYMENT += mobility_default_deployment } + diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/contacts.pro --- a/qtcontactsmobility/plugins/contacts/contacts.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/plugins/contacts/contacts.pro Fri Apr 16 14:53:18 2010 +0300 @@ -9,13 +9,12 @@ contains(build_unit_tests, yes):SUBDIRS += symbian/tsrc # SIM backend depends on etel MM APIs - exists($${EPOCROOT}epoc32/release/winscw/udeb/etelmm.lib) \ - | exists($${EPOCROOT}epoc32/release/armv5/lib/etelmm.lib) { + contains(symbiancntsim_enabled, yes) { SUBDIRS += symbiansim contains(build_unit_tests, yes):SUBDIRS += symbiansim/tsrc - message("SIM backend enabled") + message("Symbian SIM backend enabled") } else { - message("SIM backend disabled") + message("Symbian SIM backend disabled") } } wince*:SUBDIRS += wince diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cntabstractcontactfilter.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntabstractcontactfilter.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QABSTRACTCONTACTFILTER_H -#define QABSTRACTCONTACTFILTER_H - -#include -#include "qtcontactsglobal.h" -#include "qcontactmanager.h" -#include "qcontactsortorder.h" -#include "qcontactfilter.h" - -QTM_USE_NAMESPACE -class CntAbstractContactFilter -{ -public: - enum FilterSupport { - /* The filter not supported */ - NotSupported = 0, - /* The filter is supported */ - Supported, - /* The filter is not directly supported, but for performance reasons - * the contact filter implementation pretends supporting the filter - * when it actually maps the filter to another, less strict filter. - * For example if the caller uses match flag QContactFilter::MatchExactly, the - * filter actually gives the result as QContactFilter::MatchContains (because of - * the limitations in the underlying database). - * The result then needs to be filtered by the caller (for example by - * using QContactManagerEngine::testFilter). */ - SupportedPreFilterOnly - }; -public: - virtual QList contacts( - const QContactFilter &filter, - const QList &sortOrders, - bool &filterSupported, - QContactManager::Error &error) = 0; - virtual bool filterSupported(const QContactFilter& filter) = 0; -}; - -#endif /* QABSTRACTCONTACTFILTER_H */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cntabstractcontactsorter.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntabstractcontactsorter.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef CNTABSTRACTCONTACTSORTER_H -#define CNTABSTRACTCONTACTSORTER_H - -#include -#include "qtcontactsglobal.h" -#include "qcontactmanager.h" -#include "qcontactsortorder.h" - -QTM_USE_NAMESPACE -class CntAbstractContactSorter -{ -public: - virtual QList contacts( - const QList& sortOrders, - QContactManager::Error& error) = 0; - - virtual QList sort( - QList contactIds, - const QList& sortOrders, - QContactManager::Error& error) = 0; - - virtual bool sortOrderSupported(const QList& sortOrders) = 0; -}; - -#endif /* QABSTRACTCONTACTSORTER_H */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cntdisplaylabel.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntdisplaylabel.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/cntdisplaylabel.h Fri Apr 16 14:53:18 2010 +0300 @@ -62,15 +62,13 @@ CntDisplayLabel(); virtual ~CntDisplayLabel(); - QString synthesizeDisplayLabel( const QContact& contact, QContactManager::Error& error) const; + QString synthesizedDisplayLabel( const QContact& contact, QContactManager::Error& error) const; QString unNamned() const; QList > contactFilterDetails() const; QList > groupFilterDetails() const; private: void setDisplayLabelDetails(); - QList > > contactDisplayLabelDetails() const; - QList > > groupDisplayLabelDetails() const; QString generateDisplayLabel( const QContact &contact, const QList > > detailList) const; QString delimiter() const; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cntdisplaylabelsqlfilter.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntdisplaylabelsqlfilter.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef CNTDISPLAYLABELSQLFILTER_H_ -#define CNTDISPLAYLABELSQLFILTER_H_ - -#include -#include -#include - -QTM_USE_NAMESPACE - -class CntDisplayLabelSqlFilter -{ -public: - CntDisplayLabelSqlFilter(); - virtual ~CntDisplayLabelSqlFilter(); - - void createSqlQuery(const QContactDetailFilter& filter, - QString& sqlQuery, - QContactManager::Error& error); -private: - void createQuerySingleSearchValue(QString& sqlQuery, const QString &searchValue, const QStringList &columns) const; - void createQueryMultipleSearchValues(QString& sqlQuery, const QStringList &searchValues, const QStringList &columns) const; - QString createSubQuery(const QString &searchValue, const QString &column) const; - QString columnName(const QPair &detail) const; -}; - -#endif /* CNTDISPLAYLABELSQLFILTER_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cntsqlsearch.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntsqlsearch.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -//#ifdef SYMBIAN_BACKEND_USE_SQLITE - -#include -#include - - -class CntSqlSearch : public QObject -{ - Q_OBJECT - -public: - CntSqlSearch(); - - QString CreatePredictiveSearch(const QString &pattern); - - -private: - - QString SelectTableView(const QString &pattern); - - bool IsSubStringSearch(const QString &pattern); - - QStringList GetNumber(const QString &pattern); - - QString CreateSubStringSearch(const QString &pattern); - - QString CreateStringSearch(const QString &pattern); - - QString CreateSpaceStringSearch(QStringList numbers); - - QString CreateSpaceString(QString number); - - friend class UT_CntSqlSearch; -}; -//#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbianengine.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbianengine.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbianengine.h Fri Apr 16 14:53:18 2010 +0300 @@ -90,48 +90,51 @@ CntSymbianEngine(const CntSymbianEngine& other); ~CntSymbianEngine(); void deref(); + + /* URI reporting */ + QString managerName() const; /* Contacts - Accessors and Mutators */ - QList contacts(const QContactFilter& filter, const QList& sortOrders, QContactManager::Error& error) const; - QList contacts(const QList& sortOrders, QContactManager::Error& error) const; - - QContact contact(const QContactLocalId& contactId, QContactManager::Error& error) const; + QList contactIds(const QContactFilter& filter, const QList& sortOrders, QContactManager::Error& error) const; + QList contactIds(const QList& sortOrders, QContactManager::Error& error) const; + QList contacts(const QList& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const; + QList contacts(const QContactFilter& filter, const QList& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const; + QContact contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions, QContactManager::Error& error) const; + bool saveContact(QContact* contact, QContactManager::Error& error); - QList saveContacts(QList* contacts, QContactManager::Error& error); + bool saveContacts(QList* contacts, QMap* errorMap, QContactManager::Error& error); bool removeContact(const QContactLocalId& contactId, QContactManager::Error& error); - QList removeContacts(QList* contactIds, QContactManager::Error& error); + bool removeContacts(QList* contactIds, QMap* errorMap, QContactManager::Error& error); + /* Synthesize the display label of a contact */ + QString synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const; + + /* "Self" contact id (MyCard) */ + bool setSelfContactId(const QContactLocalId& contactId, QContactManager::Error& error); + QContactLocalId selfContactId(QContactManager::Error& error) const; + /* Relationships between contacts */ - QStringList supportedRelationshipTypes(const QString& contactType) const; QList relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationshipFilter::Role role, QContactManager::Error& error) const; bool saveRelationship(QContactRelationship* relationship, QContactManager::Error& error); QList saveRelationships(QList* relationships, QContactManager::Error& error); bool removeRelationship(const QContactRelationship& relationship, QContactManager::Error& error); QList removeRelationships(const QList& relationships, QContactManager::Error& error); - /* Definitions */ + /* Definitions - Accessors and Mutators */ QMap detailDefinitions(const QString& contactType, QContactManager::Error& error) const; /* Capabilities reporting */ bool hasFeature(QContactManager::ManagerFeature feature, const QString& contactType) const; - bool filterSupported(const QContactFilter& filter) const; + QStringList supportedRelationshipTypes(const QString& contactType) const; + bool isFilterSupported(const QContactFilter& filter) const; QList supportedDataTypes() const; - /* Synthesize the display label of a contact */ - QString synthesizeDisplayLabel(const QContact& contact, QContactManager::Error& error) const; - - /* "Self" contact id (MyCard) */ - bool setSelfContactId(const QContactLocalId& contactId, QContactManager::Error& error); - QContactLocalId selfContactId(QContactManager::Error& error) const; - - QString managerName() const; - private: QList slowFilter(const QContactFilter& filter, const QList& contacts, QContactManager::Error& error) const; QList slowSort(const QList& contactIds, const QList& sortOrders, QContactManager::Error& error) const; bool doSaveContact(QContact* contact, QContactChangeSet& changeSet, QContactManager::Error& error); - QContact fetchContactL(const QContactLocalId &localId) const; + QContact fetchContactL(const QContactLocalId &localId, const QStringList& definitionRestrictions) const; /* Add contact */ bool addContact(QContact& contact, QContactChangeSet& changeSet, QContactManager::Error& qtError); diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbianfilterdbms.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbianfilterdbms.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef CNTSYMBIANFILTERDBMS_H -#define CNTSYMBIANFILTERDBMS_H - -#ifndef SYMBIAN_BACKEND_USE_SQLITE - -#include "cntabstractcontactfilter.h" -#include - -class CContactDatabase; -class CContactIdArray; -class CntAbstractContactSorter; -class CntTransformContact; -class CContactItemFieldDef; -class CContactItemFieldSet; - -QTM_BEGIN_NAMESPACE -class QContactDetailFilter; -QTM_END_NAMESPACE - -QTM_USE_NAMESPACE -class CntSymbianFilter : public CntAbstractContactFilter -{ -public: - CntSymbianFilter(CContactDatabase& contactDatabase); - ~CntSymbianFilter(); - - /* from CntAbstractContactFilter */ - QList contacts(const QContactFilter& filter, - const QList& sortOrders, - bool &filterSupported, - QContactManager::Error& error); - bool filterSupported(const QContactFilter& filter); - -private: - FilterSupport filterSupportLevel(const QContactFilter& filter); - QList filterContacts(const QContactFilter& filter, - QContactManager::Error& error); - void transformDetailFilterL(const QContactDetailFilter& detailFilter, CContactItemFieldDef*& fieldDef); - TInt findContacts( - CContactIdArray*& idArray, - const CContactItemFieldDef& fieldDef, - const TDesC& text) const; - CContactIdArray* findContactsL( - const CContactItemFieldDef& fieldDef, - const TDesC& text) const; - TInt matchContacts( - CContactIdArray*& idArray, - const TDesC& phoneNumber, - const TInt matchLength); - bool isFalsePositive(const CContactItemFieldSet& fieldSet, const TUid& fieldTypeUid, const TDesC& searchString); - void getMatchLengthL(TInt& matchLength); - CContactDatabase &m_contactDatabase; - CntAbstractContactSorter *m_contactSorter; - CntTransformContact *m_transformContact; -}; - -#endif /*SYMBIAN_BACKEND_USE_SQLITE*/ - -#endif /* CNTSYMBIANFILTERDBMS_H */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbianfiltersql.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbianfiltersql.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef CNT_SYMBIAN_FILTER_SQL_H -#define CNT_SYMBIAN_FILTER_SQL_H - -#ifdef SYMBIAN_BACKEND_USE_SQLITE - -#include "cntabstractcontactfilter.h" -#include "cntsymbianfiltersqlhelper.h" - -class CContactDatabase; -QTM_USE_NAMESPACE -class CntSymbianFilter : public CntAbstractContactFilter -{ -public: - CntSymbianFilter(CContactDatabase& contactDatabase); - ~CntSymbianFilter(); - - /* from CntAbstractContactFilter */ - QList contacts( - const QContactFilter& filter, - const QList& sortOrders, - bool &filterSupportedFlag, - QContactManager::Error& error); - bool filterSupported(const QContactFilter& filter); - -private: - FilterSupport filterSupportLevel(const QContactFilter& filter); - - CContactDatabase& m_contactDatabase; - CntSymbianFilterSqlHelper* m_sqlhelper; - -}; - -#endif /* SYMBIAN_BACKEND_USE_SQLITE */ - -#endif /* CNT_SYMBIAN_FILTER_SQL_H */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbianfiltersqlhelper.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbianfiltersqlhelper.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,140 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef CNTSYMBIANFILTERSQLHELPER_H -#define CNTSYMBIANFILTERSQLHELPER_H - -// System includes -#include -// User includes -#include "qcontactdetailfilter.h" -#include "qcontactphonenumber.h" -#include "qcontactmanager.h" -#include "cntsymbiansrvconnection.h" -#include "cntabstractcontactfilter.h" - -// Forward declarations -class CntSqlSearch; -// External data types - -// Constants -QTM_USE_NAMESPACE -class CntSymbianFilterSqlHelper -{ -public: - Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SingleQuote,"'") ; - Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::PercentSign,"%") ; - Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::Space," ") ; - Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::EqualTo,"=") ; - Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SqlLike," LIKE ") ; - Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SqlNotNull," NOT NULL ") ; - Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SqlWhere," WHERE ") ; - Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SqlOr," OR ") ; - Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::contactsTable," contact ") ; - Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::commAddrTable," comm_addr ") ; - - //This is copied from pltables.h from cntmodel. - // This definition needs to be exported and the file included - // so that duplicity is avoided - enum TCommAddrType - { - EPhoneNumber, - EEmailAddress, - ESipAddress - }; -public: - CntSymbianFilterSqlHelper(CContactDatabase &contactDatabase); - virtual ~CntSymbianFilterSqlHelper(); - -public: - /*Generic functions for all filters*/ - QList searchContacts(const QContactFilter& filter, - const QList& sortOrders, - QContactManager::Error& error); - CntAbstractContactFilter::FilterSupport filterSupportLevel(const QContactFilter& filter); - -private: - void appendSortOrderQuery(QString& sqlQuery, const QList& sortOrders); - void columnName( QString &columnName, const QString &detailDefinitionName, const QString & detailFieldName); - void createSqlQuery(const QContactFilter& filter, - QString& sqlQuery, - QContactManager::Error& error); - /* Return true if this filter is leaf filter*/ - bool isSingleFilter(const QContactFilter& filter) const; - /*Local helper functions used for creating the sql query */ - void updateSqlQueryForSingleFilter(const QContactFilter& filter, - QString& sqlQuery, - QContactManager::Error& error); - void updateSqlQueryForDetailFilter(const QContactFilter& filter, - QString& sqlQuery, - QContactManager::Error& error); - - void getSqlDbTableAndColumnNameforDetailFilter( - const QContactDetailFilter& filter , - bool& isSubType, - QString& tableName, - QString& columnName ); - - - void updateFieldForDeatilFilterMatchFlag( const QContactDetailFilter& filter, - QString& fieldToUpdate , - QContactManager::Error& error) const; - QList CntSymbianFilterSqlHelper::HandlePhonenumberDetailFilter(const QContactDetailFilter detailFilter); - void getMatchLengthL(TInt& matchLength); - TInt CntSymbianFilterSqlHelper::searchPhoneNumbers( - CContactIdArray*& idArray, - const TDesC& phoneNumber, - const TInt matchLength); - CntAbstractContactFilter::FilterSupport checkIfDetailFilterSupported(const QContactDetailFilter& detailFilter) const; - QList HandlePredictiveSearchFilter(const QContactFilter& filter, bool& isPredSearch, QContactManager::Error& error); - -private: - CntSymbianSrvConnection* m_srvConnection; - CntSqlSearch* m_sqlSearch; - CContactDatabase &m_contactDatabase; - bool isPhoneNumberSearchforDetailFilter; - QHash contactsTableIdColumNameMapping; - QHash commAddrTableIdColumNameMapping; - - friend class ut_cntsymbianfiltersqlhelper; - -}; - -#endif//CNTSYMBIANFILTERSQLHELPER_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbiansorterdbms.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbiansorterdbms.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef CNTSYMBIANSORTERDBMS_H -#define CNTSYMBIANSORTERDBMS_H - -#include "cntabstractcontactsorter.h" -#include - -class CContactDatabase; -class CContactIdArray; -class CntTransformContact; - -QTM_USE_NAMESPACE -class CntSymbianSorterDbms : public CntAbstractContactSorter -{ -public: - CntSymbianSorterDbms(CContactDatabase& contactDatabase, CntTransformContact& m_transformContact); - ~CntSymbianSorterDbms(); - - /* from CntAbstractContactFilter */ - QList contacts( - const QList& sortOrders, - QContactManager::Error& error); - QList sort( - QList contactIds, - const QList& sortOrders, - QContactManager::Error& error); - bool sortOrderSupported(const QList& sortOrders); - -private: - QList contactsL(const QList& sortOrders) const; - QList sortL(const QList& contactIds, const QList& sortOrders) const; - CContactIdArray* sortL(const CContactIdArray* contactIds, const QList& sortOrders) const; - -private: - CContactDatabase& m_contactDatabase; - CntTransformContact& m_transformContact; -}; - -#endif /* QCONTACTSYMBIANSORTERDBMS_H */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbiansrvconnection.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbiansrvconnection.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef CNTSRVCONNECTION_H -#define CNTSRVCONNECTION_H - -// System includes -#include -#include -#include - -// User includes - -// Forward declarations - -// External data types - -// Constants - -QTM_USE_NAMESPACE -class CntSymbianSrvConnection : public RSessionBase -{ -public: - /*Constructor and destructor*/ - CntSymbianSrvConnection(); - ~CntSymbianSrvConnection(); - -public: - /* QT like functions */ - QList searchContacts(const QString& searchQuery, - QContactManager::Error& error); - -private: - /* Symbian Leaving functions */ - QList searchContactsL(const TDesC& aSearchQuery); - void ConnectSrvL(); - void OpenDatabaseL(); - TVersion Version() const; - TDes8& GetReceivingBufferL(TInt aSize=0); - QList UnpackCntIdArrayL(); - -private: - /* member varibles */ - CBufFlat* m_buffer; - TInt m_maxBufferSize; - TPtr8 m_bufPtr; - bool m_isInitialized; - - friend class ut_cntsymbianfiltersqlhelper; -}; - -#endif //CNTSRVCONNECTION_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cntthumbnailcreator.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntthumbnailcreator.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,95 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef THUMBNAIL_CREATOR_H -#define THUMBNAIL_CREATOR_H - -#include -#include -#include - -class CContactItemField; -class CImageDecoder; -class CFbsBitmap; -class CBitmapScaler; -class CImageEncoder; - -class CntThumbnailCreator : public CActive -{ - enum TCreatorState { - EStateInitialized = 0, - EStateDecodeImage, - EStateScaleImage, - EStateEncodeImage, - EStateFinal - }; - -public: - CntThumbnailCreator(); - ~CntThumbnailCreator(); - void addThumbnailFieldL(QList *fieldList, const TFileName &filename, const TSize& maxSize); - void addThumbnailFieldL(QList *fieldList, CFbsBitmap *bitmap, const TSize& maxSize); - -private: // from CActive - void RunL(); - void DoCancel(); - TInt RunError(TInt aError); - -private: - void DecodeImageL(const TFileName &filename); - void ScaleImageL(); - void EncodeImageL(); - void CreateContactFieldL(); - -private: - TCreatorState m_state; - TSize m_thumbnailSize; - QList *m_fieldList; - CActiveSchedulerWait *m_activeSchedulerWait; - TInt m_err; - RFs m_rfs; - CImageDecoder *m_decoder; - CFbsBitmap *m_bitmap; - CBitmapScaler *m_bitmapScaler; - HBufC8 *m_imageData; - CImageEncoder *m_encoder; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformaddress.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformaddress.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMADDRESS_H -#define TRANSFORMADDRESS_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE -class CntTransformAddress : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformanniversary.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformanniversary.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMANNIVERSARY_H -#define TRANSFORMANNIVERSARY_H - -#include "cnttransformcontactdata.h" -QTM_USE_NAMESPACE -class CntTransformAnniversary : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformanniversarysimple.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformanniversarysimple.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMANNIVERSARYSIMPLE_H -#define TRANSFORMANNIVERSARYSIMPLE_H - -#include "cnttransformcontactdata.h" -QTM_USE_NAMESPACE -class CntTransformAnniversarySimple : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformavatar.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformavatar.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMAVATAR_H -#define TRANSFORMAVATAR_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE - -// S60 specific contact field type containing image call object data -#define KUidContactFieldCodImageValue 0x101F8841 -const TUid KUidContactFieldCodImage={KUidContactFieldCodImageValue}; - -class CntTransformAvatar : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformavatarsimple.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformavatarsimple.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMAVATAR_SIMPLE_H -#define TRANSFORMAVATAR_SIMPLE_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE - -class CntTransformAvatarSimple : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformbirthday.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformbirthday.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMBIRTHDAY_H -#define TRANSFORMBIRTHDAY_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE - -class CntTransformBirthday : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformcontact.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformcontact.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,113 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef TRANSFORMCONCTACT_H -#define TRANSFORMCONCTACT_H - -#include - -#include -#include -#include -#include - -class CntTransformContactData; - -QTM_BEGIN_NAMESPACE -class QContactDetailDefinition; -QTM_END_NAMESPACE - -QTM_USE_NAMESPACE - -class CntTransformContact -{ -public: - CntTransformContact(); - virtual ~CntTransformContact(); - -public: - QContact transformContactL(CContactItem &contact) const; - void transformPostSaveDetailsL( - const CContactItem& contactItem, - QContact& contact, - const CContactDatabase &contactDatabase, - QString managerUri) const; - void transformContactL( - QContact &contact, - CContactItem &contactItem) const; - QList supportedSortingFieldTypes( QString detailDefinitionName, QString detailFieldName ); - TUint32 GetIdForDetailL(const QContactDetailFilter& detailFilter,bool& isSubtype) const; - void detailDefinitions(QMap& defaultSchema, const QString& contactType, QContactManager::Error& error) const; - QContactDetail *transformGuidItemFieldL(const CContactItem &contactItem, const CContactDatabase &contactDatabase) const; - QContactDetail *transformTimestampItemFieldL(const CContactItem &contactItem, const CContactDatabase &contactDatabase) const; -private: - enum ContactData - { - Name = 0, - Nickname, - PhoneNumber, - EmailAddress, - Address, - URL, - OnlineAccount, - Birthday, - Organisation, - Avatar, - SyncTarget, - Gender, - Anniversary, - Geolocation, - Note, - Family, - Empty - }; - - void initializeCntTransformContactData(); - QList transformDetailL(const QContactDetail &detail) const; - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact) const; - void transformPreferredDetailL(const QContact& contact, const QContactDetail& detail, QList &fieldList) const; - void transformPreferredDetail(const CContactItemField& field, const QContactDetail& detail, QContact& contact) const; - -private: - QMap m_transformContactData; -}; - -#endif /* TRANSFORMCONCTACT_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformcontactdata.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformcontactdata.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMCONTACTDATA_H -#define TRANSFORMCONTACTDATA_H - -#include -#include - -#include -#include -#include -#include - -QTM_USE_NAMESPACE - -class CntTransformContactData : public QObject -{ - Q_OBJECT - -#ifdef PBK_UNIT_TEST -public: -#else -protected: -#endif - void transformToTextFieldL(const QContactDetail &detail, QList &fieldList, const QString &detailValue, const TUid uid, const TUid vcardMapping, const bool setContext); - void setContexts(const TUid &fieldType, QContactDetail &detail); - void setContextsL(const QContactDetail &detail, CContactItemField &field); - -public: - virtual QList transformDetailL(const QContactDetail &detail) = 0; - virtual QContactDetail* transformItemField(const CContactItemField& field, const QContact &contact) = 0; - virtual bool supportsField(TUint32 fieldType) const = 0; - virtual bool supportsDetail(QString detailName) const = 0; - virtual QList supportedSortingFieldTypes(QString detailFieldName) const = 0; - virtual bool supportsSubType(const QString& detailName) const = 0; - virtual quint32 getIdForField(const QString& detailName) const = 0; - virtual void detailDefinitions(QMap &definitions, const QString& contactType) const = 0; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformemail.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformemail.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMEMAIL_H -#define TRANSFORMEMAIL_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE - -class CntTransformEmail : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformempty.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformempty.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMEMPTY_H -#define TRANSFORMEMPTY_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE - -class CntTransformEmpty : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformfamily.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformfamily.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMFAMILY_H -#define TRANSFORMFAMILY_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE - -class CntTransformFamily : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformgender.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformgender.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMGENDER_H -#define TRANSFORMGENDER_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE - -class CntTransformGender : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformgeolocation.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformgeolocation.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMGEOLOCATION_H -#define TRANSFORMGEOLOCATION_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE - -class CntTransformGeolocation : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformname.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformname.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMNAME_H -#define TRANSFORMNAME_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE - -class CntTransformName : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformnickname.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformnickname.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMNICKNAME_H -#define TRANSFORMNICKNAME_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE - -class CntTransformNickname : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformnote.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformnote.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMNOTE_H -#define TRANSFORMNOTE_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE - -class CntTransformNote : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformonlineaccount.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformonlineaccount.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifdef SYMBIAN_BACKEND_USE_SQLITE - -#ifndef TRANSFORMONLINEACCOUNT_H -#define TRANSFORMONLINEACCOUNT_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE - -class CntTransformOnlineAccount : public CntTransformContactData -{ - enum TPresnceMap - { - EPresenceOffline, - EPresenceAvailable, - EPresenceHidden, - EPresenceBusy, - EPresenceAway, - EPresenceExtendedAway, - EPresenceUnknown - }; - -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; - -private: - quint32 encodePresence(QString aPresence); - QString decodePresence(quint32 aPresence); -}; - -#endif // TRANSFORMONLINEACCOUNT_H - -#endif // SYMBIAN_BACKEND_USE_SQLITE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformorganisation.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformorganisation.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMORGANISATION_H -#define TRANSFORMORGANISATION_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE - -class CntTransformOrganisation : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformphonenumber.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformphonenumber.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMPHONENUMBER_H -#define TRANSFORMPHONENUMBER_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE - -class CntTransformPhoneNumber : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformsynctarget.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformsynctarget.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMSYNCTARGET_H -#define TRANSFORMSYNCTARGET_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE - -class CntTransformSyncTarget : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformurl.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cnttransformurl.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef TRANSFORMURL_H -#define TRANSFORMURL_H - -#include "cnttransformcontactdata.h" - -QTM_USE_NAMESPACE - -class CntTransformUrl : public CntTransformContactData -{ -protected: - QList transformDetailL(const QContactDetail &detail); - QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); - bool supportsField(TUint32 fieldType) const; - bool supportsDetail(QString detailName) const; - QList supportedSortingFieldTypes(QString detailFieldName) const; - bool supportsSubType(const QString& subType) const; - quint32 getIdForField(const QString& fieldName) const; - void detailDefinitions(QMap &definitions, const QString& contactType) const; -}; - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntabstractcontactfilter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntabstractcontactfilter.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QABSTRACTCONTACTFILTER_H +#define QABSTRACTCONTACTFILTER_H + +#include +#include "qtcontactsglobal.h" +#include "qcontactmanager.h" +#include "qcontactsortorder.h" +#include "qcontactfilter.h" + +QTM_USE_NAMESPACE +class CntAbstractContactFilter +{ +public: + enum FilterSupport { + /* The filter not supported */ + NotSupported = 0, + /* The filter is supported */ + Supported, + /* The filter is not directly supported, but for performance reasons + * the contact filter implementation pretends supporting the filter + * when it actually maps the filter to another, less strict filter. + * For example if the caller uses match flag QContactFilter::MatchExactly, the + * filter actually gives the result as QContactFilter::MatchContains (because of + * the limitations in the underlying database). + * The result then needs to be filtered by the caller (for example by + * using QContactManagerEngine::testFilter). */ + SupportedPreFilterOnly + }; +public: + virtual QList contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupported, + QContactManager::Error &error) = 0; + virtual bool filterSupported(const QContactFilter& filter) = 0; +}; + +#endif /* QABSTRACTCONTACTFILTER_H */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntabstractcontactsorter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntabstractcontactsorter.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTABSTRACTCONTACTSORTER_H +#define CNTABSTRACTCONTACTSORTER_H + +#include +#include "qtcontactsglobal.h" +#include "qcontactmanager.h" +#include "qcontactsortorder.h" + +QTM_USE_NAMESPACE +class CntAbstractContactSorter +{ +public: + virtual QList contacts( + const QList& sortOrders, + QContactManager::Error& error) = 0; + + virtual QList sort( + QList contactIds, + const QList& sortOrders, + QContactManager::Error& error) = 0; + + virtual bool sortOrderSupported(const QList& sortOrders) = 0; +}; + +#endif /* QABSTRACTCONTACTSORTER_H */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntdbinfo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntdbinfo.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#ifndef CNTDBINFO_H_ +#define CNTDBINFO_H_ + +#include +#include +#include + +class CntSymbianSrvConnection; +class CntSymbianFilter; +class CntDbInfo : public QObject +{ + Q_OBJECT + + enum TCommAddrType + { + EPhoneNumber, + EEmailAddress, + ESipAddress + }; +public: + CntDbInfo(); + virtual ~CntDbInfo(); + + void getDbTableAndColumnName( const quint32 fieldId , + QString& tableName, + QString& columnName ) const; + bool SupportsUid(int uid); + +private: + QHash contactsTableIdColumNameMapping; + QHash commAddrTableIdColumNameMapping; + +}; + + + + + + +#endif /* CNTDBINFO_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntdisplaylabelsqlfilter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntdisplaylabelsqlfilter.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTDISPLAYLABELSQLFILTER_H_ +#define CNTDISPLAYLABELSQLFILTER_H_ + +#include +#include +#include + +QTM_USE_NAMESPACE + +class CntDisplayLabelSqlFilter +{ +public: + CntDisplayLabelSqlFilter(); + virtual ~CntDisplayLabelSqlFilter(); + + void createSqlQuery(const QContactDetailFilter& filter, + QString& sqlQuery, + QContactManager::Error& error); +private: + void createQuerySingleSearchValue(QString& sqlQuery, const QString &searchValue, const QStringList &columns) const; + void createQueryMultipleSearchValues(QString& sqlQuery, const QStringList &searchValues, const QStringList &columns) const; + QString createSubQuery(const QString &searchValue, const QString &column) const; + QString columnName(const QPair &detail) const; +}; + +#endif /* CNTDISPLAYLABELSQLFILTER_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterabstract.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterabstract.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTFILTERABSTRACT_H +#define CNTFILTERABSTRACT_H + +#include + +class CntSymbianSrvConnection; + +QTM_USE_NAMESPACE + +class CntFilterAbstract : public QObject +{ + Q_OBJECT + +public: + /* + * \param cntServer used to execute sql queries on the server + * \param sqlHelper todo - used for sortorder, tablenames etc. + */ + CntFilterAbstract(CntSymbianSrvConnection &cntServer); + virtual ~CntFilterAbstract(); + + /* + * \param sortOrder that should be appended to the query + */ + QList contacts(const QContactFilter& filter, + const QList& sortOrders, + QContactManager::Error& error) const; + virtual bool isFilterSupported(const QContactFilter& filter) const = 0; + + virtual QString createSelectQuery(const QContactFilter& filter, + const QList& sortOrders, + QContactManager::Error& error) const = 0; + + +protected: + CntSymbianSrvConnection &m_srvConnection; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilteraction.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilteraction.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTFILTERACTION_H_ +#define CNTFILTERACTION_H_ + +#include "cntabstractcontactfilter.h" +#include "cntsymbiansrvconnection.h" +#include "cntdbinfo.h" + +class CntFilterAction : public CntAbstractContactFilter +{ +public: + CntFilterAction(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo); + ~CntFilterAction(); + QList contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupported, + QContactManager::Error &error); + bool filterSupported(const QContactFilter& filter); + + void createSelectQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error); +private: + +protected: + CContactDatabase& m_contactdatabase; + CntSymbianSrvConnection &m_srvConnection; + CntDbInfo& m_dbInfo; +}; + +#endif /* CNTFILTERACTION_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterchangelog.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterchangelog.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTFILTERCHANGELOG_H_ +#define CNTFILTERCHANGELOG_H_ + +#include "cntabstractcontactfilter.h" +#include "cntsymbiansrvconnection.h" +#include "cntdbinfo.h" + +class CntFilterChangeLog : public CntAbstractContactFilter +{ +public: + CntFilterChangeLog(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo); + ~CntFilterChangeLog(); + QList contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupported, + QContactManager::Error &error); + bool filterSupported(const QContactFilter& filter); + + void createSelectQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error); +private: + +protected: + CContactDatabase& m_contactdatabase; + CntSymbianSrvConnection &m_srvConnection; + CntDbInfo& m_dbInfo; +}; + +#endif /* CNTFILTERCHANGELOG_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdefault.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdefault.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTFILTERDEFAULT_H_ +#define CNTFILTERDEFAULT_H_ + +#include "cntabstractcontactfilter.h" +#include "cntsymbiansrvconnection.h" +#include "cntdbinfo.h" + +class CntFilterDefault : public CntAbstractContactFilter +{ +public: + CntFilterDefault(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo); + ~CntFilterDefault(); + QList contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupported, + QContactManager::Error &error); + bool filterSupported(const QContactFilter& filter); + + void createSelectQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error); +private: + +protected: + CContactDatabase& m_contactdatabase; + CntSymbianSrvConnection &m_srvConnection; + CntDbInfo& m_dbInfo; +}; + +#endif /* CNTFILTERDEFAULT_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdetail.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdetail.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTFILTERDETAIL_H +#define CNTFILTERDETAIL_H + +#include "cntabstractcontactfilter.h" +#include "cntsymbiansrvconnection.h" +#include "qcontactdetailfilter.h" +#include "cntdbinfo.h" + +#include + +QTM_USE_NAMESPACE + +class CntFilterDetail : public CntAbstractContactFilter +{ +public: + CntFilterDetail(CContactDatabase& contactDatabase, CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo); + ~CntFilterDetail(); + QList contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupported, + QContactManager::Error &error); + bool filterSupported(const QContactFilter& filter) ; + + //bool isFilterSupported(const QContactFilter& filter) const; + + void getTableNameWhereClause( const QContactDetailFilter& filter, + QString& tableName, + QString& sqlWhereClause , + QContactManager::Error& error) const; + void createSelectQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error); +private: + + + void updateForMatchFlag( const QContactDetailFilter& filter, + QString& fieldToUpdate , + QContactManager::Error& error) const; + QList HandlePhonenumberDetailFilter(const QContactFilter& filter); + QList HandlePredictiveSearchFilter(const QContactFilter& filter, + QContactManager::Error& error); + + TInt CntFilterDetail::searchPhoneNumbers( + CContactIdArray*& idArray, + const TDesC& phoneNumber, + const TInt matchLength); + void getMatchLengthL(TInt& matchLength); +protected: + CContactDatabase& m_contactdatabase; + CntSymbianSrvConnection &m_srvConnection; + CntDbInfo& m_dbInfo; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdetaildisplaylabel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdetaildisplaylabel.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTFILTERDETAILDISPLAYLABEL_H +#define CNTFILTERDETAILDISPLAYLABEL_H + +#include +#include +#include + +#include "cntabstractcontactfilter.h" + +QTM_USE_NAMESPACE + +class CntFilterDetailDisplayLabel +{ +public: + CntFilterDetailDisplayLabel(); + virtual ~CntFilterDetailDisplayLabel(); + +public: + QString createSelectQuery(const QContactFilter& filter, + const QList& sortOrders, + QContactManager::Error& error) const; + void createSelectQuery(const QContactFilter& detailFilter, + QString& sqlQuery, + QContactManager::Error& error); +private: + void createQuerySingleSearchValue(QString& sqlQuery, const QString &searchValue, const QStringList &columns) const; + void createQueryMultipleSearchValues(QString& sqlQuery, const QStringList &searchValues, const QStringList &columns) const; + QString createSubQuery(const QString &searchValue, const QString &column) const; + QString columnName(const QPair &detail) const; + }; + +#endif /* CNTFILTERDETAILDISPLAYLABEL_H */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdetailrange.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdetailrange.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTFILTERDETAILRANGE_H_ +#define CNTFILTERDETAILRANGE_H_ + +#include "cntabstractcontactfilter.h" +#include "cntsymbiansrvconnection.h" +#include "cntdbinfo.h" + +class CntFilterdetailrange : public CntAbstractContactFilter +{ +public: + CntFilterdetailrange(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo); + ~CntFilterdetailrange(); + QList contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupported, + QContactManager::Error &error); + bool filterSupported(const QContactFilter& filter); + + void createSelectQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error); +private: + +protected: + CContactDatabase& m_contactdatabase; + CntSymbianSrvConnection &m_srvConnection; + CntDbInfo& m_dbInfo; +}; + +#endif /* CNTFILTERDETAILRANGE_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterintersection.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterintersection.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTFILTERINTERSECTION_H_ +#define CNTFILTERINTERSECTION_H_ + +#include "cntabstractcontactfilter.h" +#include "cntsymbiansrvconnection.h" +#include "qcontactdetailfilter.h" +#include "cntdbinfo.h" + +class CntFilterIntersection : public CntAbstractContactFilter +{ + +public: + CntFilterIntersection(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo); + virtual ~CntFilterIntersection(); + QList contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupported, + QContactManager::Error &error) ; + bool filterSupported(const QContactFilter& filter); + + void getSqlQuery( const QContactIntersectionFilter& filter, + QString& tableName, + QString& sqlWhereClause , + QContactManager::Error& error) const; + + void createSelectQuery(const QContactFilter& filter, + QString& selectquery, + QContactManager::Error& error); + +private: + void getSelectQueryforFilter(const QContactFilter& filter,QString& sqlSelectQuery,QContactManager::Error& error); + +protected: + CContactDatabase& m_contactdatabase; + CntSymbianSrvConnection &m_srvConnection; + CntDbInfo& m_dbInfo; +}; + +#endif /* CNTFILTERINTERSECTION_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterinvalid.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterinvalid.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTFILTERINVALID_H_ +#define CNTFILTERINVALID_H_ + +#include "cntabstractcontactfilter.h" +#include "cntsymbiansrvconnection.h" +#include "cntdbinfo.h" + +class CntFilterInvalid : public CntAbstractContactFilter +{ +public: + CntFilterInvalid(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo); + ~CntFilterInvalid(); + QList contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupported, + QContactManager::Error &error); + bool filterSupported(const QContactFilter& filter); + void createSelectQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error); +private: + +protected: + CContactDatabase& m_contactdatabase; + CntSymbianSrvConnection &m_srvConnection; + CntDbInfo& m_dbInfo; +}; + +#endif /* CNTFILTERINVALID_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterlocalid.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterlocalid.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTFILTERLOCALID_H_ +#define CNTFILTERLOCALID_H_ + +#include "cntabstractcontactfilter.h" +#include "cntsymbiansrvconnection.h" +#include "cntdbinfo.h" + + +class CntFilterLocalId : public CntAbstractContactFilter +{ +public: + CntFilterLocalId(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo); + ~CntFilterLocalId(); + QList contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupported, + QContactManager::Error &error); + bool filterSupported(const QContactFilter& filter); + + void createSelectQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error); +private: + +protected: + CContactDatabase& m_contactdatabase; + CntSymbianSrvConnection &m_srvConnection; + CntDbInfo& m_dbInfo; +}; + +#endif /* CNTFILTERLOCALID_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterrelationship.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterrelationship.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTFILTERRELATIONSHIP_H_ +#define CNTFILTERRELATIONSHIP_H_ + +#include "cntabstractcontactfilter.h" +#include "cntsymbiansrvconnection.h" +#include "qcontactdetailfilter.h" +#include "cntdbinfo.h" + +#include + +QTM_USE_NAMESPACE + +class CntFilterRelationship : public CntAbstractContactFilter +{ +public: + CntFilterRelationship(CContactDatabase& contactDatabase, CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo); + ~CntFilterRelationship(); + QList contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupported, + QContactManager::Error &error); + bool filterSupported(const QContactFilter& filter) ; + + //bool isFilterSupported(const QContactFilter& filter) const; + + void CntFilterRelationship::getSqlquery( const QContactRelationshipFilter& relationfilter, + QString& sqlquery , + QContactManager::Error& error) const; + void CntFilterRelationship::createSelectQuery(const QContactFilter& detailFilter, + QString& sqlQuery, + QContactManager::Error& error); +protected: + CContactDatabase& m_contactdatabase; + CntSymbianSrvConnection &m_srvConnection; + CntDbInfo& m_dbInfo; +}; + +#endif //CNTFILTERRELATIONSHIP_H_ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterunion.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterunion.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTFILTERUNION_H +#define CNTFILTERUNION_H + +#include "cntabstractcontactfilter.h" +#include "cntsymbiansrvconnection.h" +#include "qcontactdetailfilter.h" +#include "cntdbinfo.h" + +#include + +QTM_USE_NAMESPACE + +class CntFilterUnion : public CntAbstractContactFilter +{ +public: + CntFilterUnion(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo); + virtual ~CntFilterUnion(); + QList contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupported, + QContactManager::Error &error) ; + bool filterSupported(const QContactFilter& filter) ; + + void createSelectQuery(const QContactFilter& filter, + QString& selectquery, + QContactManager::Error& error); + +private: + void getSelectQueryforFilter(const QContactFilter& filter,QString& sqlSelectQuery,QContactManager::Error& error); + +protected: + CContactDatabase& m_contactdatabase; + CntSymbianSrvConnection &m_srvConnection; + CntDbInfo& m_dbInfo; +}; + +#endif // CNTFILTERUNION_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsqlsearch.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsqlsearch.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +//#ifdef SYMBIAN_BACKEND_USE_SQLITE + +#include +#include + + +class CntSqlSearch : public QObject +{ + Q_OBJECT + +public: + CntSqlSearch(); + + QString CreatePredictiveSearch(const QString &pattern); + + +private: + + QString SelectTableView(const QString &pattern); + + bool IsSubStringSearch(const QString &pattern); + + QStringList GetNumber(const QString &pattern); + + QString CreateSubStringSearch(const QString &pattern); + + QString CreateStringSearch(const QString &pattern); + + QString CreateSpaceStringSearch(QStringList numbers, const QString &pattern); + + QString CreateSpaceSimpleSearch(QStringList numbers); + + QString CreateLimit(QString pattern ); + + QString CreateJoinTableLimit(QString low, QString upp, QString table); + + QString CreateJoinTableSearch(QStringList numbers); + + QString Order(QStringList numbers); + + QString upperLimit( const QString &pattern ) const; + + QString lowerLimit( const QString &pattern ) const; + + QString pad( const QString &pattern, char padChar ) const; + + friend class UT_CntSqlSearch; +}; +//#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfilterdbms.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfilterdbms.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTSYMBIANFILTERDBMS_H +#define CNTSYMBIANFILTERDBMS_H + +#ifndef SYMBIAN_BACKEND_USE_SQLITE + +#include "cntabstractcontactfilter.h" +#include + +class CContactDatabase; +class CContactIdArray; +class CntAbstractContactSorter; +class CntTransformContact; +class CContactItemFieldDef; +class CContactItemFieldSet; + +QTM_BEGIN_NAMESPACE +class QContactDetailFilter; +QTM_END_NAMESPACE + +QTM_USE_NAMESPACE +class CntSymbianFilter : public CntAbstractContactFilter +{ +public: + CntSymbianFilter(CContactDatabase& contactDatabase); + ~CntSymbianFilter(); + + /* from CntAbstractContactFilter */ + QList contacts(const QContactFilter& filter, + const QList& sortOrders, + bool &filterSupported, + QContactManager::Error& error); + bool filterSupported(const QContactFilter& filter); + +private: + FilterSupport filterSupportLevel(const QContactFilter& filter); + QList filterContacts(const QContactFilter& filter, + QContactManager::Error& error); + void transformDetailFilterL(const QContactDetailFilter& detailFilter, CContactItemFieldDef*& fieldDef); + TInt findContacts( + CContactIdArray*& idArray, + const CContactItemFieldDef& fieldDef, + const TDesC& text) const; + CContactIdArray* findContactsL( + const CContactItemFieldDef& fieldDef, + const TDesC& text) const; + TInt matchContacts( + CContactIdArray*& idArray, + const TDesC& phoneNumber, + const TInt matchLength); + bool isFalsePositive(const CContactItemFieldSet& fieldSet, const TUid& fieldTypeUid, const TDesC& searchString); + void getMatchLengthL(TInt& matchLength); + CContactDatabase &m_contactDatabase; + CntAbstractContactSorter *m_contactSorter; + CntTransformContact *m_transformContact; +#ifdef PBK_UNIT_TEST + friend class ut_cntfilteringdbms; +#endif +}; + +#endif /*SYMBIAN_BACKEND_USE_SQLITE*/ + +#endif /* CNTSYMBIANFILTERDBMS_H */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfiltersql.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfiltersql.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNT_SYMBIAN_FILTER_SQL_H +#define CNT_SYMBIAN_FILTER_SQL_H + +#ifdef SYMBIAN_BACKEND_USE_SQLITE + +#include "cntabstractcontactfilter.h" +#include "qcontactmanagerengine.h" + +class CContactDatabase; +class CntFilterAbstract; +class CntTransformContact; +class CntSymbianSrvConnection; +class CntDbInfo; +QTM_USE_NAMESPACE +class CntSymbianFilter : public CntAbstractContactFilter +{ +public: + CntSymbianFilter(QContactManagerEngine& manager, CContactDatabase& contactDatabase, const CntTransformContact &transformContact); + ~CntSymbianFilter(); + + /* from CntAbstractContactFilter */ + QList contacts( + const QContactFilter& filter, + const QList& sortOrders, + bool &filterSupportedflag, + QContactManager::Error& error) ; + + void initializeFilters(); + + bool filterSupported(const QContactFilter& filter) ; +protected: + void createSelectQuery(const QContactFilter& /*detailFilter*/, + QString& /*sqlQuery*/, + QContactManager::Error& /*error*/){}; +private: + CContactDatabase& m_contactDatabase; + CntDbInfo* m_dbInfo; + const CntTransformContact &m_transformContact; + CntSymbianSrvConnection* m_srvConnection; + QMap m_filterMap; + +}; + +#endif /* SYMBIAN_BACKEND_USE_SQLITE */ + +#endif /* CNT_SYMBIAN_FILTER_SQL_H */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfiltersqlhelper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfiltersqlhelper.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,140 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef CNTSYMBIANFILTERSQLHELPER_H +#define CNTSYMBIANFILTERSQLHELPER_H + +// System includes +#include +// User includes +#include "qcontactdetailfilter.h" +#include "qcontactphonenumber.h" +#include "qcontactmanager.h" +#include "cntsymbiansrvconnection.h" +#include "cntabstractcontactfilter.h" + +// Forward declarations +class CntSqlSearch; +// External data types + +// Constants +QTM_USE_NAMESPACE +class CntSymbianFilterSqlHelper +{ +public: + Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SingleQuote,"'") ; + Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::PercentSign,"%") ; + Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::Space," ") ; + Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::EqualTo,"=") ; + Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SqlLike," LIKE ") ; + Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SqlNotNull," NOT NULL ") ; + Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SqlWhere," WHERE ") ; + Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SqlOr," OR ") ; + Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::contactsTable," contact ") ; + Q_DECLARE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::commAddrTable," comm_addr ") ; + + //This is copied from pltables.h from cntmodel. + // This definition needs to be exported and the file included + // so that duplicity is avoided + enum TCommAddrType + { + EPhoneNumber, + EEmailAddress, + ESipAddress + }; +public: + CntSymbianFilterSqlHelper(CContactDatabase &contactDatabase); + virtual ~CntSymbianFilterSqlHelper(); + +public: + /*Generic functions for all filters*/ + QList searchContacts(const QContactFilter& filter, + const QList& sortOrders, + QContactManager::Error& error); + CntAbstractContactFilter::FilterSupport filterSupportLevel(const QContactFilter& filter); + +private: + void appendSortOrderQuery(QString& sqlQuery, const QList& sortOrders); + void columnName( QString &columnName, const QString &detailDefinitionName, const QString & detailFieldName); + void createSqlQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error); + /* Return true if this filter is leaf filter*/ + bool isSingleFilter(const QContactFilter& filter) const; + /*Local helper functions used for creating the sql query */ + void updateSqlQueryForSingleFilter(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error); + void updateSqlQueryForDetailFilter(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error); + + void getSqlDbTableAndColumnNameforDetailFilter( + const QContactDetailFilter& filter , + bool& isSubType, + QString& tableName, + QString& columnName ); + + + void updateFieldForDeatilFilterMatchFlag( const QContactDetailFilter& filter, + QString& fieldToUpdate , + QContactManager::Error& error) const; + QList CntSymbianFilterSqlHelper::HandlePhonenumberDetailFilter(const QContactDetailFilter detailFilter); + void getMatchLengthL(TInt& matchLength); + TInt CntSymbianFilterSqlHelper::searchPhoneNumbers( + CContactIdArray*& idArray, + const TDesC& phoneNumber, + const TInt matchLength); + CntAbstractContactFilter::FilterSupport checkIfDetailFilterSupported(const QContactDetailFilter& detailFilter) const; + QList HandlePredictiveSearchFilter(const QContactFilter& filter, bool& isPredSearch, QContactManager::Error& error); + +private: + CntSymbianSrvConnection* m_srvConnection; + CntSqlSearch* m_sqlSearch; + CContactDatabase &m_contactDatabase; + bool isPhoneNumberSearchforDetailFilter; + QHash contactsTableIdColumNameMapping; + QHash commAddrTableIdColumNameMapping; + + friend class ut_cntsymbianfiltersqlhelper; + +}; + +#endif//CNTSYMBIANFILTERSQLHELPER_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbiansorterdbms.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbiansorterdbms.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTSYMBIANSORTERDBMS_H +#define CNTSYMBIANSORTERDBMS_H + +#include "cntabstractcontactsorter.h" +#include + +class CContactDatabase; +class CContactIdArray; +class CntTransformContact; + +QTM_USE_NAMESPACE +class CntSymbianSorterDbms : public CntAbstractContactSorter +{ +public: + CntSymbianSorterDbms(CContactDatabase& contactDatabase, CntTransformContact& m_transformContact); + ~CntSymbianSorterDbms(); + + /* from CntAbstractContactFilter */ + QList contacts( + const QList& sortOrders, + QContactManager::Error& error); + QList sort( + QList contactIds, + const QList& sortOrders, + QContactManager::Error& error); + bool sortOrderSupported(const QList& sortOrders); + +private: + QList contactsL(const QList& sortOrders) const; + QList sortL(const QList& contactIds, const QList& sortOrders) const; + CContactIdArray* sortL(const CContactIdArray* contactIds, const QList& sortOrders) const; + +private: + CContactDatabase& m_contactDatabase; + CntTransformContact& m_transformContact; +}; + +#endif /* QCONTACTSYMBIANSORTERDBMS_H */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbiansrvconnection.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbiansrvconnection.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef CNTSRVCONNECTION_H +#define CNTSRVCONNECTION_H + +// System includes +#include +#include +#include + +// User includes + +// Forward declarations + +// External data types + +// Constants + +QTM_USE_NAMESPACE +class CntSymbianSrvConnection : public RSessionBase +{ +public: + /*Constructor and destructor*/ + CntSymbianSrvConnection(); + ~CntSymbianSrvConnection(); + +public: + /* QT like functions */ + QList searchContacts(const QString& searchQuery, + QContactManager::Error& error); + +private: + /* Symbian Leaving functions */ + QList searchContactsL(const TDesC& aSearchQuery); + void ConnectSrvL(); + void OpenDatabaseL(); + TVersion Version() const; + TDes8& GetReceivingBufferL(TInt aSize=0); + QList UnpackCntIdArrayL(); + +private: + /* member varibles */ + CBufFlat* m_buffer; + TInt m_maxBufferSize; + TPtr8 m_bufPtr; + bool m_isInitialized; + + friend class ut_cntsymbianfiltersqlhelper; +}; + +#endif //CNTSRVCONNECTION_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cntthumbnailcreator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cntthumbnailcreator.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef THUMBNAIL_CREATOR_H +#define THUMBNAIL_CREATOR_H + +#include +#include +#include + +class CContactItemField; +class CImageDecoder; +class CFbsBitmap; +class CBitmapScaler; +class CImageEncoder; + +class CntThumbnailCreator : public CActive +{ + enum TCreatorState { + EStateInitialized = 0, + EStateDecodeImage, + EStateScaleImage, + EStateEncodeImage, + EStateFinal + }; + +public: + CntThumbnailCreator(); + ~CntThumbnailCreator(); + void addThumbnailFieldL(QList *fieldList, const TFileName &filename, const TSize& maxSize); + void addThumbnailFieldL(QList *fieldList, CFbsBitmap *bitmap, const TSize& maxSize); + +private: // from CActive + void RunL(); + void DoCancel(); + TInt RunError(TInt aError); + +private: + void DecodeImageL(const TFileName &filename); + void ScaleImageL(); + void EncodeImageL(); + void CreateContactFieldL(); + void initializeThumbnailFieldL(); + +private: + TCreatorState m_state; + TSize m_thumbnailSize; + CContactItemField *m_thumbnailFieldFromTemplate; + QList *m_fieldList; + CActiveSchedulerWait *m_activeSchedulerWait; + TInt m_err; + RFs m_rfs; + CImageDecoder *m_decoder; + CFbsBitmap *m_bitmap; + CBitmapScaler *m_bitmapScaler; + HBufC8 *m_imageData; + CImageEncoder *m_encoder; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformaddress.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformaddress.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMADDRESS_H +#define TRANSFORMADDRESS_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE +class CntTransformAddress : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformanniversary.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformanniversary.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMANNIVERSARY_H +#define TRANSFORMANNIVERSARY_H + +#include "cnttransformcontactdata.h" +QTM_USE_NAMESPACE +class CntTransformAnniversary : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformanniversarysimple.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformanniversarysimple.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMANNIVERSARYSIMPLE_H +#define TRANSFORMANNIVERSARYSIMPLE_H + +#include "cnttransformcontactdata.h" +QTM_USE_NAMESPACE +class CntTransformAnniversarySimple : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformavatar.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformavatar.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMAVATAR_H +#define TRANSFORMAVATAR_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +// S60 specific contact field type containing image call object data +#define KUidContactFieldCodImageValue 0x101F8841 +const TUid KUidContactFieldCodImage={KUidContactFieldCodImageValue}; + +class CntTransformAvatar : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformavatarsimple.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformavatarsimple.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMAVATAR_SIMPLE_H +#define TRANSFORMAVATAR_SIMPLE_H + +#include "cnttransformcontactdata.h" + +class CntThumbnailCreator; + +QTM_USE_NAMESPACE + +class CntTransformAvatarSimple : public CntTransformContactData +{ +public: + CntTransformAvatarSimple(); + ~CntTransformAvatarSimple(); + +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +private: + CntThumbnailCreator* m_thumbnailCreator; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformbirthday.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformbirthday.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMBIRTHDAY_H +#define TRANSFORMBIRTHDAY_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +class CntTransformBirthday : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformcontact.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformcontact.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TRANSFORMCONCTACT_H +#define TRANSFORMCONCTACT_H + +#include + +#include +#include +#include +#include + +class CntTransformContactData; + +QTM_BEGIN_NAMESPACE +class QContactDetailDefinition; +QTM_END_NAMESPACE + +QTM_USE_NAMESPACE + +class CntTransformContact +{ +public: + CntTransformContact(); + virtual ~CntTransformContact(); + +public: + QContact transformContactL(CContactItem &contact, const QStringList& definitionRestrictions = QStringList()) const; + void transformPostSaveDetailsL( + const CContactItem& contactItem, + QContact& contact, + const CContactDatabase &contactDatabase, + QString managerUri) const; + void transformContactL( + QContact &contact, + CContactItem &contactItem) const; + QList supportedSortingFieldTypes( QString detailDefinitionName, QString detailFieldName ); + TUint32 GetIdForDetailL(const QContactDetailFilter& detailFilter,bool& isSubtype) const; + void detailDefinitions(QMap& defaultSchema, const QString& contactType, QContactManager::Error& error) const; + QContactDetail *transformGuidItemFieldL(const CContactItem &contactItem, const CContactDatabase &contactDatabase) const; + QContactDetail *transformTimestampItemFieldL(const CContactItem &contactItem, const CContactDatabase &contactDatabase) const; +private: + enum ContactData + { + Name = 0, + Nickname, + PhoneNumber, + EmailAddress, + Address, + URL, + OnlineAccount, + Birthday, + Organisation, + Avatar, + SyncTarget, + Gender, + Anniversary, + Geolocation, + Note, + Family, + Empty + }; + + void initializeCntTransformContactData(); + QList transformDetailL(const QContactDetail &detail) const; + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact) const; + void transformPreferredDetailL(const QContact& contact, const QContactDetail& detail, QList &fieldList) const; + void transformPreferredDetail(const CContactItemField& field, const QContactDetail& detail, QContact& contact) const; + +private: + QMap m_transformContactData; +}; + +#endif /* TRANSFORMCONCTACT_H_ */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformcontactdata.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformcontactdata.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMCONTACTDATA_H +#define TRANSFORMCONTACTDATA_H + +#include +#include + +#include +#include +#include +#include + +QTM_USE_NAMESPACE + +class CntTransformContactData : public QObject +{ + Q_OBJECT + +#ifdef PBK_UNIT_TEST +public: +#else +protected: +#endif + void transformToTextFieldL(const QContactDetail &detail, QList &fieldList, const QString &detailValue, const TUid uid, const TUid vcardMapping, const bool setContext); + void setContexts(const TUid &fieldType, QContactDetail &detail); + void setContextsL(const QContactDetail &detail, CContactItemField &field); + +public: + virtual QList transformDetailL(const QContactDetail &detail) = 0; + virtual QContactDetail* transformItemField(const CContactItemField& field, const QContact &contact) = 0; + virtual bool supportsField(TUint32 fieldType) const = 0; + virtual bool supportsDetail(QString detailName) const = 0; + virtual QList supportedSortingFieldTypes(QString detailFieldName) const = 0; + virtual bool supportsSubType(const QString& detailName) const = 0; + virtual quint32 getIdForField(const QString& detailName) const = 0; + virtual void detailDefinitions(QMap &definitions, const QString& contactType) const = 0; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformemail.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformemail.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMEMAIL_H +#define TRANSFORMEMAIL_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +class CntTransformEmail : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformempty.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformempty.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMEMPTY_H +#define TRANSFORMEMPTY_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +class CntTransformEmpty : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformfamily.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformfamily.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMFAMILY_H +#define TRANSFORMFAMILY_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +class CntTransformFamily : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformgender.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformgender.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMGENDER_H +#define TRANSFORMGENDER_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +class CntTransformGender : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformgeolocation.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformgeolocation.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMGEOLOCATION_H +#define TRANSFORMGEOLOCATION_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +class CntTransformGeolocation : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformname.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformname.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMNAME_H +#define TRANSFORMNAME_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +class CntTransformName : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformnickname.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformnickname.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMNICKNAME_H +#define TRANSFORMNICKNAME_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +class CntTransformNickname : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformnote.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformnote.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMNOTE_H +#define TRANSFORMNOTE_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +class CntTransformNote : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformonlineaccount.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformonlineaccount.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifdef SYMBIAN_BACKEND_USE_SQLITE + +#ifndef TRANSFORMONLINEACCOUNT_H +#define TRANSFORMONLINEACCOUNT_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +class CntTransformOnlineAccount : public CntTransformContactData +{ + enum TPresnceMap + { + EPresenceOffline, + EPresenceAvailable, + EPresenceHidden, + EPresenceBusy, + EPresenceAway, + EPresenceExtendedAway, + EPresenceUnknown + }; + +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; + +private: + quint32 encodePresence(QString aPresence); + QString decodePresence(quint32 aPresence); +}; + +#endif // TRANSFORMONLINEACCOUNT_H + +#endif // SYMBIAN_BACKEND_USE_SQLITE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformorganisation.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformorganisation.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMORGANISATION_H +#define TRANSFORMORGANISATION_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +class CntTransformOrganisation : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformphonenumber.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformphonenumber.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMPHONENUMBER_H +#define TRANSFORMPHONENUMBER_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +class CntTransformPhoneNumber : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformsynctarget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformsynctarget.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMSYNCTARGET_H +#define TRANSFORMSYNCTARGET_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +class CntTransformSyncTarget : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformurl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformurl.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TRANSFORMURL_H +#define TRANSFORMURL_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +class CntTransformUrl : public CntTransformContactData +{ +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; +}; + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/rss/cntmodel.rss --- a/qtcontactsmobility/plugins/contacts/symbian/rss/cntmodel.rss Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/plugins/contacts/symbian/rss/cntmodel.rss Fri Apr 16 14:53:18 2010 +0300 @@ -213,6 +213,19 @@ category=EContactCategoryHome; fieldName=STRING_r_cntui_new_field_defns11; }, + FIELD // Number: video calls (Home) + { + fieldStorageType=KStorageTypeText; + contactFieldType=KUidContactFieldPhoneNumberValue; + vCardMapping=KIntContactFieldVCardMapTEL; + extraMapping= + { + MAPPING { mapping=KIntContactFieldVCardMapHOME; }, + MAPPING { mapping=KIntContactFieldVCardMapVIDEO; } + }; + category=EContactCategoryHome; + fieldName=qtn_phob_lbl_video_home; + }, FIELD // Email Address (Home) { fieldStorageType = KStorageTypeText; @@ -417,6 +430,19 @@ category = EContactCategoryWork; fieldName = qtn_phob_lbl_fax_work; }, + FIELD // Number: video calls (Work) + { + fieldStorageType=KStorageTypeText; + contactFieldType=KUidContactFieldPhoneNumberValue; + vCardMapping=KIntContactFieldVCardMapTEL; + extraMapping= + { + MAPPING { mapping=KIntContactFieldVCardMapWORK; }, + MAPPING { mapping=KIntContactFieldVCardMapVIDEO; } + }; + category=EContactCategoryWork; + fieldName=qtn_phob_lbl_video_work; + }, FIELD //Assistant number { fieldStorageType=KStorageTypeText; @@ -604,7 +630,18 @@ category = EContactCategoryNone; fieldName = qtn_phob_lbl_fax; }, - + FIELD // Number: video calls (general) + { + fieldStorageType=KStorageTypeText; + contactFieldType=KUidContactFieldPhoneNumberValue; + vCardMapping=KIntContactFieldVCardMapTEL; + extraMapping= + { + MAPPING { mapping=KIntContactFieldVCardMapVIDEO; } + }; + category=EContactCategoryNone; + fieldName=qtn_phob_lbl_video; + }, FIELD // Email Address (general) { fieldStorageType = KStorageTypeText; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cntdisplaylabel.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntdisplaylabel.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/cntdisplaylabel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -77,11 +77,11 @@ contactPrefferedDisplayLabelDetails.append(qMakePair(QLatin1String(QContactName::DefinitionName), QLatin1String(QContactName::FieldFirst))); contactPrefferedDisplayLabelDetails.append(qMakePair(QLatin1String(QContactName::DefinitionName), QLatin1String(QContactName::FieldLast))); m_contactDisplayLabelDetails.append(contactPrefferedDisplayLabelDetails); - + //if preferred details doesn't exist use these - //QList > contactPreffered2DisplayLabelDetails; - //contactPreffered2DisplayLabelDetails.append(qMakePair(QLatin1String(QContactOrganization::DefinitionName), QLatin1String(QContactOrganization::FieldName))); - //m_contactDisplayLabelDetails.append(contactPreffered2DisplayLabelDetails); + QList > contactSecondaryDisplayLabelDetails; + contactSecondaryDisplayLabelDetails.append(qMakePair(QLatin1String(QContactOrganization::DefinitionName), QLatin1String(QContactOrganization::FieldName))); + m_contactDisplayLabelDetails.append(contactSecondaryDisplayLabelDetails); //Group QList > preferredGroupDisplayLabelDetails; @@ -95,18 +95,19 @@ * \a error On return, contains the possible error. * \return synthesised display label */ -QString CntDisplayLabel::synthesizeDisplayLabel(const QContact& contact, QContactManager::Error& error) const +QString CntDisplayLabel::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const { QString displayLabel; + error = QContactManager::NoError; //contact if(contact.type() == QContactType::TypeContact) { - displayLabel = generateDisplayLabel(contact, contactDisplayLabelDetails()); + displayLabel = generateDisplayLabel(contact, m_contactDisplayLabelDetails); } //group else if (contact.type() == QContactType::TypeGroup) { - displayLabel = generateDisplayLabel(contact, groupDisplayLabelDetails()); + displayLabel = generateDisplayLabel(contact, m_groupDisplayLabelDetails); } //invalid type @@ -181,23 +182,6 @@ } /*! - * Returns the display name detail definition names used for a contact - */ -QList > > CntDisplayLabel::contactDisplayLabelDetails() const -{ - return m_contactDisplayLabelDetails; -} - -/*! - * Returns the display name detail definition names used by groups - */ -QList > > CntDisplayLabel::groupDisplayLabelDetails() const -{ - return m_groupDisplayLabelDetails; -} - - -/*! * Returns the details to be used for contact filtering */ QList > CntDisplayLabel::contactFilterDetails() const diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cntdisplaylabelsqlfilter.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntdisplaylabelsqlfilter.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,195 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "cntdisplaylabelsqlfilter.h" -#include "cntdisplaylabel.h" -#include -#include - -#include - -CntDisplayLabelSqlFilter::CntDisplayLabelSqlFilter() -{ -// TODO Auto-generated constructor stub - -} - -CntDisplayLabelSqlFilter::~CntDisplayLabelSqlFilter() -{ -// TODO Auto-generated destructor stub -} - -void CntDisplayLabelSqlFilter::createSqlQuery(const QContactDetailFilter& filter, - QString& sqlQuery, - QContactManager::Error& error) -{ - error = QContactManager::NoError; - - //get the contact fields that should be checked - CntDisplayLabel displayLabel; - QList > contactFields = displayLabel.contactFilterDetails(); - - //search values - QStringList searchStrings = filter.value().toStringList(); - - //default sql query - sqlQuery = "SELECT contact_id FROM contact WHERE (type_flags>>24)=0"; - - //everything ok - if(!searchStrings.isEmpty() && searchStrings.count() <= contactFields.count() ) - { - QString subQuery; - QStringList columns; - - //get the column names - for(int i = 0; i < contactFields.count(); i++) - { - columns << columnName(contactFields.at(i)); - } - - //single search value - if(searchStrings.count() == 1) - { - createQuerySingleSearchValue(subQuery, searchStrings.at(0), columns); - } - - //multiple search values - else - { - createQueryMultipleSearchValues(subQuery, searchStrings, columns); - } - - if(!subQuery.isEmpty()){ - sqlQuery += " AND (" + subQuery + ")"; - } - - error = QContactManager::NoError; - } - - //if specified more filter criterias than contact fields return error - else if(searchStrings.count() > contactFields.count()){ - error = QContactManager::BadArgumentError; - } -} - -/* Creates a sql query for a single search value - * - * \a sqlQuery where the query is written - * \a searchValue the value that should be used to select contacts - * \a columns the columns to be looked from - * - */ -void CntDisplayLabelSqlFilter::createQuerySingleSearchValue(QString& sqlQuery, const QString &searchValue, const QStringList &columns) const -{ - for (int i = 0; i < columns.count(); i++) - { - sqlQuery += createSubQuery(searchValue, columns.at(i)); - - if( i < (columns.count() - 1)) - { - sqlQuery += " OR "; - } - } -} - -/* Creates a sql query for a multiple search values, Note supports only 2 search and columns values currently - * - * \a sqlQuery where the query is written - * \a searchValues the value that should be used to select contacts - * \a columns the columns to be looked from - */ -void CntDisplayLabelSqlFilter::createQueryMultipleSearchValues(QString& sqlQuery, const QStringList &searchValues, const QStringList &columns) const -{ - if( searchValues.count() == 2 && columns.count() == 2 ) - { - sqlQuery += createSubQuery(searchValues.at(0), columns.at(1)) + " AND "; - sqlQuery += createSubQuery(searchValues.at(1), columns.at(0)) + " OR "; - sqlQuery += createSubQuery(searchValues.at(0), columns.at(0)) + " AND "; - sqlQuery += createSubQuery(searchValues.at(1), columns.at(1)); - } -} - -/* Creates a sql LIKE Statement for the search valuea and column - * - * \a searchValue to be added to the query - * \a column to be added to the query - * \return the sql LIKE query - */ -QString CntDisplayLabelSqlFilter::createSubQuery(const QString &searchValue, const QString &column) const -{ - return ("(" + column + " LIKE \'" + searchValue + "%\' OR " + column + " LIKE \'% " + searchValue + "%\')"); -} - -/* - * Get the sql column name based on the detail - * - * \a detail to search the column name for - * \a columnName contains the column name or empty string if none found - */ -QString CntDisplayLabelSqlFilter::columnName(const QPair &detail) const -{ - QString columnName = ""; - - //Name detail - if(detail.first == QContactName::DefinitionName) - { - if(detail.second == QContactName::FieldFirst) - { - columnName = "first_name"; - } - - else if(detail.second == QContactName::FieldLast) - { - columnName = "last_name"; - } - } - - //Organization - else if(detail.first == QContactOrganization::DefinitionName) - { - if(detail.second == QContactOrganization::FieldName) - { - columnName = "company_name"; - } - } - - return columnName; -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cntrelationship.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntrelationship.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/cntrelationship.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -88,7 +88,7 @@ QStringList supportedTypes; - foreach(QString type, m_relationshipMap.keys()) { + foreach(const QString& type, m_relationshipMap.keys()) { supportedTypes.append(type); } return supportedTypes; @@ -110,7 +110,7 @@ // if relationshipType is empty, relationships of any type are returned. if (relationshipType.isEmpty()) { - foreach (QString type, m_relationshipMap.keys()) + foreach (const QString& type, m_relationshipMap.keys()) { // get the relationship CntAbstractRelationship *abstractRelationship = m_relationshipMap.value(type); @@ -124,10 +124,15 @@ } // return empty list if there was an error - if (error != QContactManager::NoError) { + if (error != QContactManager::NoError && error != QContactManager::DoesNotExistError) { return QList(); } } + // if relationships found, update error + if (!returnValue.isEmpty() && error == QContactManager::DoesNotExistError) { + // this can be the case if nothing is found for last relationship type + error = QContactManager::NoError; + } } //check if we support the relationship else if (m_relationshipMap.contains(relationshipType)) @@ -146,6 +151,11 @@ else{ error = QContactManager::NotSupportedError; } + + // No relationships found? + if (error == QContactManager::NoError && returnValue.count() == 0 ) { + error = QContactManager::DoesNotExistError; + } return returnValue; } diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cntsqlsearch.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntsqlsearch.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,217 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include - -#include "cntsqlsearch.h" - -CntSqlSearch::CntSqlSearch() -{ - - -} - -QString CntSqlSearch ::CreatePredictiveSearch(const QString &pattern) -{ - if (pattern.length() == 1) - { - return "SELECT * FROM " + SelectTableView(pattern) + " WHERE " + - CreateSubStringSearch(pattern) + " ORDER BY first_name_as_number ASC;"; - } - else - { - return "SELECT contact_id FROM " + SelectTableView(pattern) + " WHERE " + - CreateSubStringSearch(pattern) + " ORDER BY first_name_as_number ASC;"; - } - -} - -QString CntSqlSearch::SelectTableView(const QString &pattern) -{ - QString view; - QString firstNumber = pattern.at(0); - int num = firstNumber.toInt(); - switch (num) - { - - case 0: - { - view = QString("view0"); - } - break; - case 1: - { - view = QString("view1"); - } - break; - case 2: - { - view = QString("view2"); - } - break; - case 3: - { - view = QString("view3"); - } - break; - case 4: - { - view = QString("view4"); - } - break; - case 5: - { - view = QString("view5"); - } - break; - case 6: - { - view = QString("view6"); - } - break; - case 7: - { - view = QString("view7"); - } - break; - case 8: - { - view = QString("view8"); - } - break; - case 9: - { - view = QString("view9"); - } - break; - } -return view; -} - -bool CntSqlSearch::IsSubStringSearch(const QString &pattern) -{ -const QChar zero('0'); -if (pattern.count( "0", Qt::CaseSensitive ) == pattern.count() ) - { - return false; - } -else if (pattern.contains(zero)) - { - return true; - } -else - { - return false; - } -} - -QStringList CntSqlSearch::GetNumber(const QString &pattern) -{ -const QChar zero('0'); -return pattern.split(zero, QString::SkipEmptyParts); -} -QString CntSqlSearch::CreateSubStringSearch(const QString &pattern) -{ -QString queryString; -QStringList numbers; -numbers = GetNumber(pattern); - -if (IsSubStringSearch(pattern) && numbers.count() > 1 ) - { - queryString = CreateStringSearch(pattern) + CreateSpaceStringSearch(numbers); - } -else - { - queryString = CreateStringSearch(pattern); - } - -return queryString; -} - -QString CntSqlSearch::CreateStringSearch(const QString &pattern) -{ -QString queryString; -queryString = "(first_name_as_number LIKE % " + pattern + - "%) OR (last_name_as_number LIKE % " + pattern + "%)"; -return queryString; -} - -QString CntSqlSearch::CreateSpaceStringSearch(QStringList numbers) -{ -QString queryString; -QString queryItem; - -for( int i = 0; i < numbers.count(); i++ ) - { - if ( numbers.count() == 1 ) - { - queryItem += CreateSpaceString(numbers.at(i)); - } - else if ( numbers.count() - 1 == i ) - { - queryItem += CreateSpaceString(numbers.at(i)); - } - else - { - queryItem += CreateSpaceString(numbers.at(i)) + " AND "; - } - } -if (numbers.count() == 1) - { - queryString = " OR " + queryItem; - } -else - { - queryString = " OR (" + queryItem + ")"; - } - -return queryString; -} - -QString CntSqlSearch::CreateSpaceString(QString number) -{ -QString queryString; -queryString = "((first_name_as_number LIKE % " + number + - "%) OR (last_name_as_number LIKE % " + number + "%))"; -return queryString; -} - - - diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -84,7 +84,11 @@ if(error == QContactManager::NoError) { m_managerUri = QContactManager::buildUri(CNT_SYMBIAN_MANAGER_NAME, parameters); m_transformContact = new CntTransformContact; +#ifdef SYMBIAN_BACKEND_USE_SQLITE + m_contactFilter = new CntSymbianFilter(*this, *m_dataBase->contactDatabase(), *m_transformContact); +#else m_contactFilter = new CntSymbianFilter(*m_dataBase->contactDatabase()); +#endif m_contactSorter = new CntSymbianSorterDbms(*m_dataBase->contactDatabase(), *m_transformContact); m_relationship = new CntRelationship(m_dataBase->contactDatabase(), m_managerUri); m_displayLabel = new CntDisplayLabel(); @@ -123,7 +127,7 @@ * Any error that occurs will be stored in \a error. Uses either the Symbian backend native filtering or in case of an * unsupported filter, the generic (slow) filtering of QContactManagerEngine. */ -QList CntSymbianEngine::contacts( +QList CntSymbianEngine::contactIds( const QContactFilter& filter, const QList& sortOrders, QContactManager::Error& error) const @@ -134,26 +138,32 @@ if (filter.type() == QContactFilter::RelationshipFilter) { - QContactRelationshipFilter rf = static_cast(filter); - - if (rf.relationshipType() == QContactRelationship::HasMember && rf.role() == QContactRelationshipFilter::Second) - { - //note participant id should be changed to contact id when the api has been fixed !! - QList relationshipsList = relationships(rf.relationshipType(), rf.otherParticipantId(), QContactRelationshipFilter::First, error ); - - if(error == QContactManager::NoError) - { - for(int i = 0; i < relationshipsList.count(); i++) - { - result += relationshipsList.at(i).second().localId(); - } - } + QContactRelationshipFilter rf = static_cast(filter); + QList relationshipsList = relationships( + rf.relationshipType(), rf.relatedContactId(), rf.relatedContactRole(), error); + if(error == QContactManager::NoError) { + foreach(QContactRelationship r, relationshipsList) { + if(rf.relatedContactRole() == QContactRelationshipFilter::First) { + result += r.second().localId(); + } else if (rf.relatedContactRole() == QContactRelationshipFilter::Second) { + result += r.first().localId(); + } else if (rf.relatedContactRole() == QContactRelationshipFilter::Either) { + result += r.first().localId(); + result += r.second().localId(); + } + } } } else { bool filterSupported(true); result = m_contactFilter->contacts(filter, sortOrders, filterSupported, error); + + //slow sorting until it's supported in SQL requests + //sort if sorting criteria is specified + if (!sortOrders.isEmpty()) { + result = slowSort(result, sortOrders, error); + } #ifdef SYMBIAN_BACKEND_USE_SQLITE @@ -179,7 +189,7 @@ return result; } -QList CntSymbianEngine::contacts(const QList& sortOrders, QContactManager::Error& error) const +QList CntSymbianEngine::contactIds(const QList& sortOrders, QContactManager::Error& error) const { // Check if sorting is supported by backend if(m_contactSorter->sortOrderSupported(sortOrders)) @@ -198,6 +208,40 @@ return slowSort(unsortedIds, sortOrders, error); } +QList CntSymbianEngine::contacts(const QList& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const +{ + error = QContactManager::NoError; + QList contacts; + QList contactIds = this->contactIds(sortOrders, error); + if (error == QContactManager::NoError ) { + foreach (QContactLocalId id, contactIds) { + QContact contact = this->contact(id, definitionRestrictions, error); + if (error != QContactManager::NoError) { + return QList(); // return empty list if error occurred + } + contacts.append(contact); + } + } + return contacts; +} + +QList CntSymbianEngine::contacts(const QContactFilter& filter, const QList& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const +{ + error = QContactManager::NoError; + QList contacts; + QList contactIds = this->contactIds(filter, sortOrders, error); + if (error == QContactManager::NoError ) { + foreach (QContactLocalId id, contactIds) { + QContact contact = this->contact(id, definitionRestrictions, error); + if (error != QContactManager::NoError) { + return QList(); // return empty list if error occurred + } + contacts.append(contact); + } + } + return contacts; +} + /*! * Read a contact from the contact database. * @@ -206,15 +250,25 @@ * \return A QContact for the requested QContactLocalId value or 0 if the read * operation was unsuccessful (e.g. contact not found). */ -QContact CntSymbianEngine::contact(const QContactLocalId& contactId, QContactManager::Error& error) const +QContact CntSymbianEngine::contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions, QContactManager::Error& error) const { QContact* contact = new QContact(); - TRAPD(err, *contact = fetchContactL(contactId)); + TRAPD(err, *contact = fetchContactL(contactId, definitionRestrictions)); CntSymbianTransformError::transformError(err, error); - if(error == QContactManager::NoError) { + + if(error == QContactManager::NoError) { updateDisplayLabel(*contact); - QList relationships = this->relationships(QString(), contact->id(), QContactRelationshipFilter::Either, error); - QContactManagerEngine::setContactRelationships(contact, relationships); + //check relationship only if there are no definition restrictions, otherwise + //skip this time expensive operation. + if( definitionRestrictions.isEmpty()) { + QContactManager::Error relationshipError; + QList relationships = this->relationships(QString(), contact->id(), QContactRelationshipFilter::Either, relationshipError); + if (relationshipError != QContactManager::NoError && + relationshipError != QContactManager::DoesNotExistError) { // means that no relationships found + error = relationshipError; + } + QContactManagerEngine::setContactRelationships(contact, relationships); + } } return *QScopedPointer(contact); } @@ -227,37 +281,36 @@ return ret; } -/*! - * Add a list of contacts to the database. - * - * \param contacts List of QContact to be saved. - * \param error Qt error code. - * \return List of all error codes corresponding to each QContact in the - * list of contacts to be saved. - */ -QList CntSymbianEngine::saveContacts(QList* contacts, QContactManager::Error& error) +/*! \reimp */ +bool CntSymbianEngine::saveContacts(QList *contacts, QMap *errorMap, QContactManager::Error& error) { - QContactChangeSet changeSet; - QList ret; + error = QContactManager::NoError; + + if (errorMap) { + // if the errormap argument is null, we just don't do fine-grained reporting. + errorMap->clear(); + } + if (!contacts) { error = QContactManager::BadArgumentError; - return ret; - } else { + return false; + } + + QContactChangeSet changeSet; + for (int i = 0; i < contacts->count(); i++) { + QContact current = contacts->at(i); QContactManager::Error functionError = QContactManager::NoError; - for (int i = 0; i < contacts->count(); i++) { - QContact current = contacts->at(i); - if (!doSaveContact(¤t, changeSet, error)) { - functionError = error; - ret.append(functionError); - } else { - (*contacts)[i] = current; - ret.append(QContactManager::NoError); + if (!doSaveContact(¤t, changeSet, functionError)) { + error = functionError; + if (errorMap) { + errorMap->insert(i, functionError); } + } else { + (*contacts)[i] = current; } - error = functionError; } changeSet.emitSignals(this); - return ret; + return (error == QContactManager::NoError); } /*! @@ -276,7 +329,7 @@ QContactLocalId id = contacts.at(i); // Check if this is a false positive. If not, add to the result set. - if(QContactManagerEngine::testFilter(filter, contact(id, error))) + if(QContactManagerEngine::testFilter(filter, contact(id, QStringList(), error))) result << id; } return result; @@ -290,7 +343,7 @@ // Get unsorted contacts QList unsortedContacts; foreach (QContactLocalId id, contactIds) { - QContact c = contact(id, error); + QContact c = contact(id, QStringList(), error); if (error != QContactManager::NoError) return QList(); unsortedContacts << c; @@ -313,7 +366,7 @@ guidFilter.setValue(guidDetail.guid()); QContactManager::Error err; - QList localIdList = contacts(guidFilter, + QList localIdList = contactIds(guidFilter, QList(), err); if (err == QContactManager::NoError && localIdList.count() > 0) { QScopedPointer contactId(new QContactId()); @@ -349,7 +402,7 @@ /*! * Private leaving implementation for contact() */ -QContact CntSymbianEngine::fetchContactL(const QContactLocalId &localId) const +QContact CntSymbianEngine::fetchContactL(const QContactLocalId &localId, const QStringList& definitionRestrictions) const { // A contact with a zero id is not expected to exist. // Symbian contact database uses id 0 internally as the id of the @@ -362,7 +415,7 @@ CleanupStack::PushL(contactItem); // Convert to a QContact - QContact contact = m_transformContact->transformContactL(*contactItem); + QContact contact = m_transformContact->transformContactL(*contactItem, definitionRestrictions); // Transform details that are not available until the contact has been saved m_transformContact->transformPostSaveDetailsL(*contactItem, contact, *m_dataBase->contactDatabase(), m_managerUri); @@ -499,14 +552,8 @@ // note commitContactL removes empty fields from the contact m_dataBase->contactDatabase()->CommitContactL(*contactItem); - // retrieve the contact in case of empty fields that have been removed, this could also be handled in transformcontact. - contact = fetchContactL(contact.localId()); - updateDisplayLabel(contact); - // Update group memberships to contact database - //updateMemberOfGroupsL(contact); - CleanupStack::PopAndDestroy(contactItem); CleanupStack::PopAndDestroy(1); // commit lock } @@ -586,42 +633,48 @@ void CntSymbianEngine::updateDisplayLabel(QContact& contact) const { QContactManager::Error error(QContactManager::NoError); - QString label = synthesizeDisplayLabel(contact, error); + QString label = synthesizedDisplayLabel(contact, error); if(error == QContactManager::NoError) { contact = setContactDisplayLabel(label, contact); } } -QList CntSymbianEngine::removeContacts(QList* contactIds, QContactManager::Error& error) +bool CntSymbianEngine::removeContacts(QList *contactIds, QMap *errorMap, QContactManager::Error& error) { - QContactChangeSet changeSet; - QList ret; + error = QContactManager::NoError; + + if (errorMap) { + // if the errormap argument is null, we just don't do fine-grained reporting. + errorMap->clear(); + } + if (!contactIds) { error = QContactManager::BadArgumentError; - return ret; - } else { - QContactManager::Error err; - QContactLocalId selfCntId = selfContactId(err); // err ignored - QList removedList; + return false; + } + + QContactManager::Error err; + QContactLocalId selfCntId = selfContactId(err); // err ignored + + QContactChangeSet changeSet; + for (int i = 0; i < contactIds->count(); i++) { + QContactLocalId current = contactIds->at(i); QContactManager::Error functionError = QContactManager::NoError; - for (int i = 0; i < contactIds->count(); i++) { - QContactLocalId current = contactIds->at(i); - if (!removeContact(current, changeSet, error)) { - functionError = error; - ret.append(functionError); - } else { - (*contactIds)[i] = 0; - ret.append(QContactManager::NoError); - if (current == selfCntId ) { - QOwnCardPair ownCard(selfCntId, QContactLocalId(0)); - changeSet.oldAndNewSelfContactId() = ownCard; - } + if (!removeContact(current, changeSet, functionError)) { + error = functionError; + if (errorMap) { + errorMap->insert(i, functionError); + } + } else { + (*contactIds)[i] = 0; + if (current == selfCntId ) { + QOwnCardPair ownCard(selfCntId, QContactLocalId(0)); + changeSet.oldAndNewSelfContactId() = ownCard; } } - error = functionError; } changeSet.emitSignals(this); - return ret; + return (error == QContactManager::NoError); } /* relationships */ @@ -734,11 +787,20 @@ return false; switch (feature) { - /* TODO: - How about the others? like: - QContactManager::ActionPreferences, - QContactManager::MutableDefinitions, - QContactManager::Anonymous? */ + /* + TODO: + How about the others? like: + Groups, + ActionPreferences, + MutableDefinitions, + Relationships, + ArbitraryRelationshipTypes, + RelationshipOrdering, + DetailOrdering, + SelfContact, + Anonymous, + ChangeLogs + */ case QContactManager::Groups: case QContactManager::Relationships: case QContactManager::SelfContact: { @@ -753,15 +815,16 @@ return returnValue; } -bool CntSymbianEngine::filterSupported(const QContactFilter& filter) const +bool CntSymbianEngine::isFilterSupported(const QContactFilter& filter) const { return m_contactFilter->filterSupported(filter); } /* Synthesise the display label of a contact */ -QString CntSymbianEngine::synthesizeDisplayLabel(const QContact& contact, QContactManager::Error& error) const +QString CntSymbianEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const { - return m_displayLabel->synthesizeDisplayLabel(contact, error); + error = QContactManager::NoError; + return m_displayLabel->synthesizedDisplayLabel(contact, error); } bool CntSymbianEngine::setSelfContactId(const QContactLocalId& contactId, QContactManager::Error& error) @@ -818,6 +881,8 @@ * This will be replaced by the thread request worker when it is stable. */ + + /*! \reimp */ void CntSymbianEngine::requestDestroyed(QContactAbstractRequest* req) { @@ -827,9 +892,9 @@ /*! \reimp */ bool CntSymbianEngine::startRequest(QContactAbstractRequest* req) { - m_asynchronousOperations.enqueue(req); - QList dummy; - updateRequestStatus(req, QContactManager::NoError, dummy, QContactAbstractRequest::Active); + if (!m_asynchronousOperations.contains(req)) + m_asynchronousOperations.enqueue(req); + updateRequestState(req, QContactAbstractRequest::ActiveState); QTimer::singleShot(0, this, SLOT(performAsynchronousOperation())); return true; } @@ -837,8 +902,7 @@ /*! \reimp */ bool CntSymbianEngine::cancelRequest(QContactAbstractRequest* req) { - QList dummy; - updateRequestStatus(req, QContactManager::NoError, dummy, QContactAbstractRequest::Cancelling); + updateRequestState(req, QContactAbstractRequest::CanceledState); return true; } @@ -880,10 +944,8 @@ return; currentRequest = m_asynchronousOperations.dequeue(); - // check to see if it is cancelling; if so, cancel it and perform update. - if (currentRequest->status() == QContactAbstractRequest::Cancelling) { - QList dummy; - updateRequestStatus(currentRequest, QContactManager::NoError, dummy, QContactAbstractRequest::Cancelled); + // check to see if it is cancelling; if so, remove it from the queue and return. + if (currentRequest->state() == QContactAbstractRequest::CanceledState) { return; } @@ -891,7 +953,7 @@ QContactChangeSet changeSet; // Now perform the active request and emit required signals. - Q_ASSERT(currentRequest->status() == QContactAbstractRequest::Active); + Q_ASSERT(currentRequest->state() == QContactAbstractRequest::ActiveState); switch (currentRequest->type()) { case QContactAbstractRequest::ContactFetchRequest: { @@ -901,37 +963,12 @@ QStringList defs = r->definitionRestrictions(); QContactManager::Error operationError; - QList operationErrors; - QList requestedContacts; - QList requestedContactIds = contacts(filter, sorting, operationError); - - QContactManager::Error tempError; - for (int i = 0; i < requestedContactIds.size(); i++) { - QContact current = contact(requestedContactIds.at(i), tempError); - operationErrors.append(tempError); - - // check for single error; update total operation error if required - if (tempError != QContactManager::NoError) - operationError = tempError; - - // apply the required detail definition restrictions - if (!defs.isEmpty()) { - QList allDetails = current.details(); - for (int j = 0; j < allDetails.size(); j++) { - QContactDetail d = allDetails.at(j); - if (!defs.contains(d.definitionName())) { - // this detail is not required. - current.removeDetail(&d); - } - } - } - - // add the contact to the result list. - requestedContacts.append(current); - } + QList requestedContacts = QContactManagerEngine::contacts(filter, sorting, defs, operationError); // update the request with the results. - updateRequest(currentRequest, requestedContacts, operationError, operationErrors, QContactAbstractRequest::Finished); + if (!requestedContacts.isEmpty() || operationError != QContactManager::NoError) + updateContactFetchRequest(r, requestedContacts, operationError); // emit resultsAvailable() + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -942,9 +979,11 @@ QList sorting = r->sorting(); QContactManager::Error operationError = QContactManager::NoError; - QList requestedContactIds = contacts(filter, sorting, operationError); + QList requestedContactIds = QContactManagerEngine::contactIds(filter, sorting, operationError); - updateRequest(currentRequest, requestedContactIds, operationError, QList(), QContactAbstractRequest::Finished); + if (!requestedContactIds.isEmpty() || operationError != QContactManager::NoError) + updateContactLocalIdFetchRequest(r, requestedContactIds, operationError); // emit resultsAvailable() + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -954,16 +993,11 @@ QList contacts = r->contacts(); QContactManager::Error operationError = QContactManager::NoError; - QList operationErrors = saveContacts(&contacts, operationError); + QMap errorMap; + saveContacts(&contacts, &errorMap, operationError); - for (int i = 0; i < operationErrors.size(); i++) { - if (operationErrors.at(i) != QContactManager::NoError) { - operationError = operationErrors.at(i); - break; - } - } - - updateRequest(currentRequest, contacts, operationError, operationErrors, QContactAbstractRequest::Finished); + updateContactSaveRequest(r, contacts, operationError, errorMap); // there will always be results of some form. emit resultsAvailable(). + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -975,22 +1009,23 @@ // if a failure occurred, the request error will be set to the most recent // error that occurred during the remove operation. QContactRemoveRequest* r = static_cast(currentRequest); - QContactFilter filter = r->filter(); - QContactManager::Error operationError = QContactManager::NoError; - QList contactsToRemove = contacts(filter, QList(), operationError); + QList contactsToRemove = r->contactIds(); + QMap errorMap; for (int i = 0; i < contactsToRemove.size(); i++) { QContactManager::Error tempError; removeContact(contactsToRemove.at(i), changeSet, tempError); - if (tempError != QContactManager::NoError) + if (tempError != QContactManager::NoError) { + errorMap.insert(i, tempError); operationError = tempError; + } } - // there are no results, so just update the status with the error. - QList dummy; - updateRequestStatus(currentRequest, operationError, dummy, QContactAbstractRequest::Finished); + if (!errorMap.isEmpty() || operationError != QContactManager::NoError) + updateContactRemoveRequest(r, operationError, errorMap); // emit resultsAvailable() + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -998,75 +1033,81 @@ { QContactDetailDefinitionFetchRequest* r = static_cast(currentRequest); QContactManager::Error operationError = QContactManager::NoError; - QList operationErrors; + QMap errorMap; QMap requestedDefinitions; - QStringList names = r->names(); + QStringList names = r->definitionNames(); if (names.isEmpty()) names = detailDefinitions(r->contactType(), operationError).keys(); // all definitions. QContactManager::Error tempError; for (int i = 0; i < names.size(); i++) { QContactDetailDefinition current = detailDefinition(names.at(i), r->contactType(), tempError); - operationErrors.append(tempError); requestedDefinitions.insert(names.at(i), current); - if (tempError != QContactManager::NoError) + if (tempError != QContactManager::NoError) { + errorMap.insert(i, tempError); operationError = tempError; + } } - // update the request with the results. - updateRequest(currentRequest, requestedDefinitions, operationError, operationErrors, QContactAbstractRequest::Finished); + if (!errorMap.isEmpty() || !requestedDefinitions.isEmpty() || operationError != QContactManager::NoError) + updateDefinitionFetchRequest(r, requestedDefinitions, operationError, errorMap); // emit resultsAvailable() + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; - // Not implemented yet: -#if 0 - case QContactAbstractRequest::DetailDefinitionSaveRequest: - { - QContactDetailDefinitionSaveRequest* r = static_cast(currentRequest); - QContactManager::Error operationError = QContactManager::NoError; - QList operationErrors; - QList definitions = r->definitions(); - QList savedDefinitions; - - QContactManager::Error tempError; - for (int i = 0; i < definitions.size(); i++) { - QContactDetailDefinition current = definitions.at(i); - saveDetailDefinition(current, r->contactType(), changeSet, tempError); - savedDefinitions.append(current); - operationErrors.append(tempError); - - if (tempError != QContactManager::NoError) - operationError = tempError; - } - - // update the request with the results. - updateRequest(currentRequest, savedDefinitions, operationError, operationErrors, QContactAbstractRequest::Finished); - } - break; - - case QContactAbstractRequest::DetailDefinitionRemoveRequest: - { - QContactDetailDefinitionRemoveRequest* r = static_cast(currentRequest); - QStringList names = r->names(); - - QContactManager::Error operationError = QContactManager::NoError; - QList operationErrors; - - for (int i = 0; i < names.size(); i++) { - QContactManager::Error tempError; - removeDetailDefinition(names.at(i), r->contactType(), changeSet, tempError); - operationErrors.append(tempError); - - if (tempError != QContactManager::NoError) - operationError = tempError; - } - - // there are no results, so just update the status with the error. - updateRequestStatus(currentRequest, operationError, operationErrors, QContactAbstractRequest::Finished); - } - break; -#endif // not supported detail definition operations +// symbian engine currently does not support mutable definitions. +// +// case QContactAbstractRequest::DetailDefinitionSaveRequest: +// { +// QContactDetailDefinitionSaveRequest* r = static_cast(currentRequest); +// QContactManager::Error operationError = QContactManager::NoError; +// QMap errorMap; +// QList definitions = r->definitions(); +// QList savedDefinitions; +// +// QContactManager::Error tempError; +// for (int i = 0; i < definitions.size(); i++) { +// QContactDetailDefinition current = definitions.at(i); +// saveDetailDefinition(current, r->contactType(), changeSet, tempError); +// savedDefinitions.append(current); +// +// if (tempError != QContactManager::NoError) { +// errorMap.insert(i, tempError); +// operationError = tempError; +// } +// } +// +// // update the request with the results. +// updateDefinitionSaveRequest(r, savedDefinitions, operationError, errorMap); // there will always be results of some form. emit resultsAvailable(). +// updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); +// } +// break; +// +// case QContactAbstractRequest::DetailDefinitionRemoveRequest: +// { +// QContactDetailDefinitionRemoveRequest* r = static_cast(currentRequest); +// QStringList names = r->definitionNames(); +// +// QContactManager::Error operationError = QContactManager::NoError; +// QMap errorMap; +// +// for (int i = 0; i < names.size(); i++) { +// QContactManager::Error tempError; +// removeDetailDefinition(names.at(i), r->contactType(), changeSet, tempError); +// +// if (tempError != QContactManager::NoError) { +// errorMap.insert(i, tempError); +// operationError = tempError; +// } +// } +// +// // there are no results, so just update the status with the error. +// if (!errorMap.isEmpty() || operationError != QContactManager::NoError) +// updateDefinitionRemoveRequest(r, operationError, errorMap); // emit resultsAvailable() +// updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); +// } +// break; case QContactAbstractRequest::RelationshipFetchRequest: { @@ -1076,53 +1117,22 @@ QList allRelationships = relationships(QString(), QContactId(), QContactRelationshipFilter::Either, operationError); QList requestedRelationships; - // first criteria: source contact id must be empty or must match - if (r->first() == QContactId()) { - // all relationships match this criteria (zero id denotes "any") - requestedRelationships = allRelationships; - } else { - for (int i = 0; i < allRelationships.size(); i++) { - QContactRelationship currRelationship = allRelationships.at(i); - if (r->first() == currRelationship.first()) { - requestedRelationships.append(currRelationship); - } - } - } - - // second criteria: relationship type must be empty or must match - if (!r->relationshipType().isEmpty()) { - allRelationships = requestedRelationships; - requestedRelationships.clear(); - for (int i = 0; i < allRelationships.size(); i++) { - QContactRelationship currRelationship = allRelationships.at(i); - if (r->relationshipType() == currRelationship.relationshipType()) { - requestedRelationships.append(currRelationship); - } - } - } - - // third criteria: participant must be empty or must match (including role in relationship) - QString myUri = managerUri(); - QContactId anonymousParticipant; - anonymousParticipant.setLocalId(QContactLocalId(0)); - anonymousParticipant.setManagerUri(QString()); - if (r->participant() != anonymousParticipant) { - allRelationships = requestedRelationships; - requestedRelationships.clear(); - for (int i = 0; i < allRelationships.size(); i++) { - QContactRelationship currRelationship = allRelationships.at(i); - if ((r->participantRole() == QContactRelationshipFilter::Either || r->participantRole() == QContactRelationshipFilter::Second) - && currRelationship.second() == r->participant()) { - requestedRelationships.append(currRelationship); - } else if ((r->participantRole() == QContactRelationshipFilter::Either || r->participantRole() == QContactRelationshipFilter::First) - && currRelationship.first() == r->participant()) { - requestedRelationships.append(currRelationship); - } - } + // select the requested relationships. + for (int i = 0; i < allRelationships.size(); i++) { + QContactRelationship currRel = allRelationships.at(i); + if (r->first() != QContactId() && r->first() != currRel.first()) + continue; + if (r->second() != QContactId() && r->second() != currRel.second()) + continue; + if (!r->relationshipType().isEmpty() && r->relationshipType() != currRel.relationshipType()) + continue; + requestedRelationships.append(currRel); } // update the request with the results. - updateRequest(currentRequest, requestedRelationships, operationError, operationErrors, QContactAbstractRequest::Finished); + if (!requestedRelationships.isEmpty() || operationError != QContactManager::NoError) + updateRelationshipFetchRequest(r, requestedRelationships, operationError); // emit resultsAvailable() + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -1130,30 +1140,26 @@ { QContactRelationshipRemoveRequest* r = static_cast(currentRequest); QContactManager::Error operationError = QContactManager::NoError; - QList operationErrors; - QList matchingRelationships = relationships(r->relationshipType(), r->first(), QContactRelationshipFilter::First, operationError); + QList relationshipsToRemove = r->relationships(); + QMap errorMap; bool foundMatch = false; - for (int i = 0; i < matchingRelationships.size(); i++) { + for (int i = 0; i < relationshipsToRemove.size(); i++) { QContactManager::Error tempError; - QContactRelationship possibleMatch = matchingRelationships.at(i); + removeRelationship(relationshipsToRemove.at(i), tempError); - // if the second criteria matches, or is default constructed id, then we have a match and should remove it. - if (r->second() == QContactId() || possibleMatch.second() == r->second()) { - foundMatch = true; - removeRelationship(matchingRelationships.at(i), tempError); - operationErrors.append(tempError); - - if (tempError != QContactManager::NoError) - operationError = tempError; + if (tempError != QContactManager::NoError) { + errorMap.insert(i, tempError); + operationError = tempError; } } - + if (foundMatch == false && operationError == QContactManager::NoError) operationError = QContactManager::DoesNotExistError; - // there are no results, so just update the status with the error. - updateRequestStatus(currentRequest, operationError, operationErrors, QContactAbstractRequest::Finished); + if (!errorMap.isEmpty() || operationError != QContactManager::NoError) + updateRelationshipRemoveRequest(r, operationError, errorMap); // emit resultsAvailable() + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -1161,7 +1167,7 @@ { QContactRelationshipSaveRequest* r = static_cast(currentRequest); QContactManager::Error operationError = QContactManager::NoError; - QList operationErrors; + QMap errorMap; QList requestRelationships = r->relationships(); QList savedRelationships; @@ -1170,14 +1176,16 @@ QContactRelationship current = requestRelationships.at(i); saveRelationship(¤t, tempError); savedRelationships.append(current); - operationErrors.append(tempError); - if (tempError != QContactManager::NoError) + if (tempError != QContactManager::NoError) { + errorMap.insert(i, tempError); operationError = tempError; + } } // update the request with the results. - updateRequest(currentRequest, savedRelationships, operationError, operationErrors, QContactAbstractRequest::Finished); + updateRelationshipSaveRequest(r, savedRelationships, operationError, errorMap); // there will always be results of some form. emit resultsAvailable(). + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -1189,8 +1197,6 @@ changeSet.emitSignals(this); } - - #ifndef PBK_UNIT_TEST /* Factory lives here in the basement */ QContactManagerEngine* CntSymbianFactory::engine(const QMap& parameters, QContactManager::Error& error) @@ -1204,4 +1210,5 @@ } Q_EXPORT_PLUGIN2(mobapicontactspluginsymbian, CntSymbianFactory); + #endif //PBK_UNIT_TEST diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cntsymbianfilterdbms.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntsymbianfilterdbms.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,505 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef SYMBIAN_BACKEND_USE_SQLITE - -#include -#include - -#include "cntsymbianfilterdbms.h" -#include "cnttransformcontact.h" -#include "cntsymbiantransformerror.h" - -#include -#include -#include - -#include "qcontactname.h" -#include "qcontactdetailfilter.h" -#include "qcontactphonenumber.h" -#include "cntsymbiansorterdbms.h" - -// Telephony Configuration API -// Keys under this category are used in defining telephony configuration. -const TUid KCRUidTelConfiguration = {0x102828B8}; -// Amount of digits to be used in contact matching. -// This allows a customer to variate the amount of digits to be matched. -const TUint32 KTelMatchDigits = 0x00000001; -// Default match length -const TInt KDefaultMatchLength(7); - -CntSymbianFilter::CntSymbianFilter(CContactDatabase& contactDatabase): - m_contactDatabase(contactDatabase), - m_contactSorter(0), - m_transformContact(0) -{ - // TODO: take CntTransformContact ref as a parameter? - m_transformContact = new CntTransformContact; - m_contactSorter = new CntSymbianSorterDbms(m_contactDatabase, *m_transformContact); -} - -CntSymbianFilter::~CntSymbianFilter() -{ - delete m_contactSorter; - delete m_transformContact; -} - -/*! - * The contact database version implementation for QContactManager::contacts - * function. See filterSupported for the list of supported filters. - * All the other filtering flags fallback to the generic filtering done - * in QContactManagerEngine (expected to be done by to the caller). Contacts - * are sorted only if the sort order is supported by contacts database. See - * CntSymbianSorterDbms::filterSupportLevel for the list of supported sort - * orders. - * - * \a filter The QContactFilter to be used. - * \a sortOrders The sort orders to be used. If the sort orders are not - * supported by contacts database this parameter is ignored and sorting needs - * to be done by the caller. - * \a error On return, contains the possible error in filtering/sorting. - */ -QList CntSymbianFilter::contacts( - const QContactFilter &filter, - const QList &sortOrders, - bool &filterSupportedFlag, - QContactManager::Error &error) -{ - QList result; - filterSupportedFlag = true; - - // No need to proceed if some of the filters in the chain is not supported - if(!filterSupportedFlag) return result; - - // Intersection filter is handled by a recursive function call for each - // contained filter (unless at least one requires slow filtering) - if (filter.type() == QContactFilter::IntersectionFilter) { - QList filters = ((QContactIntersectionFilter) filter).filters(); - for(int i(0); filterSupportedFlag && i < filters.count(); i++) { - if(result.isEmpty()) - result = contacts(filters[i], sortOrders, filterSupportedFlag, error); - else - result = contacts(filters[i], sortOrders, filterSupportedFlag, error).toSet().intersect(result.toSet()).toList(); - } - // Union filter is handled by a recursive function call for each - // contained filter (unless at least one requires slow filtering) - } else if (filter.type() == QContactFilter::UnionFilter) { - QList filters = ((QContactUnionFilter) filter).filters(); - for(int i(0); filterSupportedFlag && i < filters.count(); i++) { - if(result.isEmpty()) - result = contacts(filters[i], sortOrders, filterSupportedFlag, error); - else - result = (contacts(filters[i], sortOrders, filterSupportedFlag, error).toSet() + result.toSet()).toList(); - } - // Detail filter with a string list is split and re-constructed into - // an intersection filter - } else if (filter.type() == QContactFilter::ContactDetailFilter - && (static_cast(filter)).value().type() == QVariant::StringList) { - QStringList values = (static_cast(filter)).value().toStringList(); - QContactIntersectionFilter intersectionFilter; - foreach(QString value, values) { - QContactDetailFilter detailFilter = filter; - detailFilter.setValue(value); - intersectionFilter.append(detailFilter); - } - // The resulting filter is handled with a recursive function call - result = contacts(intersectionFilter, sortOrders, filterSupportedFlag, error); - } else { - if (filterSupportLevel(filter) == Supported) { - filterSupportedFlag = true; - // Filter supported, use as the result directly - result = filterContacts(filter, error); - } else if (filterSupportLevel(filter) == SupportedPreFilterOnly) { - // Filter only does pre-filtering, the caller is responsible of - // removing possible false positives after filtering - filterSupportedFlag = false; - result = filterContacts(filter, error); - } else { - // Don't do filtering here, return all contact ids and tell the - // caller to do slow filtering - filterSupportedFlag = false; - result = filterContacts(QContactInvalidFilter(), error); - } - } - - return result; -} - -/*! - * The contact database version implementation for - * QContactManager::filterSupport function. -*/ -bool CntSymbianFilter::filterSupported(const QContactFilter& filter) -{ - TBool result; - - // Map filter support into a boolean value - FilterSupport support = filterSupportLevel(filter); - if (support == Supported || support == SupportedPreFilterOnly) { - result = true; - } else { - result = false; - } - return result; -} - -/*! - * The possible return values are Supported, NotSupported and - * SupportedPreFilterOnly. - * - * Supported means that the filtering is implemented directly by the underlying - * database. NotSupported means that CntSymbianFilter::contacts will - * return an error. And SupportedPreFilterOnly means that the filter is not - * fully supported, but the CntSymbianFilter::contacts will act like the - * filter was supported for performance reasons, returning a result that may - * contain false positives. This means that the client must filter the - * pre-filtered set of contacts to see if there are false positives included. - * Note that the pre-filtering does not give any performance benefits if the - * result contains all contacts or almost all contacts. - * - * \a filter The QContactFilter to be checked. - * \a return Supported in case the filter is supported. NotSupported in case - * the filter is not supported. returns - * - * SupportedPreFilterOnly is returned in the following cases: - * 1. matchFlags is set to QContactFilter::MatchExactly (CntSymbianFilter::contacts - * will use QContactFilter::MatchContains) - * 2. matchFlags is set to QContactFilter::MatchStartsWith (CntSymbianFilter::contacts - * will use QContactFilter::MatchContains) - * 3. matchFlags is set to QContactFilter::MatchEndsWith (CntSymbianFilter::contacts - * will use QContactFilter::MatchContains) - * 4. matchFlags is set to QContactFilter::MatchCaseSensitive (CntSymbianFilter::contacts - * will use QContactFilter::MatchContains) - */ -CntAbstractContactFilter::FilterSupport CntSymbianFilter::filterSupportLevel(const QContactFilter& filter) -{ - FilterSupport filterSupported(NotSupported); - - if (filter.type() == QContactFilter::ContactDetailFilter) { - const QContactDetailFilter &detailFilter = static_cast(filter); - const QContactFilter::MatchFlags matchFlags = detailFilter.matchFlags(); - const QString defName = detailFilter.detailDefinitionName(); - const int KMatchFlagsUnset(0); - QContactFilter::MatchFlags supportedFlags(KMatchFlagsUnset); - QContactFilter::MatchFlags preFilterFlags(KMatchFlagsUnset); - bool validDetailFilter(false); - - // Phone numbers - if (defName == QContactPhoneNumber::DefinitionName) { - validDetailFilter = true; - supportedFlags = QContactFilter::MatchFlags(QContactFilter::MatchPhoneNumber); - preFilterFlags = QContactFilter::MatchFlags(QContactFilter::MatchEndsWith) - | QContactFilter::MatchFlags(QContactFilter::MatchExactly); - // Names - } else if (defName == QContactName::DefinitionName - || defName == QContactNickname::DefinitionName - || defName == QContactEmailAddress::DefinitionName) { - validDetailFilter = true; - supportedFlags = QContactFilter::MatchFlags(QContactFilter::MatchContains); - preFilterFlags = QContactFilter::MatchFlags(QContactFilter::MatchExactly) - | QContactFilter::MatchFlags(QContactFilter::MatchStartsWith) - | QContactFilter::MatchFlags(QContactFilter::MatchEndsWith) - | QContactFilter::MatchFlags(QContactFilter::MatchCaseSensitive); - // display label, this is a special case that contains several name - // fields and company name - //TODO: "unnamed" display label is not supported currently - } else if (defName == QContactDisplayLabel::DefinitionName) { - validDetailFilter = true; - supportedFlags = QContactFilter::MatchFlags(QContactFilter::MatchStartsWith) - | QContactFilter::MatchFlags(QContactFilter::MatchContains); - preFilterFlags = QContactFilter::MatchFlags(QContactFilter::MatchExactly) - | QContactFilter::MatchFlags(QContactFilter::MatchEndsWith) - | QContactFilter::MatchFlags(QContactFilter::MatchCaseSensitive); - } - - if(validDetailFilter) { - if (matchFlags != QContactFilter::MatchFlags(QContactFilter::MatchExactly) - && (matchFlags | supportedFlags) == supportedFlags ) { - filterSupported = Supported; - } else if ((matchFlags | preFilterFlags) == preFilterFlags ) { - filterSupported = SupportedPreFilterOnly; - } - } - } - return filterSupported; -} - -QList CntSymbianFilter::filterContacts( - const QContactFilter& filter, - QContactManager::Error& error) -{ - QList matches; - CContactIdArray* idArray(0); - - if (filter.type() == QContactFilter::InvalidFilter ){ - TTime epoch(0); - idArray = m_contactDatabase.ContactsChangedSinceL(epoch); // return all contacts - } else if(filterSupportLevel(filter) == NotSupported) { - error = QContactManager::NotSupportedError; - } else if (filter.type() == QContactFilter::ContactDetailFilter) { - const QContactDetailFilter &detailFilter = static_cast(filter); - - // Phone numbers - if (detailFilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName) { - QString number((detailFilter.value()).toString()); - TPtrC commPtr(reinterpret_cast(number.utf16())); - - TInt matchLength(KDefaultMatchLength); - // no need to propagate error, we can use the default match length - TRAP_IGNORE(getMatchLengthL(matchLength)); - - TInt err = matchContacts(idArray, commPtr, matchLength); - if(err != KErrNone) { - CntSymbianTransformError::transformError(err, error); - } - // Names, e-mail, display label (other flags) - } else { - QString name((detailFilter.value()).toString()); - TPtrC namePtr(reinterpret_cast(name.utf16())); - CContactItemFieldDef *fieldDef(0); - TRAPD(err, transformDetailFilterL(detailFilter, fieldDef)); - if(err != KErrNone){ - CntSymbianTransformError::transformError(err, error); - } else { - Q_ASSERT_X(fieldDef->Count() > 0, "CntSymbianFilter", "Illegal field def"); - TInt err = findContacts(idArray, *fieldDef, namePtr); - if(err != KErrNone) { - CntSymbianTransformError::transformError(err, error); - } - - // Display label special case with "starts with" flag; - // False positives are removed here for performance reasons - // (this is a very common use case in a name list view) - // - // Another option might be to use CContactDatabase::FindInTextDefLC - // for filtering with display label - if (detailFilter.detailDefinitionName() == QContactDisplayLabel::DefinitionName - && detailFilter.matchFlags() == QContactFilter::MatchStartsWith) { - - // Remove false positives - for(TInt i(0); i < idArray->Count(); i++) { - CContactItem* contactItem = m_contactDatabase.ReadContactLC((*idArray)[i]); - const CContactItemFieldSet& fieldSet(contactItem->CardFields()); - if(isFalsePositive(fieldSet, KUidContactFieldGivenName, namePtr) - && isFalsePositive(fieldSet, KUidContactFieldFamilyName, namePtr) - && isFalsePositive(fieldSet, KUidContactFieldCompanyName, namePtr) - && isFalsePositive(fieldSet, KUidContactFieldSecondName, namePtr)){ - idArray->Remove(i); - i--; - } - CleanupStack::PopAndDestroy(contactItem); - } - } - } - delete fieldDef; - } - } - - if(idArray && (error == QContactManager::NoError)) { - // copy the matching contact ids - for(int i(0); i < idArray->Count(); i++) { - matches.append(QContactLocalId((*idArray)[i])); - } - } - - delete idArray; - - return matches; -} - -/*! - * Checks if the contact's field set includes field \a fieldTypeUid and if the - * field contents matches the search string. The features currently: - * 1. only checks the first field instance - * 2. supports only "starts with" - * 3. searches every word inside the field - * 4. supports only "not case-sensitive" matching - */ -bool CntSymbianFilter::isFalsePositive(const CContactItemFieldSet& fieldSet, const TUid& fieldTypeUid, const TDesC& searchString) -{ - bool value(true); - TInt index = fieldSet.Find(fieldTypeUid); - if(index >= 0) { - const CContactItemField& field(fieldSet[index]); - CContactTextField* storage = field.TextStorage(); - TPtrC text = storage->Text(); - index = text.FindC(searchString); - // Check if this is the first word beginning with search string - if(index == 0) - value = false; - // Check if this is in the beginning of a word (the preceeding - // character is a space) - else if(index > 0 && TChar(text[index-1]) == TChar(0x20)) - value = false; - } - return value; -} - -/*! - * Transform detail filter into a contact item field definition that can be - * used with CContactDatabase finds. - */ -void CntSymbianFilter::transformDetailFilterL( - const QContactDetailFilter &detailFilter, - CContactItemFieldDef *&fieldDef) -{ - const TInt defaultReserve(1); - const TInt nameFieldsCount(5); - - CContactItemFieldDef* tempFieldDef = new (ELeave) CContactItemFieldDef(); - CleanupStack::PushL(tempFieldDef); - tempFieldDef->SetReserveL(defaultReserve); - - // TODO: Refactor to use the transform classes - // Names - if(detailFilter.detailDefinitionName() == QContactName::DefinitionName) { - if(detailFilter.detailFieldName() == QContactName::FieldPrefix) { - tempFieldDef->AppendL(KUidContactFieldPrefixName); - } else if(detailFilter.detailFieldName() == QContactName::FieldFirst) { - tempFieldDef->AppendL(KUidContactFieldGivenName); - } else if(detailFilter.detailFieldName() == QContactName::FieldMiddle) { - tempFieldDef->AppendL(KUidContactFieldAdditionalName); - } else if(detailFilter.detailFieldName() == QContactName::FieldLast) { - tempFieldDef->AppendL(KUidContactFieldFamilyName); - } else if(detailFilter.detailFieldName() == QContactName::FieldSuffix) { - tempFieldDef->AppendL(KUidContactFieldSuffixName); - } else { - // default to all name fields - tempFieldDef->SetReserveL(nameFieldsCount); - tempFieldDef->AppendL(KUidContactFieldPrefixName); - tempFieldDef->AppendL(KUidContactFieldGivenName); - tempFieldDef->AppendL(KUidContactFieldAdditionalName); - tempFieldDef->AppendL(KUidContactFieldFamilyName); - tempFieldDef->AppendL(KUidContactFieldSuffixName); - } - } - // Nick name - else if(detailFilter.detailDefinitionName() == QContactNickname::DefinitionName) { - tempFieldDef->AppendL(KUidContactFieldSecondName); - } - // Email - else if(detailFilter.detailDefinitionName() == QContactEmailAddress::DefinitionName) { - tempFieldDef->AppendL(KUidContactFieldEMail); - } - // Display label - else if(detailFilter.detailDefinitionName() == QContactDisplayLabel::DefinitionName) { - // in S60 display label is constructed with "nick name", "first name", - // "last name" and/or "company name" - tempFieldDef->SetReserveL(nameFieldsCount); - tempFieldDef->AppendL(KUidContactFieldSecondName); - tempFieldDef->AppendL(KUidContactFieldGivenName); - tempFieldDef->AppendL(KUidContactFieldFamilyName); - tempFieldDef->AppendL(KUidContactFieldCompanyName); - } - - CleanupStack::Pop(tempFieldDef); - fieldDef = tempFieldDef; -} - -/*! - * Find contacts based on a contact field contents. - * \a idArray On return contains the ids of the contacts that have the field - * defined that contains the find text. - * \a fieldUid The UID of the contact database field to be searched. - * \a text The text to be searched for. - * \return Symbian error code. - */ -TInt CntSymbianFilter::findContacts( - CContactIdArray*& idArray, - const CContactItemFieldDef& fieldDef, - const TDesC& text) const -{ - CContactIdArray* idArrayTmp(0); - TRAPD( err, idArrayTmp = findContactsL(fieldDef, text)); - if(err == KErrNone) - { - idArray = idArrayTmp; - } - return err; -} - -/*! - * Leaving implementation called by findContacts. - */ -CContactIdArray* CntSymbianFilter::findContactsL( - const CContactItemFieldDef& fieldDef, - const TDesC& text) const -{ - CContactIdArray* idsArray = m_contactDatabase.FindLC(text, &fieldDef); - CleanupStack::Pop(idsArray); // Ownership transferred - return idsArray; -} - -/* - * Find contacts based on a phone number. - * \a idArray On return contains the ids of the contacts that match the filter. - * \a phoneNumber The phone number to match - * \a matchLength Match length; digits from right. - */ -TInt CntSymbianFilter::matchContacts( - CContactIdArray*& idArray, - const TDesC& phoneNumber, - const TInt matchLength) -{ - CContactIdArray* idArrayTmp(0); - TRAPD( err, idArrayTmp = m_contactDatabase.MatchPhoneNumberL(phoneNumber, matchLength)); - if(err == KErrNone) - { - idArray = idArrayTmp; - } - return err; -} - -/* - * Get the match length setting used in MatchPhoneNumber type filtering. - * \a matchLength Phone number digits to be used in matching (counted from - * right). - */ -void CntSymbianFilter::getMatchLengthL(TInt& matchLength) -{ - //Get number of digits used to match - CRepository* repository = CRepository::NewL(KCRUidTelConfiguration); - CleanupStack::PushL(repository); - User::LeaveIfError(repository->Get(KTelMatchDigits, matchLength)); - CleanupStack::PopAndDestroy(repository); -} - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cntsymbianfiltersql.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntsymbianfiltersql.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifdef SYMBIAN_BACKEND_USE_SQLITE - -#include "cntsymbianfiltersql.h" -#include "qcontactdetailfilter.h" -#include "qcontactphonenumber.h" -#include -#include -#include - -CntSymbianFilter::CntSymbianFilter(CContactDatabase& contactDatabase): - m_contactDatabase(contactDatabase) -{ - m_sqlhelper = new CntSymbianFilterSqlHelper(contactDatabase); -} - -CntSymbianFilter::~CntSymbianFilter() -{ - delete m_sqlhelper; -} - -QList CntSymbianFilter::contacts( - const QContactFilter& filter, - const QList& sortOrders, - bool &filterSupportedFlag, - QContactManager::Error& error) -{ - QList matches; - - matches = m_sqlhelper->searchContacts(filter, sortOrders, error); - - // Tell the caller do slow filtering if the filter is not supported - filterSupportedFlag = filterSupported(filter); - - return matches; -} - -bool CntSymbianFilter::filterSupported(const QContactFilter& filter) -{ - TBool result; - - // Map filter support into a boolean value - FilterSupport support = filterSupportLevel(filter); - if (support == Supported || support == SupportedPreFilterOnly) { - result = true; - } else { - result = false; - } - return result; -} - -CntAbstractContactFilter::FilterSupport CntSymbianFilter::filterSupportLevel(const QContactFilter& filter) -{ - return m_sqlhelper->filterSupportLevel(filter); -} - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cntsymbianfiltersqlhelper.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntsymbianfiltersqlhelper.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,731 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -//system includes -#include -#include -#include - -#include - -//user includes -#include "cntsymbianfiltersqlhelper.h" -#include "qcontactdetailfilter.h" -#include "cnttransformcontact.h" -#include "cntdisplaylabel.h" -#include "cntdisplaylabelsqlfilter.h" -#include "cntsqlsearch.h" - -// Telephony Configuration API -// Keys under this category are used in defining telephony configuration. -const TUid KCRUidTelConfiguration = {0x102828B8}; -// Amount of digits to be used in contact matching. -// This allows a customer to variate the amount of digits to be matched. -const TUint32 KTelMatchDigits = 0x00000001; -// Default match length -const TInt KDefaultMatchLength(7); -//Class documentation go here: -/*! - \class CntSymbianFilterSqlHelper - \brief Helper class for converting filter to sql queries -*/ - - Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SingleQuote,"'") ; - Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::PercentSign,"%") ; - Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::Space," ") ; - Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::EqualTo,"=") ; - Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SqlLike," LIKE ") ; - Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SqlNotNull," NOT NULL ") ; - Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SqlWhere," WHERE ") ; - Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SqlOr," OR ") ; - Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::contactsTable," contact ") ; - Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::commAddrTable," comm_addr ") ; - - -/*! - * The constructor - */ -CntSymbianFilterSqlHelper::CntSymbianFilterSqlHelper(CContactDatabase& contactDatabase) - : m_contactDatabase(contactDatabase), - isPhoneNumberSearchforDetailFilter(false) -{ - m_srvConnection = new CntSymbianSrvConnection(); - m_sqlSearch = new CntSqlSearch(); - - contactsTableIdColumNameMapping.insert(KUidContactFieldGivenName.iUid,"first_name" ); - contactsTableIdColumNameMapping.insert(KUidContactFieldGivenNamePronunciation.iUid,"firstname_prn" ); - contactsTableIdColumNameMapping.insert(KUidContactFieldFamilyName.iUid,"last_name" ); - contactsTableIdColumNameMapping.insert(KUidContactFieldFamilyNamePronunciation.iUid,"lastname_prn" ); - contactsTableIdColumNameMapping.insert(KUidContactFieldCompanyName.iUid,"company_name" ); - contactsTableIdColumNameMapping.insert(KUidContactFieldCompanyNamePronunciation.iUid,"companyname_prn" ); - - //commAddrTableIdColumNameMapping.insert(KUidContactFieldIMPP.iUid,ESipAddress ); - commAddrTableIdColumNameMapping.insert(KUidContactFieldSIPID.iUid,ESipAddress ); - commAddrTableIdColumNameMapping.insert(KUidContactFieldEMail.iUid,EEmailAddress ); - -} - -/*! - * Destructor - */ -CntSymbianFilterSqlHelper::~CntSymbianFilterSqlHelper() - -{ - delete m_srvConnection; - delete m_sqlSearch; - contactsTableIdColumNameMapping.clear(); - commAddrTableIdColumNameMapping.clear(); -} - -/*! - * Fetch search results from the database. - * - * \a filter The simple/complex QContactFilter passed . - * \a error On return, contains the possible error. - * \return the list of matched contact ids - */ -QList CntSymbianFilterSqlHelper::searchContacts(const QContactFilter& filter, const QList& sortOrders, - QContactManager::Error& error) -{ - isPhoneNumberSearchforDetailFilter = false; - QList idList; - bool isPredSearch; - idList = HandlePredictiveSearchFilter(filter,isPredSearch, error); - if(isPredSearch) - return idList; - if(filterSupportLevel(filter)){ - - // Create sql query from the filters - QString sqlQuery; - createSqlQuery(filter, sqlQuery, error); - - if( error != QContactManager::NoError) { - return QList(); - } - // Query the database - // If isPhoneNumberSearchforDetailFilter flag is set, we use the existing cntmodel - // else call searchContacts - if(isPhoneNumberSearchforDetailFilter) - { - // cast the filter into detail filte - const QContactDetailFilter detailFilter(filter); - idList = HandlePhonenumberDetailFilter(detailFilter); - } - else - { - //append the sort order to the query - appendSortOrderQuery(sqlQuery, sortOrders); - - //fetch the contacts - idList = m_srvConnection->searchContacts(sqlQuery, error); - } - - } - else - { - error = QContactManager::NotSupportedError; - } - return idList; - - -} - -QList CntSymbianFilterSqlHelper::HandlePredictiveSearchFilter(const QContactFilter& filter, bool &isPredSearch, - QContactManager::Error& error) - { - isPredSearch = false; - QString sqlQuery; - if(filter.type() == QContactFilter::ContactDetailFilter){ - const QContactDetailFilter detailFilter(filter); - if( detailFilter.matchFlags() == QContactFilter::MatchKeypadCollation ){ - //convert string to numeric format - QString pattern = detailFilter.value().toString(); - sqlQuery = m_sqlSearch->CreatePredictiveSearch(pattern); - isPredSearch = true; - - return m_srvConnection->searchContacts(sqlQuery, error); - } - else - { - return QList(); - } - } - else - { - return QList(); - } - } - -/*! - * Append the sort order to the sql query - * - * \a sqlQuery to add the sort order to - * \a sortOrders to be added - */ -void CntSymbianFilterSqlHelper::appendSortOrderQuery(QString& sqlQuery, const QList& sortOrders) -{ - QString column; - CntDisplayLabel displayLabel; - - bool first(true); - - for(int i = 0; i < sortOrders.count(); i++) - { - columnName(column, sortOrders.at(i).detailDefinitionName(), sortOrders.at(i).detailFieldName()); - - if(!column.isEmpty()) - { - if(first) - { - sqlQuery += " ORDER BY"; - first = false; - } - - else - { - sqlQuery += ","; - } - - //use the display label if the name is null, ignore case - sqlQuery += " CASE WHEN " + column + " ISNULL THEN \'"+ displayLabel.unNamned().toLower() + "\' ELSE lower(" + column + ") END"; - - if(sortOrders.at(i).direction() == Qt::AscendingOrder) - { - sqlQuery += " ASC"; - } - - else if(sortOrders.at(i).direction() == Qt::DescendingOrder) - { - sqlQuery += " DESC"; - } - } - } -} - -/*! - * Retrieve a column name - * - * \a columnName to be saved the column name if found - * \a detailDefinitionName of the detail to fetch column name for - * \a detailFieldName of the detail to fetch column name for - */ -void CntSymbianFilterSqlHelper::columnName( QString &columnName, const QString &detailDefinitionName, const QString & detailFieldName) -{ - columnName = ""; - - //Name detail - if(detailDefinitionName == QContactName::DefinitionName) - { - if(detailFieldName == QContactName::FieldFirst) - { - columnName = "first_name"; - } - - else if(detailFieldName == QContactName::FieldLast) - { - columnName = "last_name"; - } - } - - //Organization - else if(detailDefinitionName == QContactOrganization::DefinitionName) - { - if(detailFieldName == QContactOrganization::FieldName) - { - columnName = "company_name"; - } - } -} - -/*! - * converts complex filter into simple filters - * - * \a filter The simple/complex QContactFilter passed . - * \a sqlQuery The sql query that would be formed - * \a error On return, contains the possible error. - */ -void CntSymbianFilterSqlHelper::createSqlQuery(const QContactFilter& filter, - QString& sqlQuery, - QContactManager::Error& error) -{ - //Check if it is a single filter - bool IsOneLevelFilter = isSingleFilter(filter); - if(IsOneLevelFilter) { - //Single Filter, get the sql query here - updateSqlQueryForSingleFilter(filter,sqlQuery,error); - } else { - // We have multiple filters. Combine these to form correct query - // Not supported yet - error = QContactManager::NotSupportedError; - } -} - -/*! - * Checks if the given filter is a single filter or combination of filters - * - * \a filter The QContactFilter to be used. - * \return True if the filters is single filter - */ - -bool CntSymbianFilterSqlHelper::isSingleFilter(const QContactFilter& singlefilter) const -{ - - bool returnValue = false; - switch (singlefilter.type()) { - case QContactFilter::ContactDetailFilter: - case QContactFilter::InvalidFilter : - case QContactFilter::ContactDetailRangeFilter: - case QContactFilter::ChangeLogFilter: - case QContactFilter::DefaultFilter: - //All are single filters, return True - returnValue = true; - break; - case QContactFilter::ActionFilter: - case QContactFilter::IntersectionFilter: - case QContactFilter::UnionFilter: - - //All these are multiple filters - returnValue = false; - break; - default: - returnValue = false; - break; - }; - return returnValue; -} - -/*! - * Updates the input sql query for single filter - * - * \a filter The QContactFilter to be used. - * \a sqlQuery The sql query that would be updated - * \a error On return, contains the possible error - */ -void CntSymbianFilterSqlHelper::updateSqlQueryForSingleFilter( const QContactFilter& filter, - QString& sqlQuery, - QContactManager::Error& error) -{ - switch (filter.type()) { - case QContactFilter::InvalidFilter : - { - // Not supported yet - error = QContactManager::NotSupportedError; - break; - } - case QContactFilter::ContactDetailFilter: - { - const QContactDetailFilter detailFilter(filter); - - //display label - if (detailFilter.detailDefinitionName() == QContactDisplayLabel::DefinitionName) - { - CntDisplayLabelSqlFilter displayLabelFilter; - displayLabelFilter.createSqlQuery(detailFilter,sqlQuery,error); - } - - //type - else if(detailFilter.detailDefinitionName() == QContactType::DefinitionName) - { - if(detailFilter.value().toString() == QContactType::TypeContact) - sqlQuery = "SELECT contact_id FROM contact WHERE (type_flags>>24)=0"; - else if(detailFilter.value().toString() == QContactType::TypeGroup) - sqlQuery = "SELECT contact_id FROM contact WHERE (type_flags>>24)=3"; - } - - //everything else - else - { - updateSqlQueryForDetailFilter(filter,sqlQuery,error); - } - - break; - } - case QContactFilter::ContactDetailRangeFilter: - // Not supported yet - error = QContactManager::NotSupportedError; - break; - - case QContactFilter::ChangeLogFilter: - // Not supported yet - error = QContactManager::NotSupportedError; - break; - case QContactFilter::DefaultFilter: - sqlQuery = "SELECT DISTINCT contact_id FROM contact WHERE (type_flags>>24)=0 OR (type_flags>>24)=3"; - error = QContactManager::NoError; - break; - case QContactFilter::ActionFilter: - case QContactFilter::IntersectionFilter: - case QContactFilter::UnionFilter: - //All these are multiple filters - // Not supported yet - error = QContactManager::NotSupportedError; - break; - default: - //Some Unknow filter value - // Not supported - error = QContactManager::NotSupportedError; - break; - }; - if( error != QContactManager::NoError) - { - sqlQuery = ""; - } -} - -/*! - * Updates the input sql query for detail filter - * - * \a filter The QContactFilter to be used. - * \a sqlQuery The sql query that would be updated - * \a error On return, contains the possible error - */ -void CntSymbianFilterSqlHelper::updateSqlQueryForDetailFilter(const QContactFilter& filter, - QString& sqlQuery, - QContactManager::Error& error) -{ - - - // cast the filter into detail filter - const QContactDetailFilter detailFilter(filter); - - QString sqlWhereClause = Space + " WHERE "; - - //Get the table name and the column name - bool isSubType; - QString columnName; - QString tableName; - - //Check for phonenumber. Special handling needed - if(detailFilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName){ - isPhoneNumberSearchforDetailFilter = true; - error = QContactManager::NoError; - return; - } - - getSqlDbTableAndColumnNameforDetailFilter(detailFilter,isSubType,tableName,columnName); - - //return if tableName is empty - if(tableName == "" ){ - error = QContactManager::NotSupportedError; - return; - } - - //check columnName - if(columnName == "") { - error = QContactManager::NotSupportedError; - return; - } - else if(isSubType) { - sqlWhereClause += columnName; - sqlWhereClause += " NOT NULL "; - } - else { - - sqlWhereClause += Space + columnName + Space ; - QString fieldToUpdate; - //Update the value depending on the match flag - updateFieldForDeatilFilterMatchFlag(detailFilter,fieldToUpdate,error); - sqlWhereClause += fieldToUpdate; - } - - - //Create the sql query - sqlQuery += "SELECT DISTINCT contact_id FROM " + Space + tableName + Space + sqlWhereClause; - - -} - -/*! - * Converts filed id to column name of the database table. - * QContactManager::contacts function. - * - * \a fieldId field id representing the detail field name - * \a sqlDbTableColumnName On return,contains the column name in the database - */ -void CntSymbianFilterSqlHelper::updateFieldForDeatilFilterMatchFlag( - const QContactDetailFilter& filter, - QString& fieldToUpdate , - QContactManager::Error& error) const -{ - // Modify the filed depending on the query - switch(filter.matchFlags()) - { - case QContactFilter::MatchExactly: - { - // Pattern for MatchExactly: - // " ='xyz'" - fieldToUpdate = Space + EqualTo + SingleQuote - + filter.value().toString() + SingleQuote; - error = QContactManager::NoError; - break; - } - case QContactFilter::MatchContains: - { - // Pattern for MatchContains: - // " LIKE '%xyz%'" - fieldToUpdate = Space + SqlLike + Space + SingleQuote + PercentSign - + filter.value().toString() + PercentSign + SingleQuote ; - error = QContactManager::NoError; - break; - } - case QContactFilter::MatchStartsWith: - { - // Pattern for MatchStartsWith: - // " LIKE 'xyz%'" - fieldToUpdate = Space + SqlLike + Space + SingleQuote - + filter.value().toString() + PercentSign + SingleQuote ; - error = QContactManager::NoError; - break; - } - case QContactFilter::MatchEndsWith: - { - // Pattern for MatchEndsWith: - // " LIKE '%xyz'" - fieldToUpdate = Space + SqlLike + Space + SingleQuote + PercentSign - + filter.value().toString() + SingleQuote ; - error = QContactManager::NoError; - break; - } - case QContactFilter::MatchFixedString: - { - error = QContactManager::NotSupportedError; - break; - } - case QContactFilter::MatchCaseSensitive: - { - error = QContactManager::NotSupportedError; - break; - } - default: - { - error = QContactManager::NotSupportedError; - break; - } - } -} - -/*! - * Converts filed id to column name of the database table. - * QContactManager::contacts function. - * - * \a fieldId field id representing the detail field name - * \a sqlDbTableColumnName On return,contains the column name in the database - */ -void CntSymbianFilterSqlHelper::getSqlDbTableAndColumnNameforDetailFilter( - const QContactDetailFilter& detailFilter , - bool& isSubType, - QString& tableName, - QString& columnName ) -{ - - //Get the field id for the detail field name - CntTransformContact transformContact; - quint32 fieldId = transformContact.GetIdForDetailL(detailFilter, isSubType); - - //check contacts table - columnName = ""; - tableName = ""; - - if (contactsTableIdColumNameMapping.contains(fieldId)){ - columnName = contactsTableIdColumNameMapping.value(fieldId); - tableName = "contact"; - } - - if( ("" == columnName) || ("" == tableName)){ - //Search comm Addr table - if (commAddrTableIdColumNameMapping.contains(fieldId)){ - // communication address table has slightly differnt format, so we make the column name as - // "type = and value " - int typeval = commAddrTableIdColumNameMapping.value(fieldId) ; - columnName = Space + "TYPE = "; - columnName.append('0'+ typeval) - + typeval + Space; - columnName += " and value " ; - tableName = "comm_addr"; - } - - } -} - -QList CntSymbianFilterSqlHelper::HandlePhonenumberDetailFilter(const QContactDetailFilter detailFilter) - { - QList matches; - - if(detailFilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName){ - - // Phone numbers need separate handling - if ((filterSupportLevel(detailFilter) == CntAbstractContactFilter::Supported - || filterSupportLevel(detailFilter) == CntAbstractContactFilter::SupportedPreFilterOnly)) - { - QString number((detailFilter.value()).toString()); - TPtrC commPtr(reinterpret_cast(number.utf16())); - - TInt matchLength(KDefaultMatchLength); - // no need to propagate error, we can use the default match length - TRAP_IGNORE(getMatchLengthL(matchLength)); - - //cal the search - CContactIdArray* idArray(0); - TInt err = searchPhoneNumbers(idArray, commPtr, matchLength); - if( idArray && (err == KErrNone)){ - // copy the matching contact ids - for(int i(0); i < idArray->Count(); i++) { - matches.append(QContactLocalId((*idArray)[i])); - } - delete idArray; - } - else{ - //CntSymbianTransformError::transformError(err, error); - } - } - - - } - return matches; - - } -/*! - * The contact database version implementation for - * QContactManager::filterSupported function. The possible return values are - * Supported, NotSupported and SupportedPreFilterOnly. Supported means that - * the filtering is implemented directly by the underlying database. - * NotSupported means that CntSymbianFilterDbms::contacts will return an - * error. And SupportedPreFilterOnly means that the filter is not supported, - * but the CntSymbianFilterDbms::contacts will act like the filter was - * supported. This means that the client must filter the pre-filtered set of - * contacts to see if there are false positives included. Note that in some - * cases the pre-filtering is not very effective. - * - * \a filter The QContactFilter to be checked. - * \a return Supported in case the filter is supported. NotSupported in case - * the filter is not supported. returns - * - */ -CntAbstractContactFilter::FilterSupport CntSymbianFilterSqlHelper::filterSupportLevel(const QContactFilter& filter) -{ - CntAbstractContactFilter::FilterSupport filterSupported(CntAbstractContactFilter::NotSupported); - switch (filter.type()) { - case QContactFilter::DefaultFilter: //default filter == no filter - { - filterSupported = CntAbstractContactFilter::Supported; - break; - } - case QContactFilter::ContactDetailFilter: - { - const QContactDetailFilter &detailFilter = static_cast(filter); - filterSupported = checkIfDetailFilterSupported(detailFilter); - break; - } - case QContactFilter::InvalidFilter : - case QContactFilter::ContactDetailRangeFilter: - case QContactFilter::ChangeLogFilter: - case QContactFilter::ActionFilter: - case QContactFilter::IntersectionFilter: - case QContactFilter::UnionFilter: - case QContactFilter::RelationshipFilter: - default: - filterSupported = CntAbstractContactFilter::NotSupported; - break; - } - return filterSupported; -} -CntAbstractContactFilter::FilterSupport CntSymbianFilterSqlHelper::checkIfDetailFilterSupported - (const QContactDetailFilter& detailFilter) const -{ - - CntAbstractContactFilter::FilterSupport filterSupported(CntAbstractContactFilter::NotSupported); - //Get the match flags - QContactFilter::MatchFlags matchFlags = detailFilter.matchFlags(); - // Phone numbers - if (detailFilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName) { - if (matchFlags == QContactFilter::MatchEndsWith){ - filterSupported = CntAbstractContactFilter::Supported; - } - else if (matchFlags == QContactFilter::MatchExactly){ - filterSupported = CntAbstractContactFilter::SupportedPreFilterOnly; - } - } - // Names , Email,Sip address - else if ( detailFilter.detailDefinitionName() == QContactName::DefinitionName || - detailFilter.detailDefinitionName() == QContactEmailAddress::DefinitionName || - detailFilter.detailDefinitionName() == QContactOnlineAccount::DefinitionName || - detailFilter.detailDefinitionName() == QContactDisplayLabel::DefinitionName || - detailFilter.detailDefinitionName() == QContactType::DefinitionName){ - if ( (matchFlags == QContactFilter::MatchContains)|| (matchFlags == QContactFilter::MatchStartsWith)|| - (matchFlags == QContactFilter::MatchEndsWith)|| (matchFlags == QContactFilter::MatchExactly)){ - filterSupported = CntAbstractContactFilter::Supported; - } - if(matchFlags == QContactFilter::MatchKeypadCollation) - filterSupported = CntAbstractContactFilter::Supported; - } - return filterSupported; - -} -/* - * Get the match length setting. Digits to be used in matching (counted from - * right). - */ -void CntSymbianFilterSqlHelper::getMatchLengthL(TInt& matchLength) -{ - //Get number of digits used to match - CRepository* repository = CRepository::NewL(KCRUidTelConfiguration); - CleanupStack::PushL(repository); - User::LeaveIfError(repository->Get(KTelMatchDigits, matchLength)); - CleanupStack::PopAndDestroy(repository); -} - -/* - * Find contacts based on a phone number. - * \a idArray On return contains the ids of the contacts that match the phonenumber. - * \a phoneNumber The phone number to match - * \a matchLength Match length; digits from right. - */ -TInt CntSymbianFilterSqlHelper::searchPhoneNumbers( - CContactIdArray*& idArray, - const TDesC& phoneNumber, - const TInt matchLength) -{ - CContactIdArray* idArrayTmp(0); - TRAPD( err, idArrayTmp = m_contactDatabase.MatchPhoneNumberL(phoneNumber, matchLength)); - if(err == KErrNone){ - idArray = idArrayTmp; - } - return 0; -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cntsymbiansorterdbms.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntsymbiansorterdbms.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,231 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "cntsymbiansorterdbms.h" -#include "cntsymbiantransformerror.h" - -#include -#include -#include -#include "cnttransformcontact.h" - -typedef QList QContactLocalIdList; - -/* ... The macros changed names */ -#if QT_VERSION < QT_VERSION_CHECK(4, 6, 0) -#define QT_TRAP_THROWING QT_TRANSLATE_SYMBIAN_LEAVE_TO_EXCEPTION -#define QT_TRYCATCH_LEAVING QT_TRANSLATE_EXCEPTION_TO_SYMBIAN_LEAVE -#endif - -// NOTE: There is a bug with RVCT compiler which causes the local stack -// variable to corrupt if the called function leaves. As a workaround we are -// reserving the objects from heap so it will not get corrupted. -// This of course applies only to those stack variables which are passed to -// the called function or the return value of the function is placed to the -// variable. - -CntSymbianSorterDbms::CntSymbianSorterDbms(CContactDatabase& contactDatabase,CntTransformContact& transformContact): - m_contactDatabase(contactDatabase), - m_transformContact(transformContact) -{ -} - -CntSymbianSorterDbms::~CntSymbianSorterDbms() -{ -} - -QList CntSymbianSorterDbms::contacts( - const QList& sortOrders, - QContactManager::Error& error) -{ - // Create an empty list - // See QT_TRYCATCH_LEAVING note at the begginning of this file - QContactLocalIdList *ids = new QContactLocalIdList(); - - // Attempt to read from database, leaving the list empty if - // there was a problem - TRAPD(err, QT_TRYCATCH_LEAVING(*ids = contactsL(sortOrders))); - - CntSymbianTransformError::transformError(err, error); - - return *QScopedPointer(ids); -} - -QList CntSymbianSorterDbms::sort( - QList contactIds, - const QList& sortOrders, - QContactManager::Error& error) -{ - // Create an empty list - // See QT_TRYCATCH_LEAVING note at the begginning of this file - QContactLocalIdList *ids = new QContactLocalIdList(); - - // Attempt to read from database, leaving the list empty if - // there was a problem - TRAPD(err, QT_TRYCATCH_LEAVING(*ids = sortL(contactIds,sortOrders))); - - CntSymbianTransformError::transformError(err, error); - - return *QScopedPointer(ids); -} - -bool CntSymbianSorterDbms::sortOrderSupported(const QList& sortOrders) -{ - foreach( QContactSortOrder s, sortOrders ) { - // Find uids for sortings - QList fieldTypeUids = m_transformContact.supportedSortingFieldTypes(s.detailDefinitionName(), s.detailFieldName()); - if( fieldTypeUids.count() == 0 ) - return false; - - // Only blanks last supported - if( s.blankPolicy() != QContactSortOrder::BlanksLast ) - return false; - - // Always case sensitive - if( s.caseSensitivity() != Qt::CaseSensitive ) - return false; - -#ifndef SYMBIAN_BACKEND_USE_SQLITE - // NOTE: - // Seems that there is a bug in cntmodel which causes that sorting - // is working correctly only if the direction is the same for all - // sort orders. - if( s.direction() != sortOrders[0].direction() ) - return false; -#endif - } - return true; -} - -QList CntSymbianSorterDbms::contactsL(const QList& sortOrders) const -{ - // Populate the ID array, returns the coontact ids + group ids - TTime epoch(0); - CContactIdArray *ids = m_contactDatabase.ContactsChangedSinceL(epoch); - CleanupStack::PushL(ids); - - // Remove templates from the list - CContactIdArray *templateIds = m_contactDatabase.GetCardTemplateIdListL(); - CleanupStack::PushL(templateIds); - for(TInt i(0); i < templateIds->Count(); i++) { - TContactItemId id = (*templateIds)[i]; - TInt index = ids->Find(id); - if(index > KErrNotFound) - ids->Remove(index); - } - CleanupStack::PopAndDestroy(templateIds); - - // Sort the list - CContactIdArray* sortedIds = sortL(ids, sortOrders); - CleanupStack::PopAndDestroy(ids); - ids = sortedIds; - CleanupStack::PushL(ids); - - // Add the contact ids to the returned QList - QList qIds; - for (TInt i(0); i < ids->Count(); i++) { - qIds.append((*ids)[i]); - } - - CleanupStack::PopAndDestroy(ids); - - return qIds; -} - -QList CntSymbianSorterDbms::sortL(const QList& contactIds, const QList& sortOrders) const -{ - CContactIdArray* ids = CContactIdArray::NewLC(); - foreach(QContactLocalId id, contactIds) - ids->AddL(id); - - CContactIdArray* sortedIds = sortL(ids, sortOrders); - CleanupStack::PopAndDestroy(ids); - CleanupStack::PushL(sortedIds); - - QList qSortedIds; - for (int i=0; iCount(); i++) - qSortedIds.append( (*sortedIds)[i] ); - CleanupStack::PopAndDestroy(sortedIds); - - return qSortedIds; -} - -CContactIdArray* CntSymbianSorterDbms::sortL(const CContactIdArray* contactIds, const QList& sortOrders) const -{ - CArrayFixFlat *sort = - new (ELeave) CArrayFixFlat(5); - CleanupStack::PushL(sort); - - // Convert sort orders to TSortPref array - foreach (QContactSortOrder s, sortOrders) - { - QList fieldTypes = m_transformContact.supportedSortingFieldTypes(s.detailDefinitionName(), s.detailFieldName()); - if (fieldTypes.count()) - { - foreach(TUid fieldType, fieldTypes) { - CContactDatabase::TSortPref pref; - // NOTE: TSortPref sets order to ascending by default - if( s.direction() == Qt::DescendingOrder ) - pref.iOrder = CContactDatabase::TSortPref::EDesc; - pref.iFieldType = fieldType; - sort->AppendL(pref); - } - } - else - { - // This should never happen. Sorting should have happened - // the "slow way" at QContactManagerEngine::sortContacts. - User::Leave(KErrNotFound); - } - } - - CContactIdArray* sortedIds(0); - // There is a bug in CContactDatabase::SortArrayL, if an empty sort is used - // the function returns all contacts (and groups) instead of the given - // contact ids - if(sortOrders.isEmpty()) { - sortedIds = CContactIdArray::NewL(contactIds); - } else { - sortedIds = m_contactDatabase.SortArrayL(contactIds,sort); - } - CleanupStack::PopAndDestroy(sort); - return sortedIds; -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cntsymbiansrvconnection.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntsymbiansrvconnection.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,239 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -//system includes -#include -#include - -//user includes -#include "cntsymbiansrvconnection.h" -#include "cntsymbiantransformerror.h" - -// Constants -// To be removed. Should be defined in a header file -#define KCntSearchResultIdLists 99 -#define KCntOpenDataBase 100 // = KCapabilityReadUserData - -_LIT(KCntServerExe,"CNTSRV.EXE"); // Name of the exe for the Contacts server. -_LIT(KCntServerName,"CNTSRV"); // Name used to connect a session - // to the Contacts server. - -/** Maximum number of asynchronous IPC calls. */ -const TInt KAsyncMessageSlots=6; - -/* Contacts server version number. */ -const TInt KCntServerMajorVersionNumber=1; -const TInt KCntServerMinorVersionNumber=1; -const TInt KCntServerBuildVersionNumber=1; - -const TInt KGranularityRank = 8; //2^8 = 256 bytes -const TInt KDefaultPackagerSize = 3514; //Observed Techview Golden template size. - -/*! - * The constructor - */ -CntSymbianSrvConnection::CntSymbianSrvConnection() : - m_buffer(0), - m_bufPtr(0,0,0), - m_isInitialized(false) -{ -} - -/*! - * Destructor - */ -CntSymbianSrvConnection::~CntSymbianSrvConnection() -{ - delete m_buffer; - RHandleBase::Close(); -} - -/*! - * Query the SQL database - * - * \a sqlQuery An SQL query - * \a error On return, contains the possible error. - * \return the list of matched contact ids - */ -QList CntSymbianSrvConnection::searchContacts(const QString& sqlQuery, - QContactManager::Error& error) -{ - QList list; - TPtrC queryPtr(reinterpret_cast(sqlQuery.utf16())); - TRAPD(err, list = searchContactsL(queryPtr)); - CntSymbianTransformError::transformError(err, error); - return list; -} - -/*! - * The leaving function that queries the SQL database - * - * \a aSqlQuery An SQL query - * \return the list of matched contact ids - */ -QList CntSymbianSrvConnection::searchContactsL(const TDesC& aSqlQuery) -{ - // Initialize connection if it is not initialized yet. - if (!m_isInitialized) { - ConnectSrvL(); - OpenDatabaseL(); - m_isInitialized = true; - } - - // Fetch results from the server - TIpcArgs args; - args.Set(0, &GetReceivingBufferL()); - args.Set(1, &aSqlQuery); - TInt newBuffSize = SendReceive(KCntSearchResultIdLists, args); - User::LeaveIfError(newBuffSize); - if (newBuffSize > 0) - { - args.Set(0, &GetReceivingBufferL(newBuffSize)); - args.Set(1,&aSqlQuery); - User::LeaveIfError(newBuffSize = SendReceive(KCntSearchResultIdLists, args)); - } - - // Unpack the contact ids into an list - return UnpackCntIdArrayL(); -} - -/*! - * Connect to / create a cntsrv server session - */ -void CntSymbianSrvConnection::ConnectSrvL() -{ - // Assume the server is already running and attempt to create a session - // with a maximum of KAsyncMessageSlots message slots. - TInt err = CreateSession(KCntServerName,Version(),KAsyncMessageSlots); - - // Server is not running - if(err == KErrNotFound) { - // Use the RProcess API to start the server. - RProcess server; - User::LeaveIfError(server.Create(KCntServerExe,KNullDesC)); - - //Enforce server to be at system default priority EPriorityForeground - server.SetPriority(EPriorityForeground); - - // Synchronise with the server. - TRequestStatus reqStatus; - server.Rendezvous(reqStatus); - server.Resume(); - - // Server will call the reciprocal static synchronisation call. - User::WaitForRequest(reqStatus); - server.Close(); - User::LeaveIfError(reqStatus.Int()); - - // Create the server session. - User::LeaveIfError(CreateSession(KCntServerName,Version(),KAsyncMessageSlots)); - } else { - User::LeaveIfError(err); - } - - // Create IPC buffer - m_buffer = CBufFlat::NewL(1 << KGranularityRank); - m_maxBufferSize = KDefaultPackagerSize; - -} - -/*! - * Open database - */ -void CntSymbianSrvConnection::OpenDatabaseL() -{ - TIpcArgs args; - args.Set(0, &KNullDesC); - User::LeaveIfError(SendReceive(KCntOpenDataBase, args)); -} - -/*! - * Version of cntsrv - */ -TVersion CntSymbianSrvConnection::Version() const -{ - return(TVersion(KCntServerMajorVersionNumber, - KCntServerMinorVersionNumber, - KCntServerBuildVersionNumber)); -} - -/*! - * Get the buffer reference to be used for IPC - * - * \a size size of the receiving buffer - * \return a reference to the beginning of the buffer - */ -TDes8& CntSymbianSrvConnection::GetReceivingBufferL(int size) -{ - if(size > m_buffer->Size()) { - // Find next divisable by granularity size value. - (size >>= KGranularityRank)++; - m_maxBufferSize = size <<= 8; - m_buffer->ResizeL(m_maxBufferSize); - - } else if(!size && m_buffer->Size() < m_maxBufferSize) { - // Use the stored default size. - m_buffer->ResizeL(m_maxBufferSize); - } - // The location of the whole buffer may have changed, because reallocation - // may have taken place. Update both buffer pointers. - m_bufPtr.Set(m_buffer->Ptr(0)); - return m_bufPtr; -} - -/*! - * Unpack results from a buffer stream and store in a list - * - * \return list of matched contact ids - */ -QList CntSymbianSrvConnection::UnpackCntIdArrayL() -{ - RBufReadStream readStream; - QList list; - TContactItemId item; - - readStream.Open(*m_buffer); - int count = readStream.ReadInt32L(); - for (int i=0; i> item; - list.append(item); - } - return list; -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cntthumbnailcreator.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntthumbnailcreator.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,273 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cntthumbnailcreator.h" -#include "cntsymbiantransformerror.h" - -#include -#include -#include -#include -#include -#include -#include - -#if QT_VERSION < QT_VERSION_CHECK(4, 6, 0) -#define QT_TRAP_THROWING QT_TRANSLATE_SYMBIAN_LEAVE_TO_EXCEPTION -#define QT_TRYCATCH_LEAVING QT_TRANSLATE_EXCEPTION_TO_SYMBIAN_LEAVE -#endif - -const TSize KThumbnailSizeUninitialized(0, 0); - -#ifdef _DEBUG -_LIT(KPanicCategory, "ThumbnailCreator"); -enum TPanicReasons { - KPanicUnitialized = 0 -}; -#endif - -CntThumbnailCreator::CntThumbnailCreator() : - CActive(EPriorityStandard), - m_state(EStateInitialized), - m_thumbnailSize(KThumbnailSizeUninitialized), - m_err(KErrNone) -{ - CActiveScheduler::Add(this); -} - -CntThumbnailCreator::~CntThumbnailCreator() -{ - delete m_encoder; - delete m_imageData; - delete m_bitmapScaler; - delete m_bitmap; - delete m_decoder; - delete m_activeSchedulerWait; - if (m_rfs.Handle() != KNullHandle) - m_rfs.Close(); -} - -/*! - * After calling this function \a fieldList will contain thumbnail field (field - * types KUidContactFieldVCardMapJPEG, KUidContactFieldPicture in this order) - * with thumbnail data. If the file \a filename does not exist, no fields are - * added to the field list. If the file \a filename is not a valid image file, - * a leave will occur. \a maxSize is the maximum size of the thumbnail image - * that is stored into contact database. If the image is bigger than \a maxSize - * the generated thumbnail will be scaled down to \a maxSize. - */ -void CntThumbnailCreator::addThumbnailFieldL(QList *fieldList, const TFileName &filename, const TSize& maxSize) -{ - Cancel(); - m_fieldList = fieldList; - m_thumbnailSize = maxSize; - - // Lazy instantiation to save resources - if (m_rfs.Handle() == KNullHandle) - m_rfs.Connect(); - if(!m_activeSchedulerWait) - m_activeSchedulerWait = new (ELeave) CActiveSchedulerWait; - - DecodeImageL(filename); - - // Synchronize asynchronous operations (wait loop is finished in RunL when - // image operations are done, or in RunError if an error occurs) - m_activeSchedulerWait->Start(); - User::LeaveIfError(m_err); -} - -void CntThumbnailCreator::addThumbnailFieldL(QList *fieldList, CFbsBitmap *bitmap, const TSize& maxSize) -{ - Cancel(); - m_fieldList = fieldList; - m_thumbnailSize = maxSize; - delete m_bitmap; - m_bitmap = bitmap; - - // Lazy instantiation to save resources - if (m_rfs.Handle() == KNullHandle) - m_rfs.Connect(); - if(!m_activeSchedulerWait) - m_activeSchedulerWait = new (ELeave) CActiveSchedulerWait; - - m_state = EStateEncodeImage; - EncodeImageL(); - - // Synchronize asynchronous operations (wait loop is finished in RunL when - // image operations are done, or in RunError if an error occurs) - m_activeSchedulerWait->Start(); - User::LeaveIfError(m_err); -} - - -void CntThumbnailCreator::RunL() -{ - __ASSERT_DEBUG(m_activeSchedulerWait, User::Panic(KPanicCategory, KPanicUnitialized)); - - User::LeaveIfError(iStatus.Int()); - switch (m_state) { - case EStateDecodeImage: - { - m_state = EStateScaleImage; - ScaleImageL(); - break; - } - case EStateScaleImage: - { - m_state = EStateEncodeImage; - EncodeImageL(); - break; - } - case EStateEncodeImage: - { - m_state = EStateFinal; - CreateContactFieldL(); - break; - } - case EStateFinal: - { - // We are done with the image, back to the caller of convertL - m_activeSchedulerWait->AsyncStop(); - break; - } - default: - User::Leave(KErrCompletion); - } -} - -void CntThumbnailCreator::DoCancel() -{ - __ASSERT_DEBUG(m_activeSchedulerWait, User::Panic(KPanicCategory, KPanicUnitialized)); - - m_err = KErrCancel; - m_activeSchedulerWait->AsyncStop(); -} - -TInt CntThumbnailCreator::RunError(TInt aError) -{ - __ASSERT_DEBUG(m_activeSchedulerWait, User::Panic(KPanicCategory, KPanicUnitialized)); - - m_err = aError; - m_activeSchedulerWait->AsyncStop(); - return KErrNone; -} - -void CntThumbnailCreator::DecodeImageL(const TFileName &filename) -{ - if (m_rfs.IsValidName(filename) && BaflUtils::FileExists(m_rfs, filename)) { - m_state = EStateDecodeImage; - - // Create image decoder - delete m_decoder; - m_decoder = 0; - m_decoder = CImageDecoder::FileNewL(m_rfs, filename); - TFrameInfo frameInfo = m_decoder->FrameInfo(); - - // Lazy instantiation - if(!m_bitmap) - m_bitmap = new (ELeave) CFbsBitmap; - User::LeaveIfError(m_bitmap->Create(frameInfo.iOverallSizeInPixels, frameInfo.iFrameDisplayMode)); - - m_decoder->Convert(&iStatus, *m_bitmap); - } else { - m_state = EStateFinal; - - // Ignore "file does not exist" error because the image has probably - // been removed (leaves thumbnail field empty for the contact). - TRequestStatus *status = &iStatus; - User::RequestComplete(status, KErrNone); - } - SetActive(); -} - -void CntThumbnailCreator::ScaleImageL() -{ - __ASSERT_DEBUG(m_decoder, User::Panic(KPanicCategory, KPanicUnitialized)); - __ASSERT_DEBUG(m_thumbnailSize != KThumbnailSizeUninitialized, User::Panic(KPanicCategory, KPanicUnitialized)); - - TFrameInfo frameInfo = m_decoder->FrameInfo(); - - // Scale down if the image is too big - if ( frameInfo.iOverallSizeInPixels.iWidth > m_thumbnailSize.iWidth - || frameInfo.iOverallSizeInPixels.iHeight > m_thumbnailSize.iHeight) { - // Lazy instantiation - if(!m_bitmapScaler) - m_bitmapScaler = CBitmapScaler::NewL(); - m_bitmapScaler->Scale(&iStatus, *m_bitmap, m_thumbnailSize); - } else { - // No need to scale, complete request immediately - TRequestStatus *status = &iStatus; - User::RequestComplete(status, KErrNone); - } - SetActive(); -} - -void CntThumbnailCreator::EncodeImageL() -{ - delete m_imageData; - m_imageData = 0; - delete m_encoder; - m_encoder = 0; - m_encoder = CImageEncoder::DataNewL(m_imageData, CImageEncoder::EOptionNone, KImageTypeJPGUid); - m_encoder->Convert(&iStatus, *m_bitmap); - SetActive(); -} - -void CntThumbnailCreator::CreateContactFieldL() -{ - __ASSERT_DEBUG(m_imageData, User::Panic(KPanicCategory, KPanicUnitialized)); - - // Note! There is a bug in S60 Phonebook or Symbian Contact model; - // The field types must be inserted in order KUidContactFieldVCardMapJPEG, - // KUidContactFieldPicture (not the other way around), otherwise the - // thumbnail is not shown in S60 Phonebook! - CContactItemField *thumbnailField = CContactItemField::NewLC( - KStorageTypeStore, KUidContactFieldVCardMapJPEG); - thumbnailField->SetMapping(KUidContactFieldVCardMapPHOTO); - thumbnailField->AddFieldTypeL(KUidContactFieldPicture); - thumbnailField->StoreStorage()->SetThingL(*m_imageData); - QT_TRYCATCH_LEAVING(m_fieldList->append(thumbnailField)); - CleanupStack::Pop(thumbnailField); - - // Complete request to proceed to the final state - TRequestStatus *status = &iStatus; - User::RequestComplete(status, KErrNone); - SetActive(); -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformaddress.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformaddress.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,255 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformaddress.h" - -QList CntTransformAddress::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactAddress::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to address - const QContactAddress& address(static_cast(detail)); - - // create new fields with contexts - transformToTextFieldL(address, fieldList, address.country(), KUidContactFieldCountry, KUidContactFieldVCardMapCOUNTRY, true); - transformToTextFieldL(address, fieldList, address.postcode(), KUidContactFieldPostcode, KUidContactFieldVCardMapPOSTCODE, true); - transformToTextFieldL(address, fieldList, address.street(), KUidContactFieldAddress, KUidContactFieldVCardMapADR, true); - transformToTextFieldL(address, fieldList, address.locality(), KUidContactFieldLocality, KUidContactFieldVCardMapLOCALITY, true); - transformToTextFieldL(address, fieldList, address.region(), KUidContactFieldRegion, KUidContactFieldVCardMapREGION, true); - transformToTextFieldL(address, fieldList, address.postOfficeBox(), KUidContactFieldPostOffice, KUidContactFieldVCardMapPOSTOFFICE, true); - - return fieldList; -} - -QContactDetail *CntTransformAddress::transformItemField(const CContactItemField& field, const QContact &contact) -{ - QContactAddress address; - - CContactTextField* storage = field.TextStorage(); - QString addressValue = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - - int fieldTypeCount(field.ContentType().FieldTypeCount()); - for (int i = 0; i < fieldTypeCount; i++) { - //country - if (field.ContentType().FieldType(i) == KUidContactFieldCountry) { - address.setCountry(addressValue); - } - - //post code - else if (field.ContentType().FieldType(i) == KUidContactFieldPostcode) { - address.setPostcode(addressValue); - } - - //street - else if (field.ContentType().FieldType(i) == KUidContactFieldAddress) { - address.setStreet(addressValue); - } - - //locality (city) - else if (field.ContentType().FieldType(i) == KUidContactFieldLocality) { - address.setLocality(addressValue); - } - - //region - else if (field.ContentType().FieldType(i) == KUidContactFieldRegion) { - address.setRegion(addressValue); - } - - //post office box - else if (field.ContentType().FieldType(i) == KUidContactFieldPostOffice) { - address.setPostOfficeBox(addressValue); - } - else { - setContexts(field.ContentType().FieldType(i), address); - } - } - - // Find existing address details from contact - QContactDetail* detail = 0; - foreach( QContactAddress existingAddress, contact.details() ) - { - // Do not merge if contexts don't match - if( existingAddress.contexts() != address.contexts() ) - continue; - - // Merge detail with existing detail - detail = new QContactAddress( existingAddress ); - foreach( QString key, address.values().keys() ) - detail->setValue( key, address.variantValue(key) ); - break; - } - - // Create a new address detail if not merging - if( !detail ) - detail = new QContactAddress(address); - - return detail; -} - -bool CntTransformAddress::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldCountry.iUid || - fieldType == KUidContactFieldPostcode.iUid || - fieldType == KUidContactFieldAddress.iUid || - fieldType == KUidContactFieldLocality.iUid || - fieldType == KUidContactFieldRegion.iUid || - fieldType == KUidContactFieldPostOffice.iUid) { - ret = true; - } - return ret; -} - -bool CntTransformAddress::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactAddress::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformAddress::supportedSortingFieldTypes(QString detailFieldName) const -{ - QList uids; - - if( detailFieldName == QContactAddress::FieldStreet ) - return uids << KUidContactFieldAddress; - - if( detailFieldName == QContactAddress::FieldLocality ) - return uids << KUidContactFieldLocality; - - if( detailFieldName == QContactAddress::FieldRegion ) - return uids << KUidContactFieldRegion; - - if( detailFieldName == QContactAddress::FieldPostcode ) - return uids << KUidContactFieldPostcode; - - if( detailFieldName == QContactAddress::FieldCountry ) - return uids << KUidContactFieldCountry; - - if( detailFieldName == QContactAddress::FieldPostOfficeBox ) - return uids << KUidContactFieldPostOffice; - - return uids; -} - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformAddress::supportsSubType(const QString& subType) const -{ - if(QContactAddress::FieldSubTypes == subType) - return true; - else - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformAddress::getIdForField(const QString& fieldName) const -{ - - if (QContactAddress::FieldStreet == fieldName) - return KUidContactFieldAddress.iUid; - else if (QContactAddress::FieldLocality == fieldName) - return KUidContactFieldLocality.iUid; - else if (QContactAddress::FieldRegion == fieldName) - return KUidContactFieldRegion.iUid; - else if (QContactAddress::FieldPostcode == fieldName) - return KUidContactFieldPostcode.iUid; - else if (QContactAddress::FieldCountry == fieldName) - return KUidContactFieldCountry.iUid; - else if (QContactAddress::FieldPostOfficeBox == fieldName) - return KUidContactFieldPostOffice.iUid; - else if (QContactAddress::SubTypeParcel == fieldName) - return 0; - else if (QContactAddress::SubTypePostal == fieldName) - return 0; - else if (QContactAddress::SubTypeDomestic == fieldName) - return 0; - else if (QContactAddress::SubTypeInternational == fieldName) - return 0; - else - return 0; -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformAddress::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactAddress::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactAddress::DefinitionName); - QMap fields = d.fields(); - - // Don't support "ContextOther" - QContactDetailDefinitionField f; - f.setDataType(QVariant::StringList); - f.setAllowableValues(QVariantList() - << QLatin1String(QContactDetail::ContextHome) - << QLatin1String(QContactDetail::ContextWork)); - fields[QContactDetail::FieldContext] = f; - - // Sub-types not supported in symbian back-end, remove - fields.remove(QContactAddress::FieldSubTypes); - d.setFields(fields); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformanniversary.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformanniversary.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,203 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformanniversary.h" - -const char separator = ','; - -QList CntTransformAnniversary::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactAnniversary::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to anniversary - const QContactAnniversary &anniversary(static_cast(detail)); - - //create new field - QString formattedAnniversary; - if (anniversary.originalDate().isValid()) { - formattedAnniversary = anniversary.originalDate().toString(Qt::ISODate); - } - if (formattedAnniversary.length() > 0) { - formattedAnniversary.append(separator); - } - formattedAnniversary.append(anniversary.event()); - - TPtrC fieldText(reinterpret_cast(formattedAnniversary.utf16())); - CContactItemField* newField = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldAnniversary); - newField->TextStorage()->SetTextL(fieldText); - newField->SetMapping(KUidContactFieldVCardMapAnniversary); - - fieldList.append(newField); - CleanupStack::Pop(newField); - - return fieldList; -} - -QContactDetail *CntTransformAnniversary::transformItemField(const CContactItemField& field, const QContact &contact) -{ - Q_UNUSED(contact); - - QContactAnniversary *anniversary = new QContactAnniversary(); - - CContactTextField* storage = field.TextStorage(); - QString unformattedAnniversary = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - int separatorPos = unformattedAnniversary.indexOf(separator); - bool dateFound = false; - if (separatorPos != -1) { - // date is probably included - QDate date = QDate::fromString(unformattedAnniversary.left(separatorPos), Qt::ISODate); - if (date.isValid()) { - anniversary->setOriginalDate(date); - dateFound = true; - } - } - - if (dateFound) { - if (unformattedAnniversary.length()-separatorPos-1 > 0) { - anniversary->setEvent(unformattedAnniversary.right(unformattedAnniversary.length()-separatorPos-1)); - } - } - else { - anniversary->setEvent(unformattedAnniversary); - } - return anniversary; -} - -bool CntTransformAnniversary::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldAnniversary.iUid) { - ret = true; - } - return ret; -} - -bool CntTransformAnniversary::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactAnniversary::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformAnniversary::supportedSortingFieldTypes(QString /*detailFieldName*/) const -{ - // Sorting not supported - return QList(); -} - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformAnniversary::supportsSubType(const QString& subType) const -{ - if(QContactAnniversary::FieldSubType == subType) - return true; - else - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformAnniversary::getIdForField(const QString& fieldName) const -{ - if (QContactAnniversary::FieldCalendarId == fieldName) - return 0; - else if (QContactAnniversary::FieldOriginalDate == fieldName) - return 0; - else if (QContactAnniversary::FieldEvent == fieldName) - return 0; - else if (QContactAnniversary::SubTypeWedding == fieldName) - return 0; - else if (QContactAnniversary::SubTypeEngagement == fieldName) - return 0; - else if (QContactAnniversary::SubTypeHouse == fieldName) - return 0; - else if (QContactAnniversary::SubTypeEmployment == fieldName) - return 0; - else if (QContactAnniversary::SubTypeMemorial == fieldName) - return 0; - else - return 0; -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformAnniversary::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactAnniversary::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactAnniversary::DefinitionName); - QMap fields = d.fields(); - - // FieldCalendarId not supported in symbian back-end, remove - fields.remove(QContactAnniversary::FieldCalendarId); - - // Sub-types not supported in symbian back-end, remove - fields.remove(QContactAnniversary::FieldSubType); - - // Context not supported in symbian back-end, remove - fields.remove(QContactAnniversary::FieldContext); - - d.setFields(fields); - d.setUnique(true); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformanniversarysimple.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformanniversarysimple.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,159 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "CntTransformAnniversarySimple.h" - -QList CntTransformAnniversarySimple::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactAnniversary::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to anniversary - const QContactAnniversary &anniversary(static_cast(detail)); - - //create new field - TDateTime dateTime(anniversary.originalDate().year(), - TMonth(anniversary.originalDate().month() - 1), - anniversary.originalDate().day() - 1, 0, 0, 0, 0); - CContactItemField* newField = CContactItemField::NewLC(KStorageTypeDateTime, KUidContactFieldAnniversary); - newField->DateTimeStorage()->SetTime(dateTime); - newField->SetMapping(KUidContactFieldVCardMapAnniversary); - - fieldList.append(newField); - CleanupStack::Pop(newField); - - return fieldList; -} - -QContactDetail *CntTransformAnniversarySimple::transformItemField(const CContactItemField& field, const QContact &contact) -{ - Q_UNUSED(contact); - - QContactAnniversary *anniversary = new QContactAnniversary(); - - CContactDateField* storage = field.DateTimeStorage(); - TTime time(storage->Time()); - QDate qDate(time.DateTime().Year(), time.DateTime().Month() + 1, time.DateTime().Day() + 1); - anniversary->setOriginalDate(qDate); - - return anniversary; -} - -bool CntTransformAnniversarySimple::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldAnniversary.iUid) { - ret = true; - } - return ret; -} - -bool CntTransformAnniversarySimple::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactAnniversary::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformAnniversarySimple::supportedSortingFieldTypes(QString /*detailFieldName*/) const -{ - // Sorting not supported - return QList(); -} - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformAnniversarySimple::supportsSubType(const QString& /*subType*/) const -{ - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformAnniversarySimple::getIdForField(const QString& /*fieldName*/) const -{ - return 0; -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformAnniversarySimple::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactAnniversary::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactAnniversary::DefinitionName); - QMap fields = d.fields(); - - // Following fields not supported in symbian (pre-10.1) back-end, remove - fields.remove(QContactAnniversary::FieldCalendarId); - fields.remove(QContactAnniversary::FieldEvent); - - // Sub-types not supported in symbian back-end, remove - fields.remove(QContactAnniversary::FieldSubType); - - // Context not supported in symbian back-end, remove - fields.remove(QContactAnniversary::FieldContext); - - d.setFields(fields); - d.setUnique(true); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformavatar.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformavatar.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,211 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformavatar.h" -#include "cntmodelextuids.h" - -QList CntTransformAvatar::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactAvatar::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to avatar - const QContactAvatar &avatar(static_cast(detail)); - - - //create new field - TPtrC fieldText(reinterpret_cast(avatar.avatar().utf16())); - - if(fieldText.Length()) { - //supported subTypes - const QString& subTypeImage(QContactAvatar::SubTypeImage); - const QString& subTypeAudioRingtone(QContactAvatar::SubTypeAudioRingtone); - const QString& subTypeVideoRingtone(QContactAvatar::SubTypeVideoRingtone); - - QString subType = avatar.subType(); - TUid uid(KNullUid); - if(subType.isEmpty()) { - uid = KUidContactFieldCodImage; - } else if (subType.compare(subTypeImage) == 0) { - uid = KUidContactFieldCodImage; - } else if (subType.compare(subTypeAudioRingtone) == 0) { - uid = KUidContactFieldRingTone; - } else if (subType.compare(subTypeVideoRingtone) == 0) { - uid = KUidContactFieldVideoRingTone; - } else { - User::LeaveIfError(KErrNotSupported); - } - CContactItemField* newField = CContactItemField::NewLC(KStorageTypeText, uid); - - newField->SetMapping(KUidContactFieldVCardMapUnknown); - newField->TextStorage()->SetTextL(fieldText); - - fieldList.append(newField); - CleanupStack::Pop(newField); - } - - return fieldList; -} - -QContactDetail *CntTransformAvatar::transformItemField(const CContactItemField& field, const QContact &contact) -{ - Q_UNUSED(contact); - - QContactAvatar *avatar = new QContactAvatar(); - - CContactTextField* storage = field.TextStorage(); - QString avatarString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - avatar->setAvatar(avatarString); - - if (field.ContentType().ContainsFieldType(KUidContactFieldCodImage)) { - avatar->setSubType(QContactAvatar::SubTypeImage); - } - else if (field.ContentType().ContainsFieldType(KUidContactFieldRingTone)) { - avatar->setSubType(QContactAvatar::SubTypeAudioRingtone); - } - else if (field.ContentType().ContainsFieldType(KUidContactFieldVideoRingTone)) { - avatar->setSubType(QContactAvatar::SubTypeVideoRingtone); - } - - return avatar; -} - -bool CntTransformAvatar::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldCodImage.iUid || - fieldType == KUidContactFieldRingTone.iUid || - fieldType == KUidContactFieldVideoRingTone.iUid) { - ret = true; - } - return ret; -} - -bool CntTransformAvatar::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactAvatar::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformAvatar::supportedSortingFieldTypes(QString /*detailFieldName*/) const -{ - // Sorting not supported - return QList(); -} - - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformAvatar::supportsSubType(const QString& subType) const -{ - if(QContactAvatar::FieldSubType == subType) - return true; - else - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformAvatar::getIdForField(const QString& fieldName) const -{ - if (QContactAvatar::FieldAvatar == fieldName) - return 0; - else if (QContactAvatar::SubTypeImage == fieldName) - return 0; - else if (QContactAvatar::SubTypeVideo == fieldName) - return 0; - else if (QContactAvatar::SubTypeTexturedMesh == fieldName) - return 0; - else if (QContactAvatar::SubTypeAudioRingtone == fieldName) - return 0; - else if (QContactAvatar::SubTypeVideoRingtone == fieldName) - return 0; - else - return 0; -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformAvatar::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactAvatar::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactAvatar::DefinitionName); - QMap fields = d.fields(); - - // Update sub-types - QContactDetailDefinitionField f; - f.setDataType(QVariant::String); // only allowed to be a single subtype - f.setAllowableValues(QVariantList() - << QString(QLatin1String(QContactAvatar::SubTypeImage)) - << QString(QLatin1String(QContactAvatar::SubTypeAudioRingtone)) - << QString(QLatin1String(QContactAvatar::SubTypeVideoRingtone))); - fields.insert(QContactAvatar::FieldSubType, f); - - // Context not supported in symbian back-end, remove - fields.remove(QContactAvatar::FieldContext); - - d.setFields(fields); - d.setUnique(true); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformavatarsimple.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformavatarsimple.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,270 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformavatarsimple.h" -#include "cntthumbnailcreator.h" -#include "cntsymbiantransformerror.h" - -// S60 specific contact field type containing image call object data -#define KUidContactFieldCodImageValue 0x101F8841 -const TUid KUidContactFieldCodImage={KUidContactFieldCodImageValue}; -// Extra field that is defined in TB10.1 platform for video ring tone -#define KUidContactFieldVideoRingToneValue 0x200100E5 -const TUid KUidContactFieldVideoRingTone={KUidContactFieldVideoRingToneValue}; -// The max. size of the thumbnail image that is saved into contacts database -const TSize KMaxThumbnailSize(80, 96); - -QList CntTransformAvatarSimple::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactAvatar::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to avatar - const QContactAvatar &avatar(static_cast(detail)); - - //create new field - TPtrC fieldText(reinterpret_cast(avatar.avatar().utf16())); - - //copy filename and replace slash with a backslash - TFileName filename; - for(TInt i(0); i < fieldText.Length(); i++) { - if(i >= filename.MaxLength()) - User::Leave(KErrTooBig); - if(fieldText[i] == '/') { - filename.Append('\\'); - } else { - filename.Append(fieldText[i]); - } - } - - if(filename.Length()) { - const QString& subTypeImage(QContactAvatar::SubTypeImage); - const QString& subTypeAudioRingtone(QContactAvatar::SubTypeAudioRingtone); - const QString& subTypeVideoRingtone(QContactAvatar::SubTypeVideoRingtone); - - QString subType = avatar.subType(); - TUid uid(KNullUid); - // Default to SubTypeImage - if(subType.isEmpty() || subType.compare(subTypeImage) == 0) { - uid = KUidContactFieldCodImage; - } else if (subType.compare(subTypeAudioRingtone) == 0) { - uid = KUidContactFieldRingTone; - } else if (subType.compare(subTypeVideoRingtone) == 0) { - uid = KUidContactFieldVideoRingTone; - } else { - User::LeaveIfError(KErrNotSupported); - } - CContactItemField* newField = CContactItemField::NewLC(KStorageTypeText, uid); - - newField->SetMapping(KUidContactFieldVCardMapUnknown); - newField->TextStorage()->SetTextL(filename); - - fieldList.append(newField); - CleanupStack::Pop(newField); - } - - if(!avatar.pixmap().isNull()) { - CntThumbnailCreator* creator = new (ELeave) CntThumbnailCreator(); - CleanupStack::PushL(creator); - - // Scaling is done before converting to CFbsBitmap because - // toSymbianCFbsBitmap may generate a duplicate of the bitmap data - // Note: scaling to thumbnail may take some time if the image is big - // TODO: aspect ratio? - QPixmap scaled = avatar.pixmap().scaled(KMaxThumbnailSize.iWidth, KMaxThumbnailSize.iHeight); - CFbsBitmap* bitmap = scaled.toSymbianCFbsBitmap(); - CleanupStack::PushL(bitmap); - - creator->addThumbnailFieldL(&fieldList, bitmap, KMaxThumbnailSize); - //creator->addThumbnailFieldL(&fieldList, _L("C:\\data\\Images\\contact.jpg"), KMaxThumbnailSize); - CleanupStack::Pop(bitmap); // ownership transferred - CleanupStack::PopAndDestroy(creator); - } - - return fieldList; -} - -QContactDetail *CntTransformAvatarSimple::transformItemField(const CContactItemField& field, const QContact &contact) -{ - Q_UNUSED(contact); - QContactAvatar *avatar = new QContactAvatar(); - - if (field.ContentType().ContainsFieldType(KUidContactFieldCodImage)) { - CContactTextField* storage = field.TextStorage(); - QString avatarString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - avatar->setAvatar(avatarString); - avatar->setSubType(QContactAvatar::SubTypeImage); - } else if (field.ContentType().ContainsFieldType(KUidContactFieldRingTone)) { - CContactTextField* storage = field.TextStorage(); - QString avatarString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - avatar->setAvatar(avatarString); - avatar->setSubType(QContactAvatar::SubTypeAudioRingtone); - } else if (field.ContentType().ContainsFieldType(KUidContactFieldPicture)) { - // use the existing QContactAvatar (if available) in case of a pixmap - // field. - delete avatar; - avatar = 0; - avatar = new QContactAvatar(contact.detail()); - CContactStoreField* storage = field.StoreStorage(); - QPixmap pixmap; - HBufC8 *theThing = storage->Thing(); - QByteArray bytes((char*)theThing->Ptr(), theThing->Length()); - bool loaded = pixmap.loadFromData(bytes, "JPG"); - if (loaded) { - avatar->setPixmap(pixmap); - } else { - User::Leave(KErrInvalidContactDetail); - } - } - else if (field.ContentType().ContainsFieldType(KUidContactFieldVideoRingTone)) { - CContactTextField* storage = field.TextStorage(); - QString avatarString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - avatar->setAvatar(avatarString); - avatar->setSubType(QContactAvatar::SubTypeVideoRingtone); - } - - return avatar; -} - -bool CntTransformAvatarSimple::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldCodImage.iUid - || fieldType == KUidContactFieldRingTone.iUid - || fieldType == KUidContactFieldVideoRingTone.iUid - || fieldType == KUidContactFieldPicture.iUid - // Used as "extra mapping/extra field type" by thumbnail data fields - || fieldType == KUidContactFieldVCardMapJPEG.iUid) { - ret = true; - } - return ret; -} - -bool CntTransformAvatarSimple::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactAvatar::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformAvatarSimple::supportedSortingFieldTypes(QString /*detailFieldName*/) const -{ - // Sorting not supported - return QList(); -} - - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformAvatarSimple::supportsSubType(const QString& subType) const -{ - if(QContactAvatar::FieldSubType == subType) - return true; - else - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformAvatarSimple::getIdForField(const QString& fieldName) const -{ - if (QContactAvatar::FieldAvatar == fieldName) - return 0; - else if (QContactAvatar::SubTypeImage == fieldName) - return 0; - else if (QContactAvatar::SubTypeVideo == fieldName) - return 0; - else if (QContactAvatar::SubTypeTexturedMesh == fieldName) - return 0; - else if (QContactAvatar::SubTypeAudioRingtone == fieldName) - return 0; - else if (QContactAvatar::SubTypeVideoRingtone == fieldName) - return 0; - else - return 0; -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformAvatarSimple::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactAvatar::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactAvatar::DefinitionName); - QMap fields = d.fields(); - - // Update sub-types - QContactDetailDefinitionField f; - f.setDataType(QVariant::String); // only allowed to be a single subtype - f.setAllowableValues(QVariantList() - << QString(QLatin1String(QContactAvatar::SubTypeImage)) - << QString(QLatin1String(QContactAvatar::SubTypeAudioRingtone)) - << QString(QLatin1String(QContactAvatar::SubTypeVideoRingtone))); - fields.insert(QContactAvatar::FieldSubType, f); - - // Context not supported in symbian back-end, remove - fields.remove(QContactAvatar::FieldContext); - - d.setFields(fields); - d.setUnique(true); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformbirthday.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformbirthday.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,156 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformbirthday.h" - -QList CntTransformBirthday::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactBirthday::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to birthday - const QContactBirthday &birthday(static_cast(detail)); - - //create new field - TDateTime dateTime(birthday.date().year(), TMonth(birthday.date().month() - 1), birthday.date().day() - 1, 0, 0, 0, 0); - CContactItemField* newField = CContactItemField::NewLC(KStorageTypeDateTime, KUidContactFieldBirthday); - newField->DateTimeStorage()->SetTime(dateTime); - newField->SetMapping(KUidContactFieldVCardMapBDAY); - - fieldList.append(newField); - CleanupStack::Pop(newField); - - return fieldList; -} - -QContactDetail *CntTransformBirthday::transformItemField(const CContactItemField& field, const QContact &contact) -{ - Q_UNUSED(contact); - - QContactBirthday *birthday = new QContactBirthday(); - - CContactDateField* storage = field.DateTimeStorage(); - TTime time(storage->Time()); - QDate qDate(time.DateTime().Year(), time.DateTime().Month() + 1, time.DateTime().Day() + 1); - birthday->setDate(qDate); - - return birthday; -} - -bool CntTransformBirthday::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldBirthday.iUid) { - ret = true; - } - return ret; -} - -bool CntTransformBirthday::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactBirthday::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformBirthday::supportedSortingFieldTypes(QString detailFieldName) const -{ - QList uids; - if( detailFieldName == QContactBirthday::FieldBirthday ) - uids << KUidContactFieldBirthday; - return uids; -} - - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformBirthday::supportsSubType(const QString& subType) const -{ - Q_UNUSED(subType); - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformBirthday::getIdForField(const QString& fieldName) const -{ - if (QContactBirthday::FieldBirthday == fieldName) - return KUidContactFieldBirthday.iUid; - else - return 0; -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformBirthday::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactBirthday::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactBirthday::DefinitionName); - QMap fields = d.fields(); - - // Context not supported in symbian back-end, remove - fields.remove(QContactBirthday::FieldContext); - - d.setFields(fields); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformcontact.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformcontact.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,461 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "cnttransformcontact.h" - -#include "cnttransformname.h" -#include "cnttransformnickname.h" -#include "cnttransformphonenumber.h" -#include "cnttransformemail.h" -#include "cnttransformurl.h" -#include "cnttransformaddress.h" -#include "cnttransformbirthday.h" -#include "cnttransformonlineaccount.h" -#include "cnttransformorganisation.h" -#include "cnttransformavatar.h" -#include "cnttransformavatarsimple.h" -#include "cnttransformsynctarget.h" -#include "cnttransformgender.h" -#include "cnttransformanniversary.h" -#include "cnttransformanniversarysimple.h" -#include "cnttransformgeolocation.h" -#include "cnttransformnote.h" -#include "cnttransformfamily.h" -#include "cnttransformempty.h" -#include "cntsymbiantransformerror.h" - -#include -#include -#include -#include -#include -#include // explicitly included because of KUidContactFieldGEOValue - -#include - -//UIDs for preferred (default) fields -const int KDefaultFieldForCall = 0x10003E70; -const int KDefaultFieldForVideoCall = 0x101F85A6; -const int KDefaultFieldForEmail = 0x101F85A7; -const int KDefaultFieldForMessage = 0x101f4cf1; - -CntTransformContact::CntTransformContact() -{ - initializeCntTransformContactData(); -} - -CntTransformContact::~CntTransformContact() -{ - QMap::iterator itr; - - for (itr = m_transformContactData.begin(); itr != m_transformContactData.end(); ++itr) - { - CntTransformContactData* value = itr.value(); - delete value; - value = 0; - } -} - -void CntTransformContact::initializeCntTransformContactData() -{ - //These can be added to normal list, if we loop through it. - m_transformContactData.insert(Name, new CntTransformName); - m_transformContactData.insert(Nickname, new CntTransformNickname); - m_transformContactData.insert(PhoneNumber, new CntTransformPhoneNumber); - m_transformContactData.insert(EmailAddress, new CntTransformEmail); - m_transformContactData.insert(Address, new CntTransformAddress); - m_transformContactData.insert(URL, new CntTransformUrl); - m_transformContactData.insert(Birthday, new CntTransformBirthday); - m_transformContactData.insert(Organisation, new CntTransformOrganisation); - m_transformContactData.insert(SyncTarget, new CntTransformSyncTarget); - m_transformContactData.insert(Note, new CntTransformNote); - m_transformContactData.insert(Family, new CntTransformFamily); - -#ifdef SYMBIAN_BACKEND_USE_SQLITE - // variated transform classes - m_transformContactData.insert(Avatar, new CntTransformAvatar); - m_transformContactData.insert(Anniversary, new CntTransformAnniversary); - - // not supported on pre-10.1 - m_transformContactData.insert(Geolocation, new CntTransformGeolocation); - m_transformContactData.insert(Gender, new CntTransformGender); - - // Causes a "CPbk2ContactEdit.. 2" panic in Phonebook2 contact editor - // Although IMPP field is supported on some pre 10.1 platforms (newer - // 3.2.3 and 5.0 releases), it may be safer not to include online account - // at all. - m_transformContactData.insert(OnlineAccount, new CntTransformOnlineAccount); - -#else - // Empty transform class for removing unsupported detail definitions - m_transformContactData.insert(Empty, new CntTransformEmpty); - - // variated transform classes - m_transformContactData.insert(Anniversary, new CntTransformAnniversarySimple); - m_transformContactData.insert(Avatar, new CntTransformAvatarSimple); -#endif -} - -/*! - * Converts Symbian contact item to QContact. Note that the contact is not - * saved into contacts database so the details that require contact to exist - * in the database are not transformed. Use transformPostSaveDetailsL to - * transform those details after the contact item has been saved. - * \param contact A reference to a symbian contact item to be converted. - * \return Qt Contact - */ -QContact CntTransformContact::transformContactL(CContactItem &contact) const -{ - // Create a new QContact - QContact newQtContact; - - // set the corect type - if (contact.Type() == KUidContactGroup) - { - newQtContact.setType(QContactType::TypeGroup); - } - else - { - newQtContact.setType(QContactType::TypeContact); - } - - // Iterate through the CContactItemFieldSet, creating - // new fields for the QContact - CContactItemFieldSet& fields(contact.CardFields()); - - const int numFields(fields.Count()); - - for(int i(0); i < numFields; ++i) - { - QContactDetail *detail = transformItemField( fields[i], newQtContact ); - - if(detail) - { - newQtContact.saveDetail(detail); - transformPreferredDetail(fields[i], *detail, newQtContact); - delete detail; - detail = 0; - } - } - - return newQtContact; -} - -/*! - * Transforms details that are not available until the CContactItem has been - * saved into contacts database. - */ -void CntTransformContact::transformPostSaveDetailsL( - const CContactItem& contactItem, - QContact& contact, - const CContactDatabase &contactDatabase, - QString managerUri) const -{ - // Id - QContactId contactId; - contactId.setLocalId(contactItem.Id()); - contactId.setManagerUri(managerUri); - contact.setId(contactId); - - // GUID - QContactDetail *detailUid = transformGuidItemFieldL(contactItem, contactDatabase); - if(detailUid) - { - // replace detail - QList guids = contact.details(QContactGuid::DefinitionName); - for(int i(0); i < guids.count(); i++) { - QContactGuid guidDetail = guids[i]; - contact.removeDetail(&guidDetail); - } - contact.saveDetail(detailUid); - delete detailUid; - detailUid = 0; - } - - // Timestamp - QContactDetail *detailTimestamp = transformTimestampItemFieldL(contactItem, contactDatabase); - if(detailTimestamp) - { - // replace detail - QList timestamps = contact.details(QContactTimestamp::DefinitionName); - for(int i(0); i < timestamps.count(); i++) { - QContactTimestamp timestampDetail = timestamps[i]; - contact.removeDetail(×tampDetail); - } - contact.saveDetail(detailTimestamp); - delete detailTimestamp; - detailTimestamp = 0; - } -} - -/*! CntTransform a QContact into a Symbian CContactItem. - * This will convert all supported fields to the CContactItem format. - * - * \param contact A reference to a QContact to be converted. - * \param contactItem A reference to the CContactItem to add the fields to. -*/ -void CntTransformContact::transformContactL( - QContact &contact, - CContactItem &contactItem) const -{ - //Create a new fieldSet - CContactItemFieldSet *fieldSet = CContactItemFieldSet::NewLC(); - - // Copy all fields to the Symbian contact. - QList detailList(contact.details()); - - // Iterate through the contact details in the QContact - const int detailCount(detailList.count()); - - for(int i(0); i < detailCount; ++i) - { - QScopedPointer detail(new QContactDetail(detailList.at(i))); - if (!detail->isEmpty()) { - QString detailName = detail->definitionName(); - QList fieldList = transformDetailL(*detail); - int fieldCount = fieldList.count(); - - // save preferred detail - transformPreferredDetailL(contact, detailList.at(i), fieldList); - - for (int j = 0; j < fieldCount; j++) - { - //Add field to fieldSet - fieldSet->AddL(*fieldList.at(j)); - } - } - } - - contactItem.UpdateFieldSet(fieldSet); - CleanupStack::Pop(fieldSet); -} - -QList CntTransformContact::supportedSortingFieldTypes( QString detailDefinitionName, QString detailFieldName ) -{ - QList uids; - QMap::const_iterator i = m_transformContactData.constBegin(); - while (i != m_transformContactData.constEnd()) { - if (i.value()->supportsDetail(detailDefinitionName)) { - uids = i.value()->supportedSortingFieldTypes(detailFieldName); - if( uids.count() ) - break; - } - ++i; - } - return uids; -} - -TUint32 CntTransformContact::GetIdForDetailL(const QContactDetailFilter& detailFilter, bool& isSubtype) const - { - isSubtype = false; - QString defnitionName = detailFilter.detailDefinitionName(); - QString fieldName = detailFilter.detailFieldName(); - QString fieldValue = detailFilter.value().toString(); - quint32 fieldId = 0; - - QMap::const_iterator i = m_transformContactData.constBegin(); - while (i != m_transformContactData.constEnd()) { - - if (i.value()->supportsDetail(defnitionName)){ - // This definition is supported, - // so check if there is a subtype defined - - if (i.value()->supportsSubType(fieldName)){ - - // subtype supported, so value contains the field to be checked - fieldId = i.value()->getIdForField(fieldValue); - isSubtype = true; - - } else { - // subtype not supported, so field itself should be passed - fieldId = i.value()->getIdForField(fieldName); - isSubtype = false; - } - - break; - } - ++i; - } - return fieldId; - - } - -void CntTransformContact::detailDefinitions( - QMap& defaultSchema, - const QString& contactType, - QContactManager::Error& error) const -{ - Q_UNUSED(error); - - // Ask leaf classes to do the modifications required to the default schema - QMap::const_iterator i = m_transformContactData.constBegin(); - while (i != m_transformContactData.constEnd()) { - i.value()->detailDefinitions(defaultSchema, contactType); - i++; - } -} - -QList CntTransformContact::transformDetailL(const QContactDetail &detail) const -{ - QList itemFieldList; - QScopedPointer detailName(new QString(detail.definitionName())); - - QMap::const_iterator i = m_transformContactData.constBegin(); - while (i != m_transformContactData.constEnd()) { - if (i.value()->supportsDetail(*detailName)) { - itemFieldList = i.value()->transformDetailL(detail); - break; - } - ++i; - } - return itemFieldList; -} - -QContactDetail *CntTransformContact::transformItemField(const CContactItemField& field, const QContact &contact) const -{ - QContactDetail *detail(0); - TUint32 fieldType(field.ContentType().FieldType(0).iUid); - - QMap::const_iterator i = m_transformContactData.constBegin(); - while (i != m_transformContactData.constEnd()) { - if (i.value()->supportsField(fieldType)) { - detail = i.value()->transformItemField(field, contact); - break; - } - ++i; - } - - return detail; -} - -QContactDetail* CntTransformContact::transformGuidItemFieldL(const CContactItem &contactItem, const CContactDatabase &contactDatabase) const -{ - QContactGuid *guidDetail = 0; - QString guid = QString::fromUtf16(contactItem.UidStringL(contactDatabase.MachineId()).Ptr(), - contactItem.UidStringL(contactDatabase.MachineId()).Length()); - if (guid.length() > 0) - { - guidDetail = new QContactGuid(); - guidDetail->setGuid(guid); - } - return guidDetail; -} - -QContactDetail* CntTransformContact::transformTimestampItemFieldL(const CContactItem &contactItem, const CContactDatabase &contactDatabase) const -{ - QContactTimestamp *timestampDetail = 0; - - // NOTE: In S60 3.1 we cannot use ContactGuid::GetCreationDate() because - // it is not exported. - // TODO: Make sure SYMBIAN_CNTMODEL_V2 is the right flag for this. -#ifdef SYMBIAN_CNTMODEL_V2 - HBufC* guidBuf = contactItem.UidStringL(contactDatabase.MachineId()).AllocLC(); - TPtr ptr = guidBuf->Des(); - if (ContactGuid::GetCreationDate(ptr, contactDatabase.MachineId())) - { - if (ptr.Length() > 0) - { - TLex lex(ptr); - TInt64 timeValue; - if (lex.Val(timeValue, EHex) == 0) - { - timestampDetail = new QContactTimestamp(); - - //creation date - TTime timeCreation(timeValue); - TDateTime dateCreation = timeCreation.DateTime(); - QDate qDateCreation(dateCreation.Year(), dateCreation.Month() + 1, dateCreation.Day() + 1); - QTime qTimeCreation(dateCreation.Hour(), dateCreation.Minute(), dateCreation.Second(), dateCreation.MicroSecond()/1000); - QDateTime qDateTimeCreation(qDateCreation, qTimeCreation); - timestampDetail->setCreated(qDateTimeCreation); - - //last modified date - TTime timeModified = contactItem.LastModified(); - TDateTime dateModified = timeModified.DateTime(); - QDate qDateModified(dateModified.Year(), dateModified.Month() + 1, dateModified.Day() + 1); - QTime qTimeModified(dateModified.Hour(), dateModified.Minute(), dateModified.Second(), dateModified.MicroSecond()/1000); - QDateTime qDateTimeModified(qDateModified, qTimeModified); - timestampDetail->setLastModified(qDateTimeModified); - } - } - } - CleanupStack::PopAndDestroy(guidBuf); -#endif - return timestampDetail; -} - -void CntTransformContact::transformPreferredDetailL(const QContact& contact, - const QContactDetail& detail, QList &fieldList) const -{ - if (fieldList.count() == 0) { - return; - } - - if (contact.isPreferredDetail("call", detail)) { - fieldList.at(0)->AddFieldTypeL(TFieldType::Uid(KDefaultFieldForCall)); - } - if (contact.isPreferredDetail("email", detail)) { - fieldList.at(0)->AddFieldTypeL(TFieldType::Uid(KDefaultFieldForEmail)); - } - if (contact.isPreferredDetail("videocall", detail)) { - fieldList.at(0)->AddFieldTypeL(TFieldType::Uid(KDefaultFieldForVideoCall)); - } - if (contact.isPreferredDetail("message", detail)) { - fieldList.at(0)->AddFieldTypeL(TFieldType::Uid(KDefaultFieldForMessage)); - } -} - -void CntTransformContact::transformPreferredDetail(const CContactItemField& field, - const QContactDetail& detail, QContact& contact) const -{ - if (field.ContentType().ContainsFieldType(TFieldType::Uid(KDefaultFieldForCall))) { - contact.setPreferredDetail("call", detail); - } - if (field.ContentType().ContainsFieldType(TFieldType::Uid(KDefaultFieldForEmail))) { - contact.setPreferredDetail("email", detail); - } - if (field.ContentType().ContainsFieldType(TFieldType::Uid(KDefaultFieldForVideoCall))) { - contact.setPreferredDetail("videocall", detail); - } - if (field.ContentType().ContainsFieldType(TFieldType::Uid(KDefaultFieldForMessage))) { - contact.setPreferredDetail("message", detail); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformcontactdata.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformcontactdata.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,102 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "cnttransformcontactdata.h" - -/*! - * Generic implementation for adding a new text field with one field type for - * the given detail value. The field type (fieldTypeUid) and vcard mapping are - * defined by the caller. - * \a detail The detail being transformed. - * \a fieldList On return, contains the created contact item field. - * \a detailValue The detail value to be transformed. If empty, - * \a fieldTypeUid The UID of the field type. - * \a vcardMapping The VCard mapping of the field's content type. - * \a setContext Set to true to enable defining context for the field, set to - * false to disable context. - */ -void CntTransformContactData::transformToTextFieldL( - const QContactDetail &detail, - QList &fieldList, - const QString &detailValue, - const TUid fieldTypeUid, - const TUid vcardMapping, - const bool setContext) -{ - TPtrC value(reinterpret_cast(detailValue.utf16())); - if(value.Length()) { - CContactItemField* itemField = CContactItemField::NewLC(KStorageTypeText, fieldTypeUid); - itemField->TextStorage()->SetTextL(value); - itemField->SetMapping(vcardMapping); - if(setContext) - setContextsL(detail, *itemField); - fieldList.append(itemField); - CleanupStack::Pop(itemField); - } -} - -void CntTransformContactData::setContexts(const TUid &fieldType, QContactDetail &detail) -{ - if (fieldType == KUidContactFieldVCardMapHOME) - { - detail.setContexts(QContactDetail::ContextHome); - } - - else if (fieldType == KUidContactFieldVCardMapWORK) - { - detail.setContexts(QContactDetail::ContextWork); - } -} - -void CntTransformContactData::setContextsL(const QContactDetail &detail, CContactItemField &field) -{ - QStringList contexts = detail.contexts(); - - //only first context in the array is taken into account - if (contexts.count() > 0) { - if (contexts.at(0) == QContactDetail::ContextHome ) { - field.AddFieldTypeL(KUidContactFieldVCardMapHOME); - } - else if (contexts.at(0) == QContactDetail::ContextWork ) { - field.AddFieldTypeL(KUidContactFieldVCardMapWORK); - } - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformemail.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformemail.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,158 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformemail.h" - -QList CntTransformEmail::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactEmailAddress::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to email - const QContactEmailAddress &email(static_cast(detail)); - - //create new field with contexts - transformToTextFieldL(email, fieldList, email.emailAddress(), KUidContactFieldEMail, KUidContactFieldVCardMapEMAILINTERNET, true); - - return fieldList; -} - -QContactDetail *CntTransformEmail::transformItemField(const CContactItemField& field, const QContact &contact) -{ - Q_UNUSED(contact); - - QContactEmailAddress *email = new QContactEmailAddress(); - - CContactTextField* storage = field.TextStorage(); - QString emailAddress = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - - email->setEmailAddress(emailAddress); - - for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) - { - setContexts(field.ContentType().FieldType(i), *email); - } - - return email; -} - -bool CntTransformEmail::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldEMail.iUid) { - ret = true; - } - return ret; -} - -bool CntTransformEmail::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactEmailAddress::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformEmail::supportedSortingFieldTypes(QString detailFieldName) const -{ - QList uids; - if( detailFieldName == QContactEmailAddress::FieldEmailAddress ) - uids << KUidContactFieldEMail; - return uids; -} - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformEmail::supportsSubType(const QString& subType) const -{ - Q_UNUSED(subType); - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformEmail::getIdForField(const QString& fieldName) const -{ - if (QContactEmailAddress::FieldEmailAddress == fieldName) - return KUidContactFieldEMail.iUid; - else - return 0; -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformEmail::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactEmailAddress::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactEmailAddress::DefinitionName); - QMap fields = d.fields(); - - // Don't support "ContextOther" - QContactDetailDefinitionField f; - f.setDataType(QVariant::StringList); - f.setAllowableValues(QVariantList() - << QLatin1String(QContactDetail::ContextHome) - << QLatin1String(QContactDetail::ContextWork)); - fields[QContactDetail::FieldContext] = f; - d.setFields(fields); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformempty.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformempty.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,120 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformempty.h" -#include "cntmodelextuids.h" - -QList CntTransformEmpty::transformDetailL(const QContactDetail &detail) -{ - Q_UNUSED(detail); - QList fieldList; - return fieldList; -} - -QContactDetail *CntTransformEmpty::transformItemField(const CContactItemField& field, const QContact &contact) -{ - Q_UNUSED(field); - Q_UNUSED(contact); - return new QContactDetail(); -} - -bool CntTransformEmpty::supportsField(TUint32 fieldType) const -{ - Q_UNUSED(fieldType); - return false; -} - -bool CntTransformEmpty::supportsDetail(QString detailName) const -{ - Q_UNUSED(detailName); - return false; -} - -QList CntTransformEmpty::supportedSortingFieldTypes(QString detailFieldName) const -{ - Q_UNUSED(detailFieldName); - QList uids; - return uids; -} - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformEmpty::supportsSubType(const QString& subType) const -{ - Q_UNUSED(subType); - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformEmpty::getIdForField(const QString& fieldName) const -{ - Q_UNUSED(fieldName); - return 0; -} - -/*! - * Removes detail definitions of the details that are not supported in legacy - * S60 platforms. - * - * \a definitions On return, the supported detail definitions have been added. - */ -void CntTransformEmpty::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactGender::DefinitionName)) { - definitions.remove(QContactGender::DefinitionName); - } - if(definitions.contains(QContactGeolocation::DefinitionName)) { - definitions.remove(QContactGeolocation::DefinitionName); - } - if(definitions.contains(QContactOnlineAccount::DefinitionName)) { - definitions.remove(QContactOnlineAccount::DefinitionName); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformfamily.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformfamily.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,167 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformfamily.h" - -QList CntTransformFamily::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactFamily::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to family - const QContactFamily &family(static_cast(detail)); - - //create new fields without contexts - transformToTextFieldL(family, fieldList, family.spouse(), KUidContactFieldSpouse, KUidContactFieldVCardMapSpouse, false); - foreach(QString childName, family.children()) { - transformToTextFieldL(family, fieldList, childName, KUidContactFieldChildren, KUidContactFieldVCardMapChildren, false); - } - - return fieldList; -} - -QContactDetail *CntTransformFamily::transformItemField(const CContactItemField& field, const QContact &contact) -{ - QContactFamily *family = new QContactFamily(contact.detail()); - - CContactTextField* storage = field.TextStorage(); - QString familyString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - - for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) { - //Spouse - if (field.ContentType().FieldType(i) == KUidContactFieldSpouse) { - family->setSpouse(familyString); - } - - //Children - else if (field.ContentType().FieldType(i) == KUidContactFieldChildren) { - QStringList childrenList = family->children(); - childrenList.append(familyString); - family->setChildren(childrenList); - } - } - - return family; -} - -bool CntTransformFamily::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldSpouse.iUid || - fieldType == KUidContactFieldChildren.iUid) { - ret = true; - } - return ret; -} - -bool CntTransformFamily::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactFamily::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformFamily::supportedSortingFieldTypes(QString /*detailFieldName*/) const -{ - // Sorting not supported - return QList(); -} - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformFamily::supportsSubType(const QString& subType) const -{ - Q_UNUSED(subType); - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformFamily::getIdForField(const QString& fieldName) const -{ - if (QContactFamily::FieldSpouse == fieldName) - return KUidContactFieldSpouse.iUid; - else if (QContactFamily::FieldChildren == fieldName) - return KUidContactFieldChildren.iUid; - else - return 0; -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformFamily::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - // Note: Family is not defined in the default schema - QMap fields; - QContactDetailDefinitionField f; - QContactDetailDefinition d; - - d.setName(QContactFamily::DefinitionName); - f.setDataType(QVariant::String); - f.setAllowableValues(QVariantList()); - fields.insert(QContactFamily::FieldSpouse, f); - f.setDataType(QVariant::StringList); - fields.insert(QContactFamily::FieldChildren, f); - - d.setFields(fields); - d.setUnique(true); - - definitions.insert(d.name(), d); -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformgender.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformgender.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,156 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformgender.h" -#include "cntmodelextuids.h" - -QList CntTransformGender::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactGender::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to gender - const QContactGender &gender(static_cast(detail)); - - //create new field without contexts - transformToTextFieldL(gender, fieldList, gender.gender(), KUidContactFieldGender, KUidContactFieldVCardMapUnknown, false); - - return fieldList; -} - -QContactDetail *CntTransformGender::transformItemField(const CContactItemField& field, const QContact &contact) -{ - Q_UNUSED(contact); - - QContactGender *gender = new QContactGender(); - - CContactTextField* storage = field.TextStorage(); - QString genderInfo = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - - gender->setGender(genderInfo); - return gender; -} - -bool CntTransformGender::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldGender.iUid) { - ret = true; - } - return ret; -} - -bool CntTransformGender::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactGender::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformGender::supportedSortingFieldTypes(QString detailFieldName) const -{ - QList uids; - if( detailFieldName == QContactGender::FieldGender ) - uids << KUidContactFieldGender; - return uids; -} - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformGender::supportsSubType(const QString& subType) const -{ - Q_UNUSED(subType); - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformGender::getIdForField(const QString& fieldName) const -{ -if (QContactGender::FieldGender == fieldName) - return KUidContactFieldGender.iUid; - else if (QContactGender::GenderMale == fieldName) - return 0; - else if (QContactGender::GenderFemale == fieldName) - return 0; - else if (QContactGender::GenderUnspecified == fieldName) - return 0; - else - return 0; -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformGender::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactGender::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactGender::DefinitionName); - QMap fields = d.fields(); - - // Context not supported in symbian back-end, remove - fields.remove(QContactGender::FieldContext); - - d.setFields(fields); - d.setUnique(true); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformgeolocation.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformgeolocation.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,215 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformgeolocation.h" -#include "cntmodelextuids.h" - -const char separator = ','; - -QList CntTransformGeolocation::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactGeolocation::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to geolocation - const QContactGeolocation &geolocation(static_cast(detail)); - - //create new field - QString formattedGeolocation; - if (geolocation.latitude() >= 0.0) { - formattedGeolocation.append(QString::number(geolocation.latitude())); - } - formattedGeolocation.append(separator); - if (geolocation.longitude() >= 0.0) { - formattedGeolocation.append(QString::number(geolocation.longitude())); - } - - if (formattedGeolocation.length() > 1) { - //create new field with contexts - transformToTextFieldL(geolocation, fieldList, formattedGeolocation, KUidContactFieldGEO, KUidContactFieldVCardMapGEO, true); - } - - return fieldList; -} - -QContactDetail *CntTransformGeolocation::transformItemField(const CContactItemField& field, const QContact &contact) -{ - Q_UNUSED(contact); - - QContactGeolocation *geolocation = new QContactGeolocation(); - - CContactTextField* storage = field.TextStorage(); - QString unformattedGeolocation = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - int separatorPos = unformattedGeolocation.indexOf(separator); - - // parse latitude - bool latitudeSet = false; - if (separatorPos > 0) { - bool ok = false; - double latitude = unformattedGeolocation.left(separatorPos).toDouble(&ok); - if (ok) { - geolocation->setLatitude(latitude); - latitudeSet = true; - } - } - if (!latitudeSet) { - geolocation->setLatitude(-1); - } - - // parse longitude - bool longitudeSet = false; - if (separatorPos >= 0 && separatorPos != unformattedGeolocation.length()-1) { - bool ok = false; - double longitude = unformattedGeolocation.right(unformattedGeolocation.length()-separatorPos-1).toDouble(&ok); - if (ok) { - geolocation->setLongitude(longitude); - longitudeSet = true; - } - } - if (!longitudeSet) { - geolocation->setLongitude(-1); - } - - // set context - for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) { - setContexts(field.ContentType().FieldType(i), *geolocation); - } - - return geolocation; -} - -bool CntTransformGeolocation::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldGEO.iUid) { - ret = true; - } - return ret; -} - -bool CntTransformGeolocation::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactGeolocation::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformGeolocation::supportedSortingFieldTypes(QString /*detailFieldName*/) const -{ - // Sorting not supported - return QList(); -} - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformGeolocation::supportsSubType(const QString& subType) const -{ - Q_UNUSED(subType); - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformGeolocation::getIdForField(const QString& fieldName) const -{ - if (QContactGeolocation::FieldLabel == fieldName) - return 0; - else if (QContactGeolocation::FieldLatitude == fieldName) - return 0; - else if (QContactGeolocation::FieldLongitude == fieldName) - return 0; - else if (QContactGeolocation::FieldAccuracy == fieldName) - return 0; - else if (QContactGeolocation::FieldAltitude == fieldName) - return 0; - else if (QContactGeolocation::FieldAltitudeAccuracy == fieldName) - return 0; - else if (QContactGeolocation::FieldHeading == fieldName) - return 0; - else if (QContactGeolocation::FieldSpeed == fieldName) - return 0; - else if (QContactGeolocation::FieldTimestamp == fieldName) - return 0; - else - return 0; - -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformGeolocation::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactGeolocation::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactGeolocation::DefinitionName); - QMap fields = d.fields(); - - // Don't support "ContextOther" - QContactDetailDefinitionField f; - f.setDataType(QVariant::StringList); - f.setAllowableValues(QVariantList() - << QLatin1String(QContactDetail::ContextHome) - << QLatin1String(QContactDetail::ContextWork)); - fields[QContactDetail::FieldContext] = f; - d.setFields(fields); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformname.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformname.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,227 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformname.h" - -#include - -QList CntTransformName::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactName::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to name - const QContactName &name(static_cast(detail)); - - //create new fields without contexts - transformToTextFieldL(name, fieldList, name.prefix(), KUidContactFieldPrefixName, KUidContactFieldVCardMapUnusedN, false); - transformToTextFieldL(name, fieldList, name.first(), KUidContactFieldGivenName, KUidContactFieldVCardMapUnusedN, false); - transformToTextFieldL(name, fieldList, name.middle(), KUidContactFieldAdditionalName, KUidContactFieldVCardMapUnusedN, false); - transformToTextFieldL(name, fieldList, name.last(), KUidContactFieldFamilyName, KUidContactFieldVCardMapUnusedN, false); - transformToTextFieldL(name, fieldList, name.suffix(), KUidContactFieldSuffixName, KUidContactFieldVCardMapUnusedN, false); - transformToTextFieldL(name, fieldList, name.customLabel(), KUidContactFieldTemplateLabel, KUidContactFieldVCardMapUnusedN, false); - - return fieldList; -} - - -QContactDetail *CntTransformName::transformItemField(const CContactItemField& field, const QContact &contact) -{ - QContactName *name = new QContactName(contact.detail()); - - CContactTextField* storage = field.TextStorage(); - QString nameValue = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - - for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) { - //Prefix - if (field.ContentType().FieldType(i) == KUidContactFieldPrefixName) { - name->setPrefix(nameValue); - } - //First name - else if (field.ContentType().FieldType(i) == KUidContactFieldGivenName) { - name->setFirst(nameValue); - } - //Middle name - else if (field.ContentType().FieldType(i) == KUidContactFieldAdditionalName) { - name->setMiddle(nameValue); - } - //Last name - else if (field.ContentType().FieldType(i) == KUidContactFieldFamilyName) { - name->setLast(nameValue); - } - //Suffix - else if (field.ContentType().FieldType(i) == KUidContactFieldSuffixName) { - name->setSuffix(nameValue); - } - // custom label - else if (field.ContentType().FieldType(i) == KUidContactFieldTemplateLabel) { - name->setCustomLabel(nameValue); - } - } - - return name; -} - -bool CntTransformName::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldPrefixName.iUid - || fieldType == KUidContactFieldGivenName.iUid - || fieldType == KUidContactFieldAdditionalName.iUid - || fieldType == KUidContactFieldFamilyName.iUid - || fieldType == KUidContactFieldSuffixName.iUid - || fieldType == KUidContactFieldTemplateLabel.iUid ) { - ret = true; - } - return ret; -} - -bool CntTransformName::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactName::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformName::supportedSortingFieldTypes(QString detailFieldName) const -{ - QList uids; - - if (detailFieldName == QContactName::FieldPrefix) - return uids << KUidContactFieldPrefixName; - - if (detailFieldName == QContactName::FieldFirst) - return uids << KUidContactFieldGivenName; - - if (detailFieldName == QContactName::FieldMiddle) - return uids << KUidContactFieldAdditionalName; - - if (detailFieldName == QContactName::FieldLast) - return uids << KUidContactFieldFamilyName; - - if (detailFieldName == QContactName::FieldSuffix) - return uids << KUidContactFieldSuffixName; - - if (detailFieldName == QContactName::FieldCustomLabel) - return uids << KUidContactFieldTemplateLabel; - - return uids; -} - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformName::supportsSubType(const QString& subType) const -{ - Q_UNUSED(subType); - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformName::getIdForField(const QString& fieldName) const -{ - if (QContactName::FieldPrefix == fieldName) - return KUidContactFieldPrefixName.iUid; - else if (QContactName::FieldFirst == fieldName) - return KUidContactFieldGivenName.iUid; - else if (QContactName::FieldMiddle == fieldName) - return KUidContactFieldAdditionalName.iUid; - else if (QContactName::FieldLast == fieldName) - return KUidContactFieldFamilyName.iUid; - else if (QContactName::FieldSuffix == fieldName) - return KUidContactFieldSuffixName.iUid; - else if (QContactName::FieldCustomLabel == fieldName) - return KUidContactFieldTemplateLabel.iUid; - else - return 0; -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformName::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - if(definitions.contains(QContactName::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactName::DefinitionName); - QMap fields = d.fields(); - - // groups support only custom label - if(contactType == QContactType::TypeGroup) { - fields.remove(QContactName::FieldPrefix); - fields.remove(QContactName::FieldFirst); - fields.remove(QContactName::FieldMiddle); - fields.remove(QContactName::FieldLast); - fields.remove(QContactName::FieldSuffix); - } else { - // Note: Custom labels cannot be enabled for a contact in pre-10.1 - // platforms because setting custom label for a contact causes - // issues for S60 Phonebook editor. If custom label support is - // needed in 10.1 or later, it needs to be variated away from - // pre-10.1 platforms. - fields.remove(QContactName::FieldCustomLabel); - } - - // Context not supported in symbian back-end, remove - fields.remove(QContactName::FieldContext); - - d.setFields(fields); - d.setUnique(true); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformnickname.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformnickname.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,157 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformnickname.h" - -#include - -QList CntTransformNickname::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactNickname::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to name - const QContactNickname &name(static_cast(detail)); - - //create new field without contexts - transformToTextFieldL(name, fieldList, name.nickname(), KUidContactFieldSecondName, KUidContactFieldVCardMapSECONDNAME, false); - - return fieldList; -} - - -QContactDetail *CntTransformNickname::transformItemField(const CContactItemField& field, const QContact &contact) -{ - QContactNickname *name = new QContactNickname(contact.detail()); - - CContactTextField* storage = field.TextStorage(); - QString nameValue = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - - for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) - { - //Prefix - if (field.ContentType().FieldType(i) == KUidContactFieldSecondName) - { - name->setNickname(nameValue); - } - } - - return name; -} - -bool CntTransformNickname::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldSecondName.iUid) { - ret = true; - } - return ret; -} - -bool CntTransformNickname::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactNickname::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformNickname::supportedSortingFieldTypes(QString detailFieldName) const -{ - QList uids; - if (detailFieldName == QContactNickname::FieldNickname) - uids << KUidContactFieldSecondName; - return uids; -} - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformNickname::supportsSubType(const QString& subType) const -{ - Q_UNUSED(subType); - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformNickname::getIdForField(const QString& fieldName) const -{ - if (QContactNickname::FieldNickname == fieldName) - return KUidContactFieldSecondName.iUid; - else - return 0; -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformNickname::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactNickname::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactNickname::DefinitionName); - QMap fields = d.fields(); - - // Context not supported in symbian back-end, remove - fields.remove(QContactNickname::FieldContext); - - d.setFields(fields); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformnote.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformnote.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,148 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformnote.h" - -QList CntTransformNote::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactNote::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to note - const QContactNote ¬e(static_cast(detail)); - - //create new fields without contexts - transformToTextFieldL(note, fieldList, note.note(), KUidContactFieldNote, KUidContactFieldVCardMapNOTE, false); - - return fieldList; -} - -QContactDetail *CntTransformNote::transformItemField(const CContactItemField& field, const QContact &contact) -{ - Q_UNUSED(contact); - - QContactNote *note = new QContactNote(); - - CContactTextField* storage = field.TextStorage(); - QString noteString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - - note->setNote(noteString); - return note; -} - -bool CntTransformNote::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldNote.iUid) { - ret = true; - } - return ret; -} - -bool CntTransformNote::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactNote::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformNote::supportedSortingFieldTypes(QString detailFieldName) const -{ - QList uids; - if (detailFieldName == QContactNote::FieldNote) - uids << KUidContactFieldNote; - return uids; -} - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformNote::supportsSubType(const QString& subType) const -{ - Q_UNUSED(subType); - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformNote::getIdForField(const QString& fieldName) const -{ - if (QContactNote::FieldNote == fieldName) - return KUidContactFieldNote.iUid; - else - return 0; -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformNote::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactNote::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactNote::DefinitionName); - QMap fields = d.fields(); - - // Context not supported in symbian back-end, remove - fields.remove(QContactNote::FieldContext); - - d.setFields(fields); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformonlineaccount.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformonlineaccount.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,345 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifdef SYMBIAN_BACKEND_USE_SQLITE - -#include "cnttransformonlineaccount.h" -#include "cntmodelextuids.h" - -QList CntTransformOnlineAccount::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactOnlineAccount::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to phonenumber - const QContactOnlineAccount &onlineAccount(static_cast(detail)); - - //get the subType - QStringList subTypes = onlineAccount.subTypes(); - - //create new field - TPtrC fieldText(reinterpret_cast(onlineAccount.accountUri().utf16())); - if(fieldText.Length()) { - CContactItemField* newField = CContactItemField::NewLC(KStorageTypeText); - newField->TextStorage()->SetTextL(fieldText); - - //no subtype - if(!subTypes.count()) - { - User::LeaveIfError(KErrArgument); - } - - // online account - else if (subTypes.contains(QContactOnlineAccount::SubTypeImpp)) - { - newField->AddFieldTypeL(KUidContactFieldIMPP); - newField->SetMapping(KUidContactFieldVCardMapUnknown); - } - - //internet - else if (subTypes.contains(QContactOnlineAccount::SubTypeSipVoip)) - { - newField->AddFieldTypeL(KUidContactFieldSIPID); - newField->SetMapping(KUidContactFieldVCardMapSIPID); - newField->AddFieldTypeL(KUidContactFieldVCardMapVOIP); - } - - //share video - else if (subTypes.contains(QContactOnlineAccount::SubTypeVideoShare)) - { - newField->AddFieldTypeL(KUidContactFieldSIPID); - newField->SetMapping(KUidContactFieldVCardMapSIPID); - newField->AddFieldTypeL(KUidContactFieldVCardMapSWIS); - } - - //sip - else if (subTypes.contains(QContactOnlineAccount::SubTypeSip)) - { - newField->AddFieldTypeL(KUidContactFieldSIPID); - newField->SetMapping(KUidContactFieldVCardMapSIPID); - newField->AddFieldTypeL(KUidContactFieldVCardMapSIPID); - } - - else - { - User::LeaveIfError(KErrNotSupported); - } - - //contexts - setContextsL(onlineAccount, *newField); - - fieldList.append(newField); - CleanupStack::Pop(newField); - - // Transform Service Provider Text - TPtrC ServiceProviderText(reinterpret_cast(onlineAccount.serviceProvider().utf16())); - if(ServiceProviderText.Length()) { - CContactItemField* serviceProviderField = CContactItemField::NewLC(KStorageTypeText); - serviceProviderField->TextStorage()->SetTextL(ServiceProviderText); - serviceProviderField->AddFieldTypeL(KUidContactFieldServiceProvider); - fieldList.append(serviceProviderField); - CleanupStack::Pop(serviceProviderField); - } - - // Transform presence informaiton - TPtrC presenceText(reinterpret_cast(onlineAccount.presence().utf16())); - if(presenceText.Length()) { - QString presence = QString::number(encodePresence(onlineAccount.presence())); - CContactItemField* presenceField = CContactItemField::NewLC(KStorageTypeText); - TPtrC presenceEncodedText(reinterpret_cast(presence.utf16())); - presenceField->TextStorage()->SetTextL(presenceEncodedText); - presenceField->AddFieldTypeL(KUidContactFieldPresence); - fieldList.append(presenceField); - CleanupStack::Pop(presenceField); - } - - // Transform statusMessage - TPtrC statusMsgText(reinterpret_cast(onlineAccount.statusMessage().utf16())); - if(statusMsgText.Length()) { - CContactItemField* statusMsgField = CContactItemField::NewLC(KStorageTypeText); - statusMsgField->TextStorage()->SetTextL(statusMsgText); - statusMsgField->AddFieldTypeL(KUidContactFieldStatusMsg); - fieldList.append(statusMsgField); - CleanupStack::Pop(statusMsgField); - } - } - - return fieldList; -} - -QContactDetail *CntTransformOnlineAccount::transformItemField(const CContactItemField& field, const QContact &contact) -{ - QContactOnlineAccount *onlineAccount = new QContactOnlineAccount(contact.detail()); - CContactTextField* storage = field.TextStorage(); - QString onlineAccountString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - - // Adding Online Account Detail. - for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) { - - //Account URI - if (field.ContentType().ContainsFieldType(KUidContactFieldIMPP)) { - onlineAccount->setAccountUri(onlineAccountString); - onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeImpp); - } - else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapVOIP)) { - onlineAccount->setAccountUri(onlineAccountString); - onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeSipVoip); - } - else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapSWIS)) { - onlineAccount->setAccountUri(onlineAccountString); - onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeVideoShare); - } - else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapSIPID)) { - onlineAccount->setAccountUri(onlineAccountString); - onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeSip); - } - //Service Provider - else if (field.ContentType().FieldType(i) == KUidContactFieldServiceProvider) { - onlineAccount->setServiceProvider(onlineAccountString); - } - //Presence - else if (field.ContentType().FieldType(i) == KUidContactFieldPresence) { - QString presenceInfo = decodePresence(onlineAccountString.toInt()); - onlineAccount->setPresence(presenceInfo); - } - //Status Message - else if (field.ContentType().FieldType(i) == KUidContactFieldStatusMsg) { - onlineAccount->setStatusMessage(onlineAccountString); - } - } - - // set context - for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) { - setContexts(field.ContentType().FieldType(i), *onlineAccount); - } - - return onlineAccount; -} - -bool CntTransformOnlineAccount::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldSIPID.iUid || - fieldType == KUidContactFieldIMPP.iUid || - fieldType == KUidContactFieldServiceProvider.iUid || - fieldType == KUidContactFieldPresence.iUid || - fieldType == KUidContactFieldStatusMsg.iUid ) - { - ret = true; - } - return ret; -} - -bool CntTransformOnlineAccount::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactOnlineAccount::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformOnlineAccount::supportedSortingFieldTypes(QString detailFieldName) const -{ - QList uids; - if (detailFieldName == QContactOnlineAccount::FieldAccountUri) { - uids << KUidContactFieldIMPP; - uids << KUidContactFieldSIPID; - } - return uids; -} - - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformOnlineAccount::supportsSubType(const QString& subType) const -{ - Q_UNUSED(subType); - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformOnlineAccount::getIdForField(const QString& fieldName) const -{ - if (QContactOnlineAccount::FieldAccountUri == fieldName) - return 0; - else if (QContactOnlineAccount::SubTypeSip == fieldName) - return KUidContactFieldSIPID.iUid; - else if (QContactOnlineAccount::SubTypeImpp == fieldName) - return KUidContactFieldIMPP.iUid; - else if (QContactOnlineAccount::SubTypeSipVoip == fieldName) - return KUidContactFieldVCardMapVOIP.iUid; - else if (QContactOnlineAccount::SubTypeVideoShare == fieldName) - return KUidContactFieldVCardMapSWIS.iUid; - else - return 0; -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformOnlineAccount::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactOnlineAccount::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactOnlineAccount::DefinitionName); - QMap fields = d.fields(); - QContactDetailDefinitionField f; - - // Don't support "ContextOther" - f.setDataType(QVariant::StringList); - f.setAllowableValues(QVariantList() - << QLatin1String(QContactDetail::ContextHome) - << QLatin1String(QContactDetail::ContextWork)); - fields[QContactDetail::FieldContext] = f; - d.setFields(fields); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} - - -/*! - * Encode the presence information. - * \a aPresence - */ -quint32 CntTransformOnlineAccount::encodePresence(QString aPresence) -{ - if (QContactOnlineAccount::PresenceAvailable == aPresence) - return CntTransformOnlineAccount::EPresenceAvailable; - else if (QContactOnlineAccount::PresenceHidden == aPresence) - return CntTransformOnlineAccount::EPresenceHidden; - else if (QContactOnlineAccount::PresenceBusy == aPresence) - return CntTransformOnlineAccount::EPresenceBusy; - else if (QContactOnlineAccount::PresenceAway == aPresence) - return CntTransformOnlineAccount::EPresenceAway; - else if (QContactOnlineAccount::PresenceExtendedAway == aPresence) - return CntTransformOnlineAccount::EPresenceExtendedAway; - else if (QContactOnlineAccount::PresenceUnknown == aPresence) - return CntTransformOnlineAccount::EPresenceUnknown; - else - return CntTransformOnlineAccount::EPresenceOffline; -} - - - -/*! - * Decode the presence information. - * \a aPresence - */ -QString CntTransformOnlineAccount::decodePresence(quint32 aPresence) -{ - if (CntTransformOnlineAccount::EPresenceAvailable == aPresence) - return QContactOnlineAccount::PresenceAvailable; - else if (CntTransformOnlineAccount::EPresenceHidden == aPresence) - return QContactOnlineAccount::PresenceHidden; - else if (CntTransformOnlineAccount::EPresenceBusy == aPresence) - return QContactOnlineAccount::PresenceBusy; - else if ( CntTransformOnlineAccount::EPresenceAway == aPresence) - return QContactOnlineAccount::PresenceAway; - else if ( CntTransformOnlineAccount::EPresenceExtendedAway == aPresence) - return QContactOnlineAccount::PresenceExtendedAway; - else if ( CntTransformOnlineAccount::EPresenceUnknown == aPresence) - return QContactOnlineAccount::PresenceUnknown; - else - return QContactOnlineAccount::PresenceOffline; -} - -#endif // SYMBIAN_BACKEND_USE_SQLITE - -// End of file diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformorganisation.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformorganisation.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,207 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformorganisation.h" - -QList CntTransformOrganisation::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactOrganization::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to orgenisation - const QContactOrganization &orgDetails(static_cast(detail)); - - //create new fields without contexts - transformToTextFieldL(orgDetails, fieldList, orgDetails.name(), KUidContactFieldCompanyName, KUidContactFieldVCardMapORG, false); - QStringList departments = orgDetails.department(); - if(departments.count()) // Take only the first department - transformToTextFieldL(orgDetails, fieldList, departments[0], KUidContactFieldDepartmentName, KUidContactFieldVCardMapDepartment, false); - transformToTextFieldL(orgDetails, fieldList, orgDetails.title(), KUidContactFieldJobTitle, KUidContactFieldVCardMapTITLE, false); - transformToTextFieldL(orgDetails, fieldList, orgDetails.assistantName(), KUidContactFieldAssistant, KUidContactFieldVCardMapAssistant, false); - - return fieldList; -} - - -QContactDetail *CntTransformOrganisation::transformItemField(const CContactItemField& field, const QContact &contact) -{ - QContactOrganization *organisation = new QContactOrganization(contact.detail()); - - CContactTextField* storage = field.TextStorage(); - QString orgDetail = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - - for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) { - //Company - if (field.ContentType().FieldType(i) == KUidContactFieldCompanyName) { - organisation->setName(orgDetail); - } - //Department - else if (field.ContentType().FieldType(i) == KUidContactFieldDepartmentName) { - // Assume only a single department - QStringList departments = QStringList(orgDetail); - organisation->setDepartment(departments); - } - //Job title - else if (field.ContentType().FieldType(i) == KUidContactFieldJobTitle) { - organisation->setTitle(orgDetail); - } - //Assistant name - else if (field.ContentType().FieldType(i) == KUidContactFieldAssistant) { - organisation->setAssistantName(orgDetail); - } - } - - return organisation; -} - -bool CntTransformOrganisation::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldCompanyName.iUid || - fieldType == KUidContactFieldDepartmentName.iUid || - fieldType == KUidContactFieldJobTitle.iUid || - fieldType == KUidContactFieldAssistant.iUid) { - ret = true; - } - return ret; -} - -bool CntTransformOrganisation::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactOrganization::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformOrganisation::supportedSortingFieldTypes(QString detailFieldName) const -{ - QList uids; - - if (detailFieldName == QContactOrganization::FieldName) - return uids << KUidContactFieldCompanyName; - - if (detailFieldName == QContactOrganization::FieldDepartment) - return uids << KUidContactFieldDepartmentName; - - if (detailFieldName == QContactOrganization::FieldTitle) - return uids << KUidContactFieldJobTitle; - - if (detailFieldName == QContactOrganization::FieldAssistantName) - return uids << KUidContactFieldAssistant; - - return uids; -} - - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformOrganisation::supportsSubType(const QString& subType) const -{ - Q_UNUSED(subType); - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformOrganisation::getIdForField(const QString& fieldName) const -{ - - if (QContactOrganization::FieldName == fieldName) - return KUidContactFieldCompanyName.iUid; - else if (QContactOrganization::FieldLogo == fieldName) - return 0; - else if (QContactOrganization::FieldDepartment == fieldName) - return KUidContactFieldDepartmentName.iUid; - else if (QContactOrganization::FieldLocation == fieldName) - return 0; - else if (QContactOrganization::FieldTitle == fieldName) - return KUidContactFieldJobTitle.iUid; - else if (QContactOrganization::FieldAssistantName == fieldName) - return KUidContactFieldAssistant.iUid; - else - return 0; - -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformOrganisation::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactOrganization::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactOrganization::DefinitionName); - QMap fields = d.fields(); - QContactDetailDefinitionField f; - - // Not all fields are supported, replace: - fields.clear(); - f.setDataType(QVariant::String); - f.setAllowableValues(QVariantList()); - fields.insert(QContactOrganization::FieldName, f); - fields.insert(QContactOrganization::FieldTitle, f); - fields.insert(QContactOrganization::FieldAssistantName, f); - f.setDataType(QVariant::StringList); - fields.insert(QContactOrganization::FieldDepartment, f); - - d.setFields(fields); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformphonenumber.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformphonenumber.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,303 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformphonenumber.h" - -QList CntTransformPhoneNumber::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactPhoneNumber::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to phonenumber - const QContactPhoneNumber &phoneNumber(static_cast(detail)); - - //get the subType - QStringList subTypes = phoneNumber.subTypes(); - - //create new field - TPtrC fieldText(reinterpret_cast(phoneNumber.number().utf16())); - if(fieldText.Length()) { - CContactItemField* newField = CContactItemField::NewLC(KStorageTypeText); - newField->TextStorage()->SetTextL(fieldText); - - //no subtype - if(!subTypes.count()) - { - newField->AddFieldTypeL(KUidContactFieldPhoneNumber); - newField->SetMapping(KUidContactFieldVCardMapTEL); - } - - //landline - else if (subTypes.contains(QContactPhoneNumber::SubTypeLandline)) - { - newField->AddFieldTypeL(KUidContactFieldPhoneNumber); - newField->SetMapping(KUidContactFieldVCardMapTEL); - newField->AddFieldTypeL(KUidContactFieldVCardMapVOICE); - } - - //mobile - else if (subTypes.contains(QContactPhoneNumber::SubTypeMobile)) - { - newField->AddFieldTypeL(KUidContactFieldPhoneNumber); - newField->SetMapping(KUidContactFieldVCardMapTEL); - newField->AddFieldTypeL(KUidContactFieldVCardMapCELL); - } - - //fax - else if (subTypes.contains(QContactPhoneNumber::SubTypeFacsimile)) - { - newField->AddFieldTypeL(KUidContactFieldFax); - newField->SetMapping(KUidContactFieldVCardMapTEL); - newField->AddFieldTypeL(KUidContactFieldVCardMapFAX); - } - - //pager - else if (subTypes.contains(QContactPhoneNumber::SubTypePager)) - { - newField->AddFieldTypeL(KUidContactFieldPhoneNumber); - newField->SetMapping(KUidContactFieldVCardMapTEL); - newField->AddFieldTypeL(KUidContactFieldVCardMapPAGER); - } - - //bbs - else if (subTypes.contains(QContactPhoneNumber::SubTypeBulletinBoardSystem)) - { - newField->AddFieldTypeL(KUidContactFieldPhoneNumber); - newField->SetMapping(KUidContactFieldVCardMapTEL); - newField->AddFieldTypeL(KUidContactFieldVCardMapBBS); - } - - //car - else if (subTypes.contains(QContactPhoneNumber::SubTypeCar)) - { - newField->AddFieldTypeL(KUidContactFieldPhoneNumber); - newField->SetMapping(KUidContactFieldVCardMapTEL); - newField->AddFieldTypeL(KUidContactFieldVCardMapCAR); - } - - //DTMF - else if (subTypes.contains(QContactPhoneNumber::SubTypeDtmfMenu)) - { - newField->AddFieldTypeL(KUidContactFieldDTMF); - newField->SetMapping(KUidContactFieldVCardMapUnknown); - } - - // assistant number - else if (subTypes.contains(QContactPhoneNumber::SubTypeAssistant)) - { - newField->AddFieldTypeL(KUidContactFieldPhoneNumber); - newField->SetMapping(KUidContactFieldVCardMapAssistantTel); - } - - else - { - User::LeaveIfError(KErrNotSupported); - } - - //contexts - setContextsL(phoneNumber, *newField); - - fieldList.append(newField); - CleanupStack::Pop(newField); - } - - return fieldList; -} - -QContactDetail *CntTransformPhoneNumber::transformItemField(const CContactItemField& field, const QContact &contact) -{ - Q_UNUSED(contact); - - QContactPhoneNumber *phoneNumber = new QContactPhoneNumber(); - - CContactTextField* storage = field.TextStorage(); - QString number = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - - phoneNumber->setNumber(number); - - if (field.ContentType().ContainsFieldType(KUidContactFieldPhoneNumber)) { - if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapVOICE)) { - phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeLandline); - } - else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapCELL)) { - phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeMobile); - } - else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapPAGER)) { - phoneNumber->setSubTypes(QContactPhoneNumber::SubTypePager); - } - else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapBBS)) { - phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeBulletinBoardSystem); - } - else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapCAR)) { - phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeCar); - } - else if (field.ContentType().Mapping() == KUidContactFieldVCardMapAssistantTel) { - phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeAssistant); - } - } - else if (field.ContentType().ContainsFieldType(KUidContactFieldFax)) { - phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeFacsimile); - } - else if (field.ContentType().ContainsFieldType(KUidContactFieldDTMF)) { - phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeDtmfMenu); - } - - // set context - for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) { - setContexts(field.ContentType().FieldType(i), *phoneNumber); - } - - return phoneNumber; -} - -bool CntTransformPhoneNumber::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldPhoneNumber.iUid || - fieldType == KUidContactFieldFax.iUid || - fieldType == KUidContactFieldDTMF.iUid) { - ret = true; - } - return ret; -} - -bool CntTransformPhoneNumber::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactPhoneNumber::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformPhoneNumber::supportedSortingFieldTypes(QString detailFieldName) const -{ - QList uids; - if (detailFieldName == QContactPhoneNumber::FieldNumber) { - uids << KUidContactFieldPhoneNumber; - uids << KUidContactFieldFax; - uids << KUidContactFieldDTMF; - } - return uids; -} - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformPhoneNumber::supportsSubType(const QString& subType) const -{ - if(QContactPhoneNumber::FieldSubTypes == subType) - return true; - else - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformPhoneNumber::getIdForField(const QString& fieldName) const -{ - if (QContactPhoneNumber::FieldNumber == fieldName) - return 0; - else if (QContactPhoneNumber::SubTypeLandline == fieldName) - return 0; - else if (QContactPhoneNumber::SubTypeMobile == fieldName) - return 0; - else if (QContactPhoneNumber::SubTypeFacsimile == fieldName) - return KUidContactFieldFax.iUid; - else if (QContactPhoneNumber::SubTypePager == fieldName) - return 0; - else if (QContactPhoneNumber::SubTypeVoice == fieldName) - return 0; - else if (QContactPhoneNumber::SubTypeModem == fieldName) - return 0; - else if (QContactPhoneNumber::SubTypeVideo == fieldName) - return 0; - else if (QContactPhoneNumber::SubTypeCar == fieldName) - return 0; - else if (QContactPhoneNumber::SubTypeBulletinBoardSystem == fieldName) - return 0; - else if (QContactPhoneNumber::SubTypeMessagingCapable == fieldName) - return 0; - else if (QContactPhoneNumber::SubTypeAssistant == fieldName) - return 0; - else if (QContactPhoneNumber::SubTypeDtmfMenu == fieldName) - return KUidContactFieldDTMF.iUid; - else - return 0; -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformPhoneNumber::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactPhoneNumber::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactPhoneNumber::DefinitionName); - QMap fields = d.fields(); - - // Don't support "ContextOther" - QContactDetailDefinitionField f; - f.setDataType(QVariant::StringList); - f.setAllowableValues(QVariantList() - << QLatin1String(QContactDetail::ContextHome) - << QLatin1String(QContactDetail::ContextWork)); - fields[QContactDetail::FieldContext] = f; - d.setFields(fields); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformsynctarget.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformsynctarget.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,158 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformsynctarget.h" -#include "cntmodelextuids.h" - -QList CntTransformSyncTarget::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactSyncTarget::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to sync target - const QContactSyncTarget &syncTarget(static_cast(detail)); - - //create new fields without contexts - transformToTextFieldL(syncTarget, fieldList, syncTarget.syncTarget(), KUidContactFieldClass, KUidContactFieldVCardMapClass, false); - - return fieldList; -} - -QContactDetail *CntTransformSyncTarget::transformItemField(const CContactItemField& field, const QContact &contact) -{ - Q_UNUSED(contact); - - QContactSyncTarget *syncTarget = new QContactSyncTarget(); - - CContactTextField* storage = field.TextStorage(); - QString syncTargetString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - - syncTarget->setSyncTarget(syncTargetString); - return syncTarget; -} - -bool CntTransformSyncTarget::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldClass.iUid) { - ret = true; - } - return ret; -} - -bool CntTransformSyncTarget::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactSyncTarget::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformSyncTarget::supportedSortingFieldTypes(QString detailFieldName) const -{ - QList uids; - if (detailFieldName == QContactSyncTarget::FieldSyncTarget) - uids << KUidContactFieldClass; - return uids; -} - - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformSyncTarget::supportsSubType(const QString& subType) const -{ - Q_UNUSED(subType); - return false; -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformSyncTarget::getIdForField(const QString& fieldName) const -{ - if (QContactSyncTarget::FieldSyncTarget == fieldName) - return KUidContactFieldClass.iUid; - else - return 0; -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformSyncTarget::detailDefinitions(QMap &definitions, const QString& contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactSyncTarget::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactSyncTarget::DefinitionName); - QMap fields = d.fields(); - QContactDetailDefinitionField f; - - // Not all fields are supported, replace: - fields.clear(); - f.setDataType(QVariant::String); - f.setAllowableValues(QVariantList() - << QString("private") - << QString("public") - << QString("none")); - fields.insert(QContactSyncTarget::FieldSyncTarget, f); - - d.setFields(fields); - d.setUnique(true); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/cnttransformurl.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cnttransformurl.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,191 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "cnttransformurl.h" - -QList CntTransformUrl::transformDetailL(const QContactDetail &detail) -{ - if(detail.definitionName() != QContactUrl::DefinitionName) - User::Leave(KErrArgument); - - QList fieldList; - - //cast to url - const QContactUrl &url(static_cast(detail)); - - //create new field - TPtrC fieldText(reinterpret_cast(url.url().utf16())); - if(fieldText.Length()) { - CContactItemField* newField = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldUrl); - newField->TextStorage()->SetTextL(fieldText); - newField->SetMapping(KUidContactFieldVCardMapURL); - - QString subType = url.subType(); - const QString& subTypeHomePage(QContactUrl::SubTypeHomePage); - if (subType.length() != 0 && subType.compare(subTypeHomePage) != 0) - { - User::LeaveIfError(KErrNotSupported); - } - - //contexts - setContextsL(url, *newField); - - fieldList.append(newField); - CleanupStack::Pop(newField); - } - - return fieldList; -} - -QContactDetail *CntTransformUrl::transformItemField(const CContactItemField& field, const QContact &contact) -{ - Q_UNUSED(contact); - - QContactUrl *url = new QContactUrl(); - - CContactTextField* storage = field.TextStorage(); - QString urlString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); - - url->setUrl(urlString); - url->setSubType(QContactUrl::SubTypeHomePage); - - for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) - { - setContexts(field.ContentType().FieldType(i), *url); - } - - return url; -} - -bool CntTransformUrl::supportsField(TUint32 fieldType) const -{ - bool ret = false; - if (fieldType == KUidContactFieldUrl.iUid) { - ret = true; - } - return ret; -} - -bool CntTransformUrl::supportsDetail(QString detailName) const -{ - bool ret = false; - if (detailName == QContactUrl::DefinitionName) { - ret = true; - } - return ret; -} - -QList CntTransformUrl::supportedSortingFieldTypes(QString detailFieldName) const -{ - QList uids; - if (detailFieldName == QContactUrl::FieldUrl) - uids << KUidContactFieldUrl; - return uids; -} - -/*! - * Checks whether the subtype is supported - * - * \a subType The subtype to be checked - * \return True if this subtype is supported - */ -bool CntTransformUrl::supportsSubType(const QString& subType) const -{ - if(QContactUrl::FieldSubType == subType) - return true; - else - return false; - -} - -/*! - * Returns the filed id corresponding to a field - * - * \a fieldName The name of the supported field - * \return fieldId for the fieldName, 0 if not supported - */ -quint32 CntTransformUrl::getIdForField(const QString& fieldName) const -{ - if (QContactUrl::FieldUrl == fieldName) - return 0; - else if (QContactUrl::SubTypeHomePage == fieldName) - return 0; - else if (QContactUrl::SubTypeFavourite == fieldName) - return 0; - else - return 0; - -} - -/*! - * Modifies the detail definitions. The default detail definitions are - * queried from QContactManagerEngine::schemaDefinitions and then modified - * with this function in the transform leaf classes. - * - * \a definitions The detail definitions to modify. - * \a contactType The contact type the definitions apply for. - */ -void CntTransformUrl::detailDefinitions(QMap &definitions, const QString &contactType) const -{ - Q_UNUSED(contactType); - - if(definitions.contains(QContactUrl::DefinitionName)) { - QContactDetailDefinition d = definitions.value(QContactUrl::DefinitionName); - QMap fields = d.fields(); - QContactDetailDefinitionField f; - - f.setDataType(QVariant::String); //only allowed to be a single subtype - f.setAllowableValues(QVariantList() - << QString(QLatin1String(QContactUrl::SubTypeHomePage))); - fields.insert(QContactUrl::FieldSubType, f); - - // Don't support "ContextOther" - f.setDataType(QVariant::StringList); - f.setAllowableValues(QVariantList() - << QLatin1String(QContactDetail::ContextHome) - << QLatin1String(QContactDetail::ContextWork)); - fields[QContactDetail::FieldContext] = f; - - d.setFields(fields); - - // Replace original definitions - definitions.insert(d.name(), d); - } -} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntdbinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntdbinfo.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,117 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include "cntdbinfo.h" +#include "cntmodelextuids.h" + + +CntDbInfo::CntDbInfo() +{ + + contactsTableIdColumNameMapping.insert(KUidContactFieldGivenName.iUid,"first_name" ); + contactsTableIdColumNameMapping.insert(KUidContactFieldGivenNamePronunciation.iUid,"firstname_prn" ); + contactsTableIdColumNameMapping.insert(KUidContactFieldFamilyName.iUid,"last_name" ); + contactsTableIdColumNameMapping.insert(KUidContactFieldFamilyNamePronunciation.iUid,"lastname_prn" ); + contactsTableIdColumNameMapping.insert(KUidContactFieldCompanyName.iUid,"company_name" ); + contactsTableIdColumNameMapping.insert(KUidContactFieldCompanyNamePronunciation.iUid,"companyname_prn" ); + + commAddrTableIdColumNameMapping.insert(KUidContactFieldSIPID.iUid,ESipAddress ); + commAddrTableIdColumNameMapping.insert(KUidContactFieldVCardMapVOIP.iUid,ESipAddress ); + commAddrTableIdColumNameMapping.insert(KUidContactFieldVCardMapSWIS.iUid,ESipAddress ); + commAddrTableIdColumNameMapping.insert(KUidContactFieldIMPP.iUid,ESipAddress ); + commAddrTableIdColumNameMapping.insert(KUidContactFieldEMail.iUid,EEmailAddress ); +} + +CntDbInfo::~CntDbInfo() +{ + + contactsTableIdColumNameMapping.clear(); + commAddrTableIdColumNameMapping.clear(); +} + +bool CntDbInfo::SupportsUid(int uid) + { + if(contactsTableIdColumNameMapping.contains(uid) ) + return true; + else if (commAddrTableIdColumNameMapping.contains(uid)) + return true; + else + return false; + + } +/*! + * Converts filed id to column name of the database table. + * QContactManager::contacts function. + * + * \a fieldId field id representing the detail field name + * \a sqlDbTableColumnName On return,contains the column name in the database + */ +void CntDbInfo::getDbTableAndColumnName( const quint32 fieldId , + QString& tableName, + QString& columnName ) const +{ + //Uncomment later + + + //check contacts table + columnName = ""; + tableName = ""; + + if (contactsTableIdColumNameMapping.contains(fieldId)){ + columnName = contactsTableIdColumNameMapping.value(fieldId); + tableName = "contact"; + } + + if( (columnName.isEmpty()) || (tableName.isEmpty())){ + //Search comm Addr table + if (commAddrTableIdColumNameMapping.contains(fieldId)){ + // communication address table has slightly differnt format, so we make the column name as + // "type = and value " + int typeval = commAddrTableIdColumNameMapping.value(fieldId) ; + columnName = QString(" TYPE = %1").arg(typeval); + columnName += " and value " ; + tableName = "comm_addr"; + } + + } + +} + diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntdisplaylabelsqlfilter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntdisplaylabelsqlfilter.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,195 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntdisplaylabelsqlfilter.h" +#include "cntdisplaylabel.h" +#include +#include + +#include + +CntDisplayLabelSqlFilter::CntDisplayLabelSqlFilter() +{ +// TODO Auto-generated constructor stub + +} + +CntDisplayLabelSqlFilter::~CntDisplayLabelSqlFilter() +{ +// TODO Auto-generated destructor stub +} + +void CntDisplayLabelSqlFilter::createSqlQuery(const QContactDetailFilter& filter, + QString& sqlQuery, + QContactManager::Error& error) +{ + error = QContactManager::NoError; + + //get the contact fields that should be checked + CntDisplayLabel displayLabel; + QList > contactFields = displayLabel.contactFilterDetails(); + + //search values + QStringList searchStrings = filter.value().toStringList(); + + //default sql query + sqlQuery = "SELECT contact_id FROM contact WHERE (type_flags>>24)=0"; + + //everything ok + if(!searchStrings.isEmpty() && searchStrings.count() <= contactFields.count() ) + { + QString subQuery; + QStringList columns; + + //get the column names + for(int i = 0; i < contactFields.count(); i++) + { + columns << columnName(contactFields.at(i)); + } + + //single search value + if(searchStrings.count() == 1) + { + createQuerySingleSearchValue(subQuery, searchStrings.at(0), columns); + } + + //multiple search values + else + { + createQueryMultipleSearchValues(subQuery, searchStrings, columns); + } + + if(!subQuery.isEmpty()){ + sqlQuery += " AND (" + subQuery + ')'; + } + + error = QContactManager::NoError; + } + + //if specified more filter criterias than contact fields return error + else if(searchStrings.count() > contactFields.count()){ + error = QContactManager::BadArgumentError; + } +} + +/* Creates a sql query for a single search value + * + * \a sqlQuery where the query is written + * \a searchValue the value that should be used to select contacts + * \a columns the columns to be looked from + * + */ +void CntDisplayLabelSqlFilter::createQuerySingleSearchValue(QString& sqlQuery, const QString &searchValue, const QStringList &columns) const +{ + for (int i = 0; i < columns.count(); i++) + { + sqlQuery += createSubQuery(searchValue, columns.at(i)); + + if( i < (columns.count() - 1)) + { + sqlQuery += " OR "; + } + } +} + +/* Creates a sql query for a multiple search values, Note supports only 2 search and columns values currently + * + * \a sqlQuery where the query is written + * \a searchValues the value that should be used to select contacts + * \a columns the columns to be looked from + */ +void CntDisplayLabelSqlFilter::createQueryMultipleSearchValues(QString& sqlQuery, const QStringList &searchValues, const QStringList &columns) const +{ + if( searchValues.count() == 2 && columns.count() == 2 ) + { + sqlQuery += createSubQuery(searchValues.at(0), columns.at(1)) + " AND "; + sqlQuery += createSubQuery(searchValues.at(1), columns.at(0)) + " OR "; + sqlQuery += createSubQuery(searchValues.at(0), columns.at(0)) + " AND "; + sqlQuery += createSubQuery(searchValues.at(1), columns.at(1)); + } +} + +/* Creates a sql LIKE Statement for the search valuea and column + * + * \a searchValue to be added to the query + * \a column to be added to the query + * \return the sql LIKE query + */ +QString CntDisplayLabelSqlFilter::createSubQuery(const QString &searchValue, const QString &column) const +{ + return ('(' + column + " LIKE \'" + searchValue + "%\' OR " + column + " LIKE \'% " + searchValue + "%\')"); +} + +/* + * Get the sql column name based on the detail + * + * \a detail to search the column name for + * \a columnName contains the column name or empty string if none found + */ +QString CntDisplayLabelSqlFilter::columnName(const QPair &detail) const +{ + QString columnName = ""; + + //Name detail + if(detail.first == QContactName::DefinitionName) + { + if(detail.second == QContactName::FieldFirst) + { + columnName = "first_name"; + } + + else if(detail.second == QContactName::FieldLast) + { + columnName = "last_name"; + } + } + + //Organization + else if(detail.first == QContactOrganization::DefinitionName) + { + if(detail.second == QContactOrganization::FieldName) + { + columnName = "company_name"; + } + } + + return columnName; +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilteraction.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilteraction.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntfilteraction.h" +#include "cnttransformcontact.h" +#include "cntfilterdetaildisplaylabel.h" //todo rename class to follow naming pattern CntFilterDetailDisplayLabel + +CntFilterAction::CntFilterAction(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo) + :m_contactdatabase(contactDatabase), + m_srvConnection(cntServer), + m_dbInfo(dbInfo) +{ + // m_detailFilters.append(new CntFilterDetailDisplayLabel(m_srvConnection)); +} + +CntFilterAction::~CntFilterAction() +{ + +} + +QList CntFilterAction::contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupportedflag, + QContactManager::Error &error) +{ + Q_UNUSED(sortOrders); + Q_UNUSED(filterSupportedflag); + //Check if any invalid filter is passed + if(!filterSupported(filter)) + { + error = QContactManager::NotSupportedError; + return QList(); + } + QList idList; + + //Create the query + QString sqlQuery; + createSelectQuery( filter,sqlQuery,error); + + //fetch the contacts + if(error != QContactManager::NotSupportedError) + { + idList = m_srvConnection.searchContacts(sqlQuery, error); + } + + return idList; + +} + + +bool CntFilterAction::filterSupported(const QContactFilter& /*filter*/) +{ + bool result = false; + //Not yet supported + /*if(QContactFilter::ActionFilter == filter.type()) + { + result = true; + } + */ + + return result; +} + + +void CntFilterAction::createSelectQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error) + +{ + //Check if any invalid filter is passed + if(!filterSupported(filter)) + { + error = QContactManager::NotSupportedError; + } + //For default filter, just return the below query + sqlQuery = ""; + + +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterchangelog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterchangelog.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntfilterchangelog.h" +#include "cnttransformcontact.h" +#include "cntfilterdetaildisplaylabel.h" //todo rename class to follow naming pattern CntFilterDetailDisplayLabel + +CntFilterChangeLog::CntFilterChangeLog(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo) + :m_contactdatabase(contactDatabase), + m_srvConnection(cntServer), + m_dbInfo(dbInfo) +{ + +} + +CntFilterChangeLog::~CntFilterChangeLog() +{ + +} + +QList CntFilterChangeLog::contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupportedflag, + QContactManager::Error &error) +{ + Q_UNUSED(sortOrders); + Q_UNUSED(filterSupportedflag); + //Check if any invalid filter is passed + if(!filterSupported(filter)) + { + error = QContactManager::NotSupportedError; + return QList(); + } + QList idList; + + //Create the query + QString sqlQuery; + createSelectQuery( filter,sqlQuery,error); + + //fetch the contacts + if(error != QContactManager::NotSupportedError) + { + idList = m_srvConnection.searchContacts(sqlQuery, error); + } + + return idList; + +} + + +bool CntFilterChangeLog::filterSupported(const QContactFilter& /*filter*/) +{ + bool result = false; + //Not supported yet + /* + if(QContactFilter::ChangeLogFilter == filter.type()) + { + result = true; + } + */ + return result; +} + + +void CntFilterChangeLog::createSelectQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error) + +{ + //Check if any invalid filter is passed + if(!filterSupported(filter)) + { + error = QContactManager::NotSupportedError; + } + //Not supported yet. + sqlQuery = ""; + + +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdefault.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdefault.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,116 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntfilterdefault.h" +#include "cnttransformcontact.h" +#include "cntfilterdetaildisplaylabel.h" + +CntFilterDefault::CntFilterDefault(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo) + :m_contactdatabase(contactDatabase), + m_srvConnection(cntServer), + m_dbInfo(dbInfo) +{ + +} + +CntFilterDefault::~CntFilterDefault() +{ + +} + +QList CntFilterDefault::contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupportedflag, + QContactManager::Error &error) +{ + Q_UNUSED(sortOrders); + Q_UNUSED(filterSupportedflag); + //Check if any invalid filter is passed + if(!filterSupported(filter)) + { + error = QContactManager::NotSupportedError; + return QList(); + } + QList idList; + + //Create the query + QString sqlQuery; + createSelectQuery( filter,sqlQuery,error); + + //fetch the contacts + if(error == QContactManager::NoError) + { + idList = m_srvConnection.searchContacts(sqlQuery, error); + } + + return idList; + +} + + +bool CntFilterDefault::filterSupported(const QContactFilter& filter) +{ + bool result = false; + if(QContactFilter::DefaultFilter == filter.type()) + { + result = true; + } + + return result; +} + + +void CntFilterDefault::createSelectQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error) + +{ + //Check if any invalid filter is passed + if(!filterSupported(filter)) + { + error = QContactManager::NotSupportedError; + } + //For default filter, just return the below query + sqlQuery = "SELECT DISTINCT contact_id FROM contact WHERE (type_flags>>24)=0 OR (type_flags>>24)=3"; + + +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdetail.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdetail.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,372 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +#include "cntfilterdetail.h" +#include "cnttransformcontact.h" +#include "cntfilterdetaildisplaylabel.h" //todo rename class to follow naming pattern CntFilterDetailDisplayLabel +#include "cntsqlsearch.h" + +// Telephony Configuration API +// Keys under this category are used in defining telephony configuration. +const TUid KCRUidTelConfiguration = {0x102828B8}; +// Amount of digits to be used in contact matching. +// This allows a customer to variate the amount of digits to be matched. +const TUint32 KTelMatchDigits = 0x00000001; +// Default match length +const TInt KDefaultMatchLength(7); + + +CntFilterDetail::CntFilterDetail(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo) + : m_contactdatabase(contactDatabase), + m_srvConnection(cntServer), + m_dbInfo(dbInfo) +{ + +} + +CntFilterDetail::~CntFilterDetail() +{ + +} + + +QList CntFilterDetail::contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupportedflag, + QContactManager::Error &error) +{ + Q_UNUSED(sortOrders); + Q_UNUSED(filterSupportedflag); + //Check if any invalid filter is passed + if(!filterSupported(filter) ) + { + error = QContactManager::NotSupportedError; + return QList(); + } + QList idList; + QContactDetailFilter detailFilter(filter); + QString sqlQuery; + //Check for phonenumber. Special handling needed + if(detailFilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName ) + { + //Handle phonenumber ... + + idList = HandlePhonenumberDetailFilter(filter); + } + else if (detailFilter.matchFlags() == QContactFilter::MatchKeypadCollation) + { + //predictive search filter + idList = HandlePredictiveSearchFilter(filter,error); + } + + // handle other cases + else + { + createSelectQuery(filter,sqlQuery,error); + if(error == QContactManager::NoError) + { + //fetch the contacts + idList = m_srvConnection.searchContacts(sqlQuery, error); + } + } + + return idList; + + + +} + + +bool CntFilterDetail::filterSupported(const QContactFilter& filter) +{ + bool result = false; + if(QContactFilter::ContactDetailFilter == filter.type()) + { + result = true; + } + + return result; +} + +void CntFilterDetail::createSelectQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error) + +{ + if(!filterSupported(filter) ) + { + error = QContactManager::NotSupportedError; + return; + } + QContactDetailFilter detailFilter(filter); + //display label + if (detailFilter.detailDefinitionName() == QContactDisplayLabel::DefinitionName) + { + CntFilterDetailDisplayLabel displayLabelFilter; + displayLabelFilter.createSelectQuery(filter, sqlQuery, error); + } + + //type + else if(detailFilter.detailDefinitionName() == QContactType::DefinitionName) + { + if(detailFilter.value().toString() == QContactType::TypeContact) + sqlQuery = "SELECT contact_id FROM contact WHERE (type_flags>>24)=0"; + else if(detailFilter.value().toString() == QContactType::TypeGroup) + sqlQuery = "SELECT contact_id FROM contact WHERE (type_flags>>24)=3"; + } + else if(detailFilter.detailDefinitionName() == QContactGuid::DefinitionName) + { + if(detailFilter.detailFieldName() == QContactGuid::FieldGuid) + { + QStringList fullGuidValue = detailFilter.value().toString().split('-'); + if (fullGuidValue.count() == 3) { + QString localGuidValue = fullGuidValue.at(1); + sqlQuery = "SELECT contact_id FROM contact WHERE guid_string = '" + localGuidValue + '\''; + } + } + } + //everything else + else + { + QString tableName; + QString sqlWhereClause; + getTableNameWhereClause(detailFilter,tableName,sqlWhereClause,error); + //Create the sql query + sqlQuery += "SELECT DISTINCT contact_id FROM " + tableName + " WHERE " + sqlWhereClause; + } +} + + +/*! + * Updates match flage for columns. + */ +void CntFilterDetail::updateForMatchFlag( const QContactDetailFilter& filter, + QString& fieldToUpdate , + QContactManager::Error& error) const +{ + // Modify the filed depending on the query + switch(filter.matchFlags()) + { + case QContactFilter::MatchExactly: + { + // Pattern for MatchExactly: + // " ='xyz'" + fieldToUpdate = " ='" + + filter.value().toString() + '\''; + error = QContactManager::NoError; + break; + } + case QContactFilter::MatchContains: + { + // Pattern for MatchContains: + // " LIKE '%xyz%'" + fieldToUpdate = " LIKE '%" + filter.value().toString() + "%'" ; + error = QContactManager::NoError; + break; + } + case QContactFilter::MatchStartsWith: + { + // Pattern for MatchStartsWith: + // " LIKE 'xyz%'" + fieldToUpdate = " LIKE '" + filter.value().toString() + "%'" ; + error = QContactManager::NoError; + break; + } + case QContactFilter::MatchEndsWith: + { + // Pattern for MatchEndsWith: + // " LIKE '%xyz'" + fieldToUpdate = " LIKE '%" + filter.value().toString() + '\'' ; + error = QContactManager::NoError; + break; + } + case QContactFilter::MatchFixedString: + { + error = QContactManager::NotSupportedError; + break; + } + case QContactFilter::MatchCaseSensitive: + { + error = QContactManager::NotSupportedError; + break; + } + default: + { + error = QContactManager::NotSupportedError; + break; + } + } + +} + +void CntFilterDetail::getTableNameWhereClause( const QContactDetailFilter& detailfilter, + QString& tableName, + QString& sqlWhereClause , + QContactManager::Error& error) const +{ + //Get the table name and the column name + bool isSubType; + QString columnName; + + //Get the field id for the detail field name + CntTransformContact transformContact; + quint32 fieldId = transformContact.GetIdForDetailL(detailfilter, isSubType); + m_dbInfo.getDbTableAndColumnName(fieldId,tableName,columnName); + + //return if tableName is empty + if(tableName.isEmpty()){ + error = QContactManager::NotSupportedError; + return; + } + + //check columnName + if(columnName.isEmpty()) { + error = QContactManager::NotSupportedError; + return; + } + else if(isSubType) { + sqlWhereClause += columnName; + sqlWhereClause += " NOT NULL "; + } + else { + + sqlWhereClause += ' ' + columnName + ' '; + QString fieldToUpdate; + //Update the value depending on the match flag + updateForMatchFlag(detailfilter,fieldToUpdate,error); + sqlWhereClause += fieldToUpdate; + } + + +} + +QList CntFilterDetail::HandlePredictiveSearchFilter(const QContactFilter& filter,QContactManager::Error& error) + { + + QString sqlQuery; + + if(filter.type() == QContactFilter::ContactDetailFilter){ + const QContactDetailFilter detailFilter(filter); + if( detailFilter.matchFlags() == QContactFilter::MatchKeypadCollation ){ + CntSqlSearch sqlSearch; + //convert string to numeric format + QString pattern = detailFilter.value().toString(); + sqlQuery = sqlSearch.CreatePredictiveSearch(pattern); + return m_srvConnection.searchContacts(sqlQuery, error); + } + else + { + return QList(); + } + } + else + { + return QList(); + } + } + +QList CntFilterDetail::HandlePhonenumberDetailFilter(const QContactFilter& filter) + { + QList matches; + QContactDetailFilter detailFilter(filter); + // Phone numbers need separate handling + + QString number((detailFilter.value()).toString()); + TPtrC commPtr(reinterpret_cast(number.utf16())); + + TInt matchLength(KDefaultMatchLength); + // no need to propagate error, we can use the default match length + TRAP_IGNORE(getMatchLengthL(matchLength)); + int actualLength = number.length(); + + //call the search + CContactIdArray* idArray(0); + TInt err = searchPhoneNumbers(idArray, commPtr, matchLength); + if( idArray && (err == KErrNone)){ + // copy the matching contact ids + for(int i(0); i < idArray->Count(); i++) { + matches.append(QContactLocalId((*idArray)[i])); + } + delete idArray; + } + else{ + //CntSymbianTransformError::transformError(err, error); + } + + + + return matches; + + } +/* + * Get the match length setting. Digits to be used in matching (counted from + * right). + */ +void CntFilterDetail::getMatchLengthL(TInt& matchLength) +{ + //Get number of digits used to match + CRepository* repository = CRepository::NewL(KCRUidTelConfiguration); + CleanupStack::PushL(repository); + User::LeaveIfError(repository->Get(KTelMatchDigits, matchLength)); + CleanupStack::PopAndDestroy(repository); +} + +/* + * Find contacts based on a phone number. + * \a idArray On return contains the ids of the contacts that match the phonenumber. + * \a phoneNumber The phone number to match + * \a matchLength Match length; digits from right. + */ +TInt CntFilterDetail::searchPhoneNumbers( + CContactIdArray*& idArray, + const TDesC& phoneNumber, + const TInt matchLength) +{ + CContactIdArray* idArrayTmp(0); + TRAPD( err, idArrayTmp = m_contactdatabase.MatchPhoneNumberL(phoneNumber, matchLength)); + if(err == KErrNone){ + idArray = idArrayTmp; + } + return 0; +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdetaildisplaylabel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdetaildisplaylabel.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,286 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntfilterdetaildisplaylabel.h" +#include "cntdisplaylabel.h" +#include +#include + +#include + +CntFilterDetailDisplayLabel::CntFilterDetailDisplayLabel(/*CntSymbianSrvConnection &cntServer*/) //: m_srvConnection(cntServer) +{ +// TODO Auto-generated constructor stub + +} + +CntFilterDetailDisplayLabel::~CntFilterDetailDisplayLabel() +{ +// TODO Auto-generated destructor stub +} + +#ifdef afdsfds0 +bool CntFilterDetailDisplayLabel::filterSupported(const QContactFilter& filter) +{ + bool result = false; + + if( filter.type() == QContactFilter::ContactDetailFilter) + { + const QContactDetailFilter detailFilter(filter); + + if (detailFilter.detailDefinitionName() == QContactDisplayLabel::DefinitionName) + { + result = true; + } + } + + return false; +} + +#endif + +void CntFilterDetailDisplayLabel::createSelectQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error) + +{ + //Commented currently since this will be checked in contacts call intially + //if(filterSupported(filter)) + { + const QContactDetailFilter detailFilter(filter); + + error = QContactManager::NoError; + + //get the contact fields that should be checked + CntDisplayLabel displayLabel; + QList > contactFields = displayLabel.contactFilterDetails(); + + //search values + QStringList searchStrings = detailFilter.value().toStringList(); + + //default sql query + sqlQuery = "SELECT contact_id FROM contact WHERE (type_flags>>24)=0"; + + //everything ok + if(!searchStrings.isEmpty() && searchStrings.count() <= contactFields.count() ) + { + QString subQuery; + QStringList columns; + + //get the column names + for(int i = 0; i < contactFields.count(); i++) + { + columns << columnName(contactFields.at(i)); + } + + //single search value + if(searchStrings.count() == 1) + { + createQuerySingleSearchValue(subQuery, searchStrings.at(0), columns); + } + + //multiple search values + else + { + createQueryMultipleSearchValues(subQuery, searchStrings, columns); + } + + if(!subQuery.isEmpty()){ + sqlQuery += " AND (" + subQuery + ')'; + } + + error = QContactManager::NoError; + } + + //if specified more filter criterias than contact fields return error + else if(searchStrings.count() > contactFields.count()){ + error = QContactManager::BadArgumentError; + } + } + +} + +QString CntFilterDetailDisplayLabel::createSelectQuery(const QContactFilter& filter, + const QList& sortOrders, + QContactManager::Error& error) const +{ + Q_UNUSED(sortOrders); + QString result; + //Commented currently since this will be checked in contacts call intially + //if(filterSupported(filter)) + { + const QContactDetailFilter detailFilter(filter); + + error = QContactManager::NoError; + + //get the contact fields that should be checked + CntDisplayLabel displayLabel; + QList > contactFields = displayLabel.contactFilterDetails(); + + //search values + QStringList searchStrings = detailFilter.value().toStringList(); + + //default sql query + result = "SELECT contact_id FROM contact WHERE (type_flags>>24)=0"; + + //everything ok + if(!searchStrings.isEmpty() && searchStrings.count() <= contactFields.count() ) + { + QString subQuery; + QStringList columns; + + //get the column names + for(int i = 0; i < contactFields.count(); i++) + { + columns << columnName(contactFields.at(i)); + } + + //single search value + if(searchStrings.count() == 1) + { + createQuerySingleSearchValue(subQuery, searchStrings.at(0), columns); + } + + //multiple search values + else + { + createQueryMultipleSearchValues(subQuery, searchStrings, columns); + } + + if(!subQuery.isEmpty()){ + result += " AND (" + subQuery + ')'; + } + + error = QContactManager::NoError; + } + + //if specified more filter criterias than contact fields return error + else if(searchStrings.count() > contactFields.count()){ + error = QContactManager::BadArgumentError; + } + } + + return result; +} + +/* Creates a sql query for a single search value + * + * \a sqlQuery where the query is written + * \a searchValue the value that should be used to select contacts + * \a columns the columns to be looked from + * + */ +void CntFilterDetailDisplayLabel::createQuerySingleSearchValue(QString& sqlQuery, const QString &searchValue, const QStringList &columns) const +{ + for (int i = 0; i < columns.count(); i++) + { + sqlQuery += createSubQuery(searchValue, columns.at(i)); + + if( i < (columns.count() - 1)) + { + sqlQuery += " OR "; + } + } +} + +/* Creates a sql query for a multiple search values, Note supports only 2 search and columns values currently + * + * \a sqlQuery where the query is written + * \a searchValues the value that should be used to select contacts + * \a columns the columns to be looked from + */ +void CntFilterDetailDisplayLabel::createQueryMultipleSearchValues(QString& sqlQuery, const QStringList &searchValues, const QStringList &columns) const +{ + if( searchValues.count() == 2 && columns.count() == 2 ) + { + sqlQuery += createSubQuery(searchValues.at(0), columns.at(1)) + " AND "; + sqlQuery += createSubQuery(searchValues.at(1), columns.at(0)) + " OR "; + sqlQuery += createSubQuery(searchValues.at(0), columns.at(0)) + " AND "; + sqlQuery += createSubQuery(searchValues.at(1), columns.at(1)); + } +} + +/* Creates a sql LIKE Statement for the search valuea and column + * + * \a searchValue to be added to the query + * \a column to be added to the query + * \return the sql LIKE query + */ +QString CntFilterDetailDisplayLabel::createSubQuery(const QString &searchValue, const QString &column) const +{ + return ('(' + column + " LIKE \'" + searchValue + "%\' OR " + column + " LIKE \'% " + searchValue + "%\')"); +} + +/* + * Get the sql column name based on the detail + * + * \a detail to search the column name for + * \a columnName contains the column name or empty string if none found + */ +QString CntFilterDetailDisplayLabel::columnName(const QPair &detail) const +{ + QString columnName = ""; + + //Name detail + if(detail.first == QContactName::DefinitionName) + { + if(detail.second == QContactName::FieldFirst) + { + columnName = "first_name"; + } + + else if(detail.second == QContactName::FieldLast) + { + columnName = "last_name"; + } + } + + //Organization + else if(detail.first == QContactOrganization::DefinitionName) + { + if(detail.second == QContactOrganization::FieldName) + { + columnName = "company_name"; + } + } + + return columnName; +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdetailrange.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdetailrange.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntfilterdetailrange.h" +#include "cnttransformcontact.h" +#include "cntfilterdetaildisplaylabel.h" //todo rename class to follow naming pattern CntFilterDetailDisplayLabel + +CntFilterdetailrange::CntFilterdetailrange(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo) + :m_contactdatabase(contactDatabase), + m_srvConnection(cntServer), + m_dbInfo(dbInfo) +{ + // m_detailFilters.append(new CntFilterDetailDisplayLabel(m_srvConnection)); +} + +CntFilterdetailrange::~CntFilterdetailrange() +{ + +} + + +QList CntFilterdetailrange::contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupportedflag, + QContactManager::Error &error) +{ + Q_UNUSED(sortOrders); + Q_UNUSED(filterSupportedflag); + //Check if any invalid filter is passed + if(!filterSupported(filter)) + { + error = QContactManager::NotSupportedError; + return QList(); + } + QList idList; + + //Create the query + QString sqlQuery; + createSelectQuery( filter,sqlQuery,error); + + //fetch the contacts + if(error != QContactManager::NotSupportedError) + { + idList = m_srvConnection.searchContacts(sqlQuery, error); + } + + return idList; + +} + + +bool CntFilterdetailrange::filterSupported(const QContactFilter& /*filter*/) +{ + bool result = false; + //Not yet supported + /*if(QContactFilter::ContactDetailRangeFilter == filter.type()) + { + result = true; + } + */ + return result; +} + + +void CntFilterdetailrange::createSelectQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error) + +{ + //Check if any invalid filter is passed + if(!filterSupported(filter)) + { + error = QContactManager::NotSupportedError; + } + //Not yet supported + sqlQuery = ""; + + +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterintersection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterintersection.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,186 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntfilterintersection.h" +#include "cntfilterdetail.h" +#include "cntfilterunion.h" +#include "cntfilterdefault.h" +#include "cntfilterrelationship.h" +#include "cnttransformcontact.h" +#include "qcontactintersectionfilter.h" + +CntFilterIntersection::CntFilterIntersection(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo) + : m_contactdatabase(contactDatabase), + m_srvConnection(cntServer), + m_dbInfo(dbInfo) +{ + +} + +CntFilterIntersection::~CntFilterIntersection() +{ + +} + + +QList CntFilterIntersection::contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupportedflag, + QContactManager::Error &error) +{ + Q_UNUSED(sortOrders); + Q_UNUSED(filterSupportedflag); + //Check if any invalid filter is passed + if(filterSupported(filter) == false) + { + error = QContactManager::NotSupportedError; + return QList(); + } + QList idList; + QString sqlQuery; + this->createSelectQuery( filter,sqlQuery,error) ; + //fetch the contacts + if(error == QContactManager::NoError ) + { + idList = m_srvConnection.searchContacts(sqlQuery, error); + } + return idList; +} + + +bool CntFilterIntersection::filterSupported(const QContactFilter& filter) +{ + bool result = false; + if(QContactFilter::IntersectionFilter == filter.type()) + { + result = true; + } + + return result; +} + +void CntFilterIntersection::createSelectQuery(const QContactFilter& filter, + QString& selectquery, + QContactManager::Error& error) + +{ + const QContactIntersectionFilter& intersectionfilter = static_cast(filter); + if(!filterSupported(filter)) + { + error = QContactManager::NotSupportedError; + return; + } + QList individualFilters = intersectionfilter.filters(); + //QString selectquery; + int fltrcnt = individualFilters.count(); + if(fltrcnt) + getSelectQueryforFilter(individualFilters[0],selectquery,error); + + for(int i=1; i< fltrcnt ; i++) + { + + QString query; + getSelectQueryforFilter(individualFilters[i],query,error); + if(error == QContactManager::NoError ) + { + selectquery.append(" INTERSECT "); + selectquery += query; + } + + } + + +} +void CntFilterIntersection::getSelectQueryforFilter(const QContactFilter& filter,QString& sqlSelectQuery,QContactManager::Error& error) + { + switch(filter.type()) + { + case QContactFilter::DefaultFilter: + { + CntFilterDefault defaultfltr(m_contactdatabase,m_srvConnection,m_dbInfo); + defaultfltr.createSelectQuery(filter,sqlSelectQuery,error); + break; + } + case QContactFilter::ContactDetailFilter: + { + QContactDetailFilter detailfilter(filter); + if(detailfilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName ) + { + error=QContactManager::NotSupportedError; + } + else + { + CntFilterDetail dtlfltr(m_contactdatabase,m_srvConnection,m_dbInfo); + dtlfltr.createSelectQuery(filter,sqlSelectQuery,error); + } + break; + } + case QContactFilter::RelationshipFilter: + { + CntFilterRelationship relationfltr(m_contactdatabase,m_srvConnection,m_dbInfo); + relationfltr.createSelectQuery(filter,sqlSelectQuery,error); + break; + } + case QContactFilter::IntersectionFilter: + { + sqlSelectQuery += "SELECT DISTINCT contact_id FROM ("; + CntFilterIntersection intersectionfltr(m_contactdatabase,m_srvConnection,m_dbInfo); + intersectionfltr.createSelectQuery(filter,sqlSelectQuery,error); + sqlSelectQuery += ')'; + break; + } + case QContactFilter::UnionFilter: + { + sqlSelectQuery += "SELECT DISTINCT contact_id FROM ("; + CntFilterUnion unionfltr(m_contactdatabase,m_srvConnection,m_dbInfo); + unionfltr.createSelectQuery(filter,sqlSelectQuery,error); + sqlSelectQuery += ')'; + break; + } + default: + { + error = QContactManager::NotSupportedError; + break; + } + } + } + diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterinvalid.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterinvalid.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntfilterinvalid.h" +#include "cnttransformcontact.h" +#include "cntfilterdetaildisplaylabel.h" //todo rename class to follow naming pattern CntFilterDetailDisplayLabel + +CntFilterInvalid::CntFilterInvalid(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo) + :m_contactdatabase(contactDatabase), + m_srvConnection(cntServer), + m_dbInfo(dbInfo) +{ + // m_detailFilters.append(new CntFilterDetailDisplayLabel(m_srvConnection)); +} + +CntFilterInvalid::~CntFilterInvalid() +{ + +} + +QList CntFilterInvalid::contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupportedflag, + QContactManager::Error &error) +{ + Q_UNUSED(filter); + Q_UNUSED(sortOrders); + Q_UNUSED(filterSupportedflag); + Q_UNUSED(error); + //In case of invalid filter, we return empty list + return QList(); + +} + + +bool CntFilterInvalid::filterSupported(const QContactFilter& filter) +{ + bool result = false; + if(QContactFilter::InvalidFilter == filter.type()) + { + result = true; + } + + return result; +} + +void CntFilterInvalid::createSelectQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error) + +{ + Q_UNUSED(filter); + Q_UNUSED(sqlQuery); + Q_UNUSED(error); + //Not implementation needed in this case + +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterlocalid.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterlocalid.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,116 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntfilterlocalid.h" +#include "cnttransformcontact.h" + +CntFilterLocalId::CntFilterLocalId(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo) + :m_contactdatabase(contactDatabase), + m_srvConnection(cntServer), + m_dbInfo(dbInfo) +{ + +} + +CntFilterLocalId::~CntFilterLocalId() +{ + +} + +QList CntFilterLocalId::contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupportedflag, + QContactManager::Error &error) +{ + Q_UNUSED(sortOrders); + Q_UNUSED(filterSupportedflag); + //Check if any invalid filter is passed + if(!filterSupported(filter)) + { + error = QContactManager::NotSupportedError; + return QList(); + } + QList idList; + + //Create the query + QString sqlQuery; + createSelectQuery( filter,sqlQuery,error); + + //fetch the contacts + if(error != QContactManager::NotSupportedError) + { + idList = m_srvConnection.searchContacts(sqlQuery, error); + } + + return idList; + +} + + +bool CntFilterLocalId::filterSupported(const QContactFilter& /*filter*/) +{ + bool result = false; + //Not yet supported + /*if(QContactFilter::LocalIdFilter == filter.type()) + { + result = true; + } + */ + return result; +} + + +void CntFilterLocalId::createSelectQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error) + +{ + //Check if any invalid filter is passed + if(!filterSupported(filter)) + { + error = QContactManager::NotSupportedError; + } + //Not yet supported + sqlQuery = ""; + + +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterrelationship.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterrelationship.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,143 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntfilterrelationship.h" +#include "qcontactrelationshipfilter.h" +#include "cnttransformcontact.h" + +QTM_USE_NAMESPACE + + + +CntFilterRelationship::CntFilterRelationship(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo) + : m_contactdatabase(contactDatabase), + m_srvConnection(cntServer), + m_dbInfo(dbInfo) +{ + +} + +CntFilterRelationship::~CntFilterRelationship() +{ + +} + +QList CntFilterRelationship::contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupportedflag, + QContactManager::Error &error) +{ + Q_UNUSED(sortOrders); + Q_UNUSED(filterSupportedflag); + //Check if any invalid filter is passed + if(!filterSupported(filter) ) + { + error = QContactManager::NotSupportedError; + return QList(); + } + QList idList; + QString sqlQuery; + createSelectQuery(filter,sqlQuery,error); + //fetch the contacts + if(error == QContactManager::NoError ) + { + idList = m_srvConnection.searchContacts(sqlQuery, error); + } + return idList; +} + + +bool CntFilterRelationship::filterSupported(const QContactFilter& filter) +{ + bool result = false; + if(QContactFilter::RelationshipFilter == filter.type()) + { + QContactRelationshipFilter relationfilter(filter); + if(relationfilter.relationshipType() == QContactRelationship::HasMember) + { + result = true; + } + } + + return result; +} + +void CntFilterRelationship::createSelectQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error) + +{ + if(!filterSupported(filter)) + { + error = QContactManager::NotSupportedError; + return; + } + + QContactRelationshipFilter relationfilter(filter); + QContactId id_to_search = relationfilter.relatedContactId(); + + if(relationfilter.relatedContactRole() == QContactRelationshipFilter::First ) + { + sqlQuery = QString("SELECT DISTINCT contact_group_member_id FROM groups WHERE contact_group_id = %1").arg(id_to_search.localId()); + } + else if(relationfilter.relatedContactRole() == QContactRelationshipFilter::Second ) + { + sqlQuery = QString("SELECT DISTINCT contact_group_id FROM groups WHERE contact_group_member_id = %1").arg(id_to_search.localId()); + } + else if(relationfilter.relatedContactRole() == QContactRelationshipFilter::Either ) + { + sqlQuery = QString("SELECT contact_group_member_id FROM groups WHERE contact_group_id = %1").arg(id_to_search.localId()); + + " union " + + QString("SELECT DISTINCT contact_group_id FROM groups WHERE contact_group_id = %1").arg(id_to_search.localId()); + } +} + + +void CntFilterRelationship::getSqlquery( const QContactRelationshipFilter& relationfilter, + QString& sqlquery , + QContactManager::Error& error) const +{ + Q_UNUSED(relationfilter); + Q_UNUSED(sqlquery); + Q_UNUSED(error); +} + diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterunion.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterunion.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,188 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntfilterunion.h" +#include "cntfilterdetail.h" +#include "cntfilterdefault.h" +#include "cntfilterrelationship.h" +#include "cntfilterintersection.h" +#include "cnttransformcontact.h" +#include "qcontactunionfilter.h" + +CntFilterUnion::CntFilterUnion(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo) : + m_contactdatabase(contactDatabase), + m_srvConnection(cntServer), + m_dbInfo(dbInfo) +{ + +} + +CntFilterUnion::~CntFilterUnion() +{ + +} + + +QList CntFilterUnion::contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupportedflag, + QContactManager::Error &error) +{ + Q_UNUSED(sortOrders); + Q_UNUSED(filterSupportedflag); + //Check if any invalid filter is passed + if(!filterSupported(filter)) + { + error = QContactManager::NotSupportedError; + return QList(); + } + QList idList; + QString sqlQuery; + this->createSelectQuery( filter,sqlQuery,error) ; + //fetch the contacts + if(error == QContactManager::NoError ) + { + idList = m_srvConnection.searchContacts(sqlQuery, error); + } + return idList; +} + + +bool CntFilterUnion::filterSupported(const QContactFilter& filter) +{ + bool result = false; + if(QContactFilter::UnionFilter == filter.type()) + { + result = true; + } + + return result; +} + + + +void CntFilterUnion::createSelectQuery(const QContactFilter& filter, + QString& selectquery, + QContactManager::Error& error) + +{ + const QContactUnionFilter& unionfilter = static_cast(filter); + if(!filterSupported(filter)) + { + error = QContactManager::NotSupportedError; + return; + } + QList individualFilters = unionfilter.filters(); + //QString selectquery; + int fltrcnt = individualFilters.count(); + if(fltrcnt) + getSelectQueryforFilter(individualFilters[0],selectquery,error); + + for(int i=1; i< fltrcnt ; i++) + { + + QString query; + getSelectQueryforFilter(individualFilters[i],query,error); + if(error == QContactManager::NoError ) + { + selectquery.append(" UNION "); + selectquery += query; + } + + } + + +} +void CntFilterUnion::getSelectQueryforFilter(const QContactFilter& filter,QString& sqlSelectQuery,QContactManager::Error& error) + { + switch(filter.type()) + { + case QContactFilter::DefaultFilter: + { + CntFilterDefault defaultfltr(m_contactdatabase,m_srvConnection,m_dbInfo); + defaultfltr.createSelectQuery(filter,sqlSelectQuery,error); + break; + } + case QContactFilter::ContactDetailFilter: + { + QContactDetailFilter detailfilter(filter); + if(detailfilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName ) + { + error=QContactManager::NotSupportedError; + } + else + { + CntFilterDetail dtlfltr(m_contactdatabase,m_srvConnection,m_dbInfo); + dtlfltr.createSelectQuery(filter,sqlSelectQuery,error); + } + break; + } + case QContactFilter::RelationshipFilter: + { + CntFilterRelationship relationfltr(m_contactdatabase,m_srvConnection,m_dbInfo); + relationfltr.createSelectQuery(filter,sqlSelectQuery,error); + break; + } + case QContactFilter::IntersectionFilter: + { + sqlSelectQuery += "SELECT DISTINCT contact_id FROM ("; + CntFilterIntersection intersectionfltr(m_contactdatabase,m_srvConnection,m_dbInfo); + intersectionfltr.createSelectQuery(filter,sqlSelectQuery,error); + sqlSelectQuery += ')'; + break; + } + case QContactFilter::UnionFilter: + { + sqlSelectQuery += "SELECT DISTINCT contact_id FROM ("; + CntFilterUnion unionfltr(m_contactdatabase,m_srvConnection,m_dbInfo); + unionfltr.createSelectQuery(filter,sqlSelectQuery,error); + sqlSelectQuery += ')'; + break; + } + default: + { + error = QContactManager::NotSupportedError; + break; + } + } + } + diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsqlsearch.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsqlsearch.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,350 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include + +#include "cntsqlsearch.h" + +const char LimitLength = 15; +const char LowerLimitPadding = '0'; +const char UpperLimitPadding = 'F'; + + +CntSqlSearch::CntSqlSearch() +{ + + +} + +QString CntSqlSearch::CreatePredictiveSearch(const QString &pattern) +{ + if (pattern.length() > 15) + { + return QString(""); + } + else if (pattern.length() == 1) + { + return "SELECT contact_id FROM " + SelectTableView(pattern) + " ORDER BY first_name, last_name ASC;"; + } + else + { + return CreateSubStringSearch(pattern); + } +} + +QString CntSqlSearch::SelectTableView(const QString &pattern) +{ + QString predictivesearch; + int index; + int num; + if (pattern.contains("0")) + { + index = pattern.indexOf("0"); + if(index == pattern.length() - 1 ) + { + num = 0; + } + else + { + num = pattern.at(index + 1).digitValue(); + } + } + else + { + num = pattern.at(0).digitValue(); + } + + switch (num) + { + + case 0: + { + predictivesearch = QString("predictivesearch0"); + } + break; + case 1: + { + predictivesearch = QString("predictivesearch1"); + } + break; + case 2: + { + predictivesearch = QString("predictivesearch2"); + } + break; + case 3: + { + predictivesearch = QString("predictivesearch3"); + } + break; + case 4: + { + predictivesearch = QString("predictivesearch4"); + } + break; + case 5: + { + predictivesearch = QString("predictivesearch5"); + } + break; + case 6: + { + predictivesearch = QString("predictivesearch6"); + } + break; + case 7: + { + predictivesearch = QString("predictivesearch7"); + } + break; + case 8: + { + predictivesearch = QString("predictivesearch8"); + } + break; + case 9: + { + predictivesearch = QString("predictivesearch9"); + } + break; + } +return predictivesearch; +} + +bool CntSqlSearch::IsSubStringSearch(const QString &pattern) +{ +const QChar zero('0'); +if (pattern.count( "0", Qt::CaseSensitive ) == pattern.count() ) + { + return false; + } +else if (pattern.contains(zero)) + { + return true; + } +else + { + return false; + } +} + +QStringList CntSqlSearch::GetNumber(const QString &pattern) +{ +const QChar zero('0'); +return pattern.split(zero, QString::SkipEmptyParts); +} +QString CntSqlSearch::CreateSubStringSearch(const QString &pattern) +{ +QString queryString; +QStringList numbers; +numbers = GetNumber(pattern); + +if (IsSubStringSearch(pattern) && numbers.count() > 1 ) + { + //Case 203 + queryString = CreateSpaceStringSearch(numbers, pattern) + Order(numbers); + } +else if (IsSubStringSearch(pattern) && numbers.count() < 1 ) + { + //Case 01 + queryString = CreateStringSearch(pattern) + Order(numbers); + } +else + { + //Case 33 + queryString = CreateStringSearch(pattern) + Order(numbers); + } + +return queryString; +} + +QString CntSqlSearch::CreateStringSearch(const QString &pattern ) +{ +QString queryString; + + +return QString("SELECT contact_id FROM " + SelectTableView(pattern) + + " WHERE " + CreateLimit(pattern)); +} + +QString CntSqlSearch::CreateSpaceStringSearch(QStringList numbers, const QString &pattern) +{ +/*if(numbers.at(0) == numbers.at(1)) + { + + } +else*/ + { + if((numbers.at(0).length() > 1 || numbers.at(1).length() > 1) && + (pattern.startsWith('0') || pattern.endsWith('0'))) + { + return QString(CreateJoinTableSearch(numbers) + + " OR (" + CreateJoinTableLimit(lowerLimit(pattern), upperLimit(pattern), SelectTableView(numbers.at(0))) + ")" + + " OR (" + CreateJoinTableLimit(lowerLimit(pattern), upperLimit(pattern), SelectTableView(numbers.at(1)))) + ")"; + } + else if(numbers.at(0).length() > 1 || numbers.at(1).length() > 1 ) + { + return CreateJoinTableSearch(numbers); + } + else + { + return CreateSpaceSimpleSearch(numbers); + } + } +} + +QString CntSqlSearch::CreateSpaceSimpleSearch(QStringList numbers) +{ +QString firstTable = SelectTableView(numbers.at(0)); +QString secondTable = SelectTableView(numbers.at(1)); +QString queryString; + +queryString ="SELECT " + firstTable + ".contact_id FROM " + firstTable + " WHERE EXISTS (SELECT contact_id FROM " + secondTable + +" WHERE " + firstTable + ".contact_id = " + secondTable + ".contact_id)"; +return queryString; +} + +QString CntSqlSearch::CreateLimit(QString pattern) +{ +QString low = lowerLimit(pattern); +QString upp = upperLimit(pattern); +/*return QString("(nbr>" +low + " AND nbr<" + upp + + ") OR (nbr2>" +low + " AND nbr2<" + upp + + ") OR (nbr3>" +low + " AND nbr3<" + upp + + ") OR (nbr4>" +low + " AND nbr4<" + upp + ")");*/ + +return "NOT((NOT (nbr >= " + low + " AND nbr <= " + upp + + ")) AND (NOT (nbr2 >= " + low + " AND nbr2 <= " + upp + + ")) AND (NOT (nbr3 >= " + low + " AND nbr3 <= " + upp + + ")) AND (NOT (nbr4 >= " + low + " AND nbr4 <= " + upp + ")))"; +} + +QString CntSqlSearch::CreateJoinTableSearch(QStringList numbers) +{ +QString firstTable = SelectTableView(numbers.at(0)); +QString secondTable = SelectTableView(numbers.at(1)); +QString queryString; + +queryString = QString("SELECT " + firstTable + ".contact_id FROM " + firstTable + " JOIN " + secondTable + " ON " + firstTable +".contact_id = " + secondTable + ".contact_id WHERE"); + + +if (numbers.at(0).length() > 1 && numbers.at(1).length() > 1 ) + { + queryString += "(" + CreateJoinTableLimit(lowerLimit(numbers.at(0)), upperLimit(numbers.at(0)), SelectTableView(numbers.at(0))) + + ") AND (" + CreateJoinTableLimit(lowerLimit(numbers.at(1)), upperLimit(numbers.at(1)), SelectTableView(numbers.at(1))) + ")"; + } +else if (numbers.at(0).length() > 1 ) + { + queryString += CreateJoinTableLimit(lowerLimit(numbers.at(0)), upperLimit(numbers.at(0)), SelectTableView(numbers.at(0))); + } +else + { + queryString += CreateJoinTableLimit(lowerLimit(numbers.at(1)), upperLimit(numbers.at(1)), SelectTableView(numbers.at(1))); + } + +return queryString; +} + +QString CntSqlSearch::CreateJoinTableLimit(QString low, QString upp, QString table ) +{ +table += "."; +return QString("(" + table + "nbr>" + low + + " AND " + table + "nbr<" + upp + + ") OR (" + table + "nbr2>" + low + + " AND " + table + "nbr2<" + upp + + ") OR (" + table + "nbr3>" + low + + " AND " + table + "nbr3<" + upp + + ") OR (" + table + "nbr4>" + low + + " AND " + table + "nbr4<" + upp + ")"); +} + +QString CntSqlSearch::Order(QStringList numbers) +{ +if (numbers.count() > 1 ) + { + if( numbers.at(0).length() > numbers.at(1).length() || numbers.at(0).length() == numbers.at(1).length() ) + { + return QString(" ORDER BY " + SelectTableView(numbers.at(0)) + ".first_name, " + SelectTableView(numbers.at(0)) + ".last_name ASC;"); + } + else + { + return QString(" ORDER BY " + SelectTableView(numbers.at(1)) + ".first_name, " + SelectTableView(numbers.at(1)) + ".last_name ASC;"); + } + } +else + { + return QString(" ORDER BY first_name, last_name ASC;"); + } +} + +QString CntSqlSearch::pad( const QString &pattern, char padChar ) const + { + QString des; + int padCount = LimitLength-pattern.length(); + padCount = padCount < 0 ? 0 : padCount; + + QString result; //("0x"); + + if ( LimitLength-pattern.length() < 0 ) { + result = result + pattern.left( LimitLength ); + } else { + result = result + pattern; + for( int i=0;i +#include + +#include "cntsymbianfilterdbms.h" +#include "cnttransformcontact.h" +#include "cntsymbiantransformerror.h" + +#include +#include +#include + +#include "qcontactname.h" +#include "qcontactdetailfilter.h" +#include "qcontactphonenumber.h" +#include "cntsymbiansorterdbms.h" + +// Telephony Configuration API +// Keys under this category are used in defining telephony configuration. +const TUid KCRUidTelConfiguration = {0x102828B8}; +// Amount of digits to be used in contact matching. +// This allows a customer to variate the amount of digits to be matched. +const TUint32 KTelMatchDigits = 0x00000001; +// Default match length +const TInt KDefaultMatchLength(7); + +CntSymbianFilter::CntSymbianFilter(CContactDatabase& contactDatabase): + m_contactDatabase(contactDatabase), + m_contactSorter(0), + m_transformContact(0) +{ + // TODO: take CntTransformContact ref as a parameter? + m_transformContact = new CntTransformContact; + m_contactSorter = new CntSymbianSorterDbms(m_contactDatabase, *m_transformContact); +} + +CntSymbianFilter::~CntSymbianFilter() +{ + delete m_contactSorter; + delete m_transformContact; +} + +/*! + * The contact database version implementation for QContactManager::contacts + * function. See filterSupported for the list of supported filters. + * All the other filtering flags fallback to the generic filtering done + * in QContactManagerEngine (expected to be done by to the caller). Contacts + * are sorted only if the sort order is supported by contacts database. See + * CntSymbianSorterDbms::filterSupportLevel for the list of supported sort + * orders. + * + * \a filter The QContactFilter to be used. + * \a sortOrders The sort orders to be used. If the sort orders are not + * supported by contacts database this parameter is ignored and sorting needs + * to be done by the caller. + * \a error On return, contains the possible error in filtering/sorting. + */ +QList CntSymbianFilter::contacts( + const QContactFilter &filter, + const QList &sortOrders, + bool &filterSupportedFlag, + QContactManager::Error &error) +{ + QList result; + + // No need to proceed if some of the filters in the chain is not supported + if(!filterSupportedFlag) return result; + + // Intersection filter is handled by a recursive function call for each + // contained filter (unless at least one requires slow filtering) + if (filter.type() == QContactFilter::IntersectionFilter) { + QList filters = ((QContactIntersectionFilter) filter).filters(); + for(int i(0); filterSupportedFlag && i < filters.count(); i++) { + if(result.isEmpty()) + result = contacts(filters[i], sortOrders, filterSupportedFlag, error); + else + result = contacts(filters[i], sortOrders, filterSupportedFlag, error).toSet().intersect(result.toSet()).toList(); + } + // Union filter is handled by a recursive function call for each + // contained filter (unless at least one requires slow filtering) + } else if (filter.type() == QContactFilter::UnionFilter) { + QList filters = ((QContactUnionFilter) filter).filters(); + for(int i(0); filterSupportedFlag && i < filters.count(); i++) { + if(result.isEmpty()) + result = contacts(filters[i], sortOrders, filterSupportedFlag, error); + else + result = (contacts(filters[i], sortOrders, filterSupportedFlag, error).toSet() + result.toSet()).toList(); + } + // Detail filter with a string list is split and re-constructed into + // an intersection filter + } else if (filter.type() == QContactFilter::ContactDetailFilter + && (static_cast(filter)).value().type() == QVariant::StringList) { + QStringList values = (static_cast(filter)).value().toStringList(); + QContactIntersectionFilter intersectionFilter; + foreach(QString value, values) { + QContactDetailFilter detailFilter = filter; + detailFilter.setValue(value); + intersectionFilter.append(detailFilter); + } + // The resulting filter is handled with a recursive function call + result = contacts(intersectionFilter, sortOrders, filterSupportedFlag, error); + } else { + if (filterSupportLevel(filter) == Supported) { + filterSupportedFlag = true; + // Filter supported, use as the result directly + result = filterContacts(filter, error); + } else if (filterSupportLevel(filter) == SupportedPreFilterOnly) { + // Filter only does pre-filtering, the caller is responsible of + // removing possible false positives after filtering + filterSupportedFlag = false; + result = filterContacts(filter, error); + } else { + // Don't do filtering here, return all contact ids and tell the + // caller to do slow filtering + filterSupportedFlag = false; + result = filterContacts(QContactInvalidFilter(), error); + } + } + + return result; +} + +/*! + * The contact database version implementation for + * QContactManager::filterSupport function. +*/ +bool CntSymbianFilter::filterSupported(const QContactFilter& filter) +{ + TBool result; + + // Map filter support into a boolean value + FilterSupport support = filterSupportLevel(filter); + if (support == Supported || support == SupportedPreFilterOnly) { + result = true; + } else { + result = false; + } + return result; +} + +/*! + * The possible return values are Supported, NotSupported and + * SupportedPreFilterOnly. + * + * Supported means that the filtering is implemented directly by the underlying + * database. NotSupported means that CntSymbianFilter::contacts will + * return an error. And SupportedPreFilterOnly means that the filter is not + * fully supported, but the CntSymbianFilter::contacts will act like the + * filter was supported for performance reasons, returning a result that may + * contain false positives. This means that the client must filter the + * pre-filtered set of contacts to see if there are false positives included. + * Note that the pre-filtering does not give any performance benefits if the + * result contains all contacts or almost all contacts. + * + * \a filter The QContactFilter to be checked. + * \a return Supported in case the filter is supported. NotSupported in case + * the filter is not supported. returns + * + * SupportedPreFilterOnly is returned in the following cases: + * 1. matchFlags is set to QContactFilter::MatchExactly (CntSymbianFilter::contacts + * will use QContactFilter::MatchContains) + * 2. matchFlags is set to QContactFilter::MatchStartsWith (CntSymbianFilter::contacts + * will use QContactFilter::MatchContains) + * 3. matchFlags is set to QContactFilter::MatchEndsWith (CntSymbianFilter::contacts + * will use QContactFilter::MatchContains) + * 4. matchFlags is set to QContactFilter::MatchCaseSensitive (CntSymbianFilter::contacts + * will use QContactFilter::MatchContains) + */ +CntAbstractContactFilter::FilterSupport CntSymbianFilter::filterSupportLevel(const QContactFilter& filter) +{ + if (filter.type() == QContactFilter::ContactDetailFilter) { + const QContactDetailFilter &detailFilter = static_cast(filter); + QContactFilter::MatchFlags matchFlags = detailFilter.matchFlags(); + const QString defName = detailFilter.detailDefinitionName(); + const QString fieldName = detailFilter.detailFieldName(); + + // Filter must target a certain field + if (fieldName.isEmpty()) { + return NotSupported; + } + + // Phone numbers + if (defName == QContactPhoneNumber::DefinitionName) { + + if (matchFlags == QContactFilter::MatchPhoneNumber) { + return Supported; + } + + if (matchFlags == QContactFilter::MatchExactly || + matchFlags == QContactFilter::MatchEndsWith || + matchFlags == QContactFilter::MatchFixedString) { + return SupportedPreFilterOnly; + } + // Names + } else if (defName == QContactName::DefinitionName + || defName == QContactNickname::DefinitionName + || defName == QContactEmailAddress::DefinitionName) { + + if (matchFlags == QContactFilter::MatchContains) { + return Supported; + } + + // Don't care about case sensitivity flag because: + // 1) We do not support it. 2) We are doing prefiltering only. + matchFlags &= ~QContactFilter::MatchFlags(QContactFilter::MatchCaseSensitive); + + if (matchFlags == QContactFilter::MatchExactly || + matchFlags == QContactFilter::MatchContains || + matchFlags == QContactFilter::MatchStartsWith || + matchFlags == QContactFilter::MatchEndsWith || + matchFlags == QContactFilter::MatchFixedString) { + return SupportedPreFilterOnly; + } + // display label, this is a special case that contains several name + // fields and company name + //TODO: "unnamed" display label is not supported currently + } else if (defName == QContactDisplayLabel::DefinitionName) { + + if (matchFlags == QContactFilter::MatchStartsWith) { + return Supported; + } + + // Don't care about case sensitivity flag because: + // 1) We do not support it. 2) We are doing prefiltering only. + matchFlags &= ~QContactFilter::MatchFlags(QContactFilter::MatchCaseSensitive); + + if (matchFlags == QContactFilter::MatchStartsWith) { + return SupportedPreFilterOnly; + } + } + } + return NotSupported; +} + +QList CntSymbianFilter::filterContacts( + const QContactFilter& filter, + QContactManager::Error& error) +{ + QList matches; + CContactIdArray* idArray(0); + + if (filter.type() == QContactFilter::InvalidFilter ){ + TTime epoch(0); + idArray = m_contactDatabase.ContactsChangedSinceL(epoch); // return all contacts + } else if(filterSupportLevel(filter) == NotSupported) { + error = QContactManager::NotSupportedError; + } else if (filter.type() == QContactFilter::ContactDetailFilter) { + const QContactDetailFilter &detailFilter = static_cast(filter); + + // Phone numbers + if (detailFilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName) { + QString number((detailFilter.value()).toString()); + TPtrC commPtr(reinterpret_cast(number.utf16())); + + TInt matchLength(KDefaultMatchLength); + // no need to propagate error, we can use the default match length + TRAP_IGNORE(getMatchLengthL(matchLength)); + + TInt err = matchContacts(idArray, commPtr, matchLength); + if(err != KErrNone) { + CntSymbianTransformError::transformError(err, error); + } + // Names, e-mail, display label (other flags) + } else { + QString name((detailFilter.value()).toString()); + TPtrC namePtr(reinterpret_cast(name.utf16())); + CContactItemFieldDef *fieldDef(0); + TRAPD(err, transformDetailFilterL(detailFilter, fieldDef)); + if(err != KErrNone){ + CntSymbianTransformError::transformError(err, error); + } else { + Q_ASSERT_X(fieldDef->Count() > 0, "CntSymbianFilter", "Illegal field def"); + TInt err = findContacts(idArray, *fieldDef, namePtr); + if(err != KErrNone) { + CntSymbianTransformError::transformError(err, error); + } + + // Display label special case with "starts with" flag; + // False positives are removed here for performance reasons + // (this is a very common use case in a name list view) + // + // Another option might be to use CContactDatabase::FindInTextDefLC + // for filtering with display label + if (detailFilter.detailDefinitionName() == QContactDisplayLabel::DefinitionName + && detailFilter.matchFlags() == QContactFilter::MatchStartsWith) { + + // Remove false positives + for(TInt i(0); i < idArray->Count(); i++) { + CContactItem* contactItem = m_contactDatabase.ReadContactLC((*idArray)[i]); + const CContactItemFieldSet& fieldSet(contactItem->CardFields()); + if(isFalsePositive(fieldSet, KUidContactFieldGivenName, namePtr) + && isFalsePositive(fieldSet, KUidContactFieldFamilyName, namePtr) + && isFalsePositive(fieldSet, KUidContactFieldCompanyName, namePtr) + && isFalsePositive(fieldSet, KUidContactFieldSecondName, namePtr)){ + idArray->Remove(i); + i--; + } + CleanupStack::PopAndDestroy(contactItem); + } + } + } + delete fieldDef; + } + } + + if(idArray && (error == QContactManager::NoError)) { + // copy the matching contact ids + for(int i(0); i < idArray->Count(); i++) { + matches.append(QContactLocalId((*idArray)[i])); + } + } + + delete idArray; + + return matches; +} + +/*! + * Checks if the contact's field set includes field \a fieldTypeUid and if the + * field contents matches the search string. The features currently: + * 1. only checks the first field instance + * 2. supports only "starts with" + * 3. searches every word inside the field + * 4. supports only "not case-sensitive" matching + */ +bool CntSymbianFilter::isFalsePositive(const CContactItemFieldSet& fieldSet, const TUid& fieldTypeUid, const TDesC& searchString) +{ + bool value(true); + TInt index = fieldSet.Find(fieldTypeUid); + if(index >= 0) { + const CContactItemField& field(fieldSet[index]); + CContactTextField* storage = field.TextStorage(); + TPtrC text = storage->Text(); + index = text.FindC(searchString); + // Check if this is the first word beginning with search string + if(index == 0) + value = false; + // Check if this is in the beginning of a word (the preceeding + // character is a space) + else if(index > 0 && TChar(text[index-1]) == TChar(0x20)) + value = false; + } + return value; +} + +/*! + * Transform detail filter into a contact item field definition that can be + * used with CContactDatabase finds. + */ +void CntSymbianFilter::transformDetailFilterL( + const QContactDetailFilter &detailFilter, + CContactItemFieldDef *&fieldDef) +{ + const TInt defaultReserve(1); + const TInt nameFieldsCount(5); + + CContactItemFieldDef* tempFieldDef = new (ELeave) CContactItemFieldDef(); + CleanupStack::PushL(tempFieldDef); + tempFieldDef->SetReserveL(defaultReserve); + + // TODO: Refactor to use the transform classes + // Names + if(detailFilter.detailDefinitionName() == QContactName::DefinitionName) { + if(detailFilter.detailFieldName() == QContactName::FieldPrefix) { + tempFieldDef->AppendL(KUidContactFieldPrefixName); + } else if(detailFilter.detailFieldName() == QContactName::FieldFirst) { + tempFieldDef->AppendL(KUidContactFieldGivenName); + } else if(detailFilter.detailFieldName() == QContactName::FieldMiddle) { + tempFieldDef->AppendL(KUidContactFieldAdditionalName); + } else if(detailFilter.detailFieldName() == QContactName::FieldLast) { + tempFieldDef->AppendL(KUidContactFieldFamilyName); + } else if(detailFilter.detailFieldName() == QContactName::FieldSuffix) { + tempFieldDef->AppendL(KUidContactFieldSuffixName); + } else { + // default to all name fields + tempFieldDef->SetReserveL(nameFieldsCount); + tempFieldDef->AppendL(KUidContactFieldPrefixName); + tempFieldDef->AppendL(KUidContactFieldGivenName); + tempFieldDef->AppendL(KUidContactFieldAdditionalName); + tempFieldDef->AppendL(KUidContactFieldFamilyName); + tempFieldDef->AppendL(KUidContactFieldSuffixName); + } + } + // Nick name + else if(detailFilter.detailDefinitionName() == QContactNickname::DefinitionName) { + tempFieldDef->AppendL(KUidContactFieldSecondName); + } + // Email + else if(detailFilter.detailDefinitionName() == QContactEmailAddress::DefinitionName) { + tempFieldDef->AppendL(KUidContactFieldEMail); + } + // Display label + else if(detailFilter.detailDefinitionName() == QContactDisplayLabel::DefinitionName) { + // in S60 display label is constructed with "nick name", "first name", + // "last name" and/or "company name" + tempFieldDef->SetReserveL(nameFieldsCount); + tempFieldDef->AppendL(KUidContactFieldSecondName); + tempFieldDef->AppendL(KUidContactFieldGivenName); + tempFieldDef->AppendL(KUidContactFieldFamilyName); + tempFieldDef->AppendL(KUidContactFieldCompanyName); + } + + CleanupStack::Pop(tempFieldDef); + fieldDef = tempFieldDef; +} + +/*! + * Find contacts based on a contact field contents. + * \a idArray On return contains the ids of the contacts that have the field + * defined that contains the find text. + * \a fieldUid The UID of the contact database field to be searched. + * \a text The text to be searched for. + * \return Symbian error code. + */ +TInt CntSymbianFilter::findContacts( + CContactIdArray*& idArray, + const CContactItemFieldDef& fieldDef, + const TDesC& text) const +{ + CContactIdArray* idArrayTmp(0); + TRAPD( err, idArrayTmp = findContactsL(fieldDef, text)); + if(err == KErrNone) + { + idArray = idArrayTmp; + } + return err; +} + +/*! + * Leaving implementation called by findContacts. + */ +CContactIdArray* CntSymbianFilter::findContactsL( + const CContactItemFieldDef& fieldDef, + const TDesC& text) const +{ + CContactIdArray* idsArray = m_contactDatabase.FindLC(text, &fieldDef); + CleanupStack::Pop(idsArray); // Ownership transferred + return idsArray; +} + +/* + * Find contacts based on a phone number. + * \a idArray On return contains the ids of the contacts that match the filter. + * \a phoneNumber The phone number to match + * \a matchLength Match length; digits from right. + */ +TInt CntSymbianFilter::matchContacts( + CContactIdArray*& idArray, + const TDesC& phoneNumber, + const TInt matchLength) +{ + CContactIdArray* idArrayTmp(0); + TRAPD( err, idArrayTmp = m_contactDatabase.MatchPhoneNumberL(phoneNumber, matchLength)); + if(err == KErrNone) + { + idArray = idArrayTmp; + } + return err; +} + +/* + * Get the match length setting used in MatchPhoneNumber type filtering. + * \a matchLength Phone number digits to be used in matching (counted from + * right). + */ +void CntSymbianFilter::getMatchLengthL(TInt& matchLength) +{ + //Get number of digits used to match + CRepository* repository = CRepository::NewL(KCRUidTelConfiguration); + CleanupStack::PushL(repository); + User::LeaveIfError(repository->Get(KTelMatchDigits, matchLength)); + CleanupStack::PopAndDestroy(repository); +} + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbianfiltersql.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbianfiltersql.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,139 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifdef SYMBIAN_BACKEND_USE_SQLITE + +#include "cntsymbianfiltersql.h" +#include "qcontactdetailfilter.h" +#include "qcontactphonenumber.h" +#include "cntsymbiansrvconnection.h" + +#include "cntfilterdetail.h" +#include "cntfilterdefault.h" +#include "cntfilterintersection.h" +#include "cntfilterunion.h" +#include "cntfilterrelationship.h" +#include "cntfilterinvalid.h" +#include "cntfilterdetailrange.h" +#include "cntfilterchangelog.h" +#include "cntfilteraction.h" +#include "cntfilterlocalid.h" +#include +#include +#include + + +CntSymbianFilter::CntSymbianFilter(QContactManagerEngine& /*manager*/, CContactDatabase& contactDatabase, const CntTransformContact &transformContact): + m_contactDatabase(contactDatabase), + m_transformContact(transformContact) +{ + m_srvConnection = new CntSymbianSrvConnection(); + m_dbInfo = new CntDbInfo(); + initializeFilters(); + +} + +void CntSymbianFilter::initializeFilters() + { + m_filterMap.insert(QContactFilter::ContactDetailFilter, new CntFilterDetail(m_contactDatabase,*m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::DefaultFilter, new CntFilterDefault(m_contactDatabase,*m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::IntersectionFilter, new CntFilterIntersection(m_contactDatabase,*m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::UnionFilter, new CntFilterUnion(m_contactDatabase,*m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::RelationshipFilter, new CntFilterRelationship(m_contactDatabase,*m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::InvalidFilter, new CntFilterInvalid(m_contactDatabase,*m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::ContactDetailRangeFilter, new CntFilterdetailrange(m_contactDatabase,*m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::ChangeLogFilter, new CntFilterChangeLog(m_contactDatabase,*m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::ActionFilter, new CntFilterAction(m_contactDatabase,*m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::LocalIdFilter, new CntFilterLocalId(m_contactDatabase,*m_srvConnection,*m_dbInfo)); + + } + + + +CntSymbianFilter::~CntSymbianFilter() +{ + + + //delete the all filters from the map + QMap::iterator itr; + + for (itr = m_filterMap.begin(); itr != m_filterMap.end(); ++itr) + { + CntAbstractContactFilter* value = itr.value(); + delete value; + value = 0; + } + + delete m_srvConnection; + delete m_dbInfo; +} + +QList CntSymbianFilter::contacts( + const QContactFilter& filter, + const QList& sortOrders, + bool &filterSupported, + QContactManager::Error& error) +{ + QList ids; + if(m_filterMap.contains(filter.type())) + { + + ids = ( m_filterMap.value(filter.type()))->contacts(filter,sortOrders,filterSupported,error); + return ids; + + } + error = QContactManager::NotSupportedError; + return ids; + +} + +bool CntSymbianFilter::filterSupported(const QContactFilter& filter) +{ + bool result = false; + + if(m_filterMap.contains(filter.type())) + { + result = m_filterMap.value(filter.type())->filterSupported(filter); + } + return result; +} + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbianfiltersqlhelper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbianfiltersqlhelper.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,731 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +//system includes +#include +#include +#include + +#include + +//user includes +#include "cntsymbianfiltersqlhelper.h" +#include "qcontactdetailfilter.h" +#include "cnttransformcontact.h" +#include "cntdisplaylabel.h" +#include "cntdisplaylabelsqlfilter.h" +#include "cntsqlsearch.h" + +// Telephony Configuration API +// Keys under this category are used in defining telephony configuration. +const TUid KCRUidTelConfiguration = {0x102828B8}; +// Amount of digits to be used in contact matching. +// This allows a customer to variate the amount of digits to be matched. +const TUint32 KTelMatchDigits = 0x00000001; +// Default match length +const TInt KDefaultMatchLength(7); +//Class documentation go here: +/*! + \class CntSymbianFilterSqlHelper + \brief Helper class for converting filter to sql queries +*/ + + Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SingleQuote,"'") ; + Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::PercentSign,"%") ; + Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::Space," ") ; + Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::EqualTo,"=") ; + Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SqlLike," LIKE ") ; + Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SqlNotNull," NOT NULL ") ; + Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SqlWhere," WHERE ") ; + Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::SqlOr," OR ") ; + Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::contactsTable," contact ") ; + Q_DEFINE_LATIN1_LITERAL(CntSymbianFilterSqlHelper::commAddrTable," comm_addr ") ; + + +/*! + * The constructor + */ +CntSymbianFilterSqlHelper::CntSymbianFilterSqlHelper(CContactDatabase& contactDatabase) + : m_contactDatabase(contactDatabase), + isPhoneNumberSearchforDetailFilter(false) +{ + m_srvConnection = new CntSymbianSrvConnection(); + m_sqlSearch = new CntSqlSearch(); + + contactsTableIdColumNameMapping.insert(KUidContactFieldGivenName.iUid,"first_name" ); + contactsTableIdColumNameMapping.insert(KUidContactFieldGivenNamePronunciation.iUid,"firstname_prn" ); + contactsTableIdColumNameMapping.insert(KUidContactFieldFamilyName.iUid,"last_name" ); + contactsTableIdColumNameMapping.insert(KUidContactFieldFamilyNamePronunciation.iUid,"lastname_prn" ); + contactsTableIdColumNameMapping.insert(KUidContactFieldCompanyName.iUid,"company_name" ); + contactsTableIdColumNameMapping.insert(KUidContactFieldCompanyNamePronunciation.iUid,"companyname_prn" ); + + //commAddrTableIdColumNameMapping.insert(KUidContactFieldIMPP.iUid,ESipAddress ); + commAddrTableIdColumNameMapping.insert(KUidContactFieldSIPID.iUid,ESipAddress ); + commAddrTableIdColumNameMapping.insert(KUidContactFieldEMail.iUid,EEmailAddress ); + +} + +/*! + * Destructor + */ +CntSymbianFilterSqlHelper::~CntSymbianFilterSqlHelper() + +{ + delete m_srvConnection; + delete m_sqlSearch; + contactsTableIdColumNameMapping.clear(); + commAddrTableIdColumNameMapping.clear(); +} + +/*! + * Fetch search results from the database. + * + * \a filter The simple/complex QContactFilter passed . + * \a error On return, contains the possible error. + * \return the list of matched contact ids + */ +QList CntSymbianFilterSqlHelper::searchContacts(const QContactFilter& filter, const QList& sortOrders, + QContactManager::Error& error) +{ + isPhoneNumberSearchforDetailFilter = false; + QList idList; + bool isPredSearch; + idList = HandlePredictiveSearchFilter(filter,isPredSearch, error); + if(isPredSearch) + return idList; + if(filterSupportLevel(filter)){ + + // Create sql query from the filters + QString sqlQuery; + createSqlQuery(filter, sqlQuery, error); + + if( error != QContactManager::NoError) { + return QList(); + } + // Query the database + // If isPhoneNumberSearchforDetailFilter flag is set, we use the existing cntmodel + // else call searchContacts + if(isPhoneNumberSearchforDetailFilter) + { + // cast the filter into detail filte + const QContactDetailFilter detailFilter(filter); + idList = HandlePhonenumberDetailFilter(detailFilter); + } + else + { + //append the sort order to the query + appendSortOrderQuery(sqlQuery, sortOrders); + + //fetch the contacts + idList = m_srvConnection->searchContacts(sqlQuery, error); + } + + } + else + { + error = QContactManager::NotSupportedError; + } + return idList; + + +} + +QList CntSymbianFilterSqlHelper::HandlePredictiveSearchFilter(const QContactFilter& filter, bool &isPredSearch, + QContactManager::Error& error) + { + isPredSearch = false; + QString sqlQuery; + if(filter.type() == QContactFilter::ContactDetailFilter){ + const QContactDetailFilter detailFilter(filter); + if( detailFilter.matchFlags() == QContactFilter::MatchKeypadCollation ){ + //convert string to numeric format + QString pattern = detailFilter.value().toString(); + sqlQuery = m_sqlSearch->CreatePredictiveSearch(pattern); + isPredSearch = true; + + return m_srvConnection->searchContacts(sqlQuery, error); + } + else + { + return QList(); + } + } + else + { + return QList(); + } + } + +/*! + * Append the sort order to the sql query + * + * \a sqlQuery to add the sort order to + * \a sortOrders to be added + */ +void CntSymbianFilterSqlHelper::appendSortOrderQuery(QString& sqlQuery, const QList& sortOrders) +{ + QString column; + CntDisplayLabel displayLabel; + + bool first(true); + + for(int i = 0; i < sortOrders.count(); i++) + { + columnName(column, sortOrders.at(i).detailDefinitionName(), sortOrders.at(i).detailFieldName()); + + if(!column.isEmpty()) + { + if(first) + { + sqlQuery += " ORDER BY"; + first = false; + } + + else + { + sqlQuery += ','; + } + + //use the display label if the name is null, ignore case + sqlQuery += " CASE WHEN " + column + " ISNULL THEN \'"+ displayLabel.unNamned().toLower() + "\' ELSE lower(" + column + ") END"; + + if(sortOrders.at(i).direction() == Qt::AscendingOrder) + { + sqlQuery += " ASC"; + } + + else if(sortOrders.at(i).direction() == Qt::DescendingOrder) + { + sqlQuery += " DESC"; + } + } + } +} + +/*! + * Retrieve a column name + * + * \a columnName to be saved the column name if found + * \a detailDefinitionName of the detail to fetch column name for + * \a detailFieldName of the detail to fetch column name for + */ +void CntSymbianFilterSqlHelper::columnName( QString &columnName, const QString &detailDefinitionName, const QString & detailFieldName) +{ + columnName = ""; + + //Name detail + if(detailDefinitionName == QContactName::DefinitionName) + { + if(detailFieldName == QContactName::FieldFirst) + { + columnName = "first_name"; + } + + else if(detailFieldName == QContactName::FieldLast) + { + columnName = "last_name"; + } + } + + //Organization + else if(detailDefinitionName == QContactOrganization::DefinitionName) + { + if(detailFieldName == QContactOrganization::FieldName) + { + columnName = "company_name"; + } + } +} + +/*! + * converts complex filter into simple filters + * + * \a filter The simple/complex QContactFilter passed . + * \a sqlQuery The sql query that would be formed + * \a error On return, contains the possible error. + */ +void CntSymbianFilterSqlHelper::createSqlQuery(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error) +{ + //Check if it is a single filter + bool IsOneLevelFilter = isSingleFilter(filter); + if(IsOneLevelFilter) { + //Single Filter, get the sql query here + updateSqlQueryForSingleFilter(filter,sqlQuery,error); + } else { + // We have multiple filters. Combine these to form correct query + // Not supported yet + error = QContactManager::NotSupportedError; + } +} + +/*! + * Checks if the given filter is a single filter or combination of filters + * + * \a filter The QContactFilter to be used. + * \return True if the filters is single filter + */ + +bool CntSymbianFilterSqlHelper::isSingleFilter(const QContactFilter& singlefilter) const +{ + + bool returnValue = false; + switch (singlefilter.type()) { + case QContactFilter::ContactDetailFilter: + case QContactFilter::InvalidFilter : + case QContactFilter::ContactDetailRangeFilter: + case QContactFilter::ChangeLogFilter: + case QContactFilter::DefaultFilter: + //All are single filters, return True + returnValue = true; + break; + case QContactFilter::ActionFilter: + case QContactFilter::IntersectionFilter: + case QContactFilter::UnionFilter: + + //All these are multiple filters + returnValue = false; + break; + default: + returnValue = false; + break; + }; + return returnValue; +} + +/*! + * Updates the input sql query for single filter + * + * \a filter The QContactFilter to be used. + * \a sqlQuery The sql query that would be updated + * \a error On return, contains the possible error + */ +void CntSymbianFilterSqlHelper::updateSqlQueryForSingleFilter( const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error) +{ + switch (filter.type()) { + case QContactFilter::InvalidFilter : + { + // Not supported yet + error = QContactManager::NotSupportedError; + break; + } + case QContactFilter::ContactDetailFilter: + { + const QContactDetailFilter detailFilter(filter); + + //display label + if (detailFilter.detailDefinitionName() == QContactDisplayLabel::DefinitionName) + { + CntDisplayLabelSqlFilter displayLabelFilter; + displayLabelFilter.createSqlQuery(detailFilter,sqlQuery,error); + } + + //type + else if(detailFilter.detailDefinitionName() == QContactType::DefinitionName) + { + if(detailFilter.value().toString() == QContactType::TypeContact) + sqlQuery = "SELECT contact_id FROM contact WHERE (type_flags>>24)=0"; + else if(detailFilter.value().toString() == QContactType::TypeGroup) + sqlQuery = "SELECT contact_id FROM contact WHERE (type_flags>>24)=3"; + } + + //everything else + else + { + updateSqlQueryForDetailFilter(filter,sqlQuery,error); + } + + break; + } + case QContactFilter::ContactDetailRangeFilter: + // Not supported yet + error = QContactManager::NotSupportedError; + break; + + case QContactFilter::ChangeLogFilter: + // Not supported yet + error = QContactManager::NotSupportedError; + break; + case QContactFilter::DefaultFilter: + sqlQuery = "SELECT DISTINCT contact_id FROM contact WHERE (type_flags>>24)=0 OR (type_flags>>24)=3"; + error = QContactManager::NoError; + break; + case QContactFilter::ActionFilter: + case QContactFilter::IntersectionFilter: + case QContactFilter::UnionFilter: + //All these are multiple filters + // Not supported yet + error = QContactManager::NotSupportedError; + break; + default: + //Some Unknow filter value + // Not supported + error = QContactManager::NotSupportedError; + break; + }; + if( error != QContactManager::NoError) + { + sqlQuery = ""; + } +} + +/*! + * Updates the input sql query for detail filter + * + * \a filter The QContactFilter to be used. + * \a sqlQuery The sql query that would be updated + * \a error On return, contains the possible error + */ +void CntSymbianFilterSqlHelper::updateSqlQueryForDetailFilter(const QContactFilter& filter, + QString& sqlQuery, + QContactManager::Error& error) +{ + + + // cast the filter into detail filter + const QContactDetailFilter detailFilter(filter); + + QString sqlWhereClause = Space + " WHERE "; + + //Get the table name and the column name + bool isSubType; + QString columnName; + QString tableName; + + //Check for phonenumber. Special handling needed + if(detailFilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName){ + isPhoneNumberSearchforDetailFilter = true; + error = QContactManager::NoError; + return; + } + + getSqlDbTableAndColumnNameforDetailFilter(detailFilter,isSubType,tableName,columnName); + + //return if tableName is empty + if(tableName.isEmpty()){ + error = QContactManager::NotSupportedError; + return; + } + + //check columnName + if(columnName.isEmpty()) { + error = QContactManager::NotSupportedError; + return; + } + else if(isSubType) { + sqlWhereClause += columnName; + sqlWhereClause += " NOT NULL "; + } + else { + + sqlWhereClause += Space + columnName + Space ; + QString fieldToUpdate; + //Update the value depending on the match flag + updateFieldForDeatilFilterMatchFlag(detailFilter,fieldToUpdate,error); + sqlWhereClause += fieldToUpdate; + } + + + //Create the sql query + sqlQuery += "SELECT DISTINCT contact_id FROM " + Space + tableName + Space + sqlWhereClause; + + +} + +/*! + * Converts filed id to column name of the database table. + * QContactManager::contacts function. + * + * \a fieldId field id representing the detail field name + * \a sqlDbTableColumnName On return,contains the column name in the database + */ +void CntSymbianFilterSqlHelper::updateFieldForDeatilFilterMatchFlag( + const QContactDetailFilter& filter, + QString& fieldToUpdate , + QContactManager::Error& error) const +{ + // Modify the filed depending on the query + switch(filter.matchFlags()) + { + case QContactFilter::MatchExactly: + { + // Pattern for MatchExactly: + // " ='xyz'" + fieldToUpdate = Space + EqualTo + SingleQuote + + filter.value().toString() + SingleQuote; + error = QContactManager::NoError; + break; + } + case QContactFilter::MatchContains: + { + // Pattern for MatchContains: + // " LIKE '%xyz%'" + fieldToUpdate = Space + SqlLike + Space + SingleQuote + PercentSign + + filter.value().toString() + PercentSign + SingleQuote ; + error = QContactManager::NoError; + break; + } + case QContactFilter::MatchStartsWith: + { + // Pattern for MatchStartsWith: + // " LIKE 'xyz%'" + fieldToUpdate = Space + SqlLike + Space + SingleQuote + + filter.value().toString() + PercentSign + SingleQuote ; + error = QContactManager::NoError; + break; + } + case QContactFilter::MatchEndsWith: + { + // Pattern for MatchEndsWith: + // " LIKE '%xyz'" + fieldToUpdate = Space + SqlLike + Space + SingleQuote + PercentSign + + filter.value().toString() + SingleQuote ; + error = QContactManager::NoError; + break; + } + case QContactFilter::MatchFixedString: + { + error = QContactManager::NotSupportedError; + break; + } + case QContactFilter::MatchCaseSensitive: + { + error = QContactManager::NotSupportedError; + break; + } + default: + { + error = QContactManager::NotSupportedError; + break; + } + } +} + +/*! + * Converts filed id to column name of the database table. + * QContactManager::contacts function. + * + * \a fieldId field id representing the detail field name + * \a sqlDbTableColumnName On return,contains the column name in the database + */ +void CntSymbianFilterSqlHelper::getSqlDbTableAndColumnNameforDetailFilter( + const QContactDetailFilter& detailFilter , + bool& isSubType, + QString& tableName, + QString& columnName ) +{ + + //Get the field id for the detail field name + CntTransformContact transformContact; + quint32 fieldId = transformContact.GetIdForDetailL(detailFilter, isSubType); + + //check contacts table + columnName = ""; + tableName = ""; + + if (contactsTableIdColumNameMapping.contains(fieldId)){ + columnName = contactsTableIdColumNameMapping.value(fieldId); + tableName = "contact"; + } + + if( (columnName.isEmpty()) || (tableName.isEmpty())){ + //Search comm Addr table + if (commAddrTableIdColumNameMapping.contains(fieldId)){ + // communication address table has slightly differnt format, so we make the column name as + // "type = and value " + int typeval = commAddrTableIdColumNameMapping.value(fieldId) ; + columnName = Space + "TYPE = "; + columnName.append('0'+ typeval) + + typeval + Space; + columnName += " and value " ; + tableName = "comm_addr"; + } + + } +} + +QList CntSymbianFilterSqlHelper::HandlePhonenumberDetailFilter(const QContactDetailFilter detailFilter) + { + QList matches; + + if(detailFilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName){ + + // Phone numbers need separate handling + if ((filterSupportLevel(detailFilter) == CntAbstractContactFilter::Supported + || filterSupportLevel(detailFilter) == CntAbstractContactFilter::SupportedPreFilterOnly)) + { + QString number((detailFilter.value()).toString()); + TPtrC commPtr(reinterpret_cast(number.utf16())); + + TInt matchLength(KDefaultMatchLength); + // no need to propagate error, we can use the default match length + TRAP_IGNORE(getMatchLengthL(matchLength)); + + //cal the search + CContactIdArray* idArray(0); + TInt err = searchPhoneNumbers(idArray, commPtr, matchLength); + if( idArray && (err == KErrNone)){ + // copy the matching contact ids + for(int i(0); i < idArray->Count(); i++) { + matches.append(QContactLocalId((*idArray)[i])); + } + delete idArray; + } + else{ + //CntSymbianTransformError::transformError(err, error); + } + } + + + } + return matches; + + } +/*! + * The contact database version implementation for + * QContactManager::filterSupported function. The possible return values are + * Supported, NotSupported and SupportedPreFilterOnly. Supported means that + * the filtering is implemented directly by the underlying database. + * NotSupported means that CntSymbianFilterDbms::contacts will return an + * error. And SupportedPreFilterOnly means that the filter is not supported, + * but the CntSymbianFilterDbms::contacts will act like the filter was + * supported. This means that the client must filter the pre-filtered set of + * contacts to see if there are false positives included. Note that in some + * cases the pre-filtering is not very effective. + * + * \a filter The QContactFilter to be checked. + * \a return Supported in case the filter is supported. NotSupported in case + * the filter is not supported. returns + * + */ +CntAbstractContactFilter::FilterSupport CntSymbianFilterSqlHelper::filterSupportLevel(const QContactFilter& filter) +{ + CntAbstractContactFilter::FilterSupport filterSupported(CntAbstractContactFilter::NotSupported); + switch (filter.type()) { + case QContactFilter::DefaultFilter: //default filter == no filter + { + filterSupported = CntAbstractContactFilter::Supported; + break; + } + case QContactFilter::ContactDetailFilter: + { + const QContactDetailFilter &detailFilter = static_cast(filter); + filterSupported = checkIfDetailFilterSupported(detailFilter); + break; + } + case QContactFilter::InvalidFilter : + case QContactFilter::ContactDetailRangeFilter: + case QContactFilter::ChangeLogFilter: + case QContactFilter::ActionFilter: + case QContactFilter::IntersectionFilter: + case QContactFilter::UnionFilter: + case QContactFilter::RelationshipFilter: + default: + filterSupported = CntAbstractContactFilter::NotSupported; + break; + } + return filterSupported; +} +CntAbstractContactFilter::FilterSupport CntSymbianFilterSqlHelper::checkIfDetailFilterSupported + (const QContactDetailFilter& detailFilter) const +{ + + CntAbstractContactFilter::FilterSupport filterSupported(CntAbstractContactFilter::NotSupported); + //Get the match flags + QContactFilter::MatchFlags matchFlags = detailFilter.matchFlags(); + // Phone numbers + if (detailFilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName) { + if (matchFlags == QContactFilter::MatchEndsWith){ + filterSupported = CntAbstractContactFilter::Supported; + } + else if (matchFlags == QContactFilter::MatchExactly){ + filterSupported = CntAbstractContactFilter::SupportedPreFilterOnly; + } + } + // Names , Email,Sip address + else if ( detailFilter.detailDefinitionName() == QContactName::DefinitionName || + detailFilter.detailDefinitionName() == QContactEmailAddress::DefinitionName || + detailFilter.detailDefinitionName() == QContactOnlineAccount::DefinitionName || + detailFilter.detailDefinitionName() == QContactDisplayLabel::DefinitionName || + detailFilter.detailDefinitionName() == QContactType::DefinitionName){ + if ( (matchFlags == QContactFilter::MatchContains)|| (matchFlags == QContactFilter::MatchStartsWith)|| + (matchFlags == QContactFilter::MatchEndsWith)|| (matchFlags == QContactFilter::MatchExactly)){ + filterSupported = CntAbstractContactFilter::Supported; + } + if(matchFlags == QContactFilter::MatchKeypadCollation) + filterSupported = CntAbstractContactFilter::Supported; + } + return filterSupported; + +} +/* + * Get the match length setting. Digits to be used in matching (counted from + * right). + */ +void CntSymbianFilterSqlHelper::getMatchLengthL(TInt& matchLength) +{ + //Get number of digits used to match + CRepository* repository = CRepository::NewL(KCRUidTelConfiguration); + CleanupStack::PushL(repository); + User::LeaveIfError(repository->Get(KTelMatchDigits, matchLength)); + CleanupStack::PopAndDestroy(repository); +} + +/* + * Find contacts based on a phone number. + * \a idArray On return contains the ids of the contacts that match the phonenumber. + * \a phoneNumber The phone number to match + * \a matchLength Match length; digits from right. + */ +TInt CntSymbianFilterSqlHelper::searchPhoneNumbers( + CContactIdArray*& idArray, + const TDesC& phoneNumber, + const TInt matchLength) +{ + CContactIdArray* idArrayTmp(0); + TRAPD( err, idArrayTmp = m_contactDatabase.MatchPhoneNumberL(phoneNumber, matchLength)); + if(err == KErrNone){ + idArray = idArrayTmp; + } + return 0; +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbiansorterdbms.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbiansorterdbms.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,231 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntsymbiansorterdbms.h" +#include "cntsymbiantransformerror.h" + +#include +#include +#include +#include "cnttransformcontact.h" + +typedef QList QContactLocalIdList; + +/* ... The macros changed names */ +#if QT_VERSION < QT_VERSION_CHECK(4, 6, 0) +#define QT_TRAP_THROWING QT_TRANSLATE_SYMBIAN_LEAVE_TO_EXCEPTION +#define QT_TRYCATCH_LEAVING QT_TRANSLATE_EXCEPTION_TO_SYMBIAN_LEAVE +#endif + +// NOTE: There is a bug with RVCT compiler which causes the local stack +// variable to corrupt if the called function leaves. As a workaround we are +// reserving the objects from heap so it will not get corrupted. +// This of course applies only to those stack variables which are passed to +// the called function or the return value of the function is placed to the +// variable. + +CntSymbianSorterDbms::CntSymbianSorterDbms(CContactDatabase& contactDatabase,CntTransformContact& transformContact): + m_contactDatabase(contactDatabase), + m_transformContact(transformContact) +{ +} + +CntSymbianSorterDbms::~CntSymbianSorterDbms() +{ +} + +QList CntSymbianSorterDbms::contacts( + const QList& sortOrders, + QContactManager::Error& error) +{ + // Create an empty list + // See QT_TRYCATCH_LEAVING note at the begginning of this file + QContactLocalIdList *ids = new QContactLocalIdList(); + + // Attempt to read from database, leaving the list empty if + // there was a problem + TRAPD(err, QT_TRYCATCH_LEAVING(*ids = contactsL(sortOrders))); + + CntSymbianTransformError::transformError(err, error); + + return *QScopedPointer(ids); +} + +QList CntSymbianSorterDbms::sort( + QList contactIds, + const QList& sortOrders, + QContactManager::Error& error) +{ + // Create an empty list + // See QT_TRYCATCH_LEAVING note at the begginning of this file + QContactLocalIdList *ids = new QContactLocalIdList(); + + // Attempt to read from database, leaving the list empty if + // there was a problem + TRAPD(err, QT_TRYCATCH_LEAVING(*ids = sortL(contactIds,sortOrders))); + + CntSymbianTransformError::transformError(err, error); + + return *QScopedPointer(ids); +} + +bool CntSymbianSorterDbms::sortOrderSupported(const QList& sortOrders) +{ + foreach( QContactSortOrder s, sortOrders ) { + // Find uids for sortings + QList fieldTypeUids = m_transformContact.supportedSortingFieldTypes(s.detailDefinitionName(), s.detailFieldName()); + if( fieldTypeUids.count() == 0 ) + return false; + + // Only blanks last supported + if( s.blankPolicy() != QContactSortOrder::BlanksLast ) + return false; + + // Always case sensitive + if( s.caseSensitivity() != Qt::CaseSensitive ) + return false; + +#ifndef SYMBIAN_BACKEND_USE_SQLITE + // NOTE: + // Seems that there is a bug in cntmodel which causes that sorting + // is working correctly only if the direction is the same for all + // sort orders. + if( s.direction() != sortOrders[0].direction() ) + return false; +#endif + } + return true; +} + +QList CntSymbianSorterDbms::contactsL(const QList& sortOrders) const +{ + // Populate the ID array, returns the coontact ids + group ids + TTime epoch(0); + CContactIdArray *ids = m_contactDatabase.ContactsChangedSinceL(epoch); + CleanupStack::PushL(ids); + + // Remove templates from the list + CContactIdArray *templateIds = m_contactDatabase.GetCardTemplateIdListL(); + CleanupStack::PushL(templateIds); + for(TInt i(0); i < templateIds->Count(); i++) { + TContactItemId id = (*templateIds)[i]; + TInt index = ids->Find(id); + if(index > KErrNotFound) + ids->Remove(index); + } + CleanupStack::PopAndDestroy(templateIds); + + // Sort the list + CContactIdArray* sortedIds = sortL(ids, sortOrders); + CleanupStack::PopAndDestroy(ids); + ids = sortedIds; + CleanupStack::PushL(ids); + + // Add the contact ids to the returned QList + QList qIds; + for (TInt i(0); i < ids->Count(); i++) { + qIds.append((*ids)[i]); + } + + CleanupStack::PopAndDestroy(ids); + + return qIds; +} + +QList CntSymbianSorterDbms::sortL(const QList& contactIds, const QList& sortOrders) const +{ + CContactIdArray* ids = CContactIdArray::NewLC(); + foreach(QContactLocalId id, contactIds) + ids->AddL(id); + + CContactIdArray* sortedIds = sortL(ids, sortOrders); + CleanupStack::PopAndDestroy(ids); + CleanupStack::PushL(sortedIds); + + QList qSortedIds; + for (int i=0; iCount(); i++) + qSortedIds.append( (*sortedIds)[i] ); + CleanupStack::PopAndDestroy(sortedIds); + + return qSortedIds; +} + +CContactIdArray* CntSymbianSorterDbms::sortL(const CContactIdArray* contactIds, const QList& sortOrders) const +{ + CArrayFixFlat *sort = + new (ELeave) CArrayFixFlat(5); + CleanupStack::PushL(sort); + + // Convert sort orders to TSortPref array + foreach (QContactSortOrder s, sortOrders) + { + QList fieldTypes = m_transformContact.supportedSortingFieldTypes(s.detailDefinitionName(), s.detailFieldName()); + if (fieldTypes.count()) + { + foreach(TUid fieldType, fieldTypes) { + CContactDatabase::TSortPref pref; + // NOTE: TSortPref sets order to ascending by default + if( s.direction() == Qt::DescendingOrder ) + pref.iOrder = CContactDatabase::TSortPref::EDesc; + pref.iFieldType = fieldType; + sort->AppendL(pref); + } + } + else + { + // This should never happen. Sorting should have happened + // the "slow way" at QContactManagerEngine::sortContacts. + User::Leave(KErrNotFound); + } + } + + CContactIdArray* sortedIds(0); + // There is a bug in CContactDatabase::SortArrayL, if an empty sort is used + // the function returns all contacts (and groups) instead of the given + // contact ids + if(sortOrders.isEmpty()) { + sortedIds = CContactIdArray::NewL(contactIds); + } else { + sortedIds = m_contactDatabase.SortArrayL(contactIds,sort); + } + CleanupStack::PopAndDestroy(sort); + return sortedIds; +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbiansrvconnection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbiansrvconnection.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,239 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +//system includes +#include +#include + +//user includes +#include "cntsymbiansrvconnection.h" +#include "cntsymbiantransformerror.h" + +// Constants +// To be removed. Should be defined in a header file +#define KCntSearchResultIdLists 99 +#define KCntOpenDataBase 100 // = KCapabilityReadUserData + +_LIT(KCntServerExe,"CNTSRV.EXE"); // Name of the exe for the Contacts server. +_LIT(KCntServerName,"CNTSRV"); // Name used to connect a session + // to the Contacts server. + +/** Maximum number of asynchronous IPC calls. */ +const TInt KAsyncMessageSlots=6; + +/* Contacts server version number. */ +const TInt KCntServerMajorVersionNumber=1; +const TInt KCntServerMinorVersionNumber=1; +const TInt KCntServerBuildVersionNumber=1; + +const TInt KGranularityRank = 8; //2^8 = 256 bytes +const TInt KDefaultPackagerSize = 3514; //Observed Techview Golden template size. + +/*! + * The constructor + */ +CntSymbianSrvConnection::CntSymbianSrvConnection() : + m_buffer(0), + m_bufPtr(0,0,0), + m_isInitialized(false) +{ +} + +/*! + * Destructor + */ +CntSymbianSrvConnection::~CntSymbianSrvConnection() +{ + delete m_buffer; + RHandleBase::Close(); +} + +/*! + * Query the SQL database + * + * \a sqlQuery An SQL query + * \a error On return, contains the possible error. + * \return the list of matched contact ids + */ +QList CntSymbianSrvConnection::searchContacts(const QString& sqlQuery, + QContactManager::Error& error) +{ + QList list; + TPtrC queryPtr(reinterpret_cast(sqlQuery.utf16())); + TRAPD(err, list = searchContactsL(queryPtr)); + CntSymbianTransformError::transformError(err, error); + return list; +} + +/*! + * The leaving function that queries the SQL database + * + * \a aSqlQuery An SQL query + * \return the list of matched contact ids + */ +QList CntSymbianSrvConnection::searchContactsL(const TDesC& aSqlQuery) +{ + // Initialize connection if it is not initialized yet. + if (!m_isInitialized) { + ConnectSrvL(); + OpenDatabaseL(); + m_isInitialized = true; + } + + // Fetch results from the server + TIpcArgs args; + args.Set(0, &GetReceivingBufferL()); + args.Set(1, &aSqlQuery); + TInt newBuffSize = SendReceive(KCntSearchResultIdLists, args); + User::LeaveIfError(newBuffSize); + if (newBuffSize > 0) + { + args.Set(0, &GetReceivingBufferL(newBuffSize)); + args.Set(1,&aSqlQuery); + User::LeaveIfError(newBuffSize = SendReceive(KCntSearchResultIdLists, args)); + } + + // Unpack the contact ids into an list + return UnpackCntIdArrayL(); +} + +/*! + * Connect to / create a cntsrv server session + */ +void CntSymbianSrvConnection::ConnectSrvL() +{ + // Assume the server is already running and attempt to create a session + // with a maximum of KAsyncMessageSlots message slots. + TInt err = CreateSession(KCntServerName,Version(),KAsyncMessageSlots); + + // Server is not running + if(err == KErrNotFound) { + // Use the RProcess API to start the server. + RProcess server; + User::LeaveIfError(server.Create(KCntServerExe,KNullDesC)); + + //Enforce server to be at system default priority EPriorityForeground + server.SetPriority(EPriorityForeground); + + // Synchronise with the server. + TRequestStatus reqStatus; + server.Rendezvous(reqStatus); + server.Resume(); + + // Server will call the reciprocal static synchronisation call. + User::WaitForRequest(reqStatus); + server.Close(); + User::LeaveIfError(reqStatus.Int()); + + // Create the server session. + User::LeaveIfError(CreateSession(KCntServerName,Version(),KAsyncMessageSlots)); + } else { + User::LeaveIfError(err); + } + + // Create IPC buffer + m_buffer = CBufFlat::NewL(1 << KGranularityRank); + m_maxBufferSize = KDefaultPackagerSize; + +} + +/*! + * Open database + */ +void CntSymbianSrvConnection::OpenDatabaseL() +{ + TIpcArgs args; + args.Set(0, &KNullDesC); + User::LeaveIfError(SendReceive(KCntOpenDataBase, args)); +} + +/*! + * Version of cntsrv + */ +TVersion CntSymbianSrvConnection::Version() const +{ + return(TVersion(KCntServerMajorVersionNumber, + KCntServerMinorVersionNumber, + KCntServerBuildVersionNumber)); +} + +/*! + * Get the buffer reference to be used for IPC + * + * \a size size of the receiving buffer + * \return a reference to the beginning of the buffer + */ +TDes8& CntSymbianSrvConnection::GetReceivingBufferL(int size) +{ + if(size > m_buffer->Size()) { + // Find next divisable by granularity size value. + (size >>= KGranularityRank)++; + m_maxBufferSize = size <<= 8; + m_buffer->ResizeL(m_maxBufferSize); + + } else if(!size && m_buffer->Size() < m_maxBufferSize) { + // Use the stored default size. + m_buffer->ResizeL(m_maxBufferSize); + } + // The location of the whole buffer may have changed, because reallocation + // may have taken place. Update both buffer pointers. + m_bufPtr.Set(m_buffer->Ptr(0)); + return m_bufPtr; +} + +/*! + * Unpack results from a buffer stream and store in a list + * + * \return list of matched contact ids + */ +QList CntSymbianSrvConnection::UnpackCntIdArrayL() +{ + RBufReadStream readStream; + QList list; + TContactItemId item; + + readStream.Open(*m_buffer); + int count = readStream.ReadInt32L(); + for (int i=0; i> item; + list.append(item); + } + return list; +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cntthumbnailcreator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cntthumbnailcreator.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,305 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cntthumbnailcreator.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#if QT_VERSION < QT_VERSION_CHECK(4, 6, 0) +#define QT_TRAP_THROWING QT_TRANSLATE_SYMBIAN_LEAVE_TO_EXCEPTION +#define QT_TRYCATCH_LEAVING QT_TRANSLATE_EXCEPTION_TO_SYMBIAN_LEAVE +#endif + +const TSize KThumbnailSizeUninitialized(0, 0); + +#ifdef _DEBUG +_LIT(KPanicCategory, "ThumbnailCreator"); +enum TPanicReasons { + KPanicUnitialized = 0 +}; +#endif + +CntThumbnailCreator::CntThumbnailCreator() : + CActive(EPriorityStandard), + m_state(EStateInitialized), + m_thumbnailSize(KThumbnailSizeUninitialized), + m_thumbnailFieldFromTemplate(0), + m_err(KErrNone) +{ + CActiveScheduler::Add(this); +} + +CntThumbnailCreator::~CntThumbnailCreator() +{ + delete m_encoder; + delete m_imageData; + delete m_bitmapScaler; + delete m_bitmap; + delete m_decoder; + delete m_activeSchedulerWait; + if (m_rfs.Handle() != KNullHandle) + m_rfs.Close(); +} + +/*! + * After calling this function \a fieldList will contain thumbnail field (field + * types KUidContactFieldVCardMapJPEG, KUidContactFieldPicture in this order) + * with thumbnail data. If the file \a filename does not exist, no fields are + * added to the field list. If the file \a filename is not a valid image file, + * a leave will occur. \a maxSize is the maximum size of the thumbnail image + * that is stored into contact database. If the image is bigger than \a maxSize + * the generated thumbnail will be scaled down to \a maxSize. + */ +void CntThumbnailCreator::addThumbnailFieldL(QList *fieldList, const TFileName &filename, const TSize& maxSize) +{ + Cancel(); + m_fieldList = fieldList; + m_thumbnailSize = maxSize; + + // Lazy instantiation to save resources + if (m_rfs.Handle() == KNullHandle) + m_rfs.Connect(); + if(!m_activeSchedulerWait) + m_activeSchedulerWait = new (ELeave) CActiveSchedulerWait; + + DecodeImageL(filename); + + // Synchronize asynchronous operations (wait loop is finished in RunL when + // image operations are done, or in RunError if an error occurs) + m_activeSchedulerWait->Start(); + User::LeaveIfError(m_err); +} + +void CntThumbnailCreator::addThumbnailFieldL(QList *fieldList, CFbsBitmap *bitmap, const TSize& maxSize) +{ + Cancel(); + m_fieldList = fieldList; + m_thumbnailSize = maxSize; + delete m_bitmap; + m_bitmap = bitmap; + + // Lazy instantiation to save resources + if (m_rfs.Handle() == KNullHandle) + m_rfs.Connect(); + if(!m_activeSchedulerWait) + m_activeSchedulerWait = new (ELeave) CActiveSchedulerWait; + + m_state = EStateEncodeImage; + EncodeImageL(); + + // Synchronize asynchronous operations (wait loop is finished in RunL when + // image operations are done, or in RunError if an error occurs) + m_activeSchedulerWait->Start(); + User::LeaveIfError(m_err); +} + + +void CntThumbnailCreator::RunL() +{ + __ASSERT_DEBUG(m_activeSchedulerWait, User::Panic(KPanicCategory, KPanicUnitialized)); + + User::LeaveIfError(iStatus.Int()); + switch (m_state) { + case EStateDecodeImage: + { + m_state = EStateScaleImage; + ScaleImageL(); + break; + } + case EStateScaleImage: + { + m_state = EStateEncodeImage; + EncodeImageL(); + break; + } + case EStateEncodeImage: + { + m_state = EStateFinal; + CreateContactFieldL(); + break; + } + case EStateFinal: + { + // We are done with the image, back to the caller of convertL + m_activeSchedulerWait->AsyncStop(); + break; + } + default: + User::Leave(KErrCompletion); + } +} + +void CntThumbnailCreator::DoCancel() +{ + __ASSERT_DEBUG(m_activeSchedulerWait, User::Panic(KPanicCategory, KPanicUnitialized)); + + m_err = KErrCancel; + m_activeSchedulerWait->AsyncStop(); +} + +TInt CntThumbnailCreator::RunError(TInt aError) +{ + __ASSERT_DEBUG(m_activeSchedulerWait, User::Panic(KPanicCategory, KPanicUnitialized)); + + m_err = aError; + m_activeSchedulerWait->AsyncStop(); + return KErrNone; +} + +void CntThumbnailCreator::DecodeImageL(const TFileName &filename) +{ + if (m_rfs.IsValidName(filename) && BaflUtils::FileExists(m_rfs, filename)) { + m_state = EStateDecodeImage; + + // Create image decoder + delete m_decoder; + m_decoder = 0; + m_decoder = CImageDecoder::FileNewL(m_rfs, filename); + TFrameInfo frameInfo = m_decoder->FrameInfo(); + + // Lazy instantiation + if(!m_bitmap) + m_bitmap = new (ELeave) CFbsBitmap; + User::LeaveIfError(m_bitmap->Create(frameInfo.iOverallSizeInPixels, frameInfo.iFrameDisplayMode)); + + m_decoder->Convert(&iStatus, *m_bitmap); + } else { + m_state = EStateFinal; + + // Ignore "file does not exist" error because the image has probably + // been removed (leaves thumbnail field empty for the contact). + TRequestStatus *status = &iStatus; + User::RequestComplete(status, KErrNone); + } + SetActive(); +} + +void CntThumbnailCreator::ScaleImageL() +{ + __ASSERT_DEBUG(m_decoder, User::Panic(KPanicCategory, KPanicUnitialized)); + __ASSERT_DEBUG(m_thumbnailSize != KThumbnailSizeUninitialized, User::Panic(KPanicCategory, KPanicUnitialized)); + + TFrameInfo frameInfo = m_decoder->FrameInfo(); + + // Scale down if the image is too big + if ( frameInfo.iOverallSizeInPixels.iWidth > m_thumbnailSize.iWidth + || frameInfo.iOverallSizeInPixels.iHeight > m_thumbnailSize.iHeight) { + // Lazy instantiation + if(!m_bitmapScaler) + m_bitmapScaler = CBitmapScaler::NewL(); + m_bitmapScaler->Scale(&iStatus, *m_bitmap, m_thumbnailSize); + } else { + // No need to scale, complete request immediately + TRequestStatus *status = &iStatus; + User::RequestComplete(status, KErrNone); + } + SetActive(); +} + +void CntThumbnailCreator::EncodeImageL() +{ + delete m_imageData; + m_imageData = 0; + delete m_encoder; + m_encoder = 0; + m_encoder = CImageEncoder::DataNewL(m_imageData, CImageEncoder::EOptionNone, KImageTypeJPGUid); + m_encoder->Convert(&iStatus, *m_bitmap); + SetActive(); +} + +void CntThumbnailCreator::CreateContactFieldL() +{ + __ASSERT_DEBUG(m_imageData, User::Panic(KPanicCategory, KPanicUnitialized)); + + initializeThumbnailFieldL(); + CContactItemField *thumbnailField = CContactItemField::NewLC(*m_thumbnailFieldFromTemplate); + + thumbnailField->StoreStorage()->SetThingL(*m_imageData); + QT_TRYCATCH_LEAVING(m_fieldList->append(thumbnailField)); + CleanupStack::Pop(thumbnailField); + + // Complete request to proceed to the final state + TRequestStatus *status = &iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); +} + +void CntThumbnailCreator::initializeThumbnailFieldL() +{ + // Assume the golden template is not changed run-time and fetch it only + // when initializeThumbnailFieldL is called for the first time during the + // life-time of the CntThumbnailCreator object (requires the instance to + // live longer than one thumbnail create operation to be effective, + // otherwise we would end up opening contact database and reading the + // system template every time a thumbnail is stored for a contact). + if(!m_thumbnailFieldFromTemplate) { + CContactDatabase *contactDatabase = CContactDatabase::OpenL(); + CleanupStack::PushL(contactDatabase); + CContactItem *goldenTemplate = contactDatabase->ReadContactLC(KGoldenTemplateId); + const CContactItemFieldSet& cardFields = goldenTemplate->CardFields(); + + // Check if thumbnail field type is KUidContactFieldPictureValue + TInt pictureFieldIndex = cardFields.Find(KUidContactFieldPicture, KUidContactFieldVCardMapPHOTO); + + // Check if thumbnail field type is KUidContactFieldVCardMapJPEG + if(pictureFieldIndex == KErrNotFound) { + pictureFieldIndex = cardFields.Find(KUidContactFieldVCardMapJPEG, KUidContactFieldVCardMapPHOTO); + } + + if(pictureFieldIndex == KErrNotFound) { + // Either KUidContactFieldPictureValue or KUidContactFieldVCardMapJPEG + // thumbnail field types should be in the template + User::Leave(KErrNotFound); + } + + m_thumbnailFieldFromTemplate = CContactItemField::NewL(cardFields[pictureFieldIndex]); + CleanupStack::PopAndDestroy(goldenTemplate); + CleanupStack::PopAndDestroy(contactDatabase); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformaddress.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformaddress.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,255 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformaddress.h" + +QList CntTransformAddress::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactAddress::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to address + const QContactAddress& address(static_cast(detail)); + + // create new fields with contexts + transformToTextFieldL(address, fieldList, address.country(), KUidContactFieldCountry, KUidContactFieldVCardMapCOUNTRY, true); + transformToTextFieldL(address, fieldList, address.postcode(), KUidContactFieldPostcode, KUidContactFieldVCardMapPOSTCODE, true); + transformToTextFieldL(address, fieldList, address.street(), KUidContactFieldAddress, KUidContactFieldVCardMapADR, true); + transformToTextFieldL(address, fieldList, address.locality(), KUidContactFieldLocality, KUidContactFieldVCardMapLOCALITY, true); + transformToTextFieldL(address, fieldList, address.region(), KUidContactFieldRegion, KUidContactFieldVCardMapREGION, true); + transformToTextFieldL(address, fieldList, address.postOfficeBox(), KUidContactFieldPostOffice, KUidContactFieldVCardMapPOSTOFFICE, true); + + return fieldList; +} + +QContactDetail *CntTransformAddress::transformItemField(const CContactItemField& field, const QContact &contact) +{ + QContactAddress address; + + CContactTextField* storage = field.TextStorage(); + QString addressValue = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + + int fieldTypeCount(field.ContentType().FieldTypeCount()); + for (int i = 0; i < fieldTypeCount; i++) { + //country + if (field.ContentType().FieldType(i) == KUidContactFieldCountry) { + address.setCountry(addressValue); + } + + //post code + else if (field.ContentType().FieldType(i) == KUidContactFieldPostcode) { + address.setPostcode(addressValue); + } + + //street + else if (field.ContentType().FieldType(i) == KUidContactFieldAddress) { + address.setStreet(addressValue); + } + + //locality (city) + else if (field.ContentType().FieldType(i) == KUidContactFieldLocality) { + address.setLocality(addressValue); + } + + //region + else if (field.ContentType().FieldType(i) == KUidContactFieldRegion) { + address.setRegion(addressValue); + } + + //post office box + else if (field.ContentType().FieldType(i) == KUidContactFieldPostOffice) { + address.setPostOfficeBox(addressValue); + } + else { + setContexts(field.ContentType().FieldType(i), address); + } + } + + // Find existing address details from contact + QContactDetail* detail = 0; + foreach( QContactAddress existingAddress, contact.details() ) + { + // Do not merge if contexts don't match + if( existingAddress.contexts() != address.contexts() ) + continue; + + // Merge detail with existing detail + detail = new QContactAddress( existingAddress ); + foreach( QString key, address.variantValues().keys() ) + detail->setValue( key, address.variantValue(key) ); + break; + } + + // Create a new address detail if not merging + if( !detail ) + detail = new QContactAddress(address); + + return detail; +} + +bool CntTransformAddress::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldCountry.iUid || + fieldType == KUidContactFieldPostcode.iUid || + fieldType == KUidContactFieldAddress.iUid || + fieldType == KUidContactFieldLocality.iUid || + fieldType == KUidContactFieldRegion.iUid || + fieldType == KUidContactFieldPostOffice.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformAddress::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactAddress::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformAddress::supportedSortingFieldTypes(QString detailFieldName) const +{ + QList uids; + + if( detailFieldName == QContactAddress::FieldStreet ) + return uids << KUidContactFieldAddress; + + if( detailFieldName == QContactAddress::FieldLocality ) + return uids << KUidContactFieldLocality; + + if( detailFieldName == QContactAddress::FieldRegion ) + return uids << KUidContactFieldRegion; + + if( detailFieldName == QContactAddress::FieldPostcode ) + return uids << KUidContactFieldPostcode; + + if( detailFieldName == QContactAddress::FieldCountry ) + return uids << KUidContactFieldCountry; + + if( detailFieldName == QContactAddress::FieldPostOfficeBox ) + return uids << KUidContactFieldPostOffice; + + return uids; +} + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformAddress::supportsSubType(const QString& subType) const +{ + if(QContactAddress::FieldSubTypes == subType) + return true; + else + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformAddress::getIdForField(const QString& fieldName) const +{ + + if (QContactAddress::FieldStreet == fieldName) + return KUidContactFieldAddress.iUid; + else if (QContactAddress::FieldLocality == fieldName) + return KUidContactFieldLocality.iUid; + else if (QContactAddress::FieldRegion == fieldName) + return KUidContactFieldRegion.iUid; + else if (QContactAddress::FieldPostcode == fieldName) + return KUidContactFieldPostcode.iUid; + else if (QContactAddress::FieldCountry == fieldName) + return KUidContactFieldCountry.iUid; + else if (QContactAddress::FieldPostOfficeBox == fieldName) + return KUidContactFieldPostOffice.iUid; + else if (QContactAddress::SubTypeParcel == fieldName) + return 0; + else if (QContactAddress::SubTypePostal == fieldName) + return 0; + else if (QContactAddress::SubTypeDomestic == fieldName) + return 0; + else if (QContactAddress::SubTypeInternational == fieldName) + return 0; + else + return 0; +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformAddress::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactAddress::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactAddress::DefinitionName); + QMap fields = d.fields(); + + // Don't support "ContextOther" + QContactDetailFieldDefinition f; + f.setDataType(QVariant::StringList); + f.setAllowableValues(QVariantList() + << QLatin1String(QContactDetail::ContextHome) + << QLatin1String(QContactDetail::ContextWork)); + fields[QContactDetail::FieldContext] = f; + + // Sub-types not supported in symbian back-end, remove + fields.remove(QContactAddress::FieldSubTypes); + d.setFields(fields); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformanniversary.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformanniversary.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,203 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformanniversary.h" + +const char separator = ','; + +QList CntTransformAnniversary::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactAnniversary::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to anniversary + const QContactAnniversary &anniversary(static_cast(detail)); + + //create new field + QString formattedAnniversary; + if (anniversary.originalDate().isValid()) { + formattedAnniversary = anniversary.originalDate().toString(Qt::ISODate); + } + if (formattedAnniversary.length() > 0) { + formattedAnniversary.append(separator); + } + formattedAnniversary.append(anniversary.event()); + + TPtrC fieldText(reinterpret_cast(formattedAnniversary.utf16())); + CContactItemField* newField = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldAnniversary); + newField->TextStorage()->SetTextL(fieldText); + newField->SetMapping(KUidContactFieldVCardMapAnniversary); + + fieldList.append(newField); + CleanupStack::Pop(newField); + + return fieldList; +} + +QContactDetail *CntTransformAnniversary::transformItemField(const CContactItemField& field, const QContact &contact) +{ + Q_UNUSED(contact); + + QContactAnniversary *anniversary = new QContactAnniversary(); + + CContactTextField* storage = field.TextStorage(); + QString unformattedAnniversary = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + int separatorPos = unformattedAnniversary.indexOf(separator); + bool dateFound = false; + if (separatorPos != -1) { + // date is probably included + QDate date = QDate::fromString(unformattedAnniversary.left(separatorPos), Qt::ISODate); + if (date.isValid()) { + anniversary->setOriginalDate(date); + dateFound = true; + } + } + + if (dateFound) { + if (unformattedAnniversary.length()-separatorPos-1 > 0) { + anniversary->setEvent(unformattedAnniversary.right(unformattedAnniversary.length()-separatorPos-1)); + } + } + else { + anniversary->setEvent(unformattedAnniversary); + } + return anniversary; +} + +bool CntTransformAnniversary::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldAnniversary.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformAnniversary::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactAnniversary::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformAnniversary::supportedSortingFieldTypes(QString /*detailFieldName*/) const +{ + // Sorting not supported + return QList(); +} + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformAnniversary::supportsSubType(const QString& subType) const +{ + if(QContactAnniversary::FieldSubType == subType) + return true; + else + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformAnniversary::getIdForField(const QString& fieldName) const +{ + if (QContactAnniversary::FieldCalendarId == fieldName) + return 0; + else if (QContactAnniversary::FieldOriginalDate == fieldName) + return 0; + else if (QContactAnniversary::FieldEvent == fieldName) + return 0; + else if (QContactAnniversary::SubTypeWedding == fieldName) + return 0; + else if (QContactAnniversary::SubTypeEngagement == fieldName) + return 0; + else if (QContactAnniversary::SubTypeHouse == fieldName) + return 0; + else if (QContactAnniversary::SubTypeEmployment == fieldName) + return 0; + else if (QContactAnniversary::SubTypeMemorial == fieldName) + return 0; + else + return 0; +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformAnniversary::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactAnniversary::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactAnniversary::DefinitionName); + QMap fields = d.fields(); + + // FieldCalendarId not supported in symbian back-end, remove + fields.remove(QContactAnniversary::FieldCalendarId); + + // Sub-types not supported in symbian back-end, remove + fields.remove(QContactAnniversary::FieldSubType); + + // Context not supported in symbian back-end, remove + fields.remove(QContactAnniversary::FieldContext); + + d.setFields(fields); + d.setUnique(true); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformanniversarysimple.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformanniversarysimple.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,159 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformanniversarysimple.h" + +QList CntTransformAnniversarySimple::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactAnniversary::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to anniversary + const QContactAnniversary &anniversary(static_cast(detail)); + + //create new field + TDateTime dateTime(anniversary.originalDate().year(), + TMonth(anniversary.originalDate().month() - 1), + anniversary.originalDate().day() - 1, 0, 0, 0, 0); + CContactItemField* newField = CContactItemField::NewLC(KStorageTypeDateTime, KUidContactFieldAnniversary); + newField->DateTimeStorage()->SetTime(dateTime); + newField->SetMapping(KUidContactFieldVCardMapAnniversary); + + fieldList.append(newField); + CleanupStack::Pop(newField); + + return fieldList; +} + +QContactDetail *CntTransformAnniversarySimple::transformItemField(const CContactItemField& field, const QContact &contact) +{ + Q_UNUSED(contact); + + QContactAnniversary *anniversary = new QContactAnniversary(); + + CContactDateField* storage = field.DateTimeStorage(); + TTime time(storage->Time()); + QDate qDate(time.DateTime().Year(), time.DateTime().Month() + 1, time.DateTime().Day() + 1); + anniversary->setOriginalDate(qDate); + + return anniversary; +} + +bool CntTransformAnniversarySimple::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldAnniversary.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformAnniversarySimple::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactAnniversary::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformAnniversarySimple::supportedSortingFieldTypes(QString /*detailFieldName*/) const +{ + // Sorting not supported + return QList(); +} + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformAnniversarySimple::supportsSubType(const QString& /*subType*/) const +{ + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformAnniversarySimple::getIdForField(const QString& /*fieldName*/) const +{ + return 0; +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformAnniversarySimple::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactAnniversary::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactAnniversary::DefinitionName); + QMap fields = d.fields(); + + // Following fields not supported in symbian (pre-10.1) back-end, remove + fields.remove(QContactAnniversary::FieldCalendarId); + fields.remove(QContactAnniversary::FieldEvent); + + // Sub-types not supported in symbian back-end, remove + fields.remove(QContactAnniversary::FieldSubType); + + // Context not supported in symbian back-end, remove + fields.remove(QContactAnniversary::FieldContext); + + d.setFields(fields); + d.setUnique(true); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformavatar.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformavatar.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,211 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformavatar.h" +#include "cntmodelextuids.h" + +QList CntTransformAvatar::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactAvatar::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to avatar + const QContactAvatar &avatar(static_cast(detail)); + + + //create new field + TPtrC fieldText(reinterpret_cast(avatar.avatar().utf16())); + + if(fieldText.Length()) { + //supported subTypes + const QString& subTypeImage(QContactAvatar::SubTypeImage); + const QString& subTypeAudioRingtone(QContactAvatar::SubTypeAudioRingtone); + const QString& subTypeVideoRingtone(QContactAvatar::SubTypeVideoRingtone); + + QString subType = avatar.subType(); + TUid uid(KNullUid); + if(subType.isEmpty()) { + uid = KUidContactFieldCodImage; + } else if (subType.compare(subTypeImage) == 0) { + uid = KUidContactFieldCodImage; + } else if (subType.compare(subTypeAudioRingtone) == 0) { + uid = KUidContactFieldRingTone; + } else if (subType.compare(subTypeVideoRingtone) == 0) { + uid = KUidContactFieldVideoRingTone; + } else { + User::LeaveIfError(KErrNotSupported); + } + CContactItemField* newField = CContactItemField::NewLC(KStorageTypeText, uid); + + newField->SetMapping(KUidContactFieldVCardMapUnknown); + newField->TextStorage()->SetTextL(fieldText); + + fieldList.append(newField); + CleanupStack::Pop(newField); + } + + return fieldList; +} + +QContactDetail *CntTransformAvatar::transformItemField(const CContactItemField& field, const QContact &contact) +{ + Q_UNUSED(contact); + + QContactAvatar *avatar = new QContactAvatar(); + + CContactTextField* storage = field.TextStorage(); + QString avatarString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + avatar->setAvatar(avatarString); + + if (field.ContentType().ContainsFieldType(KUidContactFieldCodImage)) { + avatar->setSubType(QContactAvatar::SubTypeImage); + } + else if (field.ContentType().ContainsFieldType(KUidContactFieldRingTone)) { + avatar->setSubType(QContactAvatar::SubTypeAudioRingtone); + } + else if (field.ContentType().ContainsFieldType(KUidContactFieldVideoRingTone)) { + avatar->setSubType(QContactAvatar::SubTypeVideoRingtone); + } + + return avatar; +} + +bool CntTransformAvatar::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldCodImage.iUid || + fieldType == KUidContactFieldRingTone.iUid || + fieldType == KUidContactFieldVideoRingTone.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformAvatar::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactAvatar::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformAvatar::supportedSortingFieldTypes(QString /*detailFieldName*/) const +{ + // Sorting not supported + return QList(); +} + + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformAvatar::supportsSubType(const QString& subType) const +{ + if(QContactAvatar::FieldSubType == subType) + return true; + else + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformAvatar::getIdForField(const QString& fieldName) const +{ + if (QContactAvatar::FieldAvatar == fieldName) + return 0; + else if (QContactAvatar::SubTypeImage == fieldName) + return 0; + else if (QContactAvatar::SubTypeVideo == fieldName) + return 0; + else if (QContactAvatar::SubTypeTexturedMesh == fieldName) + return 0; + else if (QContactAvatar::SubTypeAudioRingtone == fieldName) + return 0; + else if (QContactAvatar::SubTypeVideoRingtone == fieldName) + return 0; + else + return 0; +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformAvatar::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactAvatar::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactAvatar::DefinitionName); + QMap fields = d.fields(); + + // Update sub-types + QContactDetailFieldDefinition f; + f.setDataType(QVariant::String); // only allowed to be a single subtype + f.setAllowableValues(QVariantList() + << QString(QLatin1String(QContactAvatar::SubTypeImage)) + << QString(QLatin1String(QContactAvatar::SubTypeAudioRingtone)) + << QString(QLatin1String(QContactAvatar::SubTypeVideoRingtone))); + fields.insert(QContactAvatar::FieldSubType, f); + + // Context not supported in symbian back-end, remove + fields.remove(QContactAvatar::FieldContext); + + d.setFields(fields); + d.setUnique(true); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformavatarsimple.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformavatarsimple.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,281 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformavatarsimple.h" +#include "cntthumbnailcreator.h" +#include "cntsymbiantransformerror.h" + +// S60 specific contact field type containing image call object data +#define KUidContactFieldCodImageValue 0x101F8841 +const TUid KUidContactFieldCodImage={KUidContactFieldCodImageValue}; +// Extra field that is defined in TB10.1 platform for video ring tone +#define KUidContactFieldVideoRingToneValue 0x200100E5 +const TUid KUidContactFieldVideoRingTone={KUidContactFieldVideoRingToneValue}; +// The max. size of the thumbnail image that is saved into contacts database +const TSize KMaxThumbnailSize(80, 96); + +CntTransformAvatarSimple::CntTransformAvatarSimple() : + m_thumbnailCreator(0) +{ +} + +CntTransformAvatarSimple::~CntTransformAvatarSimple() +{ + delete m_thumbnailCreator; +} + +QList CntTransformAvatarSimple::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactAvatar::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to avatar + const QContactAvatar &avatar(static_cast(detail)); + + //create new field + TPtrC fieldText(reinterpret_cast(avatar.avatar().utf16())); + + //copy filename and replace slash with a backslash + TFileName filename; + for(TInt i(0); i < fieldText.Length(); i++) { + if(i >= filename.MaxLength()) + User::Leave(KErrTooBig); + if(fieldText[i] == '/') { + filename.Append('\\'); + } else { + filename.Append(fieldText[i]); + } + } + + if(filename.Length()) { + const QString& subTypeImage(QContactAvatar::SubTypeImage); + const QString& subTypeAudioRingtone(QContactAvatar::SubTypeAudioRingtone); + const QString& subTypeVideoRingtone(QContactAvatar::SubTypeVideoRingtone); + + QString subType = avatar.subType(); + TUid uid(KNullUid); + // Default to SubTypeImage + if(subType.isEmpty() || subType.compare(subTypeImage) == 0) { + uid = KUidContactFieldCodImage; + } else if (subType.compare(subTypeAudioRingtone) == 0) { + uid = KUidContactFieldRingTone; + } else if (subType.compare(subTypeVideoRingtone) == 0) { + uid = KUidContactFieldVideoRingTone; + } else { + User::LeaveIfError(KErrNotSupported); + } + CContactItemField* newField = CContactItemField::NewLC(KStorageTypeText, uid); + + newField->SetMapping(KUidContactFieldVCardMapUnknown); + newField->TextStorage()->SetTextL(filename); + + fieldList.append(newField); + CleanupStack::Pop(newField); + } + + if(!avatar.pixmap().isNull()) { + // lazy instantiation + if(!m_thumbnailCreator) { + m_thumbnailCreator = new (ELeave) CntThumbnailCreator(); + } + + // Scaling is done before converting to CFbsBitmap because + // toSymbianCFbsBitmap may generate a duplicate of the bitmap data + // Note: scaling to thumbnail may take some time if the image is big + // TODO: aspect ratio? + QPixmap scaled = avatar.pixmap().scaled(KMaxThumbnailSize.iWidth, KMaxThumbnailSize.iHeight); + CFbsBitmap* bitmap = scaled.toSymbianCFbsBitmap(); + CleanupStack::PushL(bitmap); + + m_thumbnailCreator->addThumbnailFieldL(&fieldList, bitmap, KMaxThumbnailSize); + CleanupStack::Pop(bitmap); // ownership transferred + } + + return fieldList; +} + +QContactDetail *CntTransformAvatarSimple::transformItemField(const CContactItemField& field, const QContact &contact) +{ + Q_UNUSED(contact); + QContactAvatar *avatar = new QContactAvatar(); + + if (field.ContentType().ContainsFieldType(KUidContactFieldCodImage)) { + CContactTextField* storage = field.TextStorage(); + QString avatarString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + avatar->setAvatar(avatarString); + avatar->setSubType(QContactAvatar::SubTypeImage); + } else if (field.ContentType().ContainsFieldType(KUidContactFieldRingTone)) { + CContactTextField* storage = field.TextStorage(); + QString avatarString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + avatar->setAvatar(avatarString); + avatar->setSubType(QContactAvatar::SubTypeAudioRingtone); + } else if (field.ContentType().ContainsFieldType(KUidContactFieldPicture) + || field.ContentType().ContainsFieldType(KUidContactFieldVCardMapJPEG)) { + // use the existing QContactAvatar (if available) in case of a pixmap + // field. + delete avatar; + avatar = 0; + avatar = new QContactAvatar(contact.detail()); + CContactStoreField* storage = field.StoreStorage(); + QPixmap pixmap; + HBufC8 *theThing = storage->Thing(); + QByteArray bytes((char*)theThing->Ptr(), theThing->Length()); + bool loaded = pixmap.loadFromData(bytes, "JPG"); + if (loaded) { + avatar->setPixmap(pixmap); + } else { + User::Leave(KErrInvalidContactDetail); + } + } + else if (field.ContentType().ContainsFieldType(KUidContactFieldVideoRingTone)) { + CContactTextField* storage = field.TextStorage(); + QString avatarString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + avatar->setAvatar(avatarString); + avatar->setSubType(QContactAvatar::SubTypeVideoRingtone); + } + + return avatar; +} + +bool CntTransformAvatarSimple::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldCodImage.iUid + || fieldType == KUidContactFieldRingTone.iUid + || fieldType == KUidContactFieldVideoRingTone.iUid + || fieldType == KUidContactFieldPicture.iUid + // Used as "extra mapping/extra field type" by thumbnail data fields + || fieldType == KUidContactFieldVCardMapJPEG.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformAvatarSimple::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactAvatar::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformAvatarSimple::supportedSortingFieldTypes(QString /*detailFieldName*/) const +{ + // Sorting not supported + return QList(); +} + + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformAvatarSimple::supportsSubType(const QString& subType) const +{ + if(QContactAvatar::FieldSubType == subType) + return true; + else + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformAvatarSimple::getIdForField(const QString& fieldName) const +{ + if (QContactAvatar::FieldAvatar == fieldName) + return 0; + else if (QContactAvatar::SubTypeImage == fieldName) + return 0; + else if (QContactAvatar::SubTypeVideo == fieldName) + return 0; + else if (QContactAvatar::SubTypeTexturedMesh == fieldName) + return 0; + else if (QContactAvatar::SubTypeAudioRingtone == fieldName) + return 0; + else if (QContactAvatar::SubTypeVideoRingtone == fieldName) + return 0; + else + return 0; +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformAvatarSimple::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactAvatar::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactAvatar::DefinitionName); + QMap fields = d.fields(); + + // Update sub-types + QContactDetailFieldDefinition f; + f.setDataType(QVariant::String); // only allowed to be a single subtype + f.setAllowableValues(QVariantList() + << QString(QLatin1String(QContactAvatar::SubTypeImage)) + << QString(QLatin1String(QContactAvatar::SubTypeAudioRingtone)) + << QString(QLatin1String(QContactAvatar::SubTypeVideoRingtone))); + fields.insert(QContactAvatar::FieldSubType, f); + + // Context not supported in symbian back-end, remove + fields.remove(QContactAvatar::FieldContext); + + d.setFields(fields); + d.setUnique(true); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformbirthday.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformbirthday.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,156 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformbirthday.h" + +QList CntTransformBirthday::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactBirthday::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to birthday + const QContactBirthday &birthday(static_cast(detail)); + + //create new field + TDateTime dateTime(birthday.date().year(), TMonth(birthday.date().month() - 1), birthday.date().day() - 1, 0, 0, 0, 0); + CContactItemField* newField = CContactItemField::NewLC(KStorageTypeDateTime, KUidContactFieldBirthday); + newField->DateTimeStorage()->SetTime(dateTime); + newField->SetMapping(KUidContactFieldVCardMapBDAY); + + fieldList.append(newField); + CleanupStack::Pop(newField); + + return fieldList; +} + +QContactDetail *CntTransformBirthday::transformItemField(const CContactItemField& field, const QContact &contact) +{ + Q_UNUSED(contact); + + QContactBirthday *birthday = new QContactBirthday(); + + CContactDateField* storage = field.DateTimeStorage(); + TTime time(storage->Time()); + QDate qDate(time.DateTime().Year(), time.DateTime().Month() + 1, time.DateTime().Day() + 1); + birthday->setDate(qDate); + + return birthday; +} + +bool CntTransformBirthday::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldBirthday.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformBirthday::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactBirthday::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformBirthday::supportedSortingFieldTypes(QString detailFieldName) const +{ + QList uids; + if( detailFieldName == QContactBirthday::FieldBirthday ) + uids << KUidContactFieldBirthday; + return uids; +} + + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformBirthday::supportsSubType(const QString& subType) const +{ + Q_UNUSED(subType); + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformBirthday::getIdForField(const QString& fieldName) const +{ + if (QContactBirthday::FieldBirthday == fieldName) + return KUidContactFieldBirthday.iUid; + else + return 0; +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformBirthday::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactBirthday::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactBirthday::DefinitionName); + QMap fields = d.fields(); + + // Context not supported in symbian back-end, remove + fields.remove(QContactBirthday::FieldContext); + + d.setFields(fields); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformcontact.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformcontact.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,472 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cnttransformcontact.h" + +#include "cnttransformname.h" +#include "cnttransformnickname.h" +#include "cnttransformphonenumber.h" +#include "cnttransformemail.h" +#include "cnttransformurl.h" +#include "cnttransformaddress.h" +#include "cnttransformbirthday.h" +#include "cnttransformonlineaccount.h" +#include "cnttransformorganisation.h" +#include "cnttransformavatar.h" +#include "cnttransformavatarsimple.h" +#include "cnttransformsynctarget.h" +#include "cnttransformgender.h" +#include "cnttransformanniversary.h" +#include "cnttransformanniversarysimple.h" +#include "cnttransformgeolocation.h" +#include "cnttransformnote.h" +#include "cnttransformfamily.h" +#include "cnttransformempty.h" +#include "cntsymbiantransformerror.h" + +#include +#include +#include +#include +#include +#include // explicitly included because of KUidContactFieldGEOValue + +#include + +//UIDs for preferred (default) fields +const int KDefaultFieldForCall = 0x10003E70; +const int KDefaultFieldForVideoCall = 0x101F85A6; +const int KDefaultFieldForEmail = 0x101F85A7; +const int KDefaultFieldForMessage = 0x101f4cf1; + +CntTransformContact::CntTransformContact() +{ + initializeCntTransformContactData(); +} + +CntTransformContact::~CntTransformContact() +{ + QMap::iterator itr; + + for (itr = m_transformContactData.begin(); itr != m_transformContactData.end(); ++itr) + { + CntTransformContactData* value = itr.value(); + delete value; + value = 0; + } +} + +void CntTransformContact::initializeCntTransformContactData() +{ + //These can be added to normal list, if we loop through it. + m_transformContactData.insert(Name, new CntTransformName); + m_transformContactData.insert(Nickname, new CntTransformNickname); + m_transformContactData.insert(PhoneNumber, new CntTransformPhoneNumber); + m_transformContactData.insert(EmailAddress, new CntTransformEmail); + m_transformContactData.insert(Address, new CntTransformAddress); + m_transformContactData.insert(URL, new CntTransformUrl); + m_transformContactData.insert(Birthday, new CntTransformBirthday); + m_transformContactData.insert(Organisation, new CntTransformOrganisation); + m_transformContactData.insert(SyncTarget, new CntTransformSyncTarget); + m_transformContactData.insert(Note, new CntTransformNote); + m_transformContactData.insert(Family, new CntTransformFamily); + +#ifdef SYMBIAN_BACKEND_USE_SQLITE + // variated transform classes + m_transformContactData.insert(Avatar, new CntTransformAvatar); + m_transformContactData.insert(Anniversary, new CntTransformAnniversary); + + // not supported on pre-10.1 + m_transformContactData.insert(Geolocation, new CntTransformGeolocation); + m_transformContactData.insert(Gender, new CntTransformGender); + + // Causes a "CPbk2ContactEdit.. 2" panic in Phonebook2 contact editor + // Although IMPP field is supported on some pre 10.1 platforms (newer + // 3.2.3 and 5.0 releases), it may be safer not to include online account + // at all. + m_transformContactData.insert(OnlineAccount, new CntTransformOnlineAccount); + +#else + // Empty transform class for removing unsupported detail definitions + m_transformContactData.insert(Empty, new CntTransformEmpty); + + // variated transform classes + m_transformContactData.insert(Anniversary, new CntTransformAnniversarySimple); + m_transformContactData.insert(Avatar, new CntTransformAvatarSimple); +#endif +} + +/*! + * Converts Symbian contact item to QContact. Note that the contact is not + * saved into contacts database so the details that require contact to exist + * in the database are not transformed. Use transformPostSaveDetailsL to + * transform those details after the contact item has been saved. + * \param contact A reference to a symbian contact item to be converted. + * \return Qt Contact + */ +QContact CntTransformContact::transformContactL(CContactItem &contact, const QStringList& definitionRestrictions) const +{ + // Create a new QContact + QContact newQtContact; + + // set the corect type + if (contact.Type() == KUidContactGroup) + { + newQtContact.setType(QContactType::TypeGroup); + } + else + { + newQtContact.setType(QContactType::TypeContact); + } + + // Iterate through the CContactItemFieldSet, creating + // new fields for the QContact + CContactItemFieldSet& fields(contact.CardFields()); + + const int numFields(fields.Count()); + + for(int i(0); i < numFields; ++i) + { + QContactDetail *detail = transformItemField( fields[i], newQtContact ); + + if(detail) + { + // add detail if user requested it. + if(definitionRestrictions.isEmpty() || definitionRestrictions.contains(detail->definitionName())) + { + newQtContact.saveDetail(detail); + transformPreferredDetail(fields[i], *detail, newQtContact); + } + delete detail; + detail = 0; + } + } + + return newQtContact; +} + +/*! + * Transforms details that are not available until the CContactItem has been + * saved into contacts database. + */ +void CntTransformContact::transformPostSaveDetailsL( + const CContactItem& contactItem, + QContact& contact, + const CContactDatabase &contactDatabase, + QString managerUri) const +{ + // Id + QContactId contactId; + contactId.setLocalId(contactItem.Id()); + contactId.setManagerUri(managerUri); + contact.setId(contactId); + + // GUID + QContactDetail *detailUid = transformGuidItemFieldL(contactItem, contactDatabase); + if(detailUid) + { + // replace detail + QList guids = contact.details(QContactGuid::DefinitionName); + for(int i(0); i < guids.count(); i++) { + QContactGuid guidDetail = guids[i]; + contact.removeDetail(&guidDetail); + } + contact.saveDetail(detailUid); + delete detailUid; + detailUid = 0; + } + + // Timestamp + QContactDetail *detailTimestamp = transformTimestampItemFieldL(contactItem, contactDatabase); + if(detailTimestamp) + { + // replace detail + QList timestamps = contact.details(QContactTimestamp::DefinitionName); + for(int i(0); i < timestamps.count(); i++) { + QContactTimestamp timestampDetail = timestamps[i]; + contact.removeDetail(×tampDetail); + } + contact.saveDetail(detailTimestamp); + delete detailTimestamp; + detailTimestamp = 0; + } +} + +/*! CntTransform a QContact into a Symbian CContactItem. + * This will convert all supported fields to the CContactItem format. + * + * \param contact A reference to a QContact to be converted. + * \param contactItem A reference to the CContactItem to add the fields to. +*/ +void CntTransformContact::transformContactL( + QContact &contact, + CContactItem &contactItem) const +{ + //Create a new fieldSet + CContactItemFieldSet *fieldSet = CContactItemFieldSet::NewLC(); + + // Copy all fields to the Symbian contact. + QList detailList(contact.details()); + + // Iterate through the contact details in the QContact + const int detailCount(detailList.count()); + + for(int i(0); i < detailCount; ++i) + { + QScopedPointer detail(new QContactDetail(detailList.at(i))); + if (!detail->isEmpty()) { + QString detailName = detail->definitionName(); + QList fieldList = transformDetailL(*detail); + int fieldCount = fieldList.count(); + + // save preferred detail + transformPreferredDetailL(contact, detailList.at(i), fieldList); + + for (int j = 0; j < fieldCount; j++) + { + //Add field to fieldSet + fieldSet->AddL(*fieldList.at(j)); + } + } + else { + // remove empty details + contact.removeDetail(detail.data()); + } + } + + contactItem.UpdateFieldSet(fieldSet); + CleanupStack::Pop(fieldSet); +} + +QList CntTransformContact::supportedSortingFieldTypes( QString detailDefinitionName, QString detailFieldName ) +{ + QList uids; + QMap::const_iterator i = m_transformContactData.constBegin(); + while (i != m_transformContactData.constEnd()) { + if (i.value()->supportsDetail(detailDefinitionName)) { + uids = i.value()->supportedSortingFieldTypes(detailFieldName); + if( uids.count() ) + break; + } + ++i; + } + return uids; +} + +TUint32 CntTransformContact::GetIdForDetailL(const QContactDetailFilter& detailFilter, bool& isSubtype) const + { + isSubtype = false; + QString defnitionName = detailFilter.detailDefinitionName(); + QString fieldName = detailFilter.detailFieldName(); + QString fieldValue = detailFilter.value().toString(); + quint32 fieldId = 0; + + QMap::const_iterator i = m_transformContactData.constBegin(); + while (i != m_transformContactData.constEnd()) { + + if (i.value()->supportsDetail(defnitionName)){ + // This definition is supported, + // so check if there is a subtype defined + + if (i.value()->supportsSubType(fieldName)){ + + // subtype supported, so value contains the field to be checked + fieldId = i.value()->getIdForField(fieldValue); + isSubtype = true; + + } else { + // subtype not supported, so field itself should be passed + fieldId = i.value()->getIdForField(fieldName); + isSubtype = false; + } + + break; + } + ++i; + } + return fieldId; + + } + +void CntTransformContact::detailDefinitions( + QMap& defaultSchema, + const QString& contactType, + QContactManager::Error& error) const +{ + Q_UNUSED(error); + + // Ask leaf classes to do the modifications required to the default schema + QMap::const_iterator i = m_transformContactData.constBegin(); + while (i != m_transformContactData.constEnd()) { + i.value()->detailDefinitions(defaultSchema, contactType); + i++; + } +} + +QList CntTransformContact::transformDetailL(const QContactDetail &detail) const +{ + QList itemFieldList; + QScopedPointer detailName(new QString(detail.definitionName())); + + QMap::const_iterator i = m_transformContactData.constBegin(); + while (i != m_transformContactData.constEnd()) { + if (i.value()->supportsDetail(*detailName)) { + itemFieldList = i.value()->transformDetailL(detail); + break; + } + ++i; + } + return itemFieldList; +} + +QContactDetail *CntTransformContact::transformItemField(const CContactItemField& field, const QContact &contact) const +{ + QContactDetail *detail(0); + + if(field.ContentType().FieldTypeCount()) { + TUint32 fieldType(field.ContentType().FieldType(0).iUid); + + QMap::const_iterator i = m_transformContactData.constBegin(); + while (i != m_transformContactData.constEnd()) { + if (i.value()->supportsField(fieldType)) { + detail = i.value()->transformItemField(field, contact); + break; + } + ++i; + } + } + + return detail; +} + +QContactDetail* CntTransformContact::transformGuidItemFieldL(const CContactItem &contactItem, const CContactDatabase &contactDatabase) const +{ + QContactGuid *guidDetail = 0; + QString guid = QString::fromUtf16(contactItem.UidStringL(contactDatabase.MachineId()).Ptr(), + contactItem.UidStringL(contactDatabase.MachineId()).Length()); + if (guid.length() > 0) + { + guidDetail = new QContactGuid(); + guidDetail->setGuid(guid); + } + return guidDetail; +} + +QContactDetail* CntTransformContact::transformTimestampItemFieldL(const CContactItem &contactItem, const CContactDatabase &contactDatabase) const +{ + QContactTimestamp *timestampDetail = 0; + + // NOTE: In S60 3.1 we cannot use ContactGuid::GetCreationDate() because + // it is not exported. + // TODO: Make sure SYMBIAN_CNTMODEL_V2 is the right flag for this. +#ifdef SYMBIAN_CNTMODEL_V2 + HBufC* guidBuf = contactItem.UidStringL(contactDatabase.MachineId()).AllocLC(); + TPtr ptr = guidBuf->Des(); + if (ContactGuid::GetCreationDate(ptr, contactDatabase.MachineId())) + { + if (ptr.Length() > 0) + { + TLex lex(ptr); + TInt64 timeValue; + if (lex.Val(timeValue, EHex) == 0) + { + timestampDetail = new QContactTimestamp(); + + //creation date + TTime timeCreation(timeValue); + TDateTime dateCreation = timeCreation.DateTime(); + QDate qDateCreation(dateCreation.Year(), dateCreation.Month() + 1, dateCreation.Day() + 1); + QTime qTimeCreation(dateCreation.Hour(), dateCreation.Minute(), dateCreation.Second(), dateCreation.MicroSecond()/1000); + QDateTime qDateTimeCreation(qDateCreation, qTimeCreation); + timestampDetail->setCreated(qDateTimeCreation); + + //last modified date + TTime timeModified = contactItem.LastModified(); + TDateTime dateModified = timeModified.DateTime(); + QDate qDateModified(dateModified.Year(), dateModified.Month() + 1, dateModified.Day() + 1); + QTime qTimeModified(dateModified.Hour(), dateModified.Minute(), dateModified.Second(), dateModified.MicroSecond()/1000); + QDateTime qDateTimeModified(qDateModified, qTimeModified); + timestampDetail->setLastModified(qDateTimeModified); + } + } + } + CleanupStack::PopAndDestroy(guidBuf); +#endif + return timestampDetail; +} + +void CntTransformContact::transformPreferredDetailL(const QContact& contact, + const QContactDetail& detail, QList &fieldList) const +{ + if (fieldList.count() == 0) { + return; + } + + if (contact.isPreferredDetail("call", detail)) { + fieldList.at(0)->AddFieldTypeL(TFieldType::Uid(KDefaultFieldForCall)); + } + if (contact.isPreferredDetail("email", detail)) { + fieldList.at(0)->AddFieldTypeL(TFieldType::Uid(KDefaultFieldForEmail)); + } + if (contact.isPreferredDetail("videocall", detail)) { + fieldList.at(0)->AddFieldTypeL(TFieldType::Uid(KDefaultFieldForVideoCall)); + } + if (contact.isPreferredDetail("message", detail)) { + fieldList.at(0)->AddFieldTypeL(TFieldType::Uid(KDefaultFieldForMessage)); + } +} + +void CntTransformContact::transformPreferredDetail(const CContactItemField& field, + const QContactDetail& detail, QContact& contact) const +{ + if (field.ContentType().ContainsFieldType(TFieldType::Uid(KDefaultFieldForCall))) { + contact.setPreferredDetail("call", detail); + } + if (field.ContentType().ContainsFieldType(TFieldType::Uid(KDefaultFieldForEmail))) { + contact.setPreferredDetail("email", detail); + } + if (field.ContentType().ContainsFieldType(TFieldType::Uid(KDefaultFieldForVideoCall))) { + contact.setPreferredDetail("videocall", detail); + } + if (field.ContentType().ContainsFieldType(TFieldType::Uid(KDefaultFieldForMessage))) { + contact.setPreferredDetail("message", detail); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformcontactdata.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformcontactdata.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cnttransformcontactdata.h" + +/*! + * Generic implementation for adding a new text field with one field type for + * the given detail value. The field type (fieldTypeUid) and vcard mapping are + * defined by the caller. + * \a detail The detail being transformed. + * \a fieldList On return, contains the created contact item field. + * \a detailValue The detail value to be transformed. If empty, + * \a fieldTypeUid The UID of the field type. + * \a vcardMapping The VCard mapping of the field's content type. + * \a setContext Set to true to enable defining context for the field, set to + * false to disable context. + */ +void CntTransformContactData::transformToTextFieldL( + const QContactDetail &detail, + QList &fieldList, + const QString &detailValue, + const TUid fieldTypeUid, + const TUid vcardMapping, + const bool setContext) +{ + TPtrC value(reinterpret_cast(detailValue.utf16())); + if(value.Length()) { + CContactItemField* itemField = CContactItemField::NewLC(KStorageTypeText, fieldTypeUid); + itemField->TextStorage()->SetTextL(value); + itemField->SetMapping(vcardMapping); + if(setContext) + setContextsL(detail, *itemField); + fieldList.append(itemField); + CleanupStack::Pop(itemField); + } +} + +void CntTransformContactData::setContexts(const TUid &fieldType, QContactDetail &detail) +{ + if (fieldType == KUidContactFieldVCardMapHOME) + { + detail.setContexts(QContactDetail::ContextHome); + } + + else if (fieldType == KUidContactFieldVCardMapWORK) + { + detail.setContexts(QContactDetail::ContextWork); + } +} + +void CntTransformContactData::setContextsL(const QContactDetail &detail, CContactItemField &field) +{ + QStringList contexts = detail.contexts(); + + //only first context in the array is taken into account + if (contexts.count() > 0) { + if (contexts.at(0) == QContactDetail::ContextHome ) { + field.AddFieldTypeL(KUidContactFieldVCardMapHOME); + } + else if (contexts.at(0) == QContactDetail::ContextWork ) { + field.AddFieldTypeL(KUidContactFieldVCardMapWORK); + } + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformemail.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformemail.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,158 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformemail.h" + +QList CntTransformEmail::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactEmailAddress::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to email + const QContactEmailAddress &email(static_cast(detail)); + + //create new field with contexts + transformToTextFieldL(email, fieldList, email.emailAddress(), KUidContactFieldEMail, KUidContactFieldVCardMapEMAILINTERNET, true); + + return fieldList; +} + +QContactDetail *CntTransformEmail::transformItemField(const CContactItemField& field, const QContact &contact) +{ + Q_UNUSED(contact); + + QContactEmailAddress *email = new QContactEmailAddress(); + + CContactTextField* storage = field.TextStorage(); + QString emailAddress = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + + email->setEmailAddress(emailAddress); + + for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) + { + setContexts(field.ContentType().FieldType(i), *email); + } + + return email; +} + +bool CntTransformEmail::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldEMail.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformEmail::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactEmailAddress::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformEmail::supportedSortingFieldTypes(QString detailFieldName) const +{ + QList uids; + if( detailFieldName == QContactEmailAddress::FieldEmailAddress ) + uids << KUidContactFieldEMail; + return uids; +} + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformEmail::supportsSubType(const QString& subType) const +{ + Q_UNUSED(subType); + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformEmail::getIdForField(const QString& fieldName) const +{ + if (QContactEmailAddress::FieldEmailAddress == fieldName) + return KUidContactFieldEMail.iUid; + else + return 0; +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformEmail::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactEmailAddress::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactEmailAddress::DefinitionName); + QMap fields = d.fields(); + + // Don't support "ContextOther" + QContactDetailFieldDefinition f; + f.setDataType(QVariant::StringList); + f.setAllowableValues(QVariantList() + << QLatin1String(QContactDetail::ContextHome) + << QLatin1String(QContactDetail::ContextWork)); + fields[QContactDetail::FieldContext] = f; + d.setFields(fields); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformempty.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformempty.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,120 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformempty.h" +#include "cntmodelextuids.h" + +QList CntTransformEmpty::transformDetailL(const QContactDetail &detail) +{ + Q_UNUSED(detail); + QList fieldList; + return fieldList; +} + +QContactDetail *CntTransformEmpty::transformItemField(const CContactItemField& field, const QContact &contact) +{ + Q_UNUSED(field); + Q_UNUSED(contact); + return new QContactDetail(); +} + +bool CntTransformEmpty::supportsField(TUint32 fieldType) const +{ + Q_UNUSED(fieldType); + return false; +} + +bool CntTransformEmpty::supportsDetail(QString detailName) const +{ + Q_UNUSED(detailName); + return false; +} + +QList CntTransformEmpty::supportedSortingFieldTypes(QString detailFieldName) const +{ + Q_UNUSED(detailFieldName); + QList uids; + return uids; +} + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformEmpty::supportsSubType(const QString& subType) const +{ + Q_UNUSED(subType); + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformEmpty::getIdForField(const QString& fieldName) const +{ + Q_UNUSED(fieldName); + return 0; +} + +/*! + * Removes detail definitions of the details that are not supported in legacy + * S60 platforms. + * + * \a definitions On return, the supported detail definitions have been added. + */ +void CntTransformEmpty::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactGender::DefinitionName)) { + definitions.remove(QContactGender::DefinitionName); + } + if(definitions.contains(QContactGeoLocation::DefinitionName)) { + definitions.remove(QContactGeoLocation::DefinitionName); + } + if(definitions.contains(QContactOnlineAccount::DefinitionName)) { + definitions.remove(QContactOnlineAccount::DefinitionName); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformfamily.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformfamily.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,167 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformfamily.h" + +QList CntTransformFamily::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactFamily::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to family + const QContactFamily &family(static_cast(detail)); + + //create new fields without contexts + transformToTextFieldL(family, fieldList, family.spouse(), KUidContactFieldSpouse, KUidContactFieldVCardMapSpouse, false); + foreach(QString childName, family.children()) { + transformToTextFieldL(family, fieldList, childName, KUidContactFieldChildren, KUidContactFieldVCardMapChildren, false); + } + + return fieldList; +} + +QContactDetail *CntTransformFamily::transformItemField(const CContactItemField& field, const QContact &contact) +{ + QContactFamily *family = new QContactFamily(contact.detail()); + + CContactTextField* storage = field.TextStorage(); + QString familyString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + + for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) { + //Spouse + if (field.ContentType().FieldType(i) == KUidContactFieldSpouse) { + family->setSpouse(familyString); + } + + //Children + else if (field.ContentType().FieldType(i) == KUidContactFieldChildren) { + QStringList childrenList = family->children(); + childrenList.append(familyString); + family->setChildren(childrenList); + } + } + + return family; +} + +bool CntTransformFamily::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldSpouse.iUid || + fieldType == KUidContactFieldChildren.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformFamily::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactFamily::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformFamily::supportedSortingFieldTypes(QString /*detailFieldName*/) const +{ + // Sorting not supported + return QList(); +} + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformFamily::supportsSubType(const QString& subType) const +{ + Q_UNUSED(subType); + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformFamily::getIdForField(const QString& fieldName) const +{ + if (QContactFamily::FieldSpouse == fieldName) + return KUidContactFieldSpouse.iUid; + else if (QContactFamily::FieldChildren == fieldName) + return KUidContactFieldChildren.iUid; + else + return 0; +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformFamily::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + // Note: Family is not defined in the default schema + QMap fields; + QContactDetailFieldDefinition f; + QContactDetailDefinition d; + + d.setName(QContactFamily::DefinitionName); + f.setDataType(QVariant::String); + f.setAllowableValues(QVariantList()); + fields.insert(QContactFamily::FieldSpouse, f); + f.setDataType(QVariant::StringList); + fields.insert(QContactFamily::FieldChildren, f); + + d.setFields(fields); + d.setUnique(true); + + definitions.insert(d.name(), d); +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformgender.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformgender.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,156 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformgender.h" +#include "cntmodelextuids.h" + +QList CntTransformGender::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactGender::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to gender + const QContactGender &gender(static_cast(detail)); + + //create new field without contexts + transformToTextFieldL(gender, fieldList, gender.gender(), KUidContactFieldGender, KUidContactFieldVCardMapUnknown, false); + + return fieldList; +} + +QContactDetail *CntTransformGender::transformItemField(const CContactItemField& field, const QContact &contact) +{ + Q_UNUSED(contact); + + QContactGender *gender = new QContactGender(); + + CContactTextField* storage = field.TextStorage(); + QString genderInfo = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + + gender->setGender(genderInfo); + return gender; +} + +bool CntTransformGender::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldGender.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformGender::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactGender::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformGender::supportedSortingFieldTypes(QString detailFieldName) const +{ + QList uids; + if( detailFieldName == QContactGender::FieldGender ) + uids << KUidContactFieldGender; + return uids; +} + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformGender::supportsSubType(const QString& subType) const +{ + Q_UNUSED(subType); + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformGender::getIdForField(const QString& fieldName) const +{ +if (QContactGender::FieldGender == fieldName) + return KUidContactFieldGender.iUid; + else if (QContactGender::GenderMale == fieldName) + return 0; + else if (QContactGender::GenderFemale == fieldName) + return 0; + else if (QContactGender::GenderUnspecified == fieldName) + return 0; + else + return 0; +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformGender::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactGender::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactGender::DefinitionName); + QMap fields = d.fields(); + + // Context not supported in symbian back-end, remove + fields.remove(QContactGender::FieldContext); + + d.setFields(fields); + d.setUnique(true); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformgeolocation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformgeolocation.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,215 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformgeolocation.h" +#include "cntmodelextuids.h" + +const char separator = ','; + +QList CntTransformGeolocation::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactGeoLocation::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to geolocation + const QContactGeoLocation &geolocation(static_cast(detail)); + + //create new field + QString formattedGeolocation; + if (geolocation.latitude() >= 0.0) { + formattedGeolocation.append(QString::number(geolocation.latitude())); + } + formattedGeolocation.append(separator); + if (geolocation.longitude() >= 0.0) { + formattedGeolocation.append(QString::number(geolocation.longitude())); + } + + if (formattedGeolocation.length() > 1) { + //create new field with contexts + transformToTextFieldL(geolocation, fieldList, formattedGeolocation, KUidContactFieldGEO, KUidContactFieldVCardMapGEO, true); + } + + return fieldList; +} + +QContactDetail *CntTransformGeolocation::transformItemField(const CContactItemField& field, const QContact &contact) +{ + Q_UNUSED(contact); + + QContactGeoLocation *geolocation = new QContactGeoLocation(); + + CContactTextField* storage = field.TextStorage(); + QString unformattedGeolocation = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + int separatorPos = unformattedGeolocation.indexOf(separator); + + // parse latitude + bool latitudeSet = false; + if (separatorPos > 0) { + bool ok = false; + double latitude = unformattedGeolocation.left(separatorPos).toDouble(&ok); + if (ok) { + geolocation->setLatitude(latitude); + latitudeSet = true; + } + } + if (!latitudeSet) { + geolocation->setLatitude(-1); + } + + // parse longitude + bool longitudeSet = false; + if (separatorPos >= 0 && separatorPos != unformattedGeolocation.length()-1) { + bool ok = false; + double longitude = unformattedGeolocation.right(unformattedGeolocation.length()-separatorPos-1).toDouble(&ok); + if (ok) { + geolocation->setLongitude(longitude); + longitudeSet = true; + } + } + if (!longitudeSet) { + geolocation->setLongitude(-1); + } + + // set context + for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) { + setContexts(field.ContentType().FieldType(i), *geolocation); + } + + return geolocation; +} + +bool CntTransformGeolocation::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldGEO.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformGeolocation::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactGeoLocation::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformGeolocation::supportedSortingFieldTypes(QString /*detailFieldName*/) const +{ + // Sorting not supported + return QList(); +} + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformGeolocation::supportsSubType(const QString& subType) const +{ + Q_UNUSED(subType); + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformGeolocation::getIdForField(const QString& fieldName) const +{ + if (QContactGeoLocation::FieldLabel == fieldName) + return 0; + else if (QContactGeoLocation::FieldLatitude == fieldName) + return 0; + else if (QContactGeoLocation::FieldLongitude == fieldName) + return 0; + else if (QContactGeoLocation::FieldAccuracy == fieldName) + return 0; + else if (QContactGeoLocation::FieldAltitude == fieldName) + return 0; + else if (QContactGeoLocation::FieldAltitudeAccuracy == fieldName) + return 0; + else if (QContactGeoLocation::FieldHeading == fieldName) + return 0; + else if (QContactGeoLocation::FieldSpeed == fieldName) + return 0; + else if (QContactGeoLocation::FieldTimestamp == fieldName) + return 0; + else + return 0; + +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformGeolocation::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactGeoLocation::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactGeoLocation::DefinitionName); + QMap fields = d.fields(); + + // Don't support "ContextOther" + QContactDetailFieldDefinition f; + f.setDataType(QVariant::StringList); + f.setAllowableValues(QVariantList() + << QLatin1String(QContactDetail::ContextHome) + << QLatin1String(QContactDetail::ContextWork)); + fields[QContactDetail::FieldContext] = f; + d.setFields(fields); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformname.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformname.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,229 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformname.h" + +#include + +QList CntTransformName::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactName::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to name + const QContactName &name(static_cast(detail)); + + //create new fields without contexts + transformToTextFieldL(name, fieldList, name.prefix(), KUidContactFieldPrefixName, KUidContactFieldVCardMapUnusedN, false); + transformToTextFieldL(name, fieldList, name.firstName(), KUidContactFieldGivenName, KUidContactFieldVCardMapUnusedN, false); + transformToTextFieldL(name, fieldList, name.middleName(), KUidContactFieldAdditionalName, KUidContactFieldVCardMapUnusedN, false); + transformToTextFieldL(name, fieldList, name.lastName(), KUidContactFieldFamilyName, KUidContactFieldVCardMapUnusedN, false); + transformToTextFieldL(name, fieldList, name.suffix(), KUidContactFieldSuffixName, KUidContactFieldVCardMapUnusedN, false); + transformToTextFieldL(name, fieldList, name.customLabel(), KUidContactFieldTemplateLabel, KUidContactFieldVCardMapUnusedN, false); + + return fieldList; +} + + +QContactDetail *CntTransformName::transformItemField(const CContactItemField& field, const QContact &contact) +{ + QContactName *name = new QContactName(contact.detail()); + + CContactTextField* storage = field.TextStorage(); + QString nameValue = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + + for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) { + //Prefix + if (field.ContentType().FieldType(i) == KUidContactFieldPrefixName) { + name->setPrefix(nameValue); + } + //First name + else if (field.ContentType().FieldType(i) == KUidContactFieldGivenName) { + name->setFirstName(nameValue); + } + //Middle name + else if (field.ContentType().FieldType(i) == KUidContactFieldAdditionalName) { + name->setMiddleName(nameValue); + } + //Last name + else if (field.ContentType().FieldType(i) == KUidContactFieldFamilyName) { + name->setLastName(nameValue); + } + //Suffix + else if (field.ContentType().FieldType(i) == KUidContactFieldSuffixName) { + name->setSuffix(nameValue); + } + // custom label + else if (field.ContentType().FieldType(i) == KUidContactFieldTemplateLabel) { + name->setCustomLabel(nameValue); + } + } + + return name; +} + +bool CntTransformName::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldPrefixName.iUid + || fieldType == KUidContactFieldGivenName.iUid + || fieldType == KUidContactFieldAdditionalName.iUid + || fieldType == KUidContactFieldFamilyName.iUid + || fieldType == KUidContactFieldSuffixName.iUid + || fieldType == KUidContactFieldTemplateLabel.iUid ) { + ret = true; + } + return ret; +} + +bool CntTransformName::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactName::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformName::supportedSortingFieldTypes(QString detailFieldName) const +{ + QList uids; + + if (detailFieldName == QContactName::FieldPrefix) + return uids << KUidContactFieldPrefixName; + + if (detailFieldName == QContactName::FieldFirst) + return uids << KUidContactFieldGivenName; + + if (detailFieldName == QContactName::FieldMiddle) + return uids << KUidContactFieldAdditionalName; + + if (detailFieldName == QContactName::FieldLast) + return uids << KUidContactFieldFamilyName; + + if (detailFieldName == QContactName::FieldSuffix) + return uids << KUidContactFieldSuffixName; + + if (detailFieldName == QContactName::FieldCustomLabel) + return uids << KUidContactFieldTemplateLabel; + + return uids; +} + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformName::supportsSubType(const QString& subType) const +{ + Q_UNUSED(subType); + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformName::getIdForField(const QString& fieldName) const +{ + if (QContactName::FieldPrefix == fieldName) + return KUidContactFieldPrefixName.iUid; + else if (QContactName::FieldFirst == fieldName) + return KUidContactFieldGivenName.iUid; + else if (QContactName::FieldMiddle == fieldName) + return KUidContactFieldAdditionalName.iUid; + else if (QContactName::FieldLast == fieldName) + return KUidContactFieldFamilyName.iUid; + else if (QContactName::FieldSuffix == fieldName) + return KUidContactFieldSuffixName.iUid; + else if (QContactName::FieldCustomLabel == fieldName) + return KUidContactFieldTemplateLabel.iUid; + else + return 0; +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformName::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + if(definitions.contains(QContactName::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactName::DefinitionName); + QMap fields = d.fields(); + + // groups support only custom label + if(contactType == QContactType::TypeGroup) { + fields.remove(QContactName::FieldPrefix); + fields.remove(QContactName::FieldFirst); + fields.remove(QContactName::FieldMiddle); + fields.remove(QContactName::FieldLast); + fields.remove(QContactName::FieldSuffix); + } else { + // Note: Custom labels cannot be enabled for a contact in pre-10.1 + // platforms because setting custom label for a contact causes + // issues for S60 Phonebook editor. If custom label support is + // needed in 10.1 or later, it needs to be variated away from + // pre-10.1 platforms. +#ifndef SYMBIAN_BACKEND_USE_SQLITE + fields.remove(QContactName::FieldCustomLabel); +#endif + } + + // Context not supported in symbian back-end, remove + fields.remove(QContactName::FieldContext); + + d.setFields(fields); + d.setUnique(true); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformnickname.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformnickname.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,157 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformnickname.h" + +#include + +QList CntTransformNickname::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactNickname::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to name + const QContactNickname &name(static_cast(detail)); + + //create new field without contexts + transformToTextFieldL(name, fieldList, name.nickname(), KUidContactFieldSecondName, KUidContactFieldVCardMapSECONDNAME, false); + + return fieldList; +} + + +QContactDetail *CntTransformNickname::transformItemField(const CContactItemField& field, const QContact &contact) +{ + QContactNickname *name = new QContactNickname(contact.detail()); + + CContactTextField* storage = field.TextStorage(); + QString nameValue = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + + for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) + { + //Prefix + if (field.ContentType().FieldType(i) == KUidContactFieldSecondName) + { + name->setNickname(nameValue); + } + } + + return name; +} + +bool CntTransformNickname::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldSecondName.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformNickname::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactNickname::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformNickname::supportedSortingFieldTypes(QString detailFieldName) const +{ + QList uids; + if (detailFieldName == QContactNickname::FieldNickname) + uids << KUidContactFieldSecondName; + return uids; +} + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformNickname::supportsSubType(const QString& subType) const +{ + Q_UNUSED(subType); + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformNickname::getIdForField(const QString& fieldName) const +{ + if (QContactNickname::FieldNickname == fieldName) + return KUidContactFieldSecondName.iUid; + else + return 0; +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformNickname::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactNickname::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactNickname::DefinitionName); + QMap fields = d.fields(); + + // Context not supported in symbian back-end, remove + fields.remove(QContactNickname::FieldContext); + + d.setFields(fields); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformnote.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformnote.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,148 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformnote.h" + +QList CntTransformNote::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactNote::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to note + const QContactNote ¬e(static_cast(detail)); + + //create new fields without contexts + transformToTextFieldL(note, fieldList, note.note(), KUidContactFieldNote, KUidContactFieldVCardMapNOTE, false); + + return fieldList; +} + +QContactDetail *CntTransformNote::transformItemField(const CContactItemField& field, const QContact &contact) +{ + Q_UNUSED(contact); + + QContactNote *note = new QContactNote(); + + CContactTextField* storage = field.TextStorage(); + QString noteString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + + note->setNote(noteString); + return note; +} + +bool CntTransformNote::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldNote.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformNote::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactNote::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformNote::supportedSortingFieldTypes(QString detailFieldName) const +{ + QList uids; + if (detailFieldName == QContactNote::FieldNote) + uids << KUidContactFieldNote; + return uids; +} + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformNote::supportsSubType(const QString& subType) const +{ + Q_UNUSED(subType); + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformNote::getIdForField(const QString& fieldName) const +{ + if (QContactNote::FieldNote == fieldName) + return KUidContactFieldNote.iUid; + else + return 0; +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformNote::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactNote::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactNote::DefinitionName); + QMap fields = d.fields(); + + // Context not supported in symbian back-end, remove + fields.remove(QContactNote::FieldContext); + + d.setFields(fields); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformonlineaccount.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformonlineaccount.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,349 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifdef SYMBIAN_BACKEND_USE_SQLITE + +#include "cnttransformonlineaccount.h" +#include "cntmodelextuids.h" + +QList CntTransformOnlineAccount::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactOnlineAccount::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to phonenumber + const QContactOnlineAccount &onlineAccount(static_cast(detail)); + + //get the subType + QStringList subTypes = onlineAccount.subTypes(); + + //create new field + TPtrC fieldText(reinterpret_cast(onlineAccount.accountUri().utf16())); + if(fieldText.Length()) { + CContactItemField* newField = CContactItemField::NewLC(KStorageTypeText); + newField->TextStorage()->SetTextL(fieldText); + + //no subtype + if(!subTypes.count()) + { + User::LeaveIfError(KErrArgument); + } + + // online account + else if (subTypes.contains(QContactOnlineAccount::SubTypeImpp)) + { + newField->AddFieldTypeL(KUidContactFieldIMPP); + newField->SetMapping(KUidContactFieldVCardMapUnknown); + } + + //internet + else if (subTypes.contains(QContactOnlineAccount::SubTypeSipVoip)) + { + newField->AddFieldTypeL(KUidContactFieldSIPID); + newField->SetMapping(KUidContactFieldVCardMapSIPID); + newField->AddFieldTypeL(KUidContactFieldVCardMapVOIP); + } + + //share video + else if (subTypes.contains(QContactOnlineAccount::SubTypeVideoShare)) + { + newField->AddFieldTypeL(KUidContactFieldSIPID); + newField->SetMapping(KUidContactFieldVCardMapSIPID); + newField->AddFieldTypeL(KUidContactFieldVCardMapSWIS); + } + + //sip + else if (subTypes.contains(QContactOnlineAccount::SubTypeSip)) + { + newField->AddFieldTypeL(KUidContactFieldSIPID); + newField->SetMapping(KUidContactFieldVCardMapSIPID); + newField->AddFieldTypeL(KUidContactFieldVCardMapSIPID); + } + + else + { + User::LeaveIfError(KErrNotSupported); + } + + //contexts + setContextsL(onlineAccount, *newField); + + fieldList.append(newField); + CleanupStack::Pop(newField); + + // Transform Service Provider Text + TPtrC ServiceProviderText(reinterpret_cast(onlineAccount.serviceProvider().utf16())); + if(ServiceProviderText.Length()) { + CContactItemField* serviceProviderField = CContactItemField::NewLC(KStorageTypeText); + serviceProviderField->TextStorage()->SetTextL(ServiceProviderText); + serviceProviderField->AddFieldTypeL(KUidContactFieldServiceProvider); + fieldList.append(serviceProviderField); + CleanupStack::Pop(serviceProviderField); + } + + // Transform presence informaiton + TPtrC presenceText(reinterpret_cast(onlineAccount.presence().utf16())); + if(presenceText.Length()) { + QString presence = QString::number(encodePresence(onlineAccount.presence())); + CContactItemField* presenceField = CContactItemField::NewLC(KStorageTypeText); + TPtrC presenceEncodedText(reinterpret_cast(presence.utf16())); + presenceField->TextStorage()->SetTextL(presenceEncodedText); + presenceField->AddFieldTypeL(KUidContactFieldPresence); + fieldList.append(presenceField); + CleanupStack::Pop(presenceField); + } + + // Transform statusMessage + TPtrC statusMsgText(reinterpret_cast(onlineAccount.statusMessage().utf16())); + if(statusMsgText.Length()) { + CContactItemField* statusMsgField = CContactItemField::NewLC(KStorageTypeText); + statusMsgField->TextStorage()->SetTextL(statusMsgText); + statusMsgField->AddFieldTypeL(KUidContactFieldStatusMsg); + fieldList.append(statusMsgField); + CleanupStack::Pop(statusMsgField); + } + } + + return fieldList; +} + +QContactDetail *CntTransformOnlineAccount::transformItemField(const CContactItemField& field, const QContact &contact) +{ + Q_UNUSED(contact); + + QContactOnlineAccount *onlineAccount = new QContactOnlineAccount(); + CContactTextField* storage = field.TextStorage(); + QString onlineAccountString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + + // Adding Online Account Detail. + for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) { + + //Account URI + if (field.ContentType().ContainsFieldType(KUidContactFieldIMPP)) { + onlineAccount->setAccountUri(onlineAccountString); + onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeImpp); + } + else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapVOIP)) { + onlineAccount->setAccountUri(onlineAccountString); + onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeSipVoip); + } + else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapSWIS)) { + onlineAccount->setAccountUri(onlineAccountString); + onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeVideoShare); + } + else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapSIPID)) { + onlineAccount->setAccountUri(onlineAccountString); + onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeSip); + } + //Service Provider + else if (field.ContentType().FieldType(i) == KUidContactFieldServiceProvider) { + onlineAccount->setServiceProvider(onlineAccountString); + } + //Presence + else if (field.ContentType().FieldType(i) == KUidContactFieldPresence) { + QString presenceInfo = decodePresence(onlineAccountString.toInt()); + onlineAccount->setPresence(presenceInfo); + } + //Status Message + else if (field.ContentType().FieldType(i) == KUidContactFieldStatusMsg) { + onlineAccount->setStatusMessage(onlineAccountString); + } + } + + // set context + for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) { + setContexts(field.ContentType().FieldType(i), *onlineAccount); + } + + return onlineAccount; +} + +bool CntTransformOnlineAccount::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldSIPID.iUid || + fieldType == KUidContactFieldIMPP.iUid || + fieldType == KUidContactFieldServiceProvider.iUid || + fieldType == KUidContactFieldPresence.iUid || + fieldType == KUidContactFieldStatusMsg.iUid ) + { + ret = true; + } + return ret; +} + +bool CntTransformOnlineAccount::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactOnlineAccount::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformOnlineAccount::supportedSortingFieldTypes(QString detailFieldName) const +{ + QList uids; + if (detailFieldName == QContactOnlineAccount::FieldAccountUri) { + uids << KUidContactFieldIMPP; + uids << KUidContactFieldSIPID; + } + return uids; +} + + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformOnlineAccount::supportsSubType(const QString& subType) const +{ + if(QContactOnlineAccount::FieldSubTypes == subType) + return true; + else + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformOnlineAccount::getIdForField(const QString& fieldName) const +{ + if (QContactOnlineAccount::FieldAccountUri == fieldName) + return 0; + else if (QContactOnlineAccount::SubTypeSip == fieldName) + return KUidContactFieldSIPID.iUid; + else if (QContactOnlineAccount::SubTypeImpp == fieldName) + return KUidContactFieldIMPP.iUid; + else if (QContactOnlineAccount::SubTypeSipVoip == fieldName) + return KUidContactFieldVCardMapVOIP.iUid; + else if (QContactOnlineAccount::SubTypeVideoShare == fieldName) + return KUidContactFieldVCardMapSWIS.iUid; + else + return 0; +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformOnlineAccount::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactOnlineAccount::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactOnlineAccount::DefinitionName); + QMap fields = d.fields(); + QContactDetailFieldDefinition f; + + // Don't support "ContextOther" + f.setDataType(QVariant::StringList); + f.setAllowableValues(QVariantList() + << QLatin1String(QContactDetail::ContextHome) + << QLatin1String(QContactDetail::ContextWork)); + fields[QContactDetail::FieldContext] = f; + d.setFields(fields); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} + + +/*! + * Encode the presence information. + * \a aPresence + */ +quint32 CntTransformOnlineAccount::encodePresence(QString aPresence) +{ + if (QContactOnlineAccount::PresenceAvailable == aPresence) + return CntTransformOnlineAccount::EPresenceAvailable; + else if (QContactOnlineAccount::PresenceHidden == aPresence) + return CntTransformOnlineAccount::EPresenceHidden; + else if (QContactOnlineAccount::PresenceBusy == aPresence) + return CntTransformOnlineAccount::EPresenceBusy; + else if (QContactOnlineAccount::PresenceAway == aPresence) + return CntTransformOnlineAccount::EPresenceAway; + else if (QContactOnlineAccount::PresenceExtendedAway == aPresence) + return CntTransformOnlineAccount::EPresenceExtendedAway; + else if (QContactOnlineAccount::PresenceUnknown == aPresence) + return CntTransformOnlineAccount::EPresenceUnknown; + else + return CntTransformOnlineAccount::EPresenceOffline; +} + + + +/*! + * Decode the presence information. + * \a aPresence + */ +QString CntTransformOnlineAccount::decodePresence(quint32 aPresence) +{ + if (CntTransformOnlineAccount::EPresenceAvailable == aPresence) + return QContactOnlineAccount::PresenceAvailable; + else if (CntTransformOnlineAccount::EPresenceHidden == aPresence) + return QContactOnlineAccount::PresenceHidden; + else if (CntTransformOnlineAccount::EPresenceBusy == aPresence) + return QContactOnlineAccount::PresenceBusy; + else if ( CntTransformOnlineAccount::EPresenceAway == aPresence) + return QContactOnlineAccount::PresenceAway; + else if ( CntTransformOnlineAccount::EPresenceExtendedAway == aPresence) + return QContactOnlineAccount::PresenceExtendedAway; + else if ( CntTransformOnlineAccount::EPresenceUnknown == aPresence) + return QContactOnlineAccount::PresenceUnknown; + else + return QContactOnlineAccount::PresenceOffline; +} + +#endif // SYMBIAN_BACKEND_USE_SQLITE + +// End of file diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformorganisation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformorganisation.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,207 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformorganisation.h" + +QList CntTransformOrganisation::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactOrganization::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to orgenisation + const QContactOrganization &orgDetails(static_cast(detail)); + + //create new fields without contexts + transformToTextFieldL(orgDetails, fieldList, orgDetails.name(), KUidContactFieldCompanyName, KUidContactFieldVCardMapORG, false); + QStringList departments = orgDetails.department(); + if(departments.count()) // Take only the first department + transformToTextFieldL(orgDetails, fieldList, departments[0], KUidContactFieldDepartmentName, KUidContactFieldVCardMapDepartment, false); + transformToTextFieldL(orgDetails, fieldList, orgDetails.title(), KUidContactFieldJobTitle, KUidContactFieldVCardMapTITLE, false); + transformToTextFieldL(orgDetails, fieldList, orgDetails.assistantName(), KUidContactFieldAssistant, KUidContactFieldVCardMapAssistant, false); + + return fieldList; +} + + +QContactDetail *CntTransformOrganisation::transformItemField(const CContactItemField& field, const QContact &contact) +{ + QContactOrganization *organisation = new QContactOrganization(contact.detail()); + + CContactTextField* storage = field.TextStorage(); + QString orgDetail = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + + for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) { + //Company + if (field.ContentType().FieldType(i) == KUidContactFieldCompanyName) { + organisation->setName(orgDetail); + } + //Department + else if (field.ContentType().FieldType(i) == KUidContactFieldDepartmentName) { + // Assume only a single department + QStringList departments = QStringList(orgDetail); + organisation->setDepartment(departments); + } + //Job title + else if (field.ContentType().FieldType(i) == KUidContactFieldJobTitle) { + organisation->setTitle(orgDetail); + } + //Assistant name + else if (field.ContentType().FieldType(i) == KUidContactFieldAssistant) { + organisation->setAssistantName(orgDetail); + } + } + + return organisation; +} + +bool CntTransformOrganisation::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldCompanyName.iUid || + fieldType == KUidContactFieldDepartmentName.iUid || + fieldType == KUidContactFieldJobTitle.iUid || + fieldType == KUidContactFieldAssistant.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformOrganisation::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactOrganization::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformOrganisation::supportedSortingFieldTypes(QString detailFieldName) const +{ + QList uids; + + if (detailFieldName == QContactOrganization::FieldName) + return uids << KUidContactFieldCompanyName; + + if (detailFieldName == QContactOrganization::FieldDepartment) + return uids << KUidContactFieldDepartmentName; + + if (detailFieldName == QContactOrganization::FieldTitle) + return uids << KUidContactFieldJobTitle; + + if (detailFieldName == QContactOrganization::FieldAssistantName) + return uids << KUidContactFieldAssistant; + + return uids; +} + + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformOrganisation::supportsSubType(const QString& subType) const +{ + Q_UNUSED(subType); + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformOrganisation::getIdForField(const QString& fieldName) const +{ + + if (QContactOrganization::FieldName == fieldName) + return KUidContactFieldCompanyName.iUid; + else if (QContactOrganization::FieldLogo == fieldName) + return 0; + else if (QContactOrganization::FieldDepartment == fieldName) + return KUidContactFieldDepartmentName.iUid; + else if (QContactOrganization::FieldLocation == fieldName) + return 0; + else if (QContactOrganization::FieldTitle == fieldName) + return KUidContactFieldJobTitle.iUid; + else if (QContactOrganization::FieldAssistantName == fieldName) + return KUidContactFieldAssistant.iUid; + else + return 0; + +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformOrganisation::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactOrganization::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactOrganization::DefinitionName); + QMap fields = d.fields(); + QContactDetailFieldDefinition f; + + // Not all fields are supported, replace: + fields.clear(); + f.setDataType(QVariant::String); + f.setAllowableValues(QVariantList()); + fields.insert(QContactOrganization::FieldName, f); + fields.insert(QContactOrganization::FieldTitle, f); + fields.insert(QContactOrganization::FieldAssistantName, f); + f.setDataType(QVariant::StringList); + fields.insert(QContactOrganization::FieldDepartment, f); + + d.setFields(fields); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformphonenumber.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformphonenumber.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,313 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformphonenumber.h" + +QList CntTransformPhoneNumber::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactPhoneNumber::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to phonenumber + const QContactPhoneNumber &phoneNumber(static_cast(detail)); + + //get the subType + QStringList subTypes = phoneNumber.subTypes(); + + //create new field + TPtrC fieldText(reinterpret_cast(phoneNumber.number().utf16())); + if(fieldText.Length()) { + CContactItemField* newField = CContactItemField::NewLC(KStorageTypeText); + newField->TextStorage()->SetTextL(fieldText); + + //no subtype + if(!subTypes.count()) + { + newField->AddFieldTypeL(KUidContactFieldPhoneNumber); + newField->SetMapping(KUidContactFieldVCardMapTEL); + } + + //landline + else if (subTypes.contains(QContactPhoneNumber::SubTypeLandline)) + { + newField->AddFieldTypeL(KUidContactFieldPhoneNumber); + newField->SetMapping(KUidContactFieldVCardMapTEL); + newField->AddFieldTypeL(KUidContactFieldVCardMapVOICE); + } + + //mobile + else if (subTypes.contains(QContactPhoneNumber::SubTypeMobile)) + { + newField->AddFieldTypeL(KUidContactFieldPhoneNumber); + newField->SetMapping(KUidContactFieldVCardMapTEL); + newField->AddFieldTypeL(KUidContactFieldVCardMapCELL); + } + + //fax + else if (subTypes.contains(QContactPhoneNumber::SubTypeFacsimile)) + { + newField->AddFieldTypeL(KUidContactFieldFax); + newField->SetMapping(KUidContactFieldVCardMapTEL); + newField->AddFieldTypeL(KUidContactFieldVCardMapFAX); + } + + //pager + else if (subTypes.contains(QContactPhoneNumber::SubTypePager)) + { + newField->AddFieldTypeL(KUidContactFieldPhoneNumber); + newField->SetMapping(KUidContactFieldVCardMapTEL); + newField->AddFieldTypeL(KUidContactFieldVCardMapPAGER); + } + + //bbs + else if (subTypes.contains(QContactPhoneNumber::SubTypeBulletinBoardSystem)) + { + newField->AddFieldTypeL(KUidContactFieldPhoneNumber); + newField->SetMapping(KUidContactFieldVCardMapTEL); + newField->AddFieldTypeL(KUidContactFieldVCardMapBBS); + } + + //car + else if (subTypes.contains(QContactPhoneNumber::SubTypeCar)) + { + newField->AddFieldTypeL(KUidContactFieldPhoneNumber); + newField->SetMapping(KUidContactFieldVCardMapTEL); + newField->AddFieldTypeL(KUidContactFieldVCardMapCAR); + } + + //DTMF + else if (subTypes.contains(QContactPhoneNumber::SubTypeDtmfMenu)) + { + newField->AddFieldTypeL(KUidContactFieldDTMF); + newField->SetMapping(KUidContactFieldVCardMapUnknown); + } + + // assistant number + else if (subTypes.contains(QContactPhoneNumber::SubTypeAssistant)) + { + newField->AddFieldTypeL(KUidContactFieldPhoneNumber); + newField->SetMapping(KUidContactFieldVCardMapAssistantTel); + } + + // video calls + else if (subTypes.contains(QContactPhoneNumber::SubTypeVideo)) + { + newField->AddFieldTypeL(KUidContactFieldPhoneNumber); + newField->SetMapping(KUidContactFieldVCardMapTEL); + newField->AddFieldTypeL(KUidContactFieldVCardMapVIDEO); + } + else + { + User::LeaveIfError(KErrNotSupported); + } + + //contexts + setContextsL(phoneNumber, *newField); + + fieldList.append(newField); + CleanupStack::Pop(newField); + } + + return fieldList; +} + +QContactDetail *CntTransformPhoneNumber::transformItemField(const CContactItemField& field, const QContact &contact) +{ + Q_UNUSED(contact); + + QContactPhoneNumber *phoneNumber = new QContactPhoneNumber(); + + CContactTextField* storage = field.TextStorage(); + QString number = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + + phoneNumber->setNumber(number); + + if (field.ContentType().ContainsFieldType(KUidContactFieldPhoneNumber)) { + if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapVOICE)) { + phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeLandline); + } + else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapCELL)) { + phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeMobile); + } + else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapPAGER)) { + phoneNumber->setSubTypes(QContactPhoneNumber::SubTypePager); + } + else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapBBS)) { + phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeBulletinBoardSystem); + } + else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapCAR)) { + phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeCar); + } + else if (field.ContentType().Mapping() == KUidContactFieldVCardMapAssistantTel) { + phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeAssistant); + } + else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapVIDEO)) { + phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeVideo); + } + } + else if (field.ContentType().ContainsFieldType(KUidContactFieldFax)) { + phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeFacsimile); + } + else if (field.ContentType().ContainsFieldType(KUidContactFieldDTMF)) { + phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeDtmfMenu); + } + + // set context + for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) { + setContexts(field.ContentType().FieldType(i), *phoneNumber); + } + + return phoneNumber; +} + +bool CntTransformPhoneNumber::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldPhoneNumber.iUid || + fieldType == KUidContactFieldFax.iUid || + fieldType == KUidContactFieldDTMF.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformPhoneNumber::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactPhoneNumber::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformPhoneNumber::supportedSortingFieldTypes(QString detailFieldName) const +{ + QList uids; + if (detailFieldName == QContactPhoneNumber::FieldNumber) { + uids << KUidContactFieldPhoneNumber; + uids << KUidContactFieldFax; + uids << KUidContactFieldDTMF; + } + return uids; +} + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformPhoneNumber::supportsSubType(const QString& subType) const +{ + if(QContactPhoneNumber::FieldSubTypes == subType) + return true; + else + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformPhoneNumber::getIdForField(const QString& fieldName) const +{ + if (QContactPhoneNumber::FieldNumber == fieldName) + return 0; + else if (QContactPhoneNumber::SubTypeLandline == fieldName) + return 0; + else if (QContactPhoneNumber::SubTypeMobile == fieldName) + return 0; + else if (QContactPhoneNumber::SubTypeFacsimile == fieldName) + return KUidContactFieldFax.iUid; + else if (QContactPhoneNumber::SubTypePager == fieldName) + return 0; + else if (QContactPhoneNumber::SubTypeVoice == fieldName) + return 0; + else if (QContactPhoneNumber::SubTypeModem == fieldName) + return 0; + else if (QContactPhoneNumber::SubTypeVideo == fieldName) + return 0; + else if (QContactPhoneNumber::SubTypeCar == fieldName) + return 0; + else if (QContactPhoneNumber::SubTypeBulletinBoardSystem == fieldName) + return 0; + else if (QContactPhoneNumber::SubTypeMessagingCapable == fieldName) + return 0; + else if (QContactPhoneNumber::SubTypeAssistant == fieldName) + return 0; + else if (QContactPhoneNumber::SubTypeDtmfMenu == fieldName) + return KUidContactFieldDTMF.iUid; + else + return 0; +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformPhoneNumber::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactPhoneNumber::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactPhoneNumber::DefinitionName); + QMap fields = d.fields(); + + // Don't support "ContextOther" + QContactDetailFieldDefinition f; + f.setDataType(QVariant::StringList); + f.setAllowableValues(QVariantList() + << QLatin1String(QContactDetail::ContextHome) + << QLatin1String(QContactDetail::ContextWork)); + fields[QContactDetail::FieldContext] = f; + d.setFields(fields); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformsynctarget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformsynctarget.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,158 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformsynctarget.h" +#include "cntmodelextuids.h" + +QList CntTransformSyncTarget::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactSyncTarget::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to sync target + const QContactSyncTarget &syncTarget(static_cast(detail)); + + //create new fields without contexts + transformToTextFieldL(syncTarget, fieldList, syncTarget.syncTarget(), KUidContactFieldClass, KUidContactFieldVCardMapClass, false); + + return fieldList; +} + +QContactDetail *CntTransformSyncTarget::transformItemField(const CContactItemField& field, const QContact &contact) +{ + Q_UNUSED(contact); + + QContactSyncTarget *syncTarget = new QContactSyncTarget(); + + CContactTextField* storage = field.TextStorage(); + QString syncTargetString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + + syncTarget->setSyncTarget(syncTargetString); + return syncTarget; +} + +bool CntTransformSyncTarget::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldClass.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformSyncTarget::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactSyncTarget::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformSyncTarget::supportedSortingFieldTypes(QString detailFieldName) const +{ + QList uids; + if (detailFieldName == QContactSyncTarget::FieldSyncTarget) + uids << KUidContactFieldClass; + return uids; +} + + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformSyncTarget::supportsSubType(const QString& subType) const +{ + Q_UNUSED(subType); + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformSyncTarget::getIdForField(const QString& fieldName) const +{ + if (QContactSyncTarget::FieldSyncTarget == fieldName) + return KUidContactFieldClass.iUid; + else + return 0; +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformSyncTarget::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactSyncTarget::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactSyncTarget::DefinitionName); + QMap fields = d.fields(); + QContactDetailFieldDefinition f; + + // Not all fields are supported, replace: + fields.clear(); + f.setDataType(QVariant::String); + f.setAllowableValues(QVariantList() + << QString("private") + << QString("public") + << QString("none")); + fields.insert(QContactSyncTarget::FieldSyncTarget, f); + + d.setFields(fields); + d.setUnique(true); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformurl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformurl.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,191 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "cnttransformurl.h" + +QList CntTransformUrl::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactUrl::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to url + const QContactUrl &url(static_cast(detail)); + + //create new field + TPtrC fieldText(reinterpret_cast(url.url().utf16())); + if(fieldText.Length()) { + CContactItemField* newField = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldUrl); + newField->TextStorage()->SetTextL(fieldText); + newField->SetMapping(KUidContactFieldVCardMapURL); + + QString subType = url.subType(); + const QString& subTypeHomePage(QContactUrl::SubTypeHomePage); + if (subType.length() != 0 && subType.compare(subTypeHomePage) != 0) + { + User::LeaveIfError(KErrNotSupported); + } + + //contexts + setContextsL(url, *newField); + + fieldList.append(newField); + CleanupStack::Pop(newField); + } + + return fieldList; +} + +QContactDetail *CntTransformUrl::transformItemField(const CContactItemField& field, const QContact &contact) +{ + Q_UNUSED(contact); + + QContactUrl *url = new QContactUrl(); + + CContactTextField* storage = field.TextStorage(); + QString urlString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + + url->setUrl(urlString); + url->setSubType(QContactUrl::SubTypeHomePage); + + for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) + { + setContexts(field.ContentType().FieldType(i), *url); + } + + return url; +} + +bool CntTransformUrl::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldUrl.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformUrl::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactUrl::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformUrl::supportedSortingFieldTypes(QString detailFieldName) const +{ + QList uids; + if (detailFieldName == QContactUrl::FieldUrl) + uids << KUidContactFieldUrl; + return uids; +} + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformUrl::supportsSubType(const QString& subType) const +{ + if(QContactUrl::FieldSubType == subType) + return true; + else + return false; + +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformUrl::getIdForField(const QString& fieldName) const +{ + if (QContactUrl::FieldUrl == fieldName) + return 0; + else if (QContactUrl::SubTypeHomePage == fieldName) + return 0; + else if (QContactUrl::SubTypeFavourite == fieldName) + return 0; + else + return 0; + +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformUrl::detailDefinitions(QMap &definitions, const QString &contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactUrl::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactUrl::DefinitionName); + QMap fields = d.fields(); + QContactDetailFieldDefinition f; + + f.setDataType(QVariant::String); //only allowed to be a single subtype + f.setAllowableValues(QVariantList() + << QString(QLatin1String(QContactUrl::SubTypeHomePage))); + fields.insert(QContactUrl::FieldSubType, f); + + // Don't support "ContextOther" + f.setDataType(QVariant::StringList); + f.setAllowableValues(QVariantList() + << QLatin1String(QContactDetail::ContextHome) + << QLatin1String(QContactDetail::ContextWork)); + fields[QContactDetail::FieldContext] = f; + + d.setFields(fields); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/symbian.pro --- a/qtcontactsmobility/plugins/contacts/symbian/symbian.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/plugins/contacts/symbian/symbian.pro Fri Apr 16 14:53:18 2010 +0300 @@ -4,21 +4,14 @@ PLUGIN_TYPE=contacts include(../../../common.pri) +include(symbian_defines.pri) symbian: { load(data_caging_paths) - - defFiles = \ - "$${LITERAL_HASH}ifdef WINSCW" \ - "DEFFILE bwins/$${TARGET}.def" \ - "$${LITERAL_HASH}elif defined EABI" \ - "DEFFILE eabi/$${TARGET}.def" \ - "$${LITERAL_HASH}endif " - MMP_RULES += defFiles TARGET.CAPABILITY = ALL -TCB TARGET.EPOCALLOWDLLDATA = 1 TARGET.UID3 = 0x2002AC7B - + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE INCLUDEPATH += inc @@ -28,92 +21,110 @@ INCLUDEPATH += $$SOURCE_DIR/contacts/filters INCLUDEPATH += $$SOURCE_DIR/contacts/requests - HEADERS += \ + HEADERS += \ $$PUBLIC_HEADERS \ inc/cntsymbianengine.h \ - inc/cnttransformcontact.h \ - inc/cnttransformcontactdata.h \ - inc/cnttransformname.h \ - inc/cnttransformnickname.h \ - inc/cnttransformphonenumber.h \ - inc/cnttransformemail.h \ - inc/cnttransformaddress.h \ - inc/cnttransformurl.h \ - inc/cnttransformbirthday.h \ - inc/cnttransformonlineaccount.h \ - inc/cnttransformorganisation.h \ - inc/cnttransformavatar.h \ - inc/cnttransformavatarsimple.h \ - inc/cntthumbnailcreator.h \ - inc/cnttransformsynctarget.h \ - inc/cnttransformgender.h \ - inc/cnttransformanniversary.h \ - inc/cnttransformanniversarysimple.h \ - inc/cnttransformgeolocation.h \ - inc/cnttransformnote.h \ - inc/cnttransformfamily.h \ - inc/cnttransformempty.h \ - inc/cntabstractcontactfilter.h \ - inc/cntsymbianfilterdbms.h \ - inc/cntsymbianfiltersql.h \ - inc/cntabstractcontactsorter.h \ - inc/cntsymbiansorterdbms.h \ - inc/cntrelationship.h \ inc/cntabstractrelationship.h \ inc/cntrelationshipgroup.h \ - inc/cntsymbianfiltersqlhelper.h \ - inc/cntsymbiansrvconnection.h \ inc/cntsymbiantransformerror.h \ inc/cntsymbiandatabase.h \ inc/cntdisplaylabel.h \ - inc/cntdisplaylabelsqlfilter.h \ - inc/cntsqlsearch.h - - SOURCES += \ - src/cntsymbianengine.cpp \ - src/cnttransformcontact.cpp \ - src/cnttransformcontactdata.cpp \ - src/cnttransformname.cpp \ - src/cnttransformnickname.cpp \ - src/cnttransformphonenumber.cpp \ - src/cnttransformemail.cpp \ - src/cnttransformaddress.cpp \ - src/cnttransformurl.cpp \ - src/cnttransformbirthday.cpp \ - src/cnttransformonlineaccount.cpp \ - src/cnttransformorganisation.cpp \ - src/cnttransformavatar.cpp \ - src/cnttransformavatarsimple.cpp \ - src/cntthumbnailcreator.cpp\ - src/cnttransformsynctarget.cpp \ - src/cnttransformgender.cpp \ - src/cnttransformanniversary.cpp \ - src/cnttransformanniversarysimple.cpp \ - src/cnttransformgeolocation.cpp \ - src/cnttransformnote.cpp \ - src/cnttransformfamily.cpp \ - src/cnttransformempty.cpp \ - src/cntsymbianfilterdbms.cpp \ - src/cntsymbianfiltersql.cpp \ - src/cntsymbiansorterdbms.cpp \ - src/cntrelationship.cpp \ + inc/cntrelationship.h \ + inc/transform/cnttransformcontact.h \ + inc/transform/cnttransformcontactdata.h \ + inc/transform/cnttransformname.h \ + inc/transform/cnttransformnickname.h \ + inc/transform/cnttransformphonenumber.h \ + inc/transform/cnttransformemail.h \ + inc/transform/cnttransformaddress.h \ + inc/transform/cnttransformurl.h \ + inc/transform/cnttransformbirthday.h \ + inc/transform/cnttransformonlineaccount.h \ + inc/transform/cnttransformorganisation.h \ + inc/transform/cnttransformavatar.h \ + inc/transform/cnttransformavatarsimple.h \ + inc/transform/cntthumbnailcreator.h \ + inc/transform/cnttransformsynctarget.h \ + inc/transform/cnttransformgender.h \ + inc/transform/cnttransformanniversary.h \ + inc/transform/cnttransformanniversarysimple.h \ + inc/transform/cnttransformgeolocation.h \ + inc/transform/cnttransformnote.h \ + inc/transform/cnttransformfamily.h \ + inc/transform/cnttransformempty.h \ + inc/filtering/cntfilterrelationship.h \ + inc/filtering/cntfilterdetaildisplaylabel.h \ + inc/filtering/cntfilterdetail.h \ + inc/filtering/cntdbinfo.h \ + inc/filtering/cntfilterdefault.h \ + inc/filtering/cntfilterintersection.h \ + inc/filtering/cntfilterunion.h \ + inc/filtering/cntfilterinvalid.h \ + inc/filtering/cntfilteraction.h \ + inc/filtering/cntfilterlocalid.h \ + inc/filtering/cntfilterchangelog.h \ + inc/filtering/cntfilterdetailrange.h \ + inc/filtering/cntabstractcontactsorter.h \ + inc/filtering/cntabstractcontactfilter.h \ + inc/filtering/cntsymbianfilterdbms.h \ + inc/filtering/cntsymbianfiltersql.h \ + inc/filtering/cntsymbiansorterdbms.h \ + inc/filtering/cntsymbiansrvconnection.h \ + inc/filtering/cntdisplaylabelsqlfilter.h \ + inc/filtering/cntsqlsearch.h + + SOURCES += \ + src/transform/cnttransformcontact.cpp \ + src/transform/cnttransformcontactdata.cpp \ + src/transform/cnttransformname.cpp \ + src/transform/cnttransformnickname.cpp \ + src/transform/cnttransformphonenumber.cpp \ + src/transform/cnttransformemail.cpp \ + src/transform/cnttransformaddress.cpp \ + src/transform/cnttransformurl.cpp \ + src/transform/cnttransformbirthday.cpp \ + src/transform/cnttransformonlineaccount.cpp \ + src/transform/cnttransformorganisation.cpp \ + src/transform/cnttransformavatar.cpp \ + src/transform/cnttransformavatarsimple.cpp \ + src/transform/cntthumbnailcreator.cpp\ + src/transform/cnttransformsynctarget.cpp \ + src/transform/cnttransformgender.cpp \ + src/transform/cnttransformanniversary.cpp \ + src/transform/cnttransformanniversarysimple.cpp \ + src/transform/cnttransformgeolocation.cpp \ + src/transform/cnttransformnote.cpp \ + src/transform/cnttransformfamily.cpp \ + src/transform/cnttransformempty.cpp \ + src/filtering/cntfilterrelationship.cpp \ + src/filtering/cntfilterdetaildisplaylabel.cpp \ + src/filtering/cntfilterdetail.cpp \ + src/filtering/cntdbinfo.cpp \ + src/filtering/cntfilterdefault.cpp \ + src/filtering/cntfilterintersection.cpp \ + src/filtering/cntfilterunion.cpp \ + src/filtering/cntfilterinvalid.cpp \ + src/filtering/cntfilteraction.cpp \ + src/filtering/cntfilterlocalid.cpp \ + src/filtering/cntfilterchangelog.cpp \ + src/filtering/cntfilterdetailrange.cpp \ + src/filtering/cntsymbianfilterdbms.cpp \ + src/filtering/cntsymbianfiltersql.cpp \ + src/filtering/cntsymbiansorterdbms.cpp \ + src/filtering/cntsymbiansrvconnection.cpp \ + src/filtering/cntdisplaylabelsqlfilter.cpp \ + src/filtering/cntsqlsearch.cpp \ + src/cntsymbianengine.cpp \ src/cntabstractrelationship.cpp \ src/cntrelationshipgroup.cpp \ - src/cntsymbianfiltersqlhelper.cpp \ - src/cntsymbiansrvconnection.cpp \ src/cntsymbiantransformerror.cpp \ src/cntsymbiandatabase.cpp \ src/cntdisplaylabel.cpp \ - src/cntdisplaylabelsqlfilter.cpp \ - src/cntsqlsearch.cpp + src/cntrelationship.cpp - - CONFIG += mobility MOBILITY = contacts - qtAddLibrary(QtContacts) - LIBS += \ -lcntmodel \ -lcentralrepository \ @@ -128,27 +139,14 @@ target.path = /sys/bin INSTALLS += target - exists($${EPOCROOT}epoc32/data/z/system/install/Series60v5.2.sis) { - exists($${EPOCROOT}epoc32/release/winscw/udeb/VPbkEng.dll) \ - | exists($${EPOCROOT}epoc32/release/armv5/urel/VPbkEng.dll) { - message("TB 9.2 platform") - } else { - message("TB 10.1 or later platform") - DEFINES += SYMBIAN_BACKEND_USE_SQLITE - cntmodelResourceFile = \ - "START RESOURCE ../rss/cntmodel.rss" \ - "TARGETPATH $${CONTACTS_RESOURCE_DIR}" \ - "END" - MMP_RULES += cntmodelResourceFile - } + contains(DEFINES, SYMBIAN_BACKEND_USE_SQLITE) { + cntmodelResourceFile = \ + "START RESOURCE ../../rss/cntmodel.rss" \ + "TARGETPATH $${CONTACTS_RESOURCE_DIR}" \ + "END" + MMP_RULES += cntmodelResourceFile } - contains(S60_VERSION, 3.2) { - DEFINES += SYMBIAN_BACKEND_S60_VERSION_32 - } - - - symbianplugin.sources = $${TARGET}.dll symbianplugin.path = /resource/qt/plugins/contacts DEPLOYMENT += symbianplugin diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbian/symbian_defines.pri --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/symbian_defines.pri Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,16 @@ + +symbian: { + exists($${EPOCROOT}epoc32/data/z/system/install/Series60v5.2.sis) { + exists($${EPOCROOT}epoc32/release/winscw/udeb/VPbkEng.dll) \ + | exists($${EPOCROOT}epoc32/release/armv5/urel/VPbkEng.dll) { + message("TB 9.2 platform") + } else { + message("TB 10.1 or later platform") + DEFINES += SYMBIAN_BACKEND_USE_SQLITE + } + } + + contains(S60_VERSION, 3.2) { + DEFINES += SYMBIAN_BACKEND_S60_VERSION_32 + } +} \ No newline at end of file diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/inc/cntabstractsimrequest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntabstractsimrequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTABSTRACTSIMREQUEST_H_ +#define CNTABSTRACTSIMREQUEST_H_ + +#include + +class CntSymbianSimEngine; +class CntSimStore; +class QTimer; + +class CntAbstractSimRequest : public QObject +{ +Q_OBJECT +public: + CntAbstractSimRequest(CntSymbianSimEngine *engine); + virtual bool start() = 0; + virtual bool cancel() = 0; + +protected: + void singleShotTimer(int msec, QObject *receiver, const char *member); + void cancelTimer(); + CntSymbianSimEngine *engine(); + CntSimStore *simStore(); + +private: + QTimer *m_timer; +}; + +#endif // CNTABSTRACTSIMREQUEST_H_ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactfetchrequest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactfetchrequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTSIMCONTACTFETCHREQUEST_H_ +#define CNTSIMCONTACTFETCHREQUEST_H_ + +#include "cntabstractsimrequest.h" + +#ifdef SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER +#include +#else +#include +#endif +#include + +QTM_BEGIN_NAMESPACE +class QContactFetchRequest; +QTM_END_NAMESPACE +class CntSymbianSimEngine; + +QTM_USE_NAMESPACE + +class CntSimContactFetchRequest : public CntAbstractSimRequest +{ +Q_OBJECT +public: + CntSimContactFetchRequest(CntSymbianSimEngine *engine, QContactFetchRequest *req); + virtual ~CntSimContactFetchRequest(); + bool start(); + bool cancel(); + +public Q_SLOTS: + void getInfoComplete(RMobilePhoneBookStore::TMobilePhoneBookInfoV5 info, QContactManager::Error error); + void readComplete(QList contacts, QContactManager::Error error); + +private: + QContactFetchRequest *m_req; +}; + +#endif // CNTSIMCONTACTFETCHREQUEST_H_ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactlocalidfetchrequest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactlocalidfetchrequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTSIMCONTACTLOCALIDFETCHREQUEST_H_ +#define CNTSIMCONTACTLOCALIDFETCHREQUEST_H_ + +#include "cntabstractsimrequest.h" + +#ifdef SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER +#include +#else +#include +#endif +#include + +QTM_BEGIN_NAMESPACE +class QContactLocalIdFetchRequest; +QTM_END_NAMESPACE +class CntSymbianSimEngine; + +QTM_USE_NAMESPACE + +class CntSimContactLocalIdFetchRequest : public CntAbstractSimRequest +{ +Q_OBJECT +public: + CntSimContactLocalIdFetchRequest(CntSymbianSimEngine *engine, QContactLocalIdFetchRequest *req); + virtual ~CntSimContactLocalIdFetchRequest(); + bool start(); + bool cancel(); + +public Q_SLOTS: + void getInfoComplete(RMobilePhoneBookStore::TMobilePhoneBookInfoV5 info, QContactManager::Error error); + void readComplete(QList contacts, QContactManager::Error error); + +private: + QContactLocalIdFetchRequest *m_req; +}; + +#endif // CNTSIMCONTACTLOCALIDFETCHREQUEST_H_ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactremoverequest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactremoverequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTSIMCONTACTREMOVEREQUEST_H_ +#define CNTSIMCONTACTREMOVEREQUEST_H_ + +#include "cntabstractsimrequest.h" + +#ifdef SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER +#include +#else +#include +#endif +#include + +QTM_BEGIN_NAMESPACE +class QContactRemoveRequest; +QTM_END_NAMESPACE +class CntSymbianSimEngine; + +QTM_USE_NAMESPACE + +class CntSimContactRemoveRequest : public CntAbstractSimRequest +{ +Q_OBJECT +public: + CntSimContactRemoveRequest(CntSymbianSimEngine *engine, QContactRemoveRequest *req); + virtual ~CntSimContactRemoveRequest(); + bool start(); + bool cancel(); + +public Q_SLOTS: + void removeComplete(QContactManager::Error error); + void removeNext(); + +private: + QContactRemoveRequest *m_req; + QList m_contactIds; + int m_index; + QMap m_errorMap; +}; + +#endif // CNTSIMCONTACTREMOVEREQUEST_H_ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactsaverequest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactsaverequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTSIMCONTACTSAVEREQUEST_H_ +#define CNTSIMCONTACTSAVEREQUEST_H_ + +#include "cntabstractsimrequest.h" + +#ifdef SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER +#include +#else +#include +#endif +#include + +QTM_BEGIN_NAMESPACE +class QContactSaveRequest; +QTM_END_NAMESPACE +class CntSymbianSimEngine; + +QTM_USE_NAMESPACE + +class CntSimContactSaveRequest : public CntAbstractSimRequest +{ +Q_OBJECT +public: + CntSimContactSaveRequest(CntSymbianSimEngine *engine, QContactSaveRequest *req); + virtual ~CntSimContactSaveRequest(); + bool start(); + bool cancel(); + +public Q_SLOTS: + void writeComplete(QContact contact, QContactManager::Error error); + void writeNext(); + +private: + QContactSaveRequest *m_req; + QList m_contacts; + int m_index; + QMap m_errorMap; +}; + +#endif // CNTSIMCONTACTSAVEREQUEST_H_ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimdetaildefinitionfetchrequest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimdetaildefinitionfetchrequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTSIMDETAILDEFINITIONFETCHREQUEST_H_ +#define CNTSIMDETAILDEFINITIONFETCHREQUEST_H_ + +#include "cntabstractsimrequest.h" + +#ifdef SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER +#include +#else +#include +#endif +#include + +QTM_BEGIN_NAMESPACE +class QContactDetailDefinitionFetchRequest; +QTM_END_NAMESPACE +class CntSymbianSimEngine; + +QTM_USE_NAMESPACE + +class CntSimDetailDefinitionFetchRequest : public CntAbstractSimRequest +{ +Q_OBJECT +public: + CntSimDetailDefinitionFetchRequest(CntSymbianSimEngine *engine, QContactDetailDefinitionFetchRequest *req); + virtual ~CntSimDetailDefinitionFetchRequest(); + bool start(); + bool cancel(); + +public Q_SLOTS: + void readDetailDefinitions(); + + +private: + QContactDetailDefinitionFetchRequest *m_req; +}; + +#endif // CNTSIMDETAILDEFINITIONFETCHREQUEST_H_ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimstore.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimstore.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTSIMSTORE_H_ +#define CNTSIMSTORE_H_ + +#include +#ifdef SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER +#include +#else +#include +#endif +#include +#include + +QTM_USE_NAMESPACE + +class CntSimStorePrivate; +class CntSymbianSimEngine; + +class CntSimStore : public QObject +{ +Q_OBJECT +public: + CntSimStore(CntSymbianSimEngine* engine); + ~CntSimStore(); + + QContactManager::Error getInfo(); + QContactManager::Error read(int index, int numSlots); + QContactManager::Error write(const QContact &contact); + QContactManager::Error remove(int index); + void cancel(); + bool isBusy(); + +signals: + // NOTE: Use Qt::QueuedConnection as connection type to make signals asynchronous. + // CntSimStorePrivate emitting these signals is an active object and emitting + // signals synchronously will corrupt the AO state. + void getInfoComplete(RMobilePhoneBookStore::TMobilePhoneBookInfoV5 info, QContactManager::Error error); + void readComplete(QList contacts, QContactManager::Error error); + void writeComplete(QContact contacts, QContactManager::Error error); + void removeComplete(QContactManager::Error error); + +private: + CntSimStorePrivate *d_ptr; + friend class CntSimStorePrivate; +}; + + +#endif // CNTSIMSTORE_H_ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimstoreprivate.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimstoreprivate.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CNTSIMSTOREPRIVATE_H_ +#define CNTSIMSTOREPRIVATE_H_ + +#include +#ifdef SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER +#include +#else +#include +#endif +#include + +#include "cntsymbiansimengine.h" + +QTM_USE_NAMESPACE + +class CntSimStore; +class CntSymbianSimEngine; + +class CntSimStorePrivate : public CActive +{ +public: + enum State { + InactiveState, + GetInfoState, + ReadState, + WriteState, + DeleteState + }; + CntSimStorePrivate(CntSymbianSimEngine &engine, CntSimStore &simStore); + ~CntSimStorePrivate(); + + QContactManager::Error getInfo(); + QContactManager::Error read(int index, int numSlots); + QContactManager::Error write(const QContact &contact); + QContactManager::Error remove(int index); + +private: + // from CActive + void RunL(); + void DoCancel(); + TInt RunError(TInt aError); + +private: + RMobilePhoneBookStore &mobilePhoneBookStore() + { return m_engine.store(); } + +private: + State m_state; + CntSymbianSimEngine &m_engine; + CntSimStore &m_simStore; + RMobilePhoneBookStore::TMobilePhoneBookInfoV5 m_etelStoreInfo; + RMobilePhoneBookStore::TMobilePhoneBookInfoV5Pckg m_etelInfoPckg; + RBuf8 m_buffer; + QContact m_convertedContact; + int m_writeIndex; +}; + +#endif // CNTSIMSTOREPRIVATE_H_ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsymbiansimengine.h --- a/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsymbiansimengine.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsymbiansimengine.h Fri Apr 16 14:53:18 2010 +0300 @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -65,6 +65,9 @@ #define CNT_SYMBIANSIM_MANAGER_NAME "symbiansim" +class CntSimStore; +class CntAbstractSimRequest; + class CntSymbianSimEngine : public QContactManagerEngine { Q_OBJECT @@ -76,15 +79,25 @@ QString managerName() const; /* Contacts - Accessors and Mutators */ - QList contacts(const QContactFilter& filter, const QList& sortOrders, QContactManager::Error& error) const; - QList contacts(const QList& sortOrders, QContactManager::Error& error) const; - QContact contact(const QContactLocalId& contactId, QContactManager::Error& error) const; + QList contactIds(const QContactFilter& filter, const QList& sortOrders, QContactManager::Error& error) const; + QList contactIds(const QList& sortOrders, QContactManager::Error& error) const; + // TODO: + //QList contacts(const QList& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const; + //QList contacts(const QContactFilter& filter, const QList& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const; + QContact contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions, QContactManager::Error& error) const; + bool saveContact(QContact* contact, QContactManager::Error& error); bool removeContact(const QContactLocalId& contactId, QContactManager::Error& error); /* Definitions - Accessors and Mutators */ QMap detailDefinitions(const QString& contactType, QContactManager::Error& error) const; + /* Asynchronous Request Support */ + void requestDestroyed(QContactAbstractRequest* req); + bool startRequest(QContactAbstractRequest* req); + bool cancelRequest(QContactAbstractRequest* req); + bool waitForRequestFinished(QContactAbstractRequest* req, int msecs); + /* Functionality reporting */ bool hasFeature(QContactManager::ManagerFeature feature, const QString& contactType = QContactType::TypeContact) const; //QStringList supportedRelationshipTypes(const QString& contactType = QContactType::TypeContact) const; @@ -93,16 +106,22 @@ QStringList supportedContactTypes() const; /* Synthesize the display label of a contact */ - QString synthesizeDisplayLabel(const QContact& contact, QContactManager::Error& error) const; + QString synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const; + +public: + void updateDisplayLabel(QContact& contact) const; + void transformError(TInt symbianError, QContactManager::Error& qtError) const; + QList decodeSimContactsL(TDes8& rawData) const; + QContact encodeSimContactL(const QContact* contact, TDes8& rawData) const; + RMobilePhoneBookStore &store() { return m_etelStore; } + CntSimStore *simStore() { return m_simStore; } private: - TInt getEtelStoreInfo() const; + void getEtelStoreInfoL() const; QContact fetchContactL(const QContactLocalId &localId) const; QList fetchContactsL() const; void saveContactL(QContact* contact) const; - void transformError(TInt symbianError, QContactManager::Error& qtError) const; - QList decodeSimContactsL(TDes8& rawData) const; - QContact encodeSimContactL(const QContact* contact, TDes8& rawData) const; + void doSaveContactL(QContact* contact) const; private: RTelServer m_etelServer; @@ -112,6 +131,8 @@ RMobilePhoneBookStore::TMobilePhoneBookInfoV5Pckg m_etelStoreInfoPckg; QString m_managerUri; + CntSimStore *m_simStore; + QMap m_asyncRequests; }; class Q_DECL_EXPORT CntSymbianSimFactory : public QObject, public QContactManagerEngineFactory diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/src/cntabstractsimrequest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntabstractsimrequest.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntabstractsimrequest.h" +#include "cntsymbiansimengine.h" +#include "cntsimstore.h" +#include + +CntAbstractSimRequest::CntAbstractSimRequest(CntSymbianSimEngine *engine) + :QObject(engine), + m_timer(0) +{ + +} + +void CntAbstractSimRequest::singleShotTimer(int msec, QObject *receiver, const char *member) +{ + // We could use QTimer::singleShot but there is no way to cancel it... + delete m_timer; + m_timer = new QTimer(this); + m_timer->setSingleShot(true); + connect(m_timer, SIGNAL(timeout()), receiver, member); + m_timer->start(msec); +} + +void CntAbstractSimRequest::cancelTimer() +{ + delete m_timer; + m_timer = 0; +} + +CntSymbianSimEngine *CntAbstractSimRequest::engine() +{ + return static_cast(parent()); +} +CntSimStore *CntAbstractSimRequest::simStore() +{ + return engine()->simStore(); +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimcontactfetchrequest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimcontactfetchrequest.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntsimcontactfetchrequest.h" +#include "cntsymbiansimengine.h" +#include "cntsimstore.h" +#include + +CntSimContactFetchRequest::CntSimContactFetchRequest(CntSymbianSimEngine *engine, QContactFetchRequest *req) + :CntAbstractSimRequest(engine), + m_req(req) +{ + connect( simStore(), SIGNAL(getInfoComplete(RMobilePhoneBookStore::TMobilePhoneBookInfoV5, QContactManager::Error)), + this, SLOT(getInfoComplete(RMobilePhoneBookStore::TMobilePhoneBookInfoV5, QContactManager::Error)), Qt::QueuedConnection ); + + connect( simStore(), SIGNAL(readComplete(QList, QContactManager::Error)), + this, SLOT(readComplete(QList, QContactManager::Error)), Qt::QueuedConnection ); +} + +CntSimContactFetchRequest::~CntSimContactFetchRequest() +{ + cancel(); +} + +bool CntSimContactFetchRequest::start() +{ + QContactManager::Error error = simStore()->getInfo(); + if (error) { + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::FinishedState); + QContactManagerEngine::updateContactFetchRequest(m_req, QList(), error); + return false; + } + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::ActiveState); + return true; +} + +bool CntSimContactFetchRequest::cancel() +{ + if (m_req->isActive()) { + simStore()->cancel(); + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::CanceledState); + return true; + } + return false; +} + +void CntSimContactFetchRequest::getInfoComplete(RMobilePhoneBookStore::TMobilePhoneBookInfoV5 info, QContactManager::Error error) +{ + if (error == QContactManager::NoError) { + //contacts are fetched starting from index 1, all slots should be checked + //since slots may be not filled in a sequence. + error = simStore()->read(1, info.iTotalEntries); + } + + if (error) { + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::FinishedState); + QContactManagerEngine::updateContactFetchRequest(m_req, QList(), error); + } +} + +void CntSimContactFetchRequest::readComplete(QList contacts, QContactManager::Error error) +{ + // Filter & sort results + QList filteredAndSorted; + for (int i=0; ifilter(), contacts.at(i))) + QContactManagerEngine::addSorted(&filteredAndSorted, contacts.at(i), m_req->sorting()); + } + + // Complete the request + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::FinishedState); + QContactManagerEngine::updateContactFetchRequest(m_req, filteredAndSorted, error); +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimcontactlocalidfetchrequest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimcontactlocalidfetchrequest.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,117 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntsimcontactlocalidfetchrequest.h" +#include "cntsymbiansimengine.h" +#include "cntsimstore.h" +#include + +CntSimContactLocalIdFetchRequest::CntSimContactLocalIdFetchRequest(CntSymbianSimEngine *engine, QContactLocalIdFetchRequest *req) + :CntAbstractSimRequest(engine), + m_req(req) +{ + connect( simStore(), SIGNAL(getInfoComplete(RMobilePhoneBookStore::TMobilePhoneBookInfoV5, QContactManager::Error)), + this, SLOT(getInfoComplete(RMobilePhoneBookStore::TMobilePhoneBookInfoV5, QContactManager::Error)), Qt::QueuedConnection ); + + connect( simStore(), SIGNAL(readComplete(QList, QContactManager::Error)), + this, SLOT(readComplete(QList, QContactManager::Error)), Qt::QueuedConnection ); +} + +CntSimContactLocalIdFetchRequest::~CntSimContactLocalIdFetchRequest() +{ + cancel(); +} + +bool CntSimContactLocalIdFetchRequest::start() +{ + QContactManager::Error error = simStore()->getInfo(); + if (error) { + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::FinishedState); + QContactManagerEngine::updateContactLocalIdFetchRequest(m_req, QList(), error); + return false; + } + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::ActiveState); + return true; +} + +bool CntSimContactLocalIdFetchRequest::cancel() +{ + if (m_req->isActive()) { + simStore()->cancel(); + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::CanceledState); + return true; + } + return false; +} + +void CntSimContactLocalIdFetchRequest::getInfoComplete(RMobilePhoneBookStore::TMobilePhoneBookInfoV5 info, QContactManager::Error error) +{ + if (error == QContactManager::NoError) { + //contacts are fetched starting from index 1, all slots should be checked + //since slots may be not filled in a sequence. + error = simStore()->read(1, info.iTotalEntries); + } + + if (error) { + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::FinishedState); + QContactManagerEngine::updateContactLocalIdFetchRequest(m_req, QList(), error); + } +} + +void CntSimContactLocalIdFetchRequest::readComplete(QList contacts, QContactManager::Error error) +{ + // Filter & sort results + QList filteredAndSorted; + for (int i=0; ifilter(), contacts.at(i))) + QContactManagerEngine::addSorted(&filteredAndSorted, contacts.at(i), m_req->sorting()); + } + + // Convert to QContactLocalId-list + QList filteredAndSortedIds; + for (int i=0; i +#include + +CntSimContactRemoveRequest::CntSimContactRemoveRequest(CntSymbianSimEngine *engine, QContactRemoveRequest *req) + :CntAbstractSimRequest(engine), + m_req(req) +{ + connect( simStore(), SIGNAL(removeComplete(QContactManager::Error)), + this, SLOT(removeComplete(QContactManager::Error)), Qt::QueuedConnection ); +} + +CntSimContactRemoveRequest::~CntSimContactRemoveRequest() +{ + cancel(); +} + +bool CntSimContactRemoveRequest::start() +{ + if (simStore()->isBusy()) + return false; + + m_contactIds = m_req->contactIds(); + m_errorMap.clear(); + m_index = 0; + singleShotTimer(0, this, SLOT(removeNext())); + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::ActiveState); + return true; +} + +bool CntSimContactRemoveRequest::cancel() +{ + if (m_req->isActive()) { + cancelTimer(); + simStore()->cancel(); + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::CanceledState); + return true; + } + return false; +} + +void CntSimContactRemoveRequest::removeComplete(QContactManager::Error error) +{ + if (error) + m_errorMap.insert(m_index, error); + m_index++; + removeNext(); +} + +void CntSimContactRemoveRequest::removeNext() +{ + if (m_req->isCanceled()) + return; + + // All contacts written? + if (m_index >= m_contactIds.count()) + { + // Take first error from errormap (if any) + QContactManager::Error error = QContactManager::NoError; + if (m_errorMap.count()) + error = m_errorMap.begin().value(); + + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::FinishedState); + QContactManagerEngine::updateContactRemoveRequest(m_req, error, m_errorMap); + return; + } + + // Remove next contact + QContactLocalId contactId = m_contactIds.at(m_index); + QContactManager::Error error = simStore()->remove(contactId); + if (error) { + m_errorMap.insert(m_index, error); + m_index++; + singleShotTimer(0, this, SLOT(removeNext())); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimcontactsaverequest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimcontactsaverequest.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,126 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntsimcontactsaverequest.h" +#include "cntsymbiansimengine.h" +#include "cntsimstore.h" +#include +#include + +CntSimContactSaveRequest::CntSimContactSaveRequest(CntSymbianSimEngine *engine, QContactSaveRequest *req) + :CntAbstractSimRequest(engine), + m_req(req) +{ + connect( simStore(), SIGNAL(writeComplete(QContact, QContactManager::Error)), + this, SLOT(writeComplete(QContact, QContactManager::Error)), Qt::QueuedConnection ); +} + +CntSimContactSaveRequest::~CntSimContactSaveRequest() +{ + cancel(); +} + +bool CntSimContactSaveRequest::start() +{ + if (simStore()->isBusy()) + return false; + + m_contacts = m_req->contacts(); + m_errorMap.clear(); + m_index = 0; + singleShotTimer(0, this, SLOT(writeNext())); + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::ActiveState); + return true; +} + +bool CntSimContactSaveRequest::cancel() +{ + if (m_req->isActive()) { + cancelTimer(); + simStore()->cancel(); + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::CanceledState); + return true; + } + return false; +} + +void CntSimContactSaveRequest::writeComplete(QContact contact, QContactManager::Error error) +{ + if (error) + m_errorMap.insert(m_index, error); + engine()->updateDisplayLabel(contact); + m_contacts[m_index] = contact; + m_index++; + writeNext(); +} + +void CntSimContactSaveRequest::writeNext() +{ + if (m_req->isCanceled()) + return; + + // All contacts written? + if (m_index >= m_contacts.count()) + { + // Take first error from errormap (if any) + QContactManager::Error error = QContactManager::NoError; + if (m_errorMap.count()) + error = m_errorMap.begin().value(); + + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::FinishedState); + QContactManagerEngine::updateContactSaveRequest(m_req, m_contacts, error, m_errorMap); + return; + } + + // Get next contact + QContact contact = m_contacts.at(m_index); + + // Validate & write contact + QContactManager::Error error; + if (engine()->validateContact(contact, error)) + error = simStore()->write(contact); + + if (error) { + m_errorMap.insert(m_index, error); + m_index++; + singleShotTimer(0, this, SLOT(writeNext())); + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimdetaildefinitionfetchrequest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimdetaildefinitionfetchrequest.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,127 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntsimdetaildefinitionfetchrequest.h" +#include "cntsymbiansimengine.h" +#include "cntsimstore.h" +#include +#include + +CntSimDetailDefinitionFetchRequest::CntSimDetailDefinitionFetchRequest(CntSymbianSimEngine *engine, QContactDetailDefinitionFetchRequest *req) + :CntAbstractSimRequest(engine), + m_req(req) +{ + +} + +CntSimDetailDefinitionFetchRequest::~CntSimDetailDefinitionFetchRequest() +{ + cancel(); +} + +bool CntSimDetailDefinitionFetchRequest::start() +{ + singleShotTimer(0, this, SLOT(readDetailDefinitions())); + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::ActiveState); + return true; +} + +bool CntSimDetailDefinitionFetchRequest::cancel() +{ + if (m_req->isActive()) { + cancelTimer(); + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::CanceledState); + return true; + } + return false; +} + +void CntSimDetailDefinitionFetchRequest::readDetailDefinitions() +{ + if (m_req->isCanceled()) + return; + + QContactManager::Error error = QContactManager::NoError; + QMap result; + QMap errorMap; + + // Get all detail definitions + QMap allDefs = engine()->detailDefinitions(m_req->contactType(), error); + + // Check for error + if (error != QContactManager::NoError) + { + for (int i=0; idefinitionNames().count(); i++) + errorMap.insert(i, error); + + // Complete the request + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::FinishedState); + QContactManagerEngine::updateDefinitionFetchRequest(m_req, result, error, errorMap); + return; + } + + // Filter results + if (m_req->definitionNames().count() == 0) + { + result = allDefs; + } + else + { + for (int i=0; idefinitionNames().count(); i++) + { + QString defName = m_req->definitionNames().at(i); + if (allDefs.contains(defName)) + result.insert(defName, allDefs.value(defName)); + else + errorMap.insert(i, QContactManager::DoesNotExistError); + } + + // Set first error as the general error + if (errorMap.count()) + error = errorMap.begin().value(); + } + + // Complete the request + QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::FinishedState); + QContactManagerEngine::updateDefinitionFetchRequest(m_req, result, error, errorMap); +} + + diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimstore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimstore.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntsimstore.h" +#include "cntsimstoreprivate.h" + +CntSimStore::CntSimStore(CntSymbianSimEngine* engine) + :QObject((QObject *)engine) +{ + // We need to register these meta types for signals because connect() with + // Qt::QueuedConnection it is required. + qRegisterMetaType("QContact"); + qRegisterMetaType >("QList"); + qRegisterMetaType("QContactManager::Error"); + qRegisterMetaType("RMobilePhoneBookStore::TMobilePhoneBookInfoV5"); + + d_ptr = new CntSimStorePrivate(*engine, *this); +} + +CntSimStore::~CntSimStore() +{ + delete d_ptr; +} + +QContactManager::Error CntSimStore::getInfo() +{ + return d_ptr->getInfo(); +} + +QContactManager::Error CntSimStore::read(int index, int numSlots) +{ + return d_ptr->read(index, numSlots); +} + +QContactManager::Error CntSimStore::write(const QContact &contact) +{ + return d_ptr->write(contact); +} + +QContactManager::Error CntSimStore::remove(int index) +{ + return d_ptr->remove(index); +} + +void CntSimStore::cancel() +{ + d_ptr->Cancel(); +} + +bool CntSimStore::isBusy() +{ + return d_ptr->IsActive(); +} + + + diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimstoreprivate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimstoreprivate.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,223 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cntsimstoreprivate.h" +#include +#include "cntsimstore.h" + +const int KOneSimContactBufferSize = 512; +Q_DEFINE_LATIN1_LITERAL(KSimSyncTarget, "SIM"); + +CntSimStorePrivate::CntSimStorePrivate(CntSymbianSimEngine &engine, CntSimStore &simStore) + :CActive(CActive::EPriorityStandard), + m_state(InactiveState), + m_engine(engine), + m_simStore(simStore), + m_etelInfoPckg(m_etelStoreInfo) +{ + CActiveScheduler::Add(this); +} + +CntSimStorePrivate::~CntSimStorePrivate() +{ + m_buffer.Close(); + Cancel(); +} + +QContactManager::Error CntSimStorePrivate::getInfo() +{ + if (IsActive()) + return QContactManager::LockedError; + + // start get info request + mobilePhoneBookStore().GetInfo(iStatus, (TDes8&)m_etelInfoPckg); + SetActive(); + m_state = GetInfoState; + + return QContactManager::NoError; +} + +QContactManager::Error CntSimStorePrivate::read(int index, int numSlots) +{ + if (IsActive()) + return QContactManager::LockedError; + + // start reading + m_buffer.Zero(); + m_buffer.ReAlloc(KOneSimContactBufferSize*numSlots); + mobilePhoneBookStore().Read(iStatus, index, numSlots, m_buffer); + SetActive(); + m_state = ReadState; + + return QContactManager::NoError; +} + +QContactManager::Error CntSimStorePrivate::write(const QContact &contact) +{ + if (IsActive()) + return QContactManager::LockedError; + + // get index + m_writeIndex = KErrNotFound; + if (contact.id().managerUri() == m_engine.managerUri() && + contact.localId() > 0) { + m_writeIndex = contact.localId(); + } + + // encode + m_buffer.Zero(); + m_buffer.ReAlloc(KOneSimContactBufferSize); + TRAPD(err, m_convertedContact = m_engine.encodeSimContactL(&contact, m_buffer)); + if (err != KErrNone) { + QContactManager::Error qtError; + m_engine.transformError(err, qtError); + return qtError; + } + + // start writing + mobilePhoneBookStore().Write(iStatus, m_buffer, m_writeIndex); + SetActive(); + m_state = WriteState; + + return QContactManager::NoError; +} + +QContactManager::Error CntSimStorePrivate::remove(int index) +{ + if (IsActive()) + return QContactManager::LockedError; + + mobilePhoneBookStore().Delete(iStatus, index); + SetActive(); + m_state = DeleteState; + + return QContactManager::NoError; +} + +void CntSimStorePrivate::DoCancel() +{ + if (m_state == GetInfoState) + mobilePhoneBookStore().CancelAsyncRequest(EMobilePhoneStoreGetInfo); + if (m_state == ReadState) + mobilePhoneBookStore().CancelAsyncRequest(EMobilePhoneStoreRead); + if (m_state == WriteState) + mobilePhoneBookStore().CancelAsyncRequest(EMobilePhoneStoreWrite); + if (m_state == DeleteState) + mobilePhoneBookStore().CancelAsyncRequest(EMobilePhoneStoreDelete); + + m_state = InactiveState; +} + +void CntSimStorePrivate::RunL() +{ + User::LeaveIfError(iStatus.Int()); + + // NOTE: emit might be synchronous so do not touch member variables after it + + switch (m_state) + { + case GetInfoState: + { + emit m_simStore.getInfoComplete(m_etelStoreInfo, QContactManager::NoError); + } + break; + + case ReadState: + { + QList contacts = m_engine.decodeSimContactsL(m_buffer); + m_buffer.Zero(); + emit m_simStore.readComplete(contacts, QContactManager::NoError); + } + break; + + case WriteState: + { + //save id, if new contact + QContactId contactId; + contactId.setLocalId(m_writeIndex); + contactId.setManagerUri(m_engine.managerUri()); + m_convertedContact.setId(contactId); + + // set sync target + QContactSyncTarget syncTarget; + syncTarget.setSyncTarget(KSimSyncTarget); + m_convertedContact.saveDetail(&syncTarget); + + emit m_simStore.writeComplete(m_convertedContact, QContactManager::NoError); + } + break; + + case DeleteState: + { + emit m_simStore.removeComplete(QContactManager::NoError); + } + break; + + default: + { + User::Leave(KErrUnknown); + } + break; + } + m_state = InactiveState; +} + +TInt CntSimStorePrivate::RunError(TInt aError) +{ + QContactManager::Error qtError = QContactManager::NoError; + m_engine.transformError(aError, qtError); + + if (m_state == GetInfoState) { + RMobilePhoneBookStore::TMobilePhoneBookInfoV5 emptyInfo; + emit m_simStore.getInfoComplete(emptyInfo, qtError); + } else if (m_state == ReadState) { + QList emptyList; + emit m_simStore.readComplete(emptyList, qtError); + } else if (m_state == WriteState) { + emit m_simStore.writeComplete(m_convertedContact, qtError); + } else if (m_state == DeleteState) { + emit m_simStore.removeComplete(qtError); + } + + m_state = InactiveState; + + return KErrNone; +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/src/cntsymbiansimengine.cpp --- a/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsymbiansimengine.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsymbiansimengine.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -43,12 +43,22 @@ #include #include +#include "cntsimstore.h" +#include "cntsimcontactfetchrequest.h" +#include "cntsimcontactlocalidfetchrequest.h" +#include "cntsimcontactsaverequest.h" +#include "cntsimcontactremoverequest.h" +#include "cntsimdetaildefinitionfetchrequest.h" + #ifdef SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER #include #else #include #endif +#include +#include + const int KOneSimContactBufferSize = 512; const TInt KDataClientBuf = 128; const TInt KEtsiTonPosition = 0x70; @@ -70,7 +80,8 @@ } // namespace CntSymbianSimEngine::CntSymbianSimEngine(const QMap& parameters, QContactManager::Error& error) : - m_etelStoreInfoPckg( m_etelStoreInfo ) + m_etelStoreInfoPckg( m_etelStoreInfo ), + m_simStore(0) { error = QContactManager::NoError; @@ -88,13 +99,14 @@ if (err == KErrNone) { // open Etel store - TODO: check from parameters what Etel store to use err = m_etelStore.Open(m_etelPhone, KETelIccAdnPhoneBook); - //err = m_etelStore.Open(m_etelPhone, KETelIccFdnPhoneBook); } if (err != KErrNone) { error = QContactManager::UnspecifiedError; } m_managerUri = QContactManager::buildUri(CNT_SYMBIANSIM_MANAGER_NAME, parameters); + + m_simStore = new CntSimStore(this); RFs fs; fs.Connect(); @@ -109,6 +121,9 @@ m_etelStore.Close(); m_etelPhone.Close(); m_etelServer.Close(); + foreach (QContactAbstractRequest *req, m_asyncRequests.keys()) { + delete m_asyncRequests.take(req); + } } void CntSymbianSimEngine::deref() @@ -125,7 +140,7 @@ * Returns a list of the ids of contacts that match the supplied \a filter, sorted according to the given \a sortOrders. * Any error that occurs will be stored in \a error. Uses the generic (slow) filtering of QContactManagerEngine. */ -QList CntSymbianSimEngine::contacts(const QContactFilter& filter, const QList& sortOrders, QContactManager::Error& error) const +QList CntSymbianSimEngine::contactIds(const QContactFilter& filter, const QList& sortOrders, QContactManager::Error& error) const { PbkPrintToLog(_L("CntSymbianSimEngine::contacts")); @@ -154,7 +169,7 @@ * Returns a list of the ids of contacts that match the supplied \a filter. * Any error that occurs will be stored in \a error. */ -QList CntSymbianSimEngine::contacts(const QList& sortOrders, QContactManager::Error& error) const +QList CntSymbianSimEngine::contactIds(const QList& sortOrders, QContactManager::Error& error) const { PbkPrintToLog(_L("CntSymbianSimEngine::contacts")); @@ -177,12 +192,14 @@ * Reads a contact from the Etel store. * * \param contactId The Id of the contact to be retrieved. + * \param definitionRestrictions Definition restrictions. * \param error Qt error code. * \return A QContact for the requested QContactLocalId value or 0 if the read * operation was unsuccessful (e.g. contact not found). */ -QContact CntSymbianSimEngine::contact(const QContactLocalId& contactId, QContactManager::Error& error) const +QContact CntSymbianSimEngine::contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions, QContactManager::Error& error) const { + Q_UNUSED(definitionRestrictions); // TODO QContact* contact = new QContact(); TRAPD(err, QT_TRYCATCH_LEAVING(*contact = fetchContactL(contactId))); transformError(err, error); @@ -190,17 +207,17 @@ return *QScopedPointer(contact); } -QString CntSymbianSimEngine::synthesizeDisplayLabel(const QContact& contact, QContactManager::Error& error) const +QString CntSymbianSimEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const { Q_UNUSED(error); - // TODO: localize unnamed - QString label("Unnamed"); QContactName name = contact.detail(QContactName::DefinitionName); - if(!name.first().isEmpty()) { - label = name.first(); + if(!name.customLabel().isEmpty()) { + return name.customLabel(); + } else { + // TODO: localize unnamed + return QString("Unnamed"); } - return label; } /*! @@ -213,7 +230,19 @@ */ bool CntSymbianSimEngine::saveContact(QContact* contact, QContactManager::Error& error) { - TRAPD(err, QT_TRYCATCH_LEAVING(saveContactL(contact))); + if (!contact) { + error = QContactManager::BadArgumentError; + return false; + } + + // TODO: Remove empty details + + // Check that the contact suits the scheme + if (!validateContact(*contact, error)) { + return false; + } + + TRAPD(err, saveContactL(contact)); transformError(err, error); PbkPrintToLog(_L("CntSymbianSimEngine::saveContact() - err = %d"), err); return (err == KErrNone); @@ -243,24 +272,22 @@ { if (!supportedContactTypes().contains(contactType)) { // Should never happen - error = QContactManager::InvalidContactTypeError; + error = QContactManager::NotSupportedError; return QMap(); } - if(m_etelStoreInfo.iMaxNumLength < 0) { - TInt err = getEtelStoreInfo(); - if(err != KErrNone) { - error = QContactManager::UnspecifiedError; - return QMap(); - } + TRAPD(err, getEtelStoreInfoL()); + if(err != KErrNone) { + transformError(err, error); + return QMap(); } // the map we will eventually return QMap retn; // local variables for reuse - QMap fields; - QContactDetailDefinitionField f; + QMap fields; + QContactDetailFieldDefinition f; QContactDetailDefinition d; QVariantList subTypes; @@ -269,13 +296,11 @@ fields.clear(); f.setDataType(QVariant::String); subTypes.clear(); - // TODO: groups supported by some USIM cards? subTypes << QString(QLatin1String(KSimSyncTarget)); f.setAllowableValues(subTypes); fields.insert(QContactSyncTarget::FieldSyncTarget, f); d.setFields(fields); d.setUnique(true); - d.setAccessConstraint(QContactDetailDefinition::CreateOnly); retn.insert(d.name(), d); // type @@ -283,16 +308,15 @@ fields.clear(); f.setDataType(QVariant::String); subTypes.clear(); - // TODO: groups supported by some USIM cards? + // groups are not supported subTypes << QString(QLatin1String(QContactType::TypeContact)); f.setAllowableValues(subTypes); fields.insert(QContactType::FieldType, f); // note: NO CONTEXT!! d.setFields(fields); d.setUnique(true); - d.setAccessConstraint(QContactDetailDefinition::CreateOnly); retn.insert(d.name(), d); -/* TODO: is guid needed? +/* TODO // guid d.setName(QContactGuid::DefinitionName); fields.clear(); @@ -316,11 +340,10 @@ fields.insert(QContactDisplayLabel::FieldLabel, f); d.setFields(fields); d.setUnique(true); - d.setAccessConstraint(QContactDetailDefinition::ReadOnly); retn.insert(d.name(), d); - // email support is SIM specific - if(m_etelStoreInfo.iMaxEmailAddr > 0) { + // email support needs to be checked run-time, because it is SIM specific + if (m_etelStoreInfo.iMaxEmailAddr > 0) { d.setName(QContactEmailAddress::DefinitionName); fields.clear(); f.setDataType(QVariant::String); @@ -328,7 +351,6 @@ fields.insert(QContactEmailAddress::FieldEmailAddress, f); d.setFields(fields); d.setUnique(true); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); } @@ -358,13 +380,17 @@ fields.insert(QContactPhoneNumber::FieldSubTypes, f); */ d.setFields(fields); - // TODO: multiple numbers supported? - d.setUnique(true); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); + if (m_etelStoreInfo.iMaxAdditionalNumbers > 0) { + // multiple numbers supported + d.setUnique(false); + } else { + // only one phone number allowed + d.setUnique(true); + } retn.insert(d.name(), d); - // nickname support is SIM specific - if(m_etelStoreInfo.iMaxSecondNames > 0) { + // nickname support needs to be checked run-time, because it is SIM specific + if (m_etelStoreInfo.iMaxSecondNames > 0) { d.setName(QContactNickname::DefinitionName); fields.clear(); f.setDataType(QVariant::String); @@ -372,7 +398,6 @@ fields.insert(QContactNickname::FieldNickname, f); d.setFields(fields); d.setUnique(true); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); } @@ -381,16 +406,114 @@ fields.clear(); f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); - // Only one name field in SIM cards, let's map it to custom label fields.insert(QContactName::FieldCustomLabel, f); d.setFields(fields); d.setUnique(true); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); return retn; } +void CntSymbianSimEngine::requestDestroyed(QContactAbstractRequest* req) +{ + if (m_asyncRequests.contains(req)) { + delete m_asyncRequests.take(req); + } +} + +bool CntSymbianSimEngine::startRequest(QContactAbstractRequest* req) +{ + // Check for existing request and start again + if (m_asyncRequests.contains(req)) { + return m_asyncRequests.value(req)->start(); + } + + // Existing request not found. Create a new one. + CntAbstractSimRequest* simReq = 0; + switch (req->type()) + { + case QContactAbstractRequest::ContactFetchRequest: + { + QContactFetchRequest* r = static_cast(req); + simReq = new CntSimContactFetchRequest(this, r); + } + break; + + case QContactAbstractRequest::ContactLocalIdFetchRequest: + { + QContactLocalIdFetchRequest* r = static_cast(req); + simReq = new CntSimContactLocalIdFetchRequest(this, r); + } + break; + + case QContactAbstractRequest::ContactSaveRequest: + { + QContactSaveRequest* r = static_cast(req); + simReq = new CntSimContactSaveRequest(this, r); + } + break; + + case QContactAbstractRequest::ContactRemoveRequest: + { + QContactRemoveRequest* r = static_cast(req); + simReq = new CntSimContactRemoveRequest(this, r); + } + break; + + case QContactAbstractRequest::DetailDefinitionFetchRequest: + { + QContactDetailDefinitionFetchRequest* r = static_cast(req); + simReq = new CntSimDetailDefinitionFetchRequest(this, r); + } + break; + + case QContactAbstractRequest::DetailDefinitionSaveRequest: + case QContactAbstractRequest::DetailDefinitionRemoveRequest: + case QContactAbstractRequest::RelationshipFetchRequest: + case QContactAbstractRequest::RelationshipSaveRequest: + case QContactAbstractRequest::RelationshipRemoveRequest: + // fall through. + default: // unknown request type. + break; + } + + if (simReq) { + m_asyncRequests.insert(req, simReq); + return simReq->start(); + } + + return false; +} + +bool CntSymbianSimEngine::cancelRequest(QContactAbstractRequest* req) +{ + if (m_asyncRequests.contains(req)) + return m_asyncRequests.value(req)->cancel(); + return false; +} + +bool CntSymbianSimEngine::waitForRequestFinished(QContactAbstractRequest* req, int msecs) +{ + if (!m_asyncRequests.contains(req)) + return false; + + if (req->state() != QContactAbstractRequest::ActiveState) + return false; + + QEventLoop *loop = new QEventLoop(this); + QObject::connect(req, SIGNAL(resultsAvailable()), loop, SLOT(quit())); + + // NOTE: zero means wait forever + if (msecs > 0) + QTimer::singleShot(msecs, loop, SLOT(quit())); + + loop->exec(); + loop->disconnect(); + loop->deleteLater(); + + return (req->state() == QContactAbstractRequest::FinishedState); +} + /*! * Returns true if the given feature \a feature is supported by the manager, * for the specified type of contact \a contactType @@ -399,6 +522,7 @@ { Q_UNUSED(feature); Q_UNUSED(contactType); + // We don't support anything in the ManagerFeature return false; } @@ -411,6 +535,27 @@ return QStringList() << QContactType::TypeContact; } +void CntSymbianSimEngine::getEtelStoreInfoL() const +{ + TRequestStatus requestStatus; + + //check what information can be saved to the Etel store + m_etelStore.GetInfo(requestStatus, (TDes8&)m_etelStoreInfoPckg); + User::WaitForRequest(requestStatus); + PbkPrintToLog(_L("CntSymbianSimEngine::getEtelStoreInfoL() - GetInfo err = %d"), + requestStatus.Int()); + User::LeaveIfError(requestStatus.Int()); + + PbkPrintToLog(_L("CntSymbianSimEngine::getEtelStoreInfoL() - TotalEntries = %d"), + m_etelStoreInfo.iTotalEntries); + PbkPrintToLog(_L("CntSymbianSimEngine::getEtelStoreInfoL() - UsedEntries = %d"), + m_etelStoreInfo.iUsedEntries); + PbkPrintToLog(_L("CntSymbianSimEngine::getEtelStoreInfoL() - MaxNumLength = %d"), + m_etelStoreInfo.iMaxNumLength); + PbkPrintToLog(_L("CntSymbianSimEngine::getEtelStoreInfoL() - MaxTextLength = %d"), + m_etelStoreInfo.iMaxTextLength); +} + /*! * Private leaving implementation for contact() */ @@ -442,18 +587,6 @@ return contacts.at(0); } -TInt CntSymbianSimEngine::getEtelStoreInfo() const -{ - TRequestStatus requestStatus; - m_etelStore.GetInfo(requestStatus, (TDes8&)m_etelStoreInfoPckg); - User::WaitForRequest(requestStatus); - if (requestStatus.Int() != KErrNone) { - PbkPrintToLog(_L("CntSymbianSimEngine::getEtelStoreInfo() - getInfo error = %d"), - requestStatus.Int()); - } - return requestStatus.Int(); -} - /*! * Private leaving implementation for contacts() */ @@ -461,19 +594,15 @@ { PbkPrintToLog(_L("CntSymbianSimEngine::fetchContactsL() - IN")); - //check number of storage slots in the store - User::LeaveIfError(getEtelStoreInfo()); - PbkPrintToLog(_L("CntSymbianSimEngine::fetchContactsL() - totalEntries = %d"), - m_etelStoreInfo.iTotalEntries); - PbkPrintToLog(_L("CntSymbianSimEngine::fetchContactsL() - usedEntries = %d"), - m_etelStoreInfo.iUsedEntries); + getEtelStoreInfoL(); QList contacts; - if(m_etelStoreInfo.iUsedEntries > 0) { + if (m_etelStoreInfo.iUsedEntries > 0) { //read the contacts from the Etel store RBuf8 buffer; buffer.CreateL(KOneSimContactBufferSize*m_etelStoreInfo.iUsedEntries); CleanupClosePushL(buffer); + //contacts are fetched starting from index 1, all slots should be checked //since slots may be not filled in a sequence. TRequestStatus requestStatus; @@ -498,23 +627,25 @@ */ void CntSymbianSimEngine::saveContactL(QContact* contact) const { + QT_TRYCATCH_LEAVING(doSaveContactL(contact)); +} + +/*! + * Private leaving implementation for saveContact() + */ +void CntSymbianSimEngine::doSaveContactL(QContact* contact) const +{ PbkPrintToLog(_L("CntSymbianSimEngine::saveContactL() - IN")); - //check what information can be saved to the Etel store - User::LeaveIfError(getEtelStoreInfo()); - PbkPrintToLog(_L("CntSymbianSimEngine::saveContactL() - totalEntries = %d"), - m_etelStoreInfo.iTotalEntries); - PbkPrintToLog(_L("CntSymbianSimEngine::saveContactL() - usedEntries = %d"), - m_etelStoreInfo.iUsedEntries); - PbkPrintToLog(_L("CntSymbianSimEngine::saveContactL() - MaxNumLength = %d"), - m_etelStoreInfo.iMaxNumLength); - PbkPrintToLog(_L("CntSymbianSimEngine::saveContactL() - MaxTextLength = %d"), - m_etelStoreInfo.iMaxTextLength); + User::LeaveIfNull(contact); + + getEtelStoreInfoL(); //encode contact RBuf8 buffer; buffer.CreateL(KOneSimContactBufferSize); CleanupClosePushL(buffer); + QContact convertedContact = encodeSimContactL(contact, buffer); //write contact @@ -552,9 +683,13 @@ contactId->setManagerUri(m_managerUri); contact->setId(*contactId); } + + updateDisplayLabel(*contact); + PbkPrintToLog(_L("CntSymbianSimEngine::saveContactL() - OUT")); } + /*! Transform a Symbian contact error id to QContactManager::Error. * * \param symbianError Symbian error. @@ -696,10 +831,10 @@ // Contact name otherwise QContactName name; QString nameString = QString::fromUtf16(bufPtr.Ptr(), bufPtr.Length()); - name.setFirst(nameString); + name.setCustomLabel(nameString); currentContact.saveDetail(&name); QContactManager::Error error(QContactManager::NoError); - currentContact = setContactDisplayLabel(synthesizeDisplayLabel(currentContact, error), currentContact); + currentContact = setContactDisplayLabel(synthesizedDisplayLabel(currentContact, error), currentContact); } } break; @@ -793,23 +928,19 @@ //add new enty tag User::LeaveIfError(pbBuffer->AddNewEntryTag()); - //add first and last name + //add name QString name; QList nameDetails = contact->details(QContactName::DefinitionName); if (nameDetails.count() == 0) { - name.append("(unnamed)"); + // TODO: should we leave name empty? + name.append("Unnamed"); } else { QContactName nameDetail = static_cast(nameDetails.at(0)); - name.append(nameDetail.first()); - if (nameDetail.last().length() > 0) { - if (nameDetail.first().length() > 0) { - name.append(" "); //separator - } - name.append(nameDetail.last()); - } - if (name.length() == 0) { - name.append("(unnamed)"); + name.append(nameDetail.customLabel()); + if (name.isNull()) { + // TODO: should we leave name empty? + name.append("Unnamed)"); } } name = name.left(m_etelStoreInfo.iMaxTextLength); //trim to the max possible length @@ -817,7 +948,7 @@ User::LeaveIfError(pbBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBText, nameValue)); QContactName convertedNameDetail; - convertedNameDetail.setFirst(name); + convertedNameDetail.setCustomLabel(name); convertedContact.saveDetail(&convertedNameDetail); //add nickname @@ -846,7 +977,6 @@ PbkPrintToLog(_L("CntSymbianSimEngine::encodeSimContactL() - phone number length = %d"), phoneNumberDetail.number().length()); if (phoneNumberDetail.number().length() > m_etelStoreInfo.iMaxNumLength) { - // if number cannot fit, do no save a contact User::LeaveIfError(KErrTooBig); } TPtrC phoneNumberValue(reinterpret_cast(phoneNumberDetail.number().utf16())); @@ -863,17 +993,18 @@ //one number is saved already for (int i = 1; i < phoneNumberDetails.count() && i-1 < m_etelStoreInfo.iMaxAdditionalNumbers; ++i) { QContactPhoneNumber phoneNumberDetail = static_cast(phoneNumberDetails.at(i)); - if (phoneNumberDetail.number().length() <= m_etelStoreInfo.iMaxNumLengthAdditionalNumber) { - //mark the beginning of an additional number - User::LeaveIfError(pbBuffer->AddNewNumberTag()); - //add number itself - TPtrC phoneNumberValue(reinterpret_cast(phoneNumberDetail.number().utf16())); - User::LeaveIfError(pbBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBNumber, phoneNumberValue)); + if (phoneNumberDetail.number().length() > m_etelStoreInfo.iMaxNumLengthAdditionalNumber) { + User::Leave(KErrTooBig); + } + //mark the beginning of an additional number + User::LeaveIfError(pbBuffer->AddNewNumberTag()); + //add number itself + TPtrC phoneNumberValue(reinterpret_cast(phoneNumberDetail.number().utf16())); + User::LeaveIfError(pbBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBNumber, phoneNumberValue)); - QContactPhoneNumber convertedPhoneNumberDetail; - convertedPhoneNumberDetail.setNumber(phoneNumberDetail.number()); - convertedContact.saveDetail(&convertedPhoneNumberDetail); - } + QContactPhoneNumber convertedPhoneNumberDetail; + convertedPhoneNumberDetail.setNumber(phoneNumberDetail.number()); + convertedContact.saveDetail(&convertedPhoneNumberDetail); } } @@ -882,14 +1013,15 @@ QList emailDetails = contact->details(QContactEmailAddress::DefinitionName); for (int i = 0; i < emailDetails.count() && i < m_etelStoreInfo.iMaxEmailAddr; ++i) { QContactEmailAddress emailDetail = static_cast(emailDetails.at(i)); - if (emailDetail.emailAddress().length() <= m_etelStoreInfo.iMaxTextLengthEmailAddr) { - TPtrC emailValue(reinterpret_cast(emailDetail.emailAddress().utf16())); - User::LeaveIfError(pbBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBEmailAddress, emailValue)); + TPtrC emailValue(reinterpret_cast(emailDetail.emailAddress().utf16())); + if (emailValue.Length() > m_etelStoreInfo.iMaxTextLengthEmailAddr) { + User::Leave(KErrTooBig); + } + User::LeaveIfError(pbBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBEmailAddress, emailValue)); - QContactEmailAddress convertedEmailDetail; - convertedEmailDetail.setEmailAddress(emailDetail.emailAddress()); - convertedContact.saveDetail(&convertedEmailDetail); - } + QContactEmailAddress convertedEmailDetail; + convertedEmailDetail.setEmailAddress(emailDetail.emailAddress()); + convertedContact.saveDetail(&convertedEmailDetail); } } @@ -899,6 +1031,15 @@ } +void CntSymbianSimEngine::updateDisplayLabel(QContact& contact) const +{ + QContactManager::Error error(QContactManager::NoError); + QString label = synthesizedDisplayLabel(contact, error); + if(error == QContactManager::NoError) { + contact = setContactDisplayLabel(label, contact); + } +} + QContactManagerEngine* CntSymbianSimFactory::engine(const QMap& parameters, QContactManager::Error& error) { return new CntSymbianSimEngine(parameters, error); diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/symbiansim.pro --- a/qtcontactsmobility/plugins/contacts/symbiansim/symbiansim.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/symbiansim.pro Fri Apr 16 14:53:18 2010 +0300 @@ -7,18 +7,13 @@ TEMPLATE = lib CONFIG += plugin TARGET = $$qtLibraryTarget(mobapicontactspluginsymbiansim) + include(../../../common.pri) +include(symbiansim_defines.pri) + symbian: { load(data_caging_paths) - defFiles = \ - "$${LITERAL_HASH}ifdef WINSCW" \ - "DEFFILE bwins/$${TARGET}.def" \ - "$${LITERAL_HASH}elif defined EABI" \ - "DEFFILE eabi/$${TARGET}.def" \ - "$${LITERAL_HASH}endif " - MMP_RULES += defFiles - TARGET.CAPABILITY = ALL -TCB TARGET.EPOCALLOWDLLDATA = 1 TARGET.UID3 = 0x2002AC85 @@ -31,37 +26,34 @@ INCLUDEPATH += $$SOURCE_DIR/contacts/details INCLUDEPATH += $$SOURCE_DIR/contacts/filters INCLUDEPATH += $$SOURCE_DIR/contacts/requests - - HEADERS += \ - $$PUBLIC_HEADERS \ - inc/cntsymbiansimengine.h - - SOURCES += \ - src/cntsymbiansimengine.cpp - + HEADERS += $$PUBLIC_HEADERS \ + inc/cntsymbiansimengine.h \ + inc/cntsimstore.h \ + inc/cntsimstoreprivate.h \ + inc/cntabstractsimrequest.h \ + inc/cntsimcontactfetchrequest.h \ + inc/cntsimcontactlocalidfetchrequest.h \ + inc/cntsimcontactremoverequest.h \ + inc/cntsimcontactsaverequest.h \ + inc/cntsimdetaildefinitionfetchrequest.h + + SOURCES += src/cntsymbiansimengine.cpp \ + src/cntsimstore.cpp \ + src/cntsimstoreprivate.cpp \ + src/cntabstractsimrequest.cpp \ + src/cntsimcontactfetchrequest.cpp \ + src/cntsimcontactlocalidfetchrequest.cpp \ + src/cntsimcontactremoverequest.cpp \ + src/cntsimcontactsaverequest.cpp \ + src/cntsimdetaildefinitionfetchrequest.cpp + CONFIG += mobility MOBILITY = contacts - - qtAddLibrary(QtContacts) LIBS += -lcntmodel \ -lflogger \ -lefsrv - # Uncomment this to use Etel test server (instead of real Etel APIs) - #DEFINES += SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER - - # add either real or test libraries for Etel - contains(DEFINES, SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER): { - message("Using Etel Test Server (not real Etel)") - INCLUDEPATH +=$${EPOCROOT}epoc32/include/internal - LIBS += -leteltestserverclient - } else { - message("Using real Etel APIs") - LIBS += -letel \ - -letelmm - } - target.path = /sys/bin INSTALLS += target diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/symbiansim_defines.pri --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/symbiansim_defines.pri Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,16 @@ + +symbian: { + # Uncomment this to use Etel test server (instead of real Etel APIs) + #DEFINES += SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER + + # add either real or test libraries for Etel + contains(DEFINES, SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER): { + message("Using Etel Test Server (not real Etel)") + INCLUDEPATH +=$${EPOCROOT}epoc32/include/internal + LIBS += -leteltestserverclient + } else { + message("Using real Etel APIs") + LIBS += -letel \ + -letelmm + } +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/tsrc/qcontactmanagersymbiansim/qcontactmanagersymbiansim.pro --- a/qtcontactsmobility/plugins/contacts/symbiansim/tsrc/qcontactmanagersymbiansim/qcontactmanagersymbiansim.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/tsrc/qcontactmanagersymbiansim/qcontactmanagersymbiansim.pro Fri Apr 16 14:53:18 2010 +0300 @@ -4,6 +4,8 @@ QT += testlib CONFIG += qtestlib +include(../../symbiansim_defines.pri) + symbian: { INCLUDEPATH += .\inc INCLUDEPATH += \ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/contacts/symbiansim/tsrc/qcontactmanagersymbiansim/tst_qcontactmanagersymbiansim.cpp --- a/qtcontactsmobility/plugins/contacts/symbiansim/tsrc/qcontactmanagersymbiansim/tst_qcontactmanagersymbiansim.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/tsrc/qcontactmanagersymbiansim/tst_qcontactmanagersymbiansim.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -44,8 +44,39 @@ #include +#ifdef SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER +#include +#else +#include +#endif +#include + QTM_USE_NAMESPACE +#define QCOMPARE_WITH_RETURN_VALUE(actual, expected) \ + if (!QTest::qCompare(actual, expected, #actual, #expected, __FILE__, __LINE__))\ + return false; + +#define QVERIFY_WITH_RETURN_VALUE(statement) \ + if (!QTest::qVerify((statement), #statement, "", __FILE__, __LINE__))\ + return false; + +#ifndef QTRY_COMPARE +#define QTRY_COMPARE(__expr, __expected) \ + do { \ + const int __step = 50; \ + const int __timeout = 5000; \ + if ((__expr) != (__expected)) { \ + QTest::qWait(0); \ + } \ + for (int __i = 0; __i < __timeout && ((__expr) != (__expected)); __i+=__step) { \ + QTest::qWait(__step); \ + } \ + QCOMPARE(__expr, __expected); \ + } while(0) +#endif + + //TESTED_CLASS= //TESTED_FILES= @@ -62,6 +93,8 @@ public slots: void init(); void cleanup(); + void initTestCase(); + void cleanupTestCase(); private slots: /* Test cases that take no data */ @@ -69,36 +102,93 @@ void supportedContactTypes(); void detailDefinitions(); + /* Test cases that need data */ + void addContact_data(); void addContact(); - void updateContact(); - void removeContact(); - - /* data */ - void addContact_data(); + void updateContactDetail_data(); + void updateContactDetail(); + void fetchContactReq(); + void localIdFetchReq(); + void saveContactReq(); + void removeContactReq(); + void detailDefinitionFetchReq(); + void notSupportedRequests(); + +private: + void getEtelStoreInfoL(const TDesC &phonebook, TDes8 &infoPckg) const; + void parseDetails(QContact &contact, QStringList details, QList &parsedDetails); + bool isContactSupported(QContact contact); + bool compareDetails(QContact contact, QList expectedDetails); + QContact createContact(QString name, QString number); + QContact saveContact(QString name, QString number); private: - bool isContactSupported(QContact contact); - QContactManager* m_cm; - /* data providers? */ + RMobilePhoneBookStore::TMobilePhoneBookInfoV5 m_etelStoreInfo; + RMobilePhoneBookStore::TMobilePhoneBookInfoV5Pckg m_etelStoreInfoPckg; }; -tst_QContactManagerSymbianSim::tst_QContactManagerSymbianSim() +tst_QContactManagerSymbianSim::tst_QContactManagerSymbianSim() : + m_etelStoreInfoPckg( m_etelStoreInfo ) { - m_cm = QContactManager::fromUri("qtcontacts:symbiansim"); + qRegisterMetaType("QContactAbstractRequest::State"); } tst_QContactManagerSymbianSim::~tst_QContactManagerSymbianSim() { - delete m_cm; } void tst_QContactManagerSymbianSim::init() { + } void tst_QContactManagerSymbianSim::cleanup() { + // remove all contacts + QList ids = m_cm->contactIds(); + m_cm->removeContacts(&ids, 0); +} + +void tst_QContactManagerSymbianSim::initTestCase() +{ + m_cm = QContactManager::fromUri("qtcontacts:symbiansim"); + QVERIFY(m_cm); + TRAPD(err, getEtelStoreInfoL(KETelIccAdnPhoneBook, m_etelStoreInfoPckg)); + QCOMPARE(err, KErrNone); +} + +void tst_QContactManagerSymbianSim::cleanupTestCase() +{ + delete m_cm; + m_cm = 0; +} + +void tst_QContactManagerSymbianSim::getEtelStoreInfoL(const TDesC &phonebook, TDes8 &infoPckg) const +{ + RTelServer etelServer; + User::LeaveIfError(etelServer.Connect()); + CleanupClosePushL(etelServer); + User::LeaveIfError(etelServer.LoadPhoneModule(KMmTsyModuleName)); + + RMobilePhone etelPhone; + RTelServer::TPhoneInfo info; + User::LeaveIfError(etelServer.GetPhoneInfo(0, info)); + User::LeaveIfError(etelPhone.Open(etelServer, info.iName)); + CleanupClosePushL(etelPhone); + + //check what information can be saved to the Etel store + RMobilePhoneBookStore etelStore; + User::LeaveIfError(etelStore.Open(etelPhone, phonebook)); + CleanupClosePushL(etelStore); + TRequestStatus requestStatus; + etelStore.GetInfo(requestStatus, infoPckg); + User::WaitForRequest(requestStatus); + User::LeaveIfError(requestStatus.Int()); + + CleanupStack::PopAndDestroy(&etelStore); + CleanupStack::PopAndDestroy(&etelPhone); + CleanupStack::PopAndDestroy(&etelServer); } void tst_QContactManagerSymbianSim::hasFeature() @@ -155,17 +245,15 @@ QMap detailDefinitions = m_cm->detailDefinitions(); QCOMPARE(m_cm->error(), QContactManager::NoError); - // count of detail definitions QVERIFY(detailDefinitions.count() >= 2); QVERIFY(detailDefinitions.count() <= 7); - // Definitions that should always exist + // check that at least definitions for name and phone number exist QVERIFY(detailDefinitions.contains(QContactName::DefinitionName)); QVERIFY(detailDefinitions.contains(QContactPhoneNumber::DefinitionName)); QVERIFY(detailDefinitions.contains(QContactDisplayLabel::DefinitionName)); QVERIFY(detailDefinitions.contains(QContactType::DefinitionName)); QVERIFY(detailDefinitions.contains(QContactSyncTarget::DefinitionName)); - // TODO: QContactGuid? // Dynamic definitions (that depend on SIM card type) if(detailDefinitions.count() == 7) { @@ -173,54 +261,401 @@ QVERIFY(detailDefinitions.contains(QContactEmailAddress::DefinitionName)); } } - void tst_QContactManagerSymbianSim::addContact_data() { // A string list containing the detail fields in format :: // For example first name: Name:First:James - QTest::addColumn("details"); + QTest::addColumn("expectedResult"); // 1 = pass, 0 = fail, -1 = depends on the SIM card + QTest::addColumn("expectedDisplayLabel"); + QTest::addColumn("details"); // format is :: + QString unnamedLabel("Unnamed"); + QString es = QString(); + QString tooLongText("James Hunt the 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890th"); + + // TODO: what name field to use for a sim contact name? + // Note: With the current implementation the value must not contain a ':' character + QTest::newRow("custom label") + << 1 // expected to pass + << "James" + << (QStringList() + << "Name:CustomLabel:James"); + + QTest::newRow("custom label 2") + << 1 // expected to pass + << "James Hunt" + << (QStringList() + << "Name:CustomLabel:James Hunt"); + + QTest::newRow("2 custom labels") + << 0 // expected to fail. Custom label is unique. + << "James Hunt" + << (QStringList() + << "Name:CustomLabel:James" + << "Name:CustomLabel:James Hunt"); + + QTest::newRow("too long custom label") + << 1 // expected to pass. Note: too long display label is truncated + << tooLongText + << (QStringList() + << (QString("Name:CustomLabel:").append(tooLongText))); - // TODO: what name field to use for a sim contact name? first name is not very logical choice... - // Note: With the current implementation the value must not contain a ':' character - QTest::newRow("first name") << - (QStringList() << "Name:First:James"); + QTest::newRow("custom label and nick name") + << -1 // Depends on SIM card support (some cards support second name) + << "James Hunt" + << (QStringList() + << "Name:CustomLabel:James Hunt" + << "Nickname:Nickname:Hunt the Shunt"); + + QTest::newRow("custom label and too long nick name") + << -1 // Depends on SIM card support (some cards support second name) + << "James Hunt" + << (QStringList() + << "Name:CustomLabel:James Hunt" + << (QString("Nickname:Nickname:").append(tooLongText))); + + QTest::newRow("phone number") + << 1 + << unnamedLabel + << (QStringList() + << "PhoneNumber:PhoneNumber:+44752222222"); + + QTest::newRow("custom label and phone number") + << 1 + << "James Hunt" + << (QStringList() + << "Name:CustomLabel:James Hunt" + << "PhoneNumber:PhoneNumber:+44752222222"); + + QTest::newRow("custom label and funny (but legal) phone number") + << 1 + << "James Hunt" + << (QStringList() + << "Name:CustomLabel:James Hunt" + << "PhoneNumber:PhoneNumber:+0123456789*#p"); - QTest::newRow("first name and nick name") << - (QStringList() << "Name:First:James" << "Nickname:Nickname:Hunt the Shunt"); + QTest::newRow("custom label and illegal phone number 1") + << 0 // illegal characters in the phone number, should fail + << "James Hunt" + << (QStringList() + << "Name:CustomLabel:James Hunt" + << "PhoneNumber:PhoneNumber:+44(75)2222222"); + + QTest::newRow("custom label and illegal phone number 2") + << 0 // illegal characters in the phone number, should fail + << "James Hunt" + << (QStringList() + << "Name:CustomLabel:James Hunt" + << "PhoneNumber:PhoneNumber:asdfqwer"); + + QTest::newRow("custom label and too long phone number") + << 0 // long enough phone number to fail on any SIM card + << "James Hunt" + << (QStringList() + << "Name:CustomLabel:James Hunt" + << "PhoneNumber:PhoneNumber:1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"); + + QTest::newRow("custom label and multiple phone numbers") + << -1 // some SIM cards support multiple phone numbers + << "James Hunt" + << (QStringList() + << "Name:CustomLabel:James Hunt" + << "PhoneNumber:PhoneNumber:+44752222222" + << "PhoneNumber:PhoneNumber:+44751111111"); + + QTest::newRow("custom label and multiple phone numbers, one phone number too long") + << 0 // Long enough additional phone number to fail on any SIM card + << "James Hunt" + << (QStringList() + << "Name:CustomLabel:James Hunt" + << "PhoneNumber:PhoneNumber:+44752222222" + << "PhoneNumber:PhoneNumber:1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"); - QTest::newRow("first name and phone number") << - (QStringList() << "Name:First:James" << "PhoneNumber:PhoneNumber:+44752222222"); + QTest::newRow("custom label and email") + << -1 // some SIM cards support e-mail address + << "James Hunt" + << (QStringList() + << "Name:CustomLabel:James Hunt" + << "EmailAddress:EmailAddress:james@mclaren.com"); + + QTest::newRow("custom label and multiple emails") + << 0 // some SIM cards support multiple e-mail addresses, but not this many + << "James Hunt" + << (QStringList() + << "Name:CustomLabel:James Hunt" + << "EmailAddress:EmailAddress:james@march.com" + << "EmailAddress:EmailAddress:james@hesketh.com" + << "EmailAddress:EmailAddress:james@mclaren.com" + << "EmailAddress:EmailAddress:james.hunt@bbc.co.uk"); - QTest::newRow("first name and email") << - (QStringList() << "Name:First:James" << "EmailAddress:EmailAddress:james.hunt@mclaren.com"); + QTest::newRow("custom label and too long email") + << 0 // long enough e-mail to fail on any SIM card + << "James Hunt" + << (QStringList() + << "Name:CustomLabel:James Hunt" + << "EmailAddress:EmailAddress:james.hunt.the12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890th@mclaren.com"); + + QTest::newRow("non-supported field") + << 0 // expected to fail + << es + << (QStringList() + << "Name:IllegalNameDetailFieldName:James"); + + QTest::newRow("non-supported detail") + << 0 // expected to fail + << es + << (QStringList() + << "NotSupportedDetailDefinitionName:IllegalFieldName:FieldValue"); + + QTest::newRow("empty, non-supported detail") + << 0 // expected to fail, since no valid details provided + << es + << (QStringList() + << "NotSupportedDetailDefinitionName:IllegalFieldName:"); } +/* + * Tests if different contacts can be saved to SIM card. + * Steps: + * 1. Parse contact details from test parameters + * 2. Determine the expected result + * 3.1 (if expected to pass) Save contact, verify result and remove contact + * 3.2 (if expected to fail) Check that saving a contact fails + */ void tst_QContactManagerSymbianSim::addContact() { - QFETCH(QStringList, details); + // Make debugging easier by getting the test case name + QString tescaseName = QTest::currentDataTag(); + + QFETCH(int, expectedResult); + QFETCH(QString, expectedDisplayLabel); + QFETCH(QStringList, details); + QContact contact; + QList expectedDetails; + + // 1. Parse details and add them to the contact + parseDetails(contact, details, expectedDetails); + + // 2. Determine the expected result + if (expectedResult == -1) { + // Unknown expected result, so we need to check what details the SIM + // card supports + if (isContactSupported(contact)) { + expectedResult = 1; + } else { + expectedResult = 0; + } + } + + // Get the contact count for verification purposes + QList idsBefore = m_cm->contactIds(); + QCOMPARE(m_cm->error(), QContactManager::NoError); + + // 3.1 (if expected to pass) Save contact, verify result and remove contact + if (expectedResult) + { + // verify contact can be saved + QVERIFY(m_cm->saveContact(&contact)); + QCOMPARE(m_cm->error(), QContactManager::NoError); + QList idsAfterSave = m_cm->contactIds(); + QCOMPARE(idsAfterSave.count(), idsBefore.count() + 1); + + // verify contact id + QVERIFY(contact.id() != QContactId()); + + // verify that the details were saved as expected + QVERIFY(compareDetails(contact, expectedDetails)); + + // verify display label, allow truncating to the max text length + QCOMPARE(contact.displayLabel(), expectedDisplayLabel.left(m_etelStoreInfo.iMaxTextLength)); + + // TODO: verify that no extra details were added? + //?QCOMPARE(contact.details().count(), detailsUnderTest.count() + 2); + + // verify contact removal + QVERIFY(m_cm->removeContact(contact.localId())); + QCOMPARE(m_cm->error(), QContactManager::NoError); + + // 3.2 (if expected to fail) Check that saving a contact fails + } else { + // verify that the contact cannot be saved + QVERIFY(!m_cm->saveContact(&contact)); + // TODO: what is the expected error code? does it depend on the case? + + // verify contact id is untouched + QVERIFY(contact.id() == QContactId()); + } + + QList idsAfterRemove = m_cm->contactIds(); + QCOMPARE(idsAfterRemove.count(), idsBefore.count()); +} + +void tst_QContactManagerSymbianSim::updateContactDetail_data() +{ + // The initial contact details, + // for example: <"Name:First:James">; <"PhoneNumber:PhoneNumber:1234567890"> + QTest::addColumn("initialDetails"); + // The updated contact details, + // for example: <"Name:First:James">; <"PhoneNumber:PhoneNumber:0987654321"> + QTest::addColumn("updatedDetails"); + + QString es = QString(); + + QTest::newRow("update custom label") + << (QStringList() + << "Name:CustomLabel:James") + << (QStringList() + << "Name:CustomLabel:James Hunt"); + + QTest::newRow("add phone number detail") + << (QStringList() + << "Name:CustomLabel:James") + << (QStringList() + << "Name:CustomLabel:James" + << "PhoneNumber:PhoneNumber:+44752222222"); + + QTest::newRow("update phone number detail") + << (QStringList() + << "Name:CustomLabel:James" + << "PhoneNumber:PhoneNumber:+44751111111") + << (QStringList() + << "Name:CustomLabel:James" + << "PhoneNumber:PhoneNumber:+44752222222"); - // Parse details and add them to the contact - foreach(QString detail, details) { + QTest::newRow("remove phone number detail") + << (QStringList() + << "Name:CustomLabel:James" + << "PhoneNumber:PhoneNumber:+44751111111") + << (QStringList() + << "Name:CustomLabel:James"); + + QTest::newRow("add e-mail detail") + << (QStringList() + << "Name:CustomLabel:James") + << (QStringList() + << "Name:CustomLabel:James" + << "EmailAddress:EmailAddress:james@hesketh.com"); + + QTest::newRow("update e-mail detail") + << (QStringList() + << "Name:CustomLabel:James" + << "EmailAddress:EmailAddress:james@march.com") + << (QStringList() + << "Name:CustomLabel:James" + << "EmailAddress:EmailAddress:james@hesketh.com"); + + QTest::newRow("remove e-mail detail") + << (QStringList() + << "Name:CustomLabel:James" + << "EmailAddress:EmailAddress:james@march.com") + << (QStringList() + << "Name:CustomLabel:James"); + + QTest::newRow("add nickname detail") + << (QStringList() + << "Name:CustomLabel:James") + << (QStringList() + << "Name:CustomLabel:James" + << "Nickname:Nickname:Hunt the Shunt"); + + QTest::newRow("update nickname detail") + << (QStringList() + << "Name:CustomLabel:James" + << "Nickname:Nickname:James") + << (QStringList() + << "Name:CustomLabel:James" + << "Nickname:Nickname:Hunt the Shunt"); + + QTest::newRow("remove nickname detail") + << (QStringList() + << "Name:CustomLabel:James" + << "Nickname:Nickname:James") + << (QStringList() + << "Name:CustomLabel:James"); +} + +/* + * Tests if SIM contacts can be changed. I.e. add, update and remove contact + * details. Steps: + * 1. Parse details from test data + * 2. Add a contact with initial details + * 3. Modify the contact (save with updated details) + * 4. Remove the contact + */ +void tst_QContactManagerSymbianSim::updateContactDetail() +{ + QString tescaseName = QTest::currentDataTag(); + + QFETCH(QStringList, initialDetails); + QFETCH(QStringList, updatedDetails); + + // 1. Parse details + QContact contact; + QList parsedDetails; + parseDetails(contact, initialDetails, parsedDetails); + + // 2. Save contact and verify result + if (!isContactSupported(contact)) { + QSKIP("The contact cannot be saved onto the SIM card", SkipSingle); + } + QVERIFY(m_cm->saveContact(&contact)); + QCOMPARE(m_cm->error(), QContactManager::NoError); + QVERIFY(compareDetails(contact, parsedDetails)); + + // 3. Update contact detail and verify result + foreach (QContactDetail detail, parsedDetails) { + QContactDetail savedDetail = contact.detail(detail.definitionName()); + QVERIFY(contact.removeDetail(&savedDetail)); + } + parseDetails(contact, updatedDetails, parsedDetails); + if (!isContactSupported(contact)) { + QVERIFY(m_cm->removeContact(contact.localId())); + QSKIP("The contact cannot be saved onto the SIM card", SkipSingle); + } + QVERIFY(m_cm->saveContact(&contact)); + QCOMPARE(m_cm->error(), QContactManager::NoError); + QVERIFY(compareDetails(contact, parsedDetails)); + + // 4. Remove the contact + QVERIFY(m_cm->removeContact(contact.localId())); +} + +/*! + * Private helper function for parsing test data (creates QContactDetails from + * string lists). + */ +void tst_QContactManagerSymbianSim::parseDetails(QContact &contact, QStringList details, QList &parsedDetails) +{ + parsedDetails.clear(); + foreach (QString detail, details) { // the expected format is :: QStringList detailParts = detail.split(QChar(':'), QString::KeepEmptyParts, Qt::CaseSensitive); QVERIFY(detailParts.count() == 3); - QContactDetail contactDetail(detailParts[0]); - contactDetail.setValue(detailParts[1], detailParts[2]); - contact.saveDetail(&contactDetail); - } + + // Use existing detail if available and would not cause an overwrite of + // a field value + QContactDetail contactDetail = QContactDetail(detailParts[0]); + if (contact.details().contains(detailParts[0]) + && contact.detail(detailParts[0]).variantValues().key(detailParts[1]).isNull()) { + contactDetail = contact.detail(detailParts[0]); + } - if(isContactSupported(contact)) - { - bool result = m_cm->saveContact(&contact); - QCOMPARE(result, true); - QCOMPARE(m_cm->error(), QContactManager::NoError); - } else { - QSKIP("Manager does not support all the contact details", SkipSingle); + // Set the field value only if not empty (do not add empty fields) + if (!detailParts[2].isEmpty()) { + QVERIFY(contactDetail.setValue(detailParts[1], detailParts[2])); + } + + QVERIFY(contact.saveDetail(&contactDetail)); + parsedDetails.append(contactDetail); } } +/*! + * Private helper function for checking if the SIM backend supports the + * contact. This can be used in cases where it depends on the SIM card features + * if the contact details can be saved or not. + */ bool tst_QContactManagerSymbianSim::isContactSupported(QContact contact) { QMap detailDefinitions = m_cm->detailDefinitions(); @@ -228,12 +663,42 @@ if(!m_cm->supportedContactTypes().contains(contact.type())) return false; + QList uniqueDetails = QList(); + foreach(QContactDetail detail, contact.details()) { - if(detailDefinitions.contains(detail.definitionName())) { - // TODO: check the fields of the detail - // TODO: check the "writability" of the detail? - // TODO: uniquenes of the detail? (for example, create a test case with multiple names) + QString definitionName = detail.definitionName(); + + // TODO: should we save a contact that has empty, non-supported details? + // The current implementation is to ignore empty details here which + // means that the backend should also ignore the empty details, even + // if the detail in question is not supported. + if (detail.isEmpty()) { + continue; + } + + // check if the detail is supported by the SIM + if (detailDefinitions.contains(detail.definitionName())) { + + QContactDetailDefinition detailDef = detailDefinitions.value(detail.definitionName()); + + // If the detail is unique check that there are no duplicates + if (detailDef.isUnique()) { + if (uniqueDetails.contains(detail.definitionName())) { + return false; + } else { + uniqueDetails.append(detail.definitionName()); + } + } + + // check the fields of the detail + foreach (QString fieldKey, detail.variantValues().keys()) { + if (!detailDef.fields().contains(fieldKey)) { + return false; + } + } + } else { + qDebug() << "Detail" << definitionName << "Not supported"; return false; } } @@ -241,15 +706,420 @@ return true; } -void tst_QContactManagerSymbianSim::updateContact() +/* + * Private helper function for comparing QContact details to a well-known set + * of QContactDetails. + * \return true if all the expected contact details have a match in the \contact. + */ +bool tst_QContactManagerSymbianSim::compareDetails(QContact contact, QList expectedDetails) +{ + foreach (QContactDetail expectedDetail, expectedDetails) { + QContactDetail actualDetail = contact.detail(expectedDetail.definitionName()); + QVERIFY_WITH_RETURN_VALUE(!actualDetail.isEmpty()); + + // Allow truncating the custom label to the max text length + if (expectedDetail.definitionName() == QContactName::DefinitionName) { + QContactName nameDetail = static_cast(expectedDetail); + nameDetail.setCustomLabel(nameDetail.customLabel().left(m_etelStoreInfo.iMaxTextLength)); + QCOMPARE_WITH_RETURN_VALUE(actualDetail, static_cast(nameDetail)); + // Allow truncating the nick name to the max text length + } else if (expectedDetail.definitionName() == QContactNickname::DefinitionName) { + QContactNickname nick = static_cast(expectedDetail); + nick.setNickname(nick.nickname().left(m_etelStoreInfo.iMaxTextLength)); + QCOMPARE_WITH_RETURN_VALUE(actualDetail, static_cast(nick)); + } else { + if (actualDetail != expectedDetail) { + // FAIL! Make it easier to debug the output by + // comparing the contact detail field contents + foreach (QString key, expectedDetail.variantValues().keys()) { + QVariant value1 = actualDetail.value(key); + QVariant value2 = expectedDetail.value(key); + QCOMPARE_WITH_RETURN_VALUE(actualDetail.value(key), expectedDetail.value(key)); + } + } + } + } + return true; +} + +QContact tst_QContactManagerSymbianSim::createContact(QString name, QString number) +{ + QContact c; + + QContactName n; + n.setCustomLabel(name); + c.saveDetail(&n); + + QContactPhoneNumber nb; + nb.setNumber(number); + c.saveDetail(&nb); + + return c; +} + +QContact tst_QContactManagerSymbianSim::saveContact(QString name, QString number) +{ + QContact c; + + QContactName n; + n.setCustomLabel(name); + c.saveDetail(&n); + + QContactPhoneNumber nb; + nb.setNumber(number); + c.saveDetail(&nb); + + if (!m_cm->saveContact(&c)) { + qWarning("*FATAL* could not save contact!"); + } + + return c; +} + +void tst_QContactManagerSymbianSim::fetchContactReq() { - // TODO + QContactFetchRequest req; + req.setManager(m_cm); + + QSignalSpy stateSpy(&req, SIGNAL(stateChanged(QContactAbstractRequest::State))); + QSignalSpy resultSpy(&req, SIGNAL(resultsAvailable())); + + // Save some contacts + QContact c1 = saveContact("a", "1234567"); + QContact c2 = saveContact("b", "7654321"); + QContact c3 = saveContact("c", "1111111"); + + // Fetch the contacts + QVERIFY(req.start()); + QVERIFY(req.state() == QContactAbstractRequest::ActiveState); + QVERIFY(stateSpy.count() == 1); + QVERIFY(req.waitForFinished(0)); + QVERIFY(req.state() == QContactAbstractRequest::FinishedState); + QVERIFY(req.error() == QContactManager::NoError); + QVERIFY(stateSpy.count() == 2); + QVERIFY(resultSpy.count() == 1); + QVERIFY(req.contacts().count() == 3); + + // Test cancelling + stateSpy.clear(); + resultSpy.clear(); + QVERIFY(!req.cancel()); + QVERIFY(req.state() == QContactAbstractRequest::FinishedState); + QVERIFY(req.start()); + QVERIFY(req.state() == QContactAbstractRequest::ActiveState); + QVERIFY(stateSpy.count() == 1); + QVERIFY(req.cancel()); + QVERIFY(!req.cancel()); + QVERIFY(stateSpy.count() == 2); + QVERIFY(resultSpy.count() == 0); + QVERIFY(req.state() == QContactAbstractRequest::CanceledState); + + // Remove all contacts + QList ids = m_cm->contactIds(); + m_cm->removeContacts(&ids, 0); + + // Test fetching nothing + stateSpy.clear(); + resultSpy.clear(); + QVERIFY(req.start()); + QVERIFY(!req.start()); + QVERIFY(req.state() == QContactAbstractRequest::ActiveState); + QVERIFY(stateSpy.count() == 1); + QTRY_COMPARE(resultSpy.count(), 1); + QVERIFY(req.state() == QContactAbstractRequest::FinishedState); + QVERIFY(req.error() == QContactManager::DoesNotExistError); + QVERIFY(stateSpy.count() == 2); + QVERIFY(req.contacts().count() == 0); +} + +void tst_QContactManagerSymbianSim::localIdFetchReq() +{ + QContactLocalIdFetchRequest req; + req.setManager(m_cm); + + QSignalSpy stateSpy(&req, SIGNAL(stateChanged(QContactAbstractRequest::State))); + QSignalSpy resultSpy(&req, SIGNAL(resultsAvailable())); + + // Save some contacts + QContact c1 = saveContact("a", "1234567"); + QContact c2 = saveContact("b", "7654321"); + QContact c3 = saveContact("c", "1111111"); + + // Fetch the contacts + QVERIFY(req.start()); + QVERIFY(req.state() == QContactAbstractRequest::ActiveState); + QVERIFY(stateSpy.count() == 1); + QVERIFY(req.waitForFinished(0)); + QVERIFY(req.state() == QContactAbstractRequest::FinishedState); + QVERIFY(req.error() == QContactManager::NoError); + QVERIFY(stateSpy.count() == 2); + QVERIFY(resultSpy.count() == 1); + QVERIFY(req.ids().count() == 3); + QVERIFY(req.ids().contains(c1.localId())); + QVERIFY(req.ids().contains(c2.localId())); + QVERIFY(req.ids().contains(c3.localId())); + + // Test cancelling + stateSpy.clear(); + resultSpy.clear(); + QVERIFY(!req.cancel()); + QVERIFY(req.state() == QContactAbstractRequest::FinishedState); + QVERIFY(req.start()); + QVERIFY(!req.start()); + QVERIFY(req.state() == QContactAbstractRequest::ActiveState); + QVERIFY(stateSpy.count() == 1); + QVERIFY(req.cancel()); + QVERIFY(!req.cancel()); + QVERIFY(stateSpy.count() == 2); + QVERIFY(resultSpy.count() == 0); + QVERIFY(req.state() == QContactAbstractRequest::CanceledState); + + // Remove all contacts + QList ids = m_cm->contactIds(); + m_cm->removeContacts(&ids, 0); + + // Start again + stateSpy.clear(); + resultSpy.clear(); + QVERIFY(req.start()); + QVERIFY(req.state() == QContactAbstractRequest::ActiveState); + QVERIFY(stateSpy.count() == 1); + QTRY_COMPARE(resultSpy.count(), 1); + QVERIFY(req.state() == QContactAbstractRequest::FinishedState); + QVERIFY(req.error() == QContactManager::DoesNotExistError); + QVERIFY(stateSpy.count() == 2); + QVERIFY(req.ids().count() == 0); } -void tst_QContactManagerSymbianSim::removeContact() +void tst_QContactManagerSymbianSim::saveContactReq() +{ + QContactSaveRequest req; + req.setManager(m_cm); + + QSignalSpy stateSpy(&req, SIGNAL(stateChanged(QContactAbstractRequest::State))); + QSignalSpy resultSpy(&req, SIGNAL(resultsAvailable())); + + // Create some contacts + QContact c1 = createContact("Keeppu", "47474747"); + QContact c2 = createContact("Rilli", "74747474"); + + // Test cancel + QList contacts; + contacts << c1 << c2; + req.setContacts(contacts); + QVERIFY(!req.cancel()); + QVERIFY(req.start()); + QVERIFY(!req.start()); + QVERIFY(req.state() == QContactAbstractRequest::ActiveState); + QVERIFY(stateSpy.count() == 1); + QVERIFY(req.cancel()); + QVERIFY(!req.cancel()); + QVERIFY(req.state() == QContactAbstractRequest::CanceledState); + QVERIFY(stateSpy.count() == 2); + QVERIFY(resultSpy.count() == 0); + QVERIFY(m_cm->contactIds().count() == 0); + + // Test save + stateSpy.clear(); + req.setContacts(contacts); + QVERIFY(req.start()); + QVERIFY(req.state() == QContactAbstractRequest::ActiveState); + QVERIFY(stateSpy.count() == 1); + QTRY_COMPARE(resultSpy.count(), 1); + QVERIFY(req.state() == QContactAbstractRequest::FinishedState); + QVERIFY(req.error() == QContactManager::NoError); + QVERIFY(req.errorMap().count() == 0); + QVERIFY(stateSpy.count() == 2); + QVERIFY(resultSpy.count() == 1); + QVERIFY(req.contacts().count() == 2); + QContact c = req.contacts().at(0); + QVERIFY(c.id().managerUri() == m_cm->managerUri()); + QVERIFY(c.localId() != QContactLocalId(0)); + QVERIFY(c.detail().firstName() == c1.detail().firstName()); + QVERIFY(c.detail().number() == c1.detail().number()); + QVERIFY(m_cm->contactIds().count() == 2); + + // Test saving again + c1 = req.contacts().at(0); + c2 = req.contacts().at(1); + + QContactName name = c1.detail(); + name.setCustomLabel("Keeputin"); + c1.saveDetail(&name); + QContactPhoneNumber number = c1.detail(); + c1.removeDetail(&number); + + contacts.clear(); + contacts << c1 << c2; + req.setContacts(contacts); + + stateSpy.clear(); + resultSpy.clear(); + QVERIFY(req.start()); + QVERIFY(req.state() == QContactAbstractRequest::ActiveState); + QVERIFY(stateSpy.count() == 1); + QVERIFY(req.waitForFinished(0)); + QVERIFY(req.state() == QContactAbstractRequest::FinishedState); + QVERIFY(req.error() == QContactManager::NoError); + QVERIFY(req.errorMap().count() == 0); + QVERIFY(stateSpy.count() == 2); + QVERIFY(resultSpy.count() == 1); + QVERIFY(req.contacts().count() == 2); + QVERIFY(req.contacts().at(0).localId() == c1.localId()); + QVERIFY(req.contacts().at(1).localId() == c2.localId()); + c = req.contacts().at(0); + QVERIFY(c.details(QContactPhoneNumber::DefinitionName).count() == 0); + QVERIFY(c.detail().customLabel() == c1.detail().customLabel()); + QVERIFY(m_cm->contactIds().count() == 2); + c = m_cm->contact(c1.localId(), QStringList()); + QVERIFY(c.details(QContactPhoneNumber::DefinitionName).count() == 0); + QVERIFY(c.detail().customLabel() == c1.detail().customLabel()); +} + +void tst_QContactManagerSymbianSim::removeContactReq() { - // TODO + QContactRemoveRequest req; + req.setManager(m_cm); + + QSignalSpy stateSpy(&req, SIGNAL(stateChanged(QContactAbstractRequest::State))); + QSignalSpy resultSpy(&req, SIGNAL(resultsAvailable())); + + // Save some contacts + QContact c1 = saveContact("a", "1234567"); + QContact c2 = saveContact("b", "7654321"); + + // Remove the contacts + QList ids; + ids << c1.localId() << c2.localId(); + req.setContactIds(ids); + QVERIFY(req.start()); + QVERIFY(req.state() == QContactAbstractRequest::ActiveState); + QVERIFY(stateSpy.count() == 1); + QVERIFY(req.waitForFinished(0)); + QVERIFY(req.state() == QContactAbstractRequest::FinishedState); + QVERIFY(req.error() == QContactManager::NoError); + QVERIFY(req.errorMap().count() == 0); + QVERIFY(stateSpy.count() == 2); + QVERIFY(resultSpy.count() == 1); + QVERIFY(m_cm->contactIds().count() == 0); + + // Test cancel + stateSpy.clear(); + resultSpy.clear(); + QVERIFY(!req.cancel()); + QVERIFY(req.start()); + QVERIFY(!req.start()); + QVERIFY(req.state() == QContactAbstractRequest::ActiveState); + QVERIFY(stateSpy.count() == 1); + QVERIFY(req.cancel()); + QVERIFY(!req.cancel()); + QVERIFY(req.state() == QContactAbstractRequest::CanceledState); + QVERIFY(stateSpy.count() == 2); + QVERIFY(resultSpy.count() == 0); + + // Remove same ones again + stateSpy.clear(); + resultSpy.clear(); + QVERIFY(req.start()); + QVERIFY(req.state() == QContactAbstractRequest::ActiveState); + QVERIFY(stateSpy.count() == 1); + QTRY_COMPARE(resultSpy.count(), 1); + QVERIFY(req.state() == QContactAbstractRequest::FinishedState); +#ifndef __WINS__ + QWARN("This test fails in hardware!"); + QWARN("In hardware removing SIM contacts which do not exist the etel server will return KErrNone instead of KErrNotFound"); +#endif + QVERIFY(req.error() == QContactManager::DoesNotExistError); + QVERIFY(req.errorMap().count() == 2); + QVERIFY(req.errorMap().value(0) == QContactManager::DoesNotExistError); + QVERIFY(req.errorMap().value(1) == QContactManager::DoesNotExistError); } +void tst_QContactManagerSymbianSim::detailDefinitionFetchReq() +{ + QContactDetailDefinitionFetchRequest req; + req.setManager(m_cm); + + QSignalSpy stateSpy(&req, SIGNAL(stateChanged(QContactAbstractRequest::State))); + QSignalSpy resultSpy(&req, SIGNAL(resultsAvailable())); + + // Fetch all + req.setContactType(QContactType::TypeContact); + QVERIFY(req.start()); + QVERIFY(req.state() == QContactAbstractRequest::ActiveState); + QVERIFY(stateSpy.count() == 1); + QVERIFY(req.waitForFinished(0)); + QVERIFY(req.state() == QContactAbstractRequest::FinishedState); + QVERIFY(req.error() == QContactManager::NoError); + QVERIFY(stateSpy.count() == 2); + QVERIFY(resultSpy.count() == 1); + QVERIFY(req.definitions().count()); + QVERIFY(req.definitions() == m_cm->detailDefinitions(req.contactType())); + + // Test cancel + stateSpy.clear(); + resultSpy.clear(); + QVERIFY(!req.cancel()); + QVERIFY(req.start()); + QVERIFY(!req.start()); + QVERIFY(req.state() == QContactAbstractRequest::ActiveState); + QVERIFY(stateSpy.count() == 1); + QVERIFY(req.cancel()); + QVERIFY(!req.cancel()); + QVERIFY(req.state() == QContactAbstractRequest::CanceledState); + QVERIFY(stateSpy.count() == 2); + QVERIFY(resultSpy.count() == 0); + + // Fetch some defs + stateSpy.clear(); + resultSpy.clear(); + req.setDefinitionNames(QStringList() << QContactPhoneNumber::DefinitionName << QContactNote::DefinitionName); + QVERIFY(req.start()); + QVERIFY(req.state() == QContactAbstractRequest::ActiveState); + QVERIFY(stateSpy.count() == 1); + QTRY_COMPARE(resultSpy.count(), 1); + QVERIFY(req.state() == QContactAbstractRequest::FinishedState); + QVERIFY(req.error() == QContactManager::DoesNotExistError); + QVERIFY(req.errorMap().value(1) == QContactManager::DoesNotExistError); + QVERIFY(stateSpy.count() == 2); + QVERIFY(resultSpy.count() == 1); + QVERIFY(req.definitions().count() == 1); + QVERIFY(req.definitions().contains(QContactPhoneNumber::DefinitionName)); + + // Fetch non-existing type + stateSpy.clear(); + resultSpy.clear(); + req.setContactType(QContactType::TypeGroup); + req.setDefinitionNames(QStringList()); + QVERIFY(req.start()); + QVERIFY(req.state() == QContactAbstractRequest::ActiveState); + QVERIFY(stateSpy.count() == 1); + QVERIFY(req.waitForFinished(0)); + QVERIFY(req.state() == QContactAbstractRequest::FinishedState); + QVERIFY(req.error() == QContactManager::NotSupportedError); + QVERIFY(stateSpy.count() == 2); + QVERIFY(resultSpy.count() == 1); +} + +void tst_QContactManagerSymbianSim::notSupportedRequests() +{ + QVERIFY(!m_cm->hasFeature(QContactManager::Relationships)); + QContactRelationshipFetchRequest rfreq; + rfreq.setManager(m_cm); + QVERIFY(!rfreq.start()); + QContactRelationshipRemoveRequest rrreq; + rrreq.setManager(m_cm); + QVERIFY(!rrreq.start()); + + QVERIFY(!m_cm->hasFeature(QContactManager::MutableDefinitions)); + QContactDetailDefinitionRemoveRequest ddrreq; + ddrreq.setManager(m_cm); + QVERIFY(!ddrreq.start()); + QContactDetailDefinitionSaveRequest ddsreq; + ddsreq.setManager(m_cm); + QVERIFY(!ddsreq.start()); +} + + QTEST_MAIN(tst_QContactManagerSymbianSim) #include "tst_qcontactmanagersymbiansim.moc" diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/plugins/plugins.pro --- a/qtcontactsmobility/plugins/plugins.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/plugins/plugins.pro Fri Apr 16 14:53:18 2010 +0300 @@ -10,4 +10,5 @@ TEMPLATE = subdirs contains(mobility_modules,contacts): SUBDIRS += contacts - +contains(mobility_modules,multimedia): SUBDIRS += multimedia +contains(mobility_modules,sensors): SUBDIRS += sensors diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/bwins/QtContactsu.def --- a/qtcontactsmobility/src/contacts/bwins/QtContactsu.def Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/bwins/QtContactsu.def Fri Apr 16 14:53:18 2010 +0300 @@ -8,23 +8,23 @@ ?contacts@QContactManagerEngine@QtMobility@@UBE?AV?$QList@I@@ABVQContactFilter@2@ABV?$QList@VQContactSortOrder@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 7 NONAME ; class QList QtMobility::QContactManagerEngine::contacts(class QtMobility::QContactFilter const &, class QList const &, enum QtMobility::QContactManager::Error &) const ?SubTypeParcel@QContactAddress@QtMobility@@2U?$Latin1Literal@$06@2@B @ 8 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactAddress::SubTypeParcel ?SubTypeImpp@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$04@2@B @ 9 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactOnlineAccount::SubTypeImpp - ?setAccessConstraint@QContactDetailDefinitionField@QtMobility@@QAEXW4AccessConstraint@12@@Z @ 10 NONAME ; void QtMobility::QContactDetailDefinitionField::setAccessConstraint(enum QtMobility::QContactDetailDefinitionField::AccessConstraint) - ?addSorted@QContactManagerEngine@QtMobility@@SAXPAV?$QList@VQContact@QtMobility@@@@ABVQContact@2@ABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 11 NONAME ; void QtMobility::QContactManagerEngine::addSorted(class QList *, class QtMobility::QContact const &, class QList const &) - ?PresenceUnknown@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$07@2@B @ 12 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactOnlineAccount::PresenceUnknown - ?availableActions@QContactAction@QtMobility@@SA?AVQStringList@@ABVQString@@H@Z @ 13 NONAME ; class QStringList QtMobility::QContactAction::availableActions(class QString const &, int) - ??1QContactIntersectionFilter@QtMobility@@UAE@XZ @ 14 NONAME ; QtMobility::QContactIntersectionFilter::~QContactIntersectionFilter(void) - ?staticMetaObject@QContactFetchRequest@QtMobility@@2UQMetaObject@@B @ 15 NONAME ; struct QMetaObject const QtMobility::QContactFetchRequest::staticMetaObject - ?PresenceHidden@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$06@2@B @ 16 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactOnlineAccount::PresenceHidden - ?value@QContactActionFilter@QtMobility@@QBE?AVQVariant@@XZ @ 17 NONAME ; class QVariant QtMobility::QContactActionFilter::value(void) const - ??0QContactDisplayLabel@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 18 NONAME ; QtMobility::QContactDisplayLabel::QContactDisplayLabel(class QtMobility::QContactDetail const &) - ??8QContactDetailDefinition@QtMobility@@QBE_NABV01@@Z @ 19 NONAME ; bool QtMobility::QContactDetailDefinition::operator==(class QtMobility::QContactDetailDefinition const &) const + ?addSorted@QContactManagerEngine@QtMobility@@SAXPAV?$QList@VQContact@QtMobility@@@@ABVQContact@2@ABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 10 NONAME ; void QtMobility::QContactManagerEngine::addSorted(class QList *, class QtMobility::QContact const &, class QList const &) + ?PresenceUnknown@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$07@2@B @ 11 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactOnlineAccount::PresenceUnknown + ?availableActions@QContactAction@QtMobility@@SA?AVQStringList@@ABVQString@@H@Z @ 12 NONAME ; class QStringList QtMobility::QContactAction::availableActions(class QString const &, int) + ??1QContactIntersectionFilter@QtMobility@@UAE@XZ @ 13 NONAME ; QtMobility::QContactIntersectionFilter::~QContactIntersectionFilter(void) + ?staticMetaObject@QContactFetchRequest@QtMobility@@2UQMetaObject@@B @ 14 NONAME ; struct QMetaObject const QtMobility::QContactFetchRequest::staticMetaObject + ?PresenceHidden@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$06@2@B @ 15 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactOnlineAccount::PresenceHidden + ?value@QContactActionFilter@QtMobility@@QBE?AVQVariant@@XZ @ 16 NONAME ; class QVariant QtMobility::QContactActionFilter::value(void) const + ??0QContactDisplayLabel@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 17 NONAME ; QtMobility::QContactDisplayLabel::QContactDisplayLabel(class QtMobility::QContactDetail const &) + ??8QContactDetailDefinition@QtMobility@@QBE_NABV01@@Z @ 18 NONAME ; bool QtMobility::QContactDetailDefinition::operator==(class QtMobility::QContactDetailDefinition const &) const + ?setLinkedDetailUris@QContactDetail@QtMobility@@QAEXABVQString@@@Z @ 19 NONAME ; void QtMobility::QContactDetail::setLinkedDetailUris(class QString const &) ?tr@QContactAction@QtMobility@@SA?AVQString@@PBD0@Z @ 20 NONAME ; class QString QtMobility::QContactAction::tr(char const *, char const *) ?supportedDataTypes@QContactManager@QtMobility@@QBE?AV?$QList@W4Type@QVariant@@@@XZ @ 21 NONAME ; class QList QtMobility::QContactManager::supportedDataTypes(void) const ?SubTypeMessagingCapable@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$0BB@@2@B @ 22 NONAME ; struct QtMobility::Latin1Literal<17> const QtMobility::QContactPhoneNumber::SubTypeMessagingCapable ?vendorName@QContactActionFilter@QtMobility@@QBE?AVQString@@XZ @ 23 NONAME ; class QString QtMobility::QContactActionFilter::vendorName(void) const - ??1QContactDetailDefinitionField@QtMobility@@QAE@XZ @ 24 NONAME ; QtMobility::QContactDetailDefinitionField::~QContactDetailDefinitionField(void) - ?qt_metacast@QContactRelationshipRemoveRequest@QtMobility@@UAEPAXPBD@Z @ 25 NONAME ; void * QtMobility::QContactRelationshipRemoveRequest::qt_metacast(char const *) - ??0QContactGeolocation@QtMobility@@QAE@XZ @ 26 NONAME ; QtMobility::QContactGeolocation::QContactGeolocation(void) + ?qt_metacast@QContactRelationshipRemoveRequest@QtMobility@@UAEPAXPBD@Z @ 24 NONAME ; void * QtMobility::QContactRelationshipRemoveRequest::qt_metacast(char const *) + ??0QContactGeolocation@QtMobility@@QAE@XZ @ 25 NONAME ; QtMobility::QContactGeolocation::QContactGeolocation(void) + ?setAltitudeAccuracy@QContactGeoLocation@QtMobility@@QAEXN@Z @ 26 NONAME ; void QtMobility::QContactGeoLocation::setAltitudeAccuracy(double) ?remove@QContactIntersectionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 27 NONAME ; void QtMobility::QContactIntersectionFilter::remove(class QtMobility::QContactFilter const &) ?d_func@QContactDetailDefinitionSaveRequest@QtMobility@@ABEPBVQContactDetailDefinitionSaveRequestPrivate@2@XZ @ 28 NONAME ; class QtMobility::QContactDetailDefinitionSaveRequestPrivate const * QtMobility::QContactDetailDefinitionSaveRequest::d_func(void) const ?qt_metacall@QContactRelationshipFetchRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 29 NONAME ; int QtMobility::QContactRelationshipFetchRequest::qt_metacall(enum QMetaObject::Call, int, void * *) @@ -44,995 +44,1125 @@ ?Aggregates@QContactRelationship@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 43 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactRelationship::Aggregates ?tr@QContactSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 44 NONAME ; class QString QtMobility::QContactSaveRequest::tr(char const *, char const *) ??4QContactSortOrder@QtMobility@@QAEAAV01@ABV01@@Z @ 45 NONAME ; class QtMobility::QContactSortOrder & QtMobility::QContactSortOrder::operator=(class QtMobility::QContactSortOrder const &) - ?setDetailDefinitionName@QContactDetailFilter@QtMobility@@QAEXABVQString@@0@Z @ 46 NONAME ; void QtMobility::QContactDetailFilter::setDetailDefinitionName(class QString const &, class QString const &) - ??_EQContactRelationshipRemoveRequest@QtMobility@@UAE@I@Z @ 47 NONAME ; QtMobility::QContactRelationshipRemoveRequest::~QContactRelationshipRemoveRequest(unsigned int) - ??1QContactInvalidFilter@QtMobility@@UAE@XZ @ 48 NONAME ; QtMobility::QContactInvalidFilter::~QContactInvalidFilter(void) - ?participant@QContactRelationshipFetchRequest@QtMobility@@QBE?AVQContactId@2@XZ @ 49 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipFetchRequest::participant(void) const - ??0QContactManagerEngine@QtMobility@@QAE@XZ @ 50 NONAME ; QtMobility::QContactManagerEngine::QContactManagerEngine(void) - ?FieldLocation@QContactOrganization@QtMobility@@2U?$Latin1Literal@$08@2@B @ 51 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactOrganization::FieldLocation - ?progress@QContactDetailDefinitionFetchRequest@QtMobility@@IAEXPAV12@_N@Z @ 52 NONAME ; void QtMobility::QContactDetailDefinitionFetchRequest::progress(class QtMobility::QContactDetailDefinitionFetchRequest *, bool) - ?removeContacts@QContactManagerEngine@QtMobility@@UAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@I@@AAW4Error@QContactManager@2@@Z @ 53 NONAME ; class QList QtMobility::QContactManagerEngine::removeContacts(class QList *, enum QtMobility::QContactManager::Error &) - ?setAvatar@QContactAvatar@QtMobility@@QAEXABVQString@@@Z @ 54 NONAME ; void QtMobility::QContactAvatar::setAvatar(class QString const &) - ?DefinitionName@QContactAvatar@QtMobility@@2U?$Latin1Literal@$06@2@B @ 55 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactAvatar::DefinitionName - ?trUtf8@QContactManagerEngine@QtMobility@@SA?AVQString@@PBD0H@Z @ 56 NONAME ; class QString QtMobility::QContactManagerEngine::trUtf8(char const *, char const *, int) - ?relationshipType@QContactRelationshipFetchRequest@QtMobility@@QBE?AVQString@@XZ @ 57 NONAME ; class QString QtMobility::QContactRelationshipFetchRequest::relationshipType(void) const - ?second@QContactRelationship@QtMobility@@QBE?AVQContactId@2@XZ @ 58 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationship::second(void) const - ?d_func@QContactRelationshipSaveRequest@QtMobility@@AAEPAVQContactRelationshipSaveRequestPrivate@2@XZ @ 59 NONAME ; class QtMobility::QContactRelationshipSaveRequestPrivate * QtMobility::QContactRelationshipSaveRequest::d_func(void) - ?setStatusMessage@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 60 NONAME ; void QtMobility::QContactOnlineAccount::setStatusMessage(class QString const &) - ??0QContactFetchRequest@QtMobility@@QAE@XZ @ 61 NONAME ; QtMobility::QContactFetchRequest::QContactFetchRequest(void) - ??4QContactName@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 62 NONAME ; class QtMobility::QContactName & QtMobility::QContactName::operator=(class QtMobility::QContactDetail const &) - ?cancel@QContactAbstractRequest@QtMobility@@QAE_NXZ @ 63 NONAME ; bool QtMobility::QContactAbstractRequest::cancel(void) - ?setMatchFlags@QContactDetailRangeFilter@QtMobility@@QAEXV?$QFlags@W4MatchFlag@QContactFilter@QtMobility@@@@@Z @ 64 NONAME ; void QtMobility::QContactDetailRangeFilter::setMatchFlags(class QFlags) - ?actionName@QContactActionFilter@QtMobility@@QBE?AVQString@@XZ @ 65 NONAME ; class QString QtMobility::QContactActionFilter::actionName(void) const - ?FieldLocality@QContactAddress@QtMobility@@2U?$Latin1Literal@$08@2@B @ 66 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactAddress::FieldLocality - ?d_func@QContactDetailRangeFilter@QtMobility@@ABEPBVQContactDetailRangeFilterPrivate@2@XZ @ 67 NONAME ; class QtMobility::QContactDetailRangeFilterPrivate const * QtMobility::QContactDetailRangeFilter::d_func(void) const - ?type@QContactType@QtMobility@@QBE?AVQString@@XZ @ 68 NONAME ; class QString QtMobility::QContactType::type(void) const - ?setLabel@QContactGeolocation@QtMobility@@QAEXABVQString@@@Z @ 69 NONAME ; void QtMobility::QContactGeolocation::setLabel(class QString const &) - ?PresenceBusy@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$04@2@B @ 70 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactOnlineAccount::PresenceBusy - ?d_func@QContactLocalIdFetchRequest@QtMobility@@ABEPBVQContactLocalIdFetchRequestPrivate@2@XZ @ 71 NONAME ; class QtMobility::QContactLocalIdFetchRequestPrivate const * QtMobility::QContactLocalIdFetchRequest::d_func(void) const - ?DefinitionName@QContactType@QtMobility@@2U?$Latin1Literal@$04@2@B @ 72 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactType::DefinitionName - ??_EQContactLocalIdFetchRequest@QtMobility@@UAE@I@Z @ 73 NONAME ; QtMobility::QContactLocalIdFetchRequest::~QContactLocalIdFetchRequest(unsigned int) - ?FieldLogo@QContactOrganization@QtMobility@@2U?$Latin1Literal@$04@2@B @ 74 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactOrganization::FieldLogo - ?schemaDefinitions@QContactManagerEngine@QtMobility@@SA?AV?$QMap@VQString@@V?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@@@XZ @ 75 NONAME ; class QMap > QtMobility::QContactManagerEngine::schemaDefinitions(void) - ??1QContactGeolocation@QtMobility@@UAE@XZ @ 76 NONAME ; QtMobility::QContactGeolocation::~QContactGeolocation(void) - ?detailDefinitionName@QContactDetailFilter@QtMobility@@QBE?AVQString@@XZ @ 77 NONAME ; class QString QtMobility::QContactDetailFilter::detailDefinitionName(void) const - ?getStaticMetaObject@QContactLocalIdFetchRequest@QtMobility@@SAABUQMetaObject@@XZ @ 78 NONAME ; struct QMetaObject const & QtMobility::QContactLocalIdFetchRequest::getStaticMetaObject(void) - ?relatedContacts@QContact@QtMobility@@QBE?AV?$QList@VQContactId@QtMobility@@@@ABVQString@@W4Role@QContactRelationshipFilter@2@@Z @ 79 NONAME ; class QList QtMobility::QContact::relatedContacts(class QString const &, enum QtMobility::QContactRelationshipFilter::Role) const - ?setName@QContactDetailDefinition@QtMobility@@QAEXABVQString@@@Z @ 80 NONAME ; void QtMobility::QContactDetailDefinition::setName(class QString const &) - ?displayLabel@QContact@QtMobility@@QBE?AVQString@@XZ @ 81 NONAME ; class QString QtMobility::QContact::displayLabel(void) const - ?assign@QContactDetail@QtMobility@@IAEAAV12@ABV12@ABVQString@@@Z @ 82 NONAME ; class QtMobility::QContactDetail & QtMobility::QContactDetail::assign(class QtMobility::QContactDetail const &, class QString const &) - ??4QContactEmailAddress@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 83 NONAME ; class QtMobility::QContactEmailAddress & QtMobility::QContactEmailAddress::operator=(class QtMobility::QContactDetail const &) - ?tr@QContactSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 84 NONAME ; class QString QtMobility::QContactSaveRequest::tr(char const *, char const *, int) - ?DefinitionName@QContactOrganization@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 85 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactOrganization::DefinitionName - ??1QContactBirthday@QtMobility@@UAE@XZ @ 86 NONAME ; QtMobility::QContactBirthday::~QContactBirthday(void) - ?removeRelationship@QContactManagerEngine@QtMobility@@UAE_NABVQContactRelationship@2@AAW4Error@QContactManager@2@@Z @ 87 NONAME ; bool QtMobility::QContactManagerEngine::removeRelationship(class QtMobility::QContactRelationship const &, enum QtMobility::QContactManager::Error &) - ?qt_metacall@QContactRelationshipSaveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 88 NONAME ; int QtMobility::QContactRelationshipSaveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) - ?trUtf8@QContactManager@QtMobility@@SA?AVQString@@PBD0H@Z @ 89 NONAME ; class QString QtMobility::QContactManager::trUtf8(char const *, char const *, int) - ?setSelfContactId@QContactMemoryEngine@QtMobility@@UAE_NABIAAW4Error@QContactManager@2@@Z @ 90 NONAME ; bool QtMobility::QContactMemoryEngine::setSelfContactId(unsigned int const &, enum QtMobility::QContactManager::Error &) - ?tr@QContactDetailDefinitionRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 91 NONAME ; class QString QtMobility::QContactDetailDefinitionRemoveRequest::tr(char const *, char const *, int) - ?definitions@QContactDetailDefinitionFetchRequest@QtMobility@@QBE?AV?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@XZ @ 92 NONAME ; class QMap QtMobility::QContactDetailDefinitionFetchRequest::definitions(void) const - ?setSubType@QContactAnniversary@QtMobility@@QAEXABVQString@@@Z @ 93 NONAME ; void QtMobility::QContactAnniversary::setSubType(class QString const &) - ?detailDefinition@QContactManagerEngine@QtMobility@@UBE?AVQContactDetailDefinition@2@ABVQString@@0AAW4Error@QContactManager@2@@Z @ 94 NONAME ; class QtMobility::QContactDetailDefinition QtMobility::QContactManagerEngine::detailDefinition(class QString const &, class QString const &, enum QtMobility::QContactManager::Error &) const - ??1QContact@QtMobility@@QAE@XZ @ 95 NONAME ; QtMobility::QContact::~QContact(void) - ?updateRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactAbstractRequest@2@ABV?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@W4Error@QContactManager@2@ABV?$QList@W4Error@QContactManager@QtMobility@@@@W4Status@32@_N@Z @ 96 NONAME ; void QtMobility::QContactManagerEngine::updateRequest(class QtMobility::QContactAbstractRequest *, class QMap const &, enum QtMobility::QContactManager::Error, class QList const &, enum QtMobility::QContactAbstractRequest::Status, bool) - ??9QContactSortOrder@QtMobility@@QBE_NABV01@@Z @ 97 NONAME ; bool QtMobility::QContactSortOrder::operator!=(class QtMobility::QContactSortOrder const &) const - ?FieldBirthday@QContactBirthday@QtMobility@@2U?$Latin1Literal@$08@2@B @ 98 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactBirthday::FieldBirthday - ?saveDetailDefinition@QContactManagerEngine@QtMobility@@UAE_NABVQContactDetailDefinition@2@ABVQString@@AAW4Error@QContactManager@2@@Z @ 99 NONAME ; bool QtMobility::QContactManagerEngine::saveDetailDefinition(class QtMobility::QContactDetailDefinition const &, class QString const &, enum QtMobility::QContactManager::Error &) - ?GenderFemale@QContactGender@QtMobility@@2U?$Latin1Literal@$06@2@B @ 100 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactGender::GenderFemale - ?trUtf8@QContactManager@QtMobility@@SA?AVQString@@PBD0@Z @ 101 NONAME ; class QString QtMobility::QContactManager::trUtf8(char const *, char const *) - ?details@QContact@QtMobility@@QBE?AV?$QList@VQContactDetail@QtMobility@@@@ABVQString@@00@Z @ 102 NONAME ; class QList QtMobility::QContact::details(class QString const &, class QString const &, class QString const &) const - ?FieldChildren@QContactFamily@QtMobility@@2U?$Latin1Literal@$08@2@B @ 103 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactFamily::FieldChildren - ?setName@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 104 NONAME ; void QtMobility::QContactOrganization::setName(class QString const &) - ?setNames@QContactDetailDefinitionFetchRequest@QtMobility@@QAEXABVQStringList@@@Z @ 105 NONAME ; void QtMobility::QContactDetailDefinitionFetchRequest::setNames(class QStringList const &) - ?append@QContactUnionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 106 NONAME ; void QtMobility::QContactUnionFilter::append(class QtMobility::QContactFilter const &) - ?isFinished@QContactAbstractRequest@QtMobility@@QBE_NXZ @ 107 NONAME ; bool QtMobility::QContactAbstractRequest::isFinished(void) const - ??0QContactChangeSet@QtMobility@@QAE@XZ @ 108 NONAME ; QtMobility::QContactChangeSet::QContactChangeSet(void) - ??0QContactInvalidFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 109 NONAME ; QtMobility::QContactInvalidFilter::QContactInvalidFilter(class QtMobility::QContactFilter const &) - ?addedRelationshipsContacts@QContactChangeSet@QtMobility@@QAEAAV?$QSet@I@@XZ @ 110 NONAME ; class QSet & QtMobility::QContactChangeSet::addedRelationshipsContacts(void) - ?createEngine@QContactManager@QtMobility@@AAEXABVQString@@ABV?$QMap@VQString@@V1@@@@Z @ 111 NONAME ; void QtMobility::QContactManager::createEngine(class QString const &, class QMap const &) - ??0QContactAddress@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 112 NONAME ; QtMobility::QContactAddress::QContactAddress(class QtMobility::QContactDetail const &) - ??1QContactRelationship@QtMobility@@QAE@XZ @ 113 NONAME ; QtMobility::QContactRelationship::~QContactRelationship(void) - ?d_func@QContactRelationshipFetchRequest@QtMobility@@ABEPBVQContactRelationshipFetchRequestPrivate@2@XZ @ 114 NONAME ; class QtMobility::QContactRelationshipFetchRequestPrivate const * QtMobility::QContactRelationshipFetchRequest::d_func(void) const - ?ContextWork@QContactDetail@QtMobility@@2U?$Latin1Literal@$04@2@B @ 115 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactDetail::ContextWork - ?tr@QContactRelationshipRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 116 NONAME ; class QString QtMobility::QContactRelationshipRemoveRequest::tr(char const *, char const *, int) - ??4QContactDetail@QtMobility@@QAEAAV01@ABV01@@Z @ 117 NONAME ; class QtMobility::QContactDetail & QtMobility::QContactDetail::operator=(class QtMobility::QContactDetail const &) - ??0QContactId@QtMobility@@QAE@XZ @ 118 NONAME ; QtMobility::QContactId::QContactId(void) - ?url@QContactUrl@QtMobility@@QBE?AVQString@@XZ @ 119 NONAME ; class QString QtMobility::QContactUrl::url(void) const - ?managerParameters@QContactMemoryEngine@QtMobility@@UBE?AV?$QMap@VQString@@V1@@@XZ @ 120 NONAME ; class QMap QtMobility::QContactMemoryEngine::managerParameters(void) const - ?setPostOfficeBox@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 121 NONAME ; void QtMobility::QContactAddress::setPostOfficeBox(class QString const &) - ??_EQContactAbstractRequest@QtMobility@@UAE@I@Z @ 122 NONAME ; QtMobility::QContactAbstractRequest::~QContactAbstractRequest(unsigned int) - ??4QContactDetailDefinitionField@QtMobility@@QAEAAV01@ABV01@@Z @ 123 NONAME ; class QtMobility::QContactDetailDefinitionField & QtMobility::QContactDetailDefinitionField::operator=(class QtMobility::QContactDetailDefinitionField const &) - ?updateRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactAbstractRequest@2@ABV?$QList@VQContact@QtMobility@@@@W4Error@QContactManager@2@ABV?$QList@W4Error@QContactManager@QtMobility@@@@W4Status@32@_N@Z @ 124 NONAME ; void QtMobility::QContactManagerEngine::updateRequest(class QtMobility::QContactAbstractRequest *, class QList const &, enum QtMobility::QContactManager::Error, class QList const &, enum QtMobility::QContactAbstractRequest::Status, bool) - ?location@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 125 NONAME ; class QString QtMobility::QContactOrganization::location(void) const - ?FieldAltitude@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$08@2@B @ 126 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactGeolocation::FieldAltitude - ?minValue@QContactDetailRangeFilter@QtMobility@@QBE?AVQVariant@@XZ @ 127 NONAME ; class QVariant QtMobility::QContactDetailRangeFilter::minValue(void) const - ??_EQContactRelationshipFetchRequest@QtMobility@@UAE@I@Z @ 128 NONAME ; QtMobility::QContactRelationshipFetchRequest::~QContactRelationshipFetchRequest(unsigned int) - ??0QContactManager@QtMobility@@QAE@ABVQString@@HABV?$QMap@VQString@@V1@@@PAVQObject@@@Z @ 129 NONAME ; QtMobility::QContactManager::QContactManager(class QString const &, int, class QMap const &, class QObject *) - ??_EQContactNickname@QtMobility@@UAE@I@Z @ 130 NONAME ; QtMobility::QContactNickname::~QContactNickname(unsigned int) - ?detailsWithAction@QContact@QtMobility@@QBE?AV?$QList@VQContactDetail@QtMobility@@@@ABVQString@@@Z @ 131 NONAME ; class QList QtMobility::QContact::detailsWithAction(class QString const &) const - ?qt_metacall@QContactDetailDefinitionRemoveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 132 NONAME ; int QtMobility::QContactDetailDefinitionRemoveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) - ??_EQContactInvalidFilter@QtMobility@@UAE@I@Z @ 133 NONAME ; QtMobility::QContactInvalidFilter::~QContactInvalidFilter(unsigned int) - ??_EQContactGeolocation@QtMobility@@UAE@I@Z @ 134 NONAME ; QtMobility::QContactGeolocation::~QContactGeolocation(unsigned int) - ??0QContactOnlineAccount@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 135 NONAME ; QtMobility::QContactOnlineAccount::QContactOnlineAccount(class QtMobility::QContactDetail const &) - ?actionName@QContactActionDescriptor@QtMobility@@QBE?AVQString@@XZ @ 136 NONAME ; class QString QtMobility::QContactActionDescriptor::actionName(void) const - ?setHeading@QContactGeolocation@QtMobility@@QAEXN@Z @ 137 NONAME ; void QtMobility::QContactGeolocation::setHeading(double) - ?d_func@QContactUnionFilter@QtMobility@@ABEPBVQContactUnionFilterPrivate@2@XZ @ 138 NONAME ; class QtMobility::QContactUnionFilterPrivate const * QtMobility::QContactUnionFilter::d_func(void) const - ?actionDescriptors@QContactAction@QtMobility@@SA?AV?$QList@VQContactActionDescriptor@QtMobility@@@@ABVQString@@0H@Z @ 139 NONAME ; class QList QtMobility::QContactAction::actionDescriptors(class QString const &, class QString const &, int) - ?detailFieldName@QContactDetailRangeFilter@QtMobility@@QBE?AVQString@@XZ @ 140 NONAME ; class QString QtMobility::QContactDetailRangeFilter::detailFieldName(void) const - ?setFirst@QContactRelationship@QtMobility@@QAEXABVQContactId@2@@Z @ 141 NONAME ; void QtMobility::QContactRelationship::setFirst(class QtMobility::QContactId const &) - ??9QContactDetail@QtMobility@@QBE_NABV01@@Z @ 142 NONAME ; bool QtMobility::QContactDetail::operator!=(class QtMobility::QContactDetail const &) const - ?saveRelationships@QContactManager@QtMobility@@QAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 143 NONAME ; class QList QtMobility::QContactManager::saveRelationships(class QList *) - ?middle@QContactName@QtMobility@@QBE?AVQString@@XZ @ 144 NONAME ; class QString QtMobility::QContactName::middle(void) const - ?managerName@QContactManagerEngine@QtMobility@@UBE?AVQString@@XZ @ 145 NONAME ; class QString QtMobility::QContactManagerEngine::managerName(void) const - ?FieldSpouse@QContactFamily@QtMobility@@2U?$Latin1Literal@$06@2@B @ 146 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactFamily::FieldSpouse - ?cancelRequest@QContactManagerEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@@Z @ 147 NONAME ; bool QtMobility::QContactManagerEngine::cancelRequest(class QtMobility::QContactAbstractRequest *) - ?FieldAvatarPixmap@QContactAvatar@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 148 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactAvatar::FieldAvatarPixmap - ?trUtf8@QContactFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 149 NONAME ; class QString QtMobility::QContactFetchRequest::trUtf8(char const *, char const *) - ?trUtf8@QContactRelationshipSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 150 NONAME ; class QString QtMobility::QContactRelationshipSaveRequest::trUtf8(char const *, char const *) - ?setUnique@QContactDetailDefinition@QtMobility@@QAEX_N@Z @ 151 NONAME ; void QtMobility::QContactDetailDefinition::setUnique(bool) - ?subType@QContactAnniversary@QtMobility@@QBE?AVQString@@XZ @ 152 NONAME ; class QString QtMobility::QContactAnniversary::subType(void) const - ?FieldSubType@QContactAvatar@QtMobility@@2U?$Latin1Literal@$07@2@B @ 153 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactAvatar::FieldSubType - ??9QContactRelationship@QtMobility@@QBE_NABV01@@Z @ 154 NONAME ; bool QtMobility::QContactRelationship::operator!=(class QtMobility::QContactRelationship const &) const - ?getStaticMetaObject@QContactRelationshipSaveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 155 NONAME ; struct QMetaObject const & QtMobility::QContactRelationshipSaveRequest::getStaticMetaObject(void) - ??4QContactId@QtMobility@@QAEAAV01@ABV01@@Z @ 156 NONAME ; class QtMobility::QContactId & QtMobility::QContactId::operator=(class QtMobility::QContactId const &) - ??4QContact@QtMobility@@QAEAAV01@ABV01@@Z @ 157 NONAME ; class QtMobility::QContact & QtMobility::QContact::operator=(class QtMobility::QContact const &) - ??1QContactChangeLogFilter@QtMobility@@UAE@XZ @ 158 NONAME ; QtMobility::QContactChangeLogFilter::~QContactChangeLogFilter(void) - ?FieldLongitude@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$09@2@B @ 159 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactGeolocation::FieldLongitude - ?HasManager@QContactRelationship@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 160 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactRelationship::HasManager - ?subTypes@QContactPhoneNumber@QtMobility@@QBE?AVQStringList@@XZ @ 161 NONAME ; class QStringList QtMobility::QContactPhoneNumber::subTypes(void) const - ?prepend@QContactUnionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 162 NONAME ; void QtMobility::QContactUnionFilter::prepend(class QtMobility::QContactFilter const &) - ?postcode@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 163 NONAME ; class QString QtMobility::QContactAddress::postcode(void) const - ?DefinitionName@QContactUrl@QtMobility@@2U?$Latin1Literal@$03@2@B @ 164 NONAME ; struct QtMobility::Latin1Literal<4> const QtMobility::QContactUrl::DefinitionName - ?setLatitude@QContactGeolocation@QtMobility@@QAEXN@Z @ 165 NONAME ; void QtMobility::QContactGeolocation::setLatitude(double) - ?errors@QContactAbstractRequest@QtMobility@@QBE?AV?$QList@W4Error@QContactManager@QtMobility@@@@XZ @ 166 NONAME ; class QList QtMobility::QContactAbstractRequest::errors(void) const - ?selfContactIdChanged@QContactManagerEngine@QtMobility@@IAEXABI0@Z @ 167 NONAME ; void QtMobility::QContactManagerEngine::selfContactIdChanged(unsigned int const &, unsigned int const &) - ?removeRelationships@QContactManagerEngine@QtMobility@@UAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@ABV?$QList@VQContactRelationship@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 168 NONAME ; class QList QtMobility::QContactManagerEngine::removeRelationships(class QList const &, enum QtMobility::QContactManager::Error &) - ?accessConstraint@QContactDetailDefinitionField@QtMobility@@QBE?AW4AccessConstraint@12@XZ @ 169 NONAME ; enum QtMobility::QContactDetailDefinitionField::AccessConstraint QtMobility::QContactDetailDefinitionField::accessConstraint(void) const - ?SubTypeInternational@QContactAddress@QtMobility@@2U?$Latin1Literal@$0O@@2@B @ 170 NONAME ; struct QtMobility::Latin1Literal<14> const QtMobility::QContactAddress::SubTypeInternational - ?d_func@QContactDetailDefinitionFetchRequest@QtMobility@@AAEPAVQContactDetailDefinitionFetchRequestPrivate@2@XZ @ 171 NONAME ; class QtMobility::QContactDetailDefinitionFetchRequestPrivate * QtMobility::QContactDetailDefinitionFetchRequest::d_func(void) - ?metaObject@QContactActionFactory@QtMobility@@UBEPBUQMetaObject@@XZ @ 172 NONAME ; struct QMetaObject const * QtMobility::QContactActionFactory::metaObject(void) const - ?setLast@QContactName@QtMobility@@QAEXABVQString@@@Z @ 173 NONAME ; void QtMobility::QContactName::setLast(class QString const &) - ??1QContactName@QtMobility@@UAE@XZ @ 174 NONAME ; QtMobility::QContactName::~QContactName(void) - ??0QContact@QtMobility@@QAE@XZ @ 175 NONAME ; QtMobility::QContact::QContact(void) - ?gender@QContactGender@QtMobility@@QBE?AVQString@@XZ @ 176 NONAME ; class QString QtMobility::QContactGender::gender(void) const - ?removeContact@QContactMemoryEngine@QtMobility@@UAE_NABIAAW4Error@QContactManager@2@@Z @ 177 NONAME ; bool QtMobility::QContactMemoryEngine::removeContact(unsigned int const &, enum QtMobility::QContactManager::Error &) - ??0QContactGender@QtMobility@@QAE@XZ @ 178 NONAME ; QtMobility::QContactGender::QContactGender(void) - ?availableManagers@QContactManager@QtMobility@@SA?AVQStringList@@XZ @ 179 NONAME ; class QStringList QtMobility::QContactManager::availableManagers(void) - ?setType@QContact@QtMobility@@QAEXABVQString@@@Z @ 180 NONAME ; void QtMobility::QContact::setType(class QString const &) - ??0QContactNote@QtMobility@@QAE@XZ @ 181 NONAME ; QtMobility::QContactNote::QContactNote(void) - ??1QContactGuid@QtMobility@@UAE@XZ @ 182 NONAME ; QtMobility::QContactGuid::~QContactGuid(void) - ?saveContacts@QContactManager@QtMobility@@QAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@VQContact@QtMobility@@@@@Z @ 183 NONAME ; class QList QtMobility::QContactManager::saveContacts(class QList *) - ??_EQContactGender@QtMobility@@UAE@I@Z @ 184 NONAME ; QtMobility::QContactGender::~QContactGender(unsigned int) - ?supportedDetails@QContactAction@QtMobility@@UBE?AV?$QList@VQContactDetail@QtMobility@@@@ABVQContact@2@@Z @ 185 NONAME ; class QList QtMobility::QContactAction::supportedDetails(class QtMobility::QContact const &) const - ?SubTypeCar@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$03@2@B @ 186 NONAME ; struct QtMobility::Latin1Literal<4> const QtMobility::QContactPhoneNumber::SubTypeCar - ?tr@QContactRelationshipSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 187 NONAME ; class QString QtMobility::QContactRelationshipSaveRequest::tr(char const *, char const *) - ?tr@QContactAbstractRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 188 NONAME ; class QString QtMobility::QContactAbstractRequest::tr(char const *, char const *) - ?selfContactId@QContactManager@QtMobility@@QBEIXZ @ 189 NONAME ; unsigned int QtMobility::QContactManager::selfContactId(void) const - ?d_func@QContactRelationshipSaveRequest@QtMobility@@ABEPBVQContactRelationshipSaveRequestPrivate@2@XZ @ 190 NONAME ; class QtMobility::QContactRelationshipSaveRequestPrivate const * QtMobility::QContactRelationshipSaveRequest::d_func(void) const - ?FieldNumber@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$0M@@2@B @ 191 NONAME ; struct QtMobility::Latin1Literal<12> const QtMobility::QContactPhoneNumber::FieldNumber - ?isActive@QContactAbstractRequest@QtMobility@@QBE_NXZ @ 192 NONAME ; bool QtMobility::QContactAbstractRequest::isActive(void) const - ??_EQContactDetail@QtMobility@@UAE@I@Z @ 193 NONAME ; QtMobility::QContactDetail::~QContactDetail(unsigned int) - ?getStaticMetaObject@QContactAction@QtMobility@@SAABUQMetaObject@@XZ @ 194 NONAME ; struct QMetaObject const & QtMobility::QContactAction::getStaticMetaObject(void) - ?deref@QContactMemoryEngine@QtMobility@@UAEXXZ @ 195 NONAME ; void QtMobility::QContactMemoryEngine::deref(void) - ??1QContactAddress@QtMobility@@UAE@XZ @ 196 NONAME ; QtMobility::QContactAddress::~QContactAddress(void) - ??_EQContactChangeLogFilter@QtMobility@@UAE@I@Z @ 197 NONAME ; QtMobility::QContactChangeLogFilter::~QContactChangeLogFilter(unsigned int) - ?setSubType@QContactUrl@QtMobility@@QAEXABVQString@@@Z @ 198 NONAME ; void QtMobility::QContactUrl::setSubType(class QString const &) - ?SubTypeModem@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$05@2@B @ 199 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactPhoneNumber::SubTypeModem - ??4QContactNote@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 200 NONAME ; class QtMobility::QContactNote & QtMobility::QContactNote::operator=(class QtMobility::QContactDetail const &) - ?setSubTypes@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 201 NONAME ; void QtMobility::QContactAddress::setSubTypes(class QString const &) - ??1QContactMemoryEngine@QtMobility@@UAE@XZ @ 202 NONAME ; QtMobility::QContactMemoryEngine::~QContactMemoryEngine(void) - ?setCreated@QContactTimestamp@QtMobility@@QAEXABVQDateTime@@@Z @ 203 NONAME ; void QtMobility::QContactTimestamp::setCreated(class QDateTime const &) - ?relationships@QContactRelationshipFetchRequest@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@XZ @ 204 NONAME ; class QList QtMobility::QContactRelationshipFetchRequest::relationships(void) const - ??1QContactFetchRequest@QtMobility@@UAE@XZ @ 205 NONAME ; QtMobility::QContactFetchRequest::~QContactFetchRequest(void) - ??0QContactAvatar@QtMobility@@QAE@XZ @ 206 NONAME ; QtMobility::QContactAvatar::QContactAvatar(void) - ?saveRelationship@QContactManagerEngine@QtMobility@@UAE_NPAVQContactRelationship@2@AAW4Error@QContactManager@2@@Z @ 207 NONAME ; bool QtMobility::QContactManagerEngine::saveRelationship(class QtMobility::QContactRelationship *, enum QtMobility::QContactManager::Error &) - ??1QContactLocalIdFetchRequest@QtMobility@@UAE@XZ @ 208 NONAME ; QtMobility::QContactLocalIdFetchRequest::~QContactLocalIdFetchRequest(void) - ?ContextOther@QContactDetail@QtMobility@@2U?$Latin1Literal@$05@2@B @ 209 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactDetail::ContextOther - ?setCaseSensitivity@QContactSortOrder@QtMobility@@QAEXW4CaseSensitivity@Qt@@@Z @ 210 NONAME ; void QtMobility::QContactSortOrder::setCaseSensitivity(enum Qt::CaseSensitivity) - ?saveContacts@QContactMemoryEngine@QtMobility@@UAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@VQContact@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 211 NONAME ; class QList QtMobility::QContactMemoryEngine::saveContacts(class QList *, enum QtMobility::QContactManager::Error &) - ??0QContactOnlineAccount@QtMobility@@QAE@XZ @ 212 NONAME ; QtMobility::QContactOnlineAccount::QContactOnlineAccount(void) - ?setSecond@QContactRelationship@QtMobility@@QAEXABVQContactId@2@@Z @ 213 NONAME ; void QtMobility::QContactRelationship::setSecond(class QtMobility::QContactId const &) - ?country@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 214 NONAME ; class QString QtMobility::QContactAddress::country(void) const - ?setTitle@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 215 NONAME ; void QtMobility::QContactOrganization::setTitle(class QString const &) - ?saveRelationships@QContactMemoryEngine@QtMobility@@UAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@VQContactRelationship@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 216 NONAME ; class QList QtMobility::QContactMemoryEngine::saveRelationships(class QList *, enum QtMobility::QContactManager::Error &) - ?FieldLabel@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$05@2@B @ 217 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactGeolocation::FieldLabel - ?setContactType@QContactDetailDefinitionRemoveRequest@QtMobility@@QAEXABVQString@@@Z @ 218 NONAME ; void QtMobility::QContactDetailDefinitionRemoveRequest::setContactType(class QString const &) - ??0QContactFamily@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 219 NONAME ; QtMobility::QContactFamily::QContactFamily(class QtMobility::QContactDetail const &) - ?latitude@QContactGeolocation@QtMobility@@QBENXZ @ 220 NONAME ; double QtMobility::QContactGeolocation::latitude(void) const - ?trUtf8@QContactDetailDefinitionRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 221 NONAME ; class QString QtMobility::QContactDetailDefinitionRemoveRequest::trUtf8(char const *, char const *, int) - ??0QContactDetailDefinition@QtMobility@@QAE@ABV01@@Z @ 222 NONAME ; QtMobility::QContactDetailDefinition::QContactDetailDefinition(class QtMobility::QContactDetailDefinition const &) - ?prepend@QContactIntersectionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 223 NONAME ; void QtMobility::QContactIntersectionFilter::prepend(class QtMobility::QContactFilter const &) - ?splitUri@QContactManager@QtMobility@@SA_NABVQString@@PAV3@PAV?$QMap@VQString@@V1@@@@Z @ 224 NONAME ; bool QtMobility::QContactManager::splitUri(class QString const &, class QString *, class QMap *) - ?setFilters@QContactUnionFilter@QtMobility@@QAEXABV?$QList@VQContactFilter@QtMobility@@@@@Z @ 225 NONAME ; void QtMobility::QContactUnionFilter::setFilters(class QList const &) - ?saveDetailDefinition@QContactManager@QtMobility@@QAE_NABVQContactDetailDefinition@2@ABVQString@@@Z @ 226 NONAME ; bool QtMobility::QContactManager::saveDetailDefinition(class QtMobility::QContactDetailDefinition const &, class QString const &) - ??0QContactAnniversary@QtMobility@@QAE@XZ @ 227 NONAME ; QtMobility::QContactAnniversary::QContactAnniversary(void) - ?version@QContactManagerEngineFactory@QtMobility@@QBEHXZ @ 228 NONAME ; int QtMobility::QContactManagerEngineFactory::version(void) const - ?waitForFinished@QContactAbstractRequest@QtMobility@@QAE_NH@Z @ 229 NONAME ; bool QtMobility::QContactAbstractRequest::waitForFinished(int) - ?qt_metacast@QContactManager@QtMobility@@UAEPAXPBD@Z @ 230 NONAME ; void * QtMobility::QContactManager::qt_metacast(char const *) - ?detailDefinitions@QContactManagerEngine@QtMobility@@UBE?AV?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@ABVQString@@AAW4Error@QContactManager@2@@Z @ 231 NONAME ; class QMap QtMobility::QContactManagerEngine::detailDefinitions(class QString const &, enum QtMobility::QContactManager::Error &) const - ?last@QContactName@QtMobility@@QBE?AVQString@@XZ @ 232 NONAME ; class QString QtMobility::QContactName::last(void) const - ?oldAndNewSelfContactId@QContactChangeSet@QtMobility@@QAEAAU?$QPair@II@@XZ @ 233 NONAME ; struct QPair & QtMobility::QContactChangeSet::oldAndNewSelfContactId(void) - ?contacts@QContactMemoryEngine@QtMobility@@UBE?AV?$QList@I@@ABV?$QList@VQContactSortOrder@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 234 NONAME ; class QList QtMobility::QContactMemoryEngine::contacts(class QList const &, enum QtMobility::QContactManager::Error &) const - ?trUtf8@QContactRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 235 NONAME ; class QString QtMobility::QContactRemoveRequest::trUtf8(char const *, char const *, int) - ??_EQContactSyncTarget@QtMobility@@UAE@I@Z @ 236 NONAME ; QtMobility::QContactSyncTarget::~QContactSyncTarget(unsigned int) - ?title@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 237 NONAME ; class QString QtMobility::QContactOrganization::title(void) const - ?FieldLabel@QContactDisplayLabel@QtMobility@@2U?$Latin1Literal@$05@2@B @ 238 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactDisplayLabel::FieldLabel - ??1QContactRelationshipSaveRequest@QtMobility@@UAE@XZ @ 239 NONAME ; QtMobility::QContactRelationshipSaveRequest::~QContactRelationshipSaveRequest(void) - ?isEmpty@QContactDetail@QtMobility@@QBE_NXZ @ 240 NONAME ; bool QtMobility::QContactDetail::isEmpty(void) const - ?progress@QContactRelationshipRemoveRequest@QtMobility@@IAEXPAV12@@Z @ 241 NONAME ; void QtMobility::QContactRelationshipRemoveRequest::progress(class QtMobility::QContactRelationshipRemoveRequest *) - ?setFilter@QContactLocalIdFetchRequest@QtMobility@@QAEXABVQContactFilter@2@@Z @ 242 NONAME ; void QtMobility::QContactLocalIdFetchRequest::setFilter(class QtMobility::QContactFilter const &) - ?PresenceAway@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$04@2@B @ 243 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactOnlineAccount::PresenceAway - ?detailFieldName@QContactDetailFilter@QtMobility@@QBE?AVQString@@XZ @ 244 NONAME ; class QString QtMobility::QContactDetailFilter::detailFieldName(void) const - ?contactType@QContactDetailDefinitionFetchRequest@QtMobility@@QBE?AVQString@@XZ @ 245 NONAME ; class QString QtMobility::QContactDetailDefinitionFetchRequest::contactType(void) const - ?compareVariant@QContactManagerEngine@QtMobility@@SAHABVQVariant@@0W4CaseSensitivity@Qt@@@Z @ 246 NONAME ; int QtMobility::QContactManagerEngine::compareVariant(class QVariant const &, class QVariant const &, enum Qt::CaseSensitivity) - ?setAllowableValues@QContactDetailDefinitionField@QtMobility@@QAEXV?$QList@VQVariant@@@@@Z @ 247 NONAME ; void QtMobility::QContactDetailDefinitionField::setAllowableValues(class QList) - ?blankPolicy@QContactSortOrder@QtMobility@@QBE?AW4BlankPolicy@12@XZ @ 248 NONAME ; enum QtMobility::QContactSortOrder::BlankPolicy QtMobility::QContactSortOrder::blankPolicy(void) const - ?setSpouse@QContactFamily@QtMobility@@QAEXABVQString@@@Z @ 249 NONAME ; void QtMobility::QContactFamily::setSpouse(class QString const &) - ?progress@QContactAction@QtMobility@@IAEXW4Status@12@ABV?$QMap@VQString@@VQVariant@@@@@Z @ 250 NONAME ; void QtMobility::QContactAction::progress(enum QtMobility::QContactAction::Status, class QMap const &) - ?qt_metacast@QContactAbstractRequest@QtMobility@@UAEPAXPBD@Z @ 251 NONAME ; void * QtMobility::QContactAbstractRequest::qt_metacast(char const *) - ??_EQContactIntersectionFilter@QtMobility@@UAE@I@Z @ 252 NONAME ; QtMobility::QContactIntersectionFilter::~QContactIntersectionFilter(unsigned int) - ?allowableValues@QContactDetailDefinitionField@QtMobility@@QBE?AV?$QList@VQVariant@@@@XZ @ 253 NONAME ; class QList QtMobility::QContactDetailDefinitionField::allowableValues(void) const - ?setActionName@QContactActionDescriptor@QtMobility@@QAEXABVQString@@@Z @ 254 NONAME ; void QtMobility::QContactActionDescriptor::setActionName(class QString const &) - ?SubTypeVoice@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$05@2@B @ 255 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactPhoneNumber::SubTypeVoice - ?altitudeAccuracy@QContactGeolocation@QtMobility@@QBENXZ @ 256 NONAME ; double QtMobility::QContactGeolocation::altitudeAccuracy(void) const - ?setPreferredDetail@QContact@QtMobility@@QAE_NABVQString@@ABVQContactDetail@2@@Z @ 257 NONAME ; bool QtMobility::QContact::setPreferredDetail(class QString const &, class QtMobility::QContactDetail const &) - ??0QContactActionDescriptor@QtMobility@@QAE@ABVQString@@0H@Z @ 258 NONAME ; QtMobility::QContactActionDescriptor::QContactActionDescriptor(class QString const &, class QString const &, int) - ??0QContactInvalidFilter@QtMobility@@QAE@XZ @ 259 NONAME ; QtMobility::QContactInvalidFilter::QContactInvalidFilter(void) - ?trUtf8@QContactSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 260 NONAME ; class QString QtMobility::QContactSaveRequest::trUtf8(char const *, char const *, int) - ?staticMetaObject@QContactSaveRequest@QtMobility@@2UQMetaObject@@B @ 261 NONAME ; struct QMetaObject const QtMobility::QContactSaveRequest::staticMetaObject - ?engines@QContactMemoryEngine@QtMobility@@0V?$QMap@VQString@@PAVQContactMemoryEngine@QtMobility@@@@A @ 262 NONAME ; class QMap QtMobility::QContactMemoryEngine::engines - ?setValue@QContactDetail@QtMobility@@QAE_NABVQString@@ABVQVariant@@@Z @ 263 NONAME ; bool QtMobility::QContactDetail::setValue(class QString const &, class QVariant const &) - ??1QContactRelationshipFetchRequest@QtMobility@@UAE@XZ @ 264 NONAME ; QtMobility::QContactRelationshipFetchRequest::~QContactRelationshipFetchRequest(void) - ??_EQContactAvatar@QtMobility@@UAE@I@Z @ 265 NONAME ; QtMobility::QContactAvatar::~QContactAvatar(unsigned int) - ?setStreet@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 266 NONAME ; void QtMobility::QContactAddress::setStreet(class QString const &) - ?relationships@QContactManager@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@ABVQContactId@2@W4Role@QContactRelationshipFilter@2@@Z @ 267 NONAME ; class QList QtMobility::QContactManager::relationships(class QtMobility::QContactId const &, enum QtMobility::QContactRelationshipFilter::Role) const - ??0QContactBirthday@QtMobility@@QAE@XZ @ 268 NONAME ; QtMobility::QContactBirthday::QContactBirthday(void) - ??1QContactAnniversary@QtMobility@@UAE@XZ @ 269 NONAME ; QtMobility::QContactAnniversary::~QContactAnniversary(void) - ?availableActions@QContact@QtMobility@@QBE?AV?$QList@VQContactActionDescriptor@QtMobility@@@@ABVQString@@H@Z @ 270 NONAME ; class QList QtMobility::QContact::availableActions(class QString const &, int) const - ??4QContactPhoneNumber@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 271 NONAME ; class QtMobility::QContactPhoneNumber & QtMobility::QContactPhoneNumber::operator=(class QtMobility::QContactDetail const &) - ?updateRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactAbstractRequest@2@ABV?$QList@I@@W4Error@QContactManager@2@ABV?$QList@W4Error@QContactManager@QtMobility@@@@W4Status@32@_N@Z @ 272 NONAME ; void QtMobility::QContactManagerEngine::updateRequest(class QtMobility::QContactAbstractRequest *, class QList const &, enum QtMobility::QContactManager::Error, class QList const &, enum QtMobility::QContactAbstractRequest::Status, bool) - ?syncTarget@QContactSyncTarget@QtMobility@@QBE?AVQString@@XZ @ 273 NONAME ; class QString QtMobility::QContactSyncTarget::syncTarget(void) const - ?detailDefinitionName@QContactDetailRangeFilter@QtMobility@@QBE?AVQString@@XZ @ 274 NONAME ; class QString QtMobility::QContactDetailRangeFilter::detailDefinitionName(void) const - ?setIds@QContactLocalIdFilter@QtMobility@@QAEXABV?$QList@I@@@Z @ 275 NONAME ; void QtMobility::QContactLocalIdFilter::setIds(class QList const &) - ?qt_metacast@QContactActionFactory@QtMobility@@UAEPAXPBD@Z @ 276 NONAME ; void * QtMobility::QContactActionFactory::qt_metacast(char const *) - ?d_func@QContactRemoveRequest@QtMobility@@ABEPBVQContactRemoveRequestPrivate@2@XZ @ 277 NONAME ; class QtMobility::QContactRemoveRequestPrivate const * QtMobility::QContactRemoveRequest::d_func(void) const - ?tr@QContactDetailDefinitionRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 278 NONAME ; class QString QtMobility::QContactDetailDefinitionRemoveRequest::tr(char const *, char const *) - ??4QContactUrl@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 279 NONAME ; class QtMobility::QContactUrl & QtMobility::QContactUrl::operator=(class QtMobility::QContactDetail const &) - ?setTimestamp@QContactGeolocation@QtMobility@@QAEXABVQDateTime@@@Z @ 280 NONAME ; void QtMobility::QContactGeolocation::setTimestamp(class QDateTime const &) - ?localId@QContact@QtMobility@@QBEIXZ @ 281 NONAME ; unsigned int QtMobility::QContact::localId(void) const - ??0QContactUrl@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 282 NONAME ; QtMobility::QContactUrl::QContactUrl(class QtMobility::QContactDetail const &) - ?DefinitionName@QContactNickname@QtMobility@@2U?$Latin1Literal@$08@2@B @ 283 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactNickname::DefinitionName - ?removeContacts@QContactMemoryEngine@QtMobility@@UAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@I@@AAW4Error@QContactManager@2@@Z @ 284 NONAME ; class QList QtMobility::QContactMemoryEngine::removeContacts(class QList *, enum QtMobility::QContactManager::Error &) - ?PresenceExtendedAway@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 285 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactOnlineAccount::PresenceExtendedAway - ?setDirection@QContactSortOrder@QtMobility@@QAEXW4SortOrder@Qt@@@Z @ 286 NONAME ; void QtMobility::QContactSortOrder::setDirection(enum Qt::SortOrder) - ?implementationVersion@QContactActionDescriptor@QtMobility@@QBEHXZ @ 287 NONAME ; int QtMobility::QContactActionDescriptor::implementationVersion(void) const - ?d_func@QContactSaveRequest@QtMobility@@AAEPAVQContactSaveRequestPrivate@2@XZ @ 288 NONAME ; class QtMobility::QContactSaveRequestPrivate * QtMobility::QContactSaveRequest::d_func(void) - ?pixmap@QContactAvatar@QtMobility@@QBE?AVQPixmap@@XZ @ 289 NONAME ; class QPixmap QtMobility::QContactAvatar::pixmap(void) const - ?setRole@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 290 NONAME ; void QtMobility::QContactOrganization::setRole(class QString const &) - ??8QContactSortOrder@QtMobility@@QBE_NABV01@@Z @ 291 NONAME ; bool QtMobility::QContactSortOrder::operator==(class QtMobility::QContactSortOrder const &) const - ?FieldType@QContactType@QtMobility@@2U?$Latin1Literal@$04@2@B @ 292 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactType::FieldType - ?spouse@QContactFamily@QtMobility@@QBE?AVQString@@XZ @ 293 NONAME ; class QString QtMobility::QContactFamily::spouse(void) const - ??_EQContactMemoryEngine@QtMobility@@UAE@I@Z @ 294 NONAME ; QtMobility::QContactMemoryEngine::~QContactMemoryEngine(unsigned int) - ?tr@QContactLocalIdFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 295 NONAME ; class QString QtMobility::QContactLocalIdFetchRequest::tr(char const *, char const *) - ?setDetailDefinitionName@QContactSortOrder@QtMobility@@QAEXABVQString@@0@Z @ 296 NONAME ; void QtMobility::QContactSortOrder::setDetailDefinitionName(class QString const &, class QString const &) - ?FieldLatitude@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$08@2@B @ 297 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactGeolocation::FieldLatitude - ?trUtf8@QContactRelationshipRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 298 NONAME ; class QString QtMobility::QContactRelationshipRemoveRequest::trUtf8(char const *, char const *) - ?role@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 299 NONAME ; class QString QtMobility::QContactOrganization::role(void) const - ?removeValue@QContactDetail@QtMobility@@QAE_NABVQString@@@Z @ 300 NONAME ; bool QtMobility::QContactDetail::removeValue(class QString const &) - ??0QContactId@QtMobility@@QAE@ABV01@@Z @ 301 NONAME ; QtMobility::QContactId::QContactId(class QtMobility::QContactId const &) - ??0QContactDetail@QtMobility@@QAE@XZ @ 302 NONAME ; QtMobility::QContactDetail::QContactDetail(void) - ?heading@QContactGeolocation@QtMobility@@QBENXZ @ 303 NONAME ; double QtMobility::QContactGeolocation::heading(void) const - ??0QContactName@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 304 NONAME ; QtMobility::QContactName::QContactName(class QtMobility::QContactDetail const &) - ?removeRelationships@QContactMemoryEngine@QtMobility@@UAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@ABV?$QList@VQContactRelationship@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 305 NONAME ; class QList QtMobility::QContactMemoryEngine::removeRelationships(class QList const &, enum QtMobility::QContactManager::Error &) - ?guid@QContactGuid@QtMobility@@QBE?AVQString@@XZ @ 306 NONAME ; class QString QtMobility::QContactGuid::guid(void) const - ??8QContactDetail@QtMobility@@QBE_NABV01@@Z @ 307 NONAME ; bool QtMobility::QContactDetail::operator==(class QtMobility::QContactDetail const &) const - ?FieldCustomLabel@QContactName@QtMobility@@2U?$Latin1Literal@$0M@@2@B @ 308 NONAME ; struct QtMobility::Latin1Literal<12> const QtMobility::QContactName::FieldCustomLabel - ?setPrefix@QContactName@QtMobility@@QAEXABVQString@@@Z @ 309 NONAME ; void QtMobility::QContactName::setPrefix(class QString const &) - ?metaObject@QContactMemoryEngine@QtMobility@@UBEPBUQMetaObject@@XZ @ 310 NONAME ; struct QMetaObject const * QtMobility::QContactMemoryEngine::metaObject(void) const - ?setGender@QContactGender@QtMobility@@QAEXABVQString@@@Z @ 311 NONAME ; void QtMobility::QContactGender::setGender(class QString const &) - ?DefinitionName@QContactFamily@QtMobility@@2U?$Latin1Literal@$06@2@B @ 312 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactFamily::DefinitionName - ?qt_metacast@QContactDetailDefinitionFetchRequest@QtMobility@@UAEPAXPBD@Z @ 313 NONAME ; void * QtMobility::QContactDetailDefinitionFetchRequest::qt_metacast(char const *) - ?fromUri@QContactManager@QtMobility@@SAPAV12@ABVQString@@PAVQObject@@@Z @ 314 NONAME ; class QtMobility::QContactManager * QtMobility::QContactManager::fromUri(class QString const &, class QObject *) - ?contact@QContactMemoryEngine@QtMobility@@UBE?AVQContact@2@ABIAAW4Error@QContactManager@2@@Z @ 315 NONAME ; class QtMobility::QContact QtMobility::QContactMemoryEngine::contact(unsigned int const &, enum QtMobility::QContactManager::Error &) const - ?setRelationshipType@QContactRelationshipFilter@QtMobility@@QAEXABVQString@@@Z @ 316 NONAME ; void QtMobility::QContactRelationshipFilter::setRelationshipType(class QString const &) - ?FieldSubTypes@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$08@2@B @ 317 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactPhoneNumber::FieldSubTypes - ?FieldSuffix@QContactName@QtMobility@@2U?$Latin1Literal@$06@2@B @ 318 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactName::FieldSuffix - ?startRequest@QContactMemoryEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@@Z @ 319 NONAME ; bool QtMobility::QContactMemoryEngine::startRequest(class QtMobility::QContactAbstractRequest *) - ?staticMetaObject@QContactRelationshipSaveRequest@QtMobility@@2UQMetaObject@@B @ 320 NONAME ; struct QMetaObject const QtMobility::QContactRelationshipSaveRequest::staticMetaObject - ?note@QContactNote@QtMobility@@QBE?AVQString@@XZ @ 321 NONAME ; class QString QtMobility::QContactNote::note(void) const - ??0QContactAbstractRequest@QtMobility@@IAE@PAVQContactAbstractRequestPrivate@1@@Z @ 322 NONAME ; QtMobility::QContactAbstractRequest::QContactAbstractRequest(class QtMobility::QContactAbstractRequestPrivate *) - ?saveContact@QContactMemoryEngine@QtMobility@@UAE_NPAVQContact@2@AAW4Error@QContactManager@2@@Z @ 323 NONAME ; bool QtMobility::QContactMemoryEngine::saveContact(class QtMobility::QContact *, enum QtMobility::QContactManager::Error &) - ?implementationVersion@QContactActionFilter@QtMobility@@QBEHXZ @ 324 NONAME ; int QtMobility::QContactActionFilter::implementationVersion(void) const - ?suffix@QContactName@QtMobility@@QBE?AVQString@@XZ @ 325 NONAME ; class QString QtMobility::QContactName::suffix(void) const - ?FieldSubType@QContactUrl@QtMobility@@2U?$Latin1Literal@$07@2@B @ 326 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactUrl::FieldSubType - ??_EQContactNote@QtMobility@@UAE@I@Z @ 327 NONAME ; QtMobility::QContactNote::~QContactNote(unsigned int) - ?d_func@QContactChangeLogFilter@QtMobility@@ABEPBVQContactChangeLogFilterPrivate@2@XZ @ 328 NONAME ; class QtMobility::QContactChangeLogFilterPrivate const * QtMobility::QContactChangeLogFilter::d_func(void) const - ??4QContactOnlineAccount@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 329 NONAME ; class QtMobility::QContactOnlineAccount & QtMobility::QContactOnlineAccount::operator=(class QtMobility::QContactDetail const &) - ?detailDefinition@QContactManager@QtMobility@@QBE?AVQContactDetailDefinition@2@ABVQString@@0@Z @ 330 NONAME ; class QtMobility::QContactDetailDefinition QtMobility::QContactManager::detailDefinition(class QString const &, class QString const &) const - ?d_func@QContactRelationshipRemoveRequest@QtMobility@@AAEPAVQContactRelationshipRemoveRequestPrivate@2@XZ @ 331 NONAME ; class QtMobility::QContactRelationshipRemoveRequestPrivate * QtMobility::QContactRelationshipRemoveRequest::d_func(void) - ?filterSupported@QContactManager@QtMobility@@QBE_NABVQContactFilter@2@@Z @ 332 NONAME ; bool QtMobility::QContactManager::filterSupported(class QtMobility::QContactFilter const &) const - ?id@QContact@QtMobility@@QBE?AVQContactId@2@XZ @ 333 NONAME ; class QtMobility::QContactId QtMobility::QContact::id(void) const - ?getStaticMetaObject@QContactRelationshipFetchRequest@QtMobility@@SAABUQMetaObject@@XZ @ 334 NONAME ; struct QMetaObject const & QtMobility::QContactRelationshipFetchRequest::getStaticMetaObject(void) - ?TypeGroup@QContactType@QtMobility@@2U?$Latin1Literal@$05@2@B @ 335 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactType::TypeGroup - ?maxValue@QContactDetailRangeFilter@QtMobility@@QBE?AVQVariant@@XZ @ 336 NONAME ; class QVariant QtMobility::QContactDetailRangeFilter::maxValue(void) const - ?tr@QContactDetailDefinitionSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 337 NONAME ; class QString QtMobility::QContactDetailDefinitionSaveRequest::tr(char const *, char const *) - ?setSubTypes@QContactOnlineAccount@QtMobility@@QAEXABVQStringList@@@Z @ 338 NONAME ; void QtMobility::QContactOnlineAccount::setSubTypes(class QStringList const &) - ?emitSignals@QContactChangeSet@QtMobility@@QAEXPAVQContactManagerEngine@2@@Z @ 339 NONAME ; void QtMobility::QContactChangeSet::emitSignals(class QtMobility::QContactManagerEngine *) - ?SubTypeVideoRingtone@QContactAvatar@QtMobility@@2U?$Latin1Literal@$0O@@2@B @ 340 NONAME ; struct QtMobility::Latin1Literal<14> const QtMobility::QContactAvatar::SubTypeVideoRingtone - ?FieldServiceProvider@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$0BA@@2@B @ 341 NONAME ; struct QtMobility::Latin1Literal<16> const QtMobility::QContactOnlineAccount::FieldServiceProvider - ?PresenceAvailable@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$09@2@B @ 342 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactOnlineAccount::PresenceAvailable - ??UQtMobility@@YA?BVQContactFilter@0@ABV10@0@Z @ 343 NONAME ; class QtMobility::QContactFilter const QtMobility::operator|(class QtMobility::QContactFilter const &, class QtMobility::QContactFilter const &) - ?calendarId@QContactAnniversary@QtMobility@@QBE?AVQString@@XZ @ 344 NONAME ; class QString QtMobility::QContactAnniversary::calendarId(void) const - ?staticMetaObject@QContactRemoveRequest@QtMobility@@2UQMetaObject@@B @ 345 NONAME ; struct QMetaObject const QtMobility::QContactRemoveRequest::staticMetaObject - ?contactsChanged@QContactManager@QtMobility@@IAEXABV?$QList@I@@@Z @ 346 NONAME ; void QtMobility::QContactManager::contactsChanged(class QList const &) - ?setCalendarId@QContactAnniversary@QtMobility@@QAEXABVQString@@@Z @ 347 NONAME ; void QtMobility::QContactAnniversary::setCalendarId(class QString const &) - ?removedContacts@QContactChangeSet@QtMobility@@QAEAAV?$QSet@I@@XZ @ 348 NONAME ; class QSet & QtMobility::QContactChangeSet::removedContacts(void) - ??9QContactActionDescriptor@QtMobility@@QBE_NABV01@@Z @ 349 NONAME ; bool QtMobility::QContactActionDescriptor::operator!=(class QtMobility::QContactActionDescriptor const &) const - ?FieldOriginalDate@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 350 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactAnniversary::FieldOriginalDate - ??1QContactDetailDefinition@QtMobility@@QAE@XZ @ 351 NONAME ; QtMobility::QContactDetailDefinition::~QContactDetailDefinition(void) - ?trUtf8@QContactDetailDefinitionRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 352 NONAME ; class QString QtMobility::QContactDetailDefinitionRemoveRequest::trUtf8(char const *, char const *) - ?metaObject@QContactDetailDefinitionRemoveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 353 NONAME ; struct QMetaObject const * QtMobility::QContactDetailDefinitionRemoveRequest::metaObject(void) const - ??4QContactGender@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 354 NONAME ; class QtMobility::QContactGender & QtMobility::QContactGender::operator=(class QtMobility::QContactDetail const &) - ?qt_metacast@QContactRemoveRequest@QtMobility@@UAEPAXPBD@Z @ 355 NONAME ; void * QtMobility::QContactRemoveRequest::qt_metacast(char const *) - ?SubTypeVideoShare@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 356 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactOnlineAccount::SubTypeVideoShare - ??1QContactDetailDefinitionRemoveRequest@QtMobility@@UAE@XZ @ 357 NONAME ; QtMobility::QContactDetailDefinitionRemoveRequest::~QContactDetailDefinitionRemoveRequest(void) - ??8QContactId@QtMobility@@QBE_NABV01@@Z @ 358 NONAME ; bool QtMobility::QContactId::operator==(class QtMobility::QContactId const &) const - ?FieldSubType@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$07@2@B @ 359 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactAnniversary::FieldSubType - ?tr@QContactActionFactory@QtMobility@@SA?AVQString@@PBD0H@Z @ 360 NONAME ; class QString QtMobility::QContactActionFactory::tr(char const *, char const *, int) - ?FieldPresence@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$08@2@B @ 361 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactOnlineAccount::FieldPresence - ?PresenceOffline@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$07@2@B @ 362 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactOnlineAccount::PresenceOffline - ?contexts@QContactDetail@QtMobility@@QBE?AVQStringList@@XZ @ 363 NONAME ; class QStringList QtMobility::QContactDetail::contexts(void) const - ??_EQContactDetailFilter@QtMobility@@UAE@I@Z @ 364 NONAME ; QtMobility::QContactDetailFilter::~QContactDetailFilter(unsigned int) - ?setAccountUri@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 365 NONAME ; void QtMobility::QContactOnlineAccount::setAccountUri(class QString const &) - ?trUtf8@QContactDetailDefinitionFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 366 NONAME ; class QString QtMobility::QContactDetailDefinitionFetchRequest::trUtf8(char const *, char const *) - ?DefinitionName@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$0M@@2@B @ 367 NONAME ; struct QtMobility::Latin1Literal<12> const QtMobility::QContactGeolocation::DefinitionName - ?SubTypeFavourite@QContactUrl@QtMobility@@2U?$Latin1Literal@$09@2@B @ 368 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactUrl::SubTypeFavourite - ?waitForRequestProgress@QContactMemoryEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@H@Z @ 369 NONAME ; bool QtMobility::QContactMemoryEngine::waitForRequestProgress(class QtMobility::QContactAbstractRequest *, int) - ?setImplementationVersion@QContactActionDescriptor@QtMobility@@QAEXH@Z @ 370 NONAME ; void QtMobility::QContactActionDescriptor::setImplementationVersion(int) - ?first@QContactRelationship@QtMobility@@QBE?AVQContactId@2@XZ @ 371 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationship::first(void) const - ??1QContactRelationshipRemoveRequest@QtMobility@@UAE@XZ @ 372 NONAME ; QtMobility::QContactRelationshipRemoveRequest::~QContactRelationshipRemoveRequest(void) - ?SubTypeAudioRingtone@QContactAvatar@QtMobility@@2U?$Latin1Literal@$0O@@2@B @ 373 NONAME ; struct QtMobility::Latin1Literal<14> const QtMobility::QContactAvatar::SubTypeAudioRingtone - ?accessConstraint@QContactDetailDefinition@QtMobility@@QBE?AW4AccessConstraint@12@XZ @ 374 NONAME ; enum QtMobility::QContactDetailDefinition::AccessConstraint QtMobility::QContactDetailDefinition::accessConstraint(void) const - ??_EQContactDetailRangeFilter@QtMobility@@UAE@I@Z @ 375 NONAME ; QtMobility::QContactDetailRangeFilter::~QContactDetailRangeFilter(unsigned int) - ??0QContactActionFilter@QtMobility@@QAE@XZ @ 376 NONAME ; QtMobility::QContactActionFilter::QContactActionFilter(void) - ??0QContactDetailRangeFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 377 NONAME ; QtMobility::QContactDetailRangeFilter::QContactDetailRangeFilter(class QtMobility::QContactFilter const &) - ?hasFeature@QContactManager@QtMobility@@QBE_NW4ManagerFeature@12@ABVQString@@@Z @ 378 NONAME ; bool QtMobility::QContactManager::hasFeature(enum QtMobility::QContactManager::ManagerFeature, class QString const &) const - ?SubTypeBulletinBoardSystem@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$0BE@@2@B @ 379 NONAME ; struct QtMobility::Latin1Literal<20> const QtMobility::QContactPhoneNumber::SubTypeBulletinBoardSystem - ?detailFieldName@QContactSortOrder@QtMobility@@QBE?AVQString@@XZ @ 380 NONAME ; class QString QtMobility::QContactSortOrder::detailFieldName(void) const - ?setRange@QContactDetailRangeFilter@QtMobility@@QAEXABVQVariant@@0V?$QFlags@W4RangeFlag@QContactDetailRangeFilter@QtMobility@@@@@Z @ 381 NONAME ; void QtMobility::QContactDetailRangeFilter::setRange(class QVariant const &, class QVariant const &, class QFlags) - ?removeDetail@QContact@QtMobility@@QAE_NPAVQContactDetail@2@@Z @ 382 NONAME ; bool QtMobility::QContact::removeDetail(class QtMobility::QContactDetail *) - ?FieldGender@QContactGender@QtMobility@@2U?$Latin1Literal@$06@2@B @ 383 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactGender::FieldGender - ?setDetailDefinitionName@QContactDetailRangeFilter@QtMobility@@QAEXABVQString@@0@Z @ 384 NONAME ; void QtMobility::QContactDetailRangeFilter::setDetailDefinitionName(class QString const &, class QString const &) - ?setLocation@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 385 NONAME ; void QtMobility::QContactOrganization::setLocation(class QString const &) - ??_EQContactFetchRequest@QtMobility@@UAE@I@Z @ 386 NONAME ; QtMobility::QContactFetchRequest::~QContactFetchRequest(unsigned int) - ?relationships@QContactManager@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@ABVQString@@ABVQContactId@2@W4Role@QContactRelationshipFilter@2@@Z @ 387 NONAME ; class QList QtMobility::QContactManager::relationships(class QString const &, class QtMobility::QContactId const &, enum QtMobility::QContactRelationshipFilter::Role) const - ?names@QContactDetailDefinitionRemoveRequest@QtMobility@@QBE?AVQStringList@@XZ @ 388 NONAME ; class QStringList QtMobility::QContactDetailDefinitionRemoveRequest::names(void) const - ?rangeFlags@QContactDetailRangeFilter@QtMobility@@QBE?AV?$QFlags@W4RangeFlag@QContactDetailRangeFilter@QtMobility@@@@XZ @ 389 NONAME ; class QFlags QtMobility::QContactDetailRangeFilter::rangeFlags(void) const - ?compareContact@QContactManagerEngine@QtMobility@@SAHABVQContact@2@0ABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 390 NONAME ; int QtMobility::QContactManagerEngine::compareContact(class QtMobility::QContact const &, class QtMobility::QContact const &, class QList const &) - ??_EQContactTimestamp@QtMobility@@UAE@I@Z @ 391 NONAME ; QtMobility::QContactTimestamp::~QContactTimestamp(unsigned int) - ?setManagerUri@QContactId@QtMobility@@QAEXABVQString@@@Z @ 392 NONAME ; void QtMobility::QContactId::setManagerUri(class QString const &) - ??1QContactRemoveRequest@QtMobility@@UAE@XZ @ 393 NONAME ; QtMobility::QContactRemoveRequest::~QContactRemoveRequest(void) - ?speed@QContactGeolocation@QtMobility@@QBENXZ @ 394 NONAME ; double QtMobility::QContactGeolocation::speed(void) const - ?addedContacts@QContactChangeSet@QtMobility@@QAEAAV?$QSet@I@@XZ @ 395 NONAME ; class QSet & QtMobility::QContactChangeSet::addedContacts(void) - ?setSorting@QContactFetchRequest@QtMobility@@QAEXABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 396 NONAME ; void QtMobility::QContactFetchRequest::setSorting(class QList const &) - ?matchFlags@QContactDetailFilter@QtMobility@@QBE?AV?$QFlags@W4MatchFlag@QContactFilter@QtMobility@@@@XZ @ 397 NONAME ; class QFlags QtMobility::QContactDetailFilter::matchFlags(void) const - ?FieldPostcode@QContactAddress@QtMobility@@2U?$Latin1Literal@$08@2@B @ 398 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactAddress::FieldPostcode - ??0QContactSortOrder@QtMobility@@QAE@XZ @ 399 NONAME ; QtMobility::QContactSortOrder::QContactSortOrder(void) - ??0QContactEmailAddress@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 400 NONAME ; QtMobility::QContactEmailAddress::QContactEmailAddress(class QtMobility::QContactDetail const &) - ?staticMetaObject@QContactAction@QtMobility@@2UQMetaObject@@B @ 401 NONAME ; struct QMetaObject const QtMobility::QContactAction::staticMetaObject - ?contact@QContactManagerEngine@QtMobility@@UBE?AVQContact@2@ABIAAW4Error@QContactManager@2@@Z @ 402 NONAME ; class QtMobility::QContact QtMobility::QContactManagerEngine::contact(unsigned int const &, enum QtMobility::QContactManager::Error &) const - ?metaObject@QContactRelationshipSaveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 403 NONAME ; struct QMetaObject const * QtMobility::QContactRelationshipSaveRequest::metaObject(void) const - ?setSecond@QContactRelationshipRemoveRequest@QtMobility@@QAEXABVQContactId@2@@Z @ 404 NONAME ; void QtMobility::QContactRelationshipRemoveRequest::setSecond(class QtMobility::QContactId const &) - ?setDefinitionRestrictions@QContactFetchRequest@QtMobility@@QAEXABVQStringList@@@Z @ 405 NONAME ; void QtMobility::QContactFetchRequest::setDefinitionRestrictions(class QStringList const &) - ?progress@QContactRelationshipSaveRequest@QtMobility@@IAEXPAV12@@Z @ 406 NONAME ; void QtMobility::QContactRelationshipSaveRequest::progress(class QtMobility::QContactRelationshipSaveRequest *) - ?saveRelationships@QContactManagerEngine@QtMobility@@UAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@VQContactRelationship@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 407 NONAME ; class QList QtMobility::QContactManagerEngine::saveRelationships(class QList *, enum QtMobility::QContactManager::Error &) - ?setRegion@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 408 NONAME ; void QtMobility::QContactAddress::setRegion(class QString const &) - ?contacts@QContactManager@QtMobility@@QBE?AV?$QList@I@@ABVQContactFilter@2@ABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 409 NONAME ; class QList QtMobility::QContactManager::contacts(class QtMobility::QContactFilter const &, class QList const &) const - ??0QContactDetailFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 410 NONAME ; QtMobility::QContactDetailFilter::QContactDetailFilter(class QtMobility::QContactFilter const &) - ?qt_metacall@QContactManager@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 411 NONAME ; int QtMobility::QContactManager::qt_metacall(enum QMetaObject::Call, int, void * *) - ??1QContactAbstractRequest@QtMobility@@UAE@XZ @ 412 NONAME ; QtMobility::QContactAbstractRequest::~QContactAbstractRequest(void) - ?synthesizeDisplayLabel@QContactManager@QtMobility@@QBE?AVQString@@ABVQContact@2@@Z @ 413 NONAME ; class QString QtMobility::QContactManager::synthesizeDisplayLabel(class QtMobility::QContact const &) const - ?setLogo@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 414 NONAME ; void QtMobility::QContactOrganization::setLogo(class QString const &) - ??0QContactUnionFilter@QtMobility@@QAE@XZ @ 415 NONAME ; QtMobility::QContactUnionFilter::QContactUnionFilter(void) - ?tr@QContactRelationshipRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 416 NONAME ; class QString QtMobility::QContactRelationshipRemoveRequest::tr(char const *, char const *) - ??9QContactFilter@QtMobility@@QBE_NABV01@@Z @ 417 NONAME ; bool QtMobility::QContactFilter::operator!=(class QtMobility::QContactFilter const &) const - ?relationships@QContactManagerEngine@QtMobility@@UBE?AV?$QList@VQContactRelationship@QtMobility@@@@ABVQString@@ABVQContactId@2@W4Role@QContactRelationshipFilter@2@AAW4Error@QContactManager@2@@Z @ 418 NONAME ; class QList QtMobility::QContactManagerEngine::relationships(class QString const &, class QtMobility::QContactId const &, enum QtMobility::QContactRelationshipFilter::Role, enum QtMobility::QContactManager::Error &) const - ?setContacts@QContactSaveRequest@QtMobility@@QAEXABV?$QList@VQContact@QtMobility@@@@@Z @ 419 NONAME ; void QtMobility::QContactSaveRequest::setContacts(class QList const &) - ?FieldAltitudeAccuracy@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$0BB@@2@B @ 420 NONAME ; struct QtMobility::Latin1Literal<17> const QtMobility::QContactGeolocation::FieldAltitudeAccuracy - ?setDataChanged@QContactChangeSet@QtMobility@@QAEX_N@Z @ 421 NONAME ; void QtMobility::QContactChangeSet::setDataChanged(bool) - ?setAccuracy@QContactGeolocation@QtMobility@@QAEXN@Z @ 422 NONAME ; void QtMobility::QContactGeolocation::setAccuracy(double) - ?staticMetaObject@QContactActionFactory@QtMobility@@2UQMetaObject@@B @ 423 NONAME ; struct QMetaObject const QtMobility::QContactActionFactory::staticMetaObject - ?DefinitionName@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$0M@@2@B @ 424 NONAME ; struct QtMobility::Latin1Literal<12> const QtMobility::QContactAnniversary::DefinitionName - ?FieldPrefix@QContactName@QtMobility@@2U?$Latin1Literal@$06@2@B @ 425 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactName::FieldPrefix - ??0QContactLocalIdFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 426 NONAME ; QtMobility::QContactLocalIdFilter::QContactLocalIdFilter(class QtMobility::QContactFilter const &) - ?subTypes@QContactOnlineAccount@QtMobility@@QBE?AVQStringList@@XZ @ 427 NONAME ; class QStringList QtMobility::QContactOnlineAccount::subTypes(void) const - ??_EQContactLocalIdFilter@QtMobility@@UAE@I@Z @ 428 NONAME ; QtMobility::QContactLocalIdFilter::~QContactLocalIdFilter(unsigned int) - ??_EQContactUnionFilter@QtMobility@@UAE@I@Z @ 429 NONAME ; QtMobility::QContactUnionFilter::~QContactUnionFilter(unsigned int) - ?d_func@QContactFetchRequest@QtMobility@@AAEPAVQContactFetchRequestPrivate@2@XZ @ 430 NONAME ; class QtMobility::QContactFetchRequestPrivate * QtMobility::QContactFetchRequest::d_func(void) - ??0QContactNickname@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 431 NONAME ; QtMobility::QContactNickname::QContactNickname(class QtMobility::QContactDetail const &) - ?d_func@QContactSaveRequest@QtMobility@@ABEPBVQContactSaveRequestPrivate@2@XZ @ 432 NONAME ; class QtMobility::QContactSaveRequestPrivate const * QtMobility::QContactSaveRequest::d_func(void) const - ?SubTypeFacsimile@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$09@2@B @ 433 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactPhoneNumber::SubTypeFacsimile - ?SubTypeWedding@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$07@2@B @ 434 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactAnniversary::SubTypeWedding - ??0QContactTimestamp@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 435 NONAME ; QtMobility::QContactTimestamp::QContactTimestamp(class QtMobility::QContactDetail const &) - ??4QContactGeolocation@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 436 NONAME ; class QtMobility::QContactGeolocation & QtMobility::QContactGeolocation::operator=(class QtMobility::QContactDetail const &) - ?setContexts@QContactDetail@QtMobility@@QAEXABVQStringList@@@Z @ 437 NONAME ; void QtMobility::QContactDetail::setContexts(class QStringList const &) - ??_EQContactType@QtMobility@@UAE@I@Z @ 438 NONAME ; QtMobility::QContactType::~QContactType(unsigned int) - ?FieldNickname@QContactNickname@QtMobility@@2U?$Latin1Literal@$08@2@B @ 439 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactNickname::FieldNickname - ??0QContactDetailDefinitionRemoveRequest@QtMobility@@QAE@XZ @ 440 NONAME ; QtMobility::QContactDetailDefinitionRemoveRequest::QContactDetailDefinitionRemoveRequest(void) - ??0QContactDetail@QtMobility@@QAE@ABVQString@@@Z @ 441 NONAME ; QtMobility::QContactDetail::QContactDetail(class QString const &) - ?d_func@QContactLocalIdFetchRequest@QtMobility@@AAEPAVQContactLocalIdFetchRequestPrivate@2@XZ @ 442 NONAME ; class QtMobility::QContactLocalIdFetchRequestPrivate * QtMobility::QContactLocalIdFetchRequest::d_func(void) - ?hasValue@QContactDetail@QtMobility@@QBE_NABVQString@@@Z @ 443 NONAME ; bool QtMobility::QContactDetail::hasValue(class QString const &) const - ??0QContactAddress@QtMobility@@QAE@XZ @ 444 NONAME ; QtMobility::QContactAddress::QContactAddress(void) - ?DefinitionName@QContactDisplayLabel@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 445 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactDisplayLabel::DefinitionName - ?fields@QContactDetailDefinition@QtMobility@@QAEAAV?$QMap@VQString@@VQContactDetailDefinitionField@QtMobility@@@@XZ @ 446 NONAME ; class QMap & QtMobility::QContactDetailDefinition::fields(void) - ??1QContactFamily@QtMobility@@UAE@XZ @ 447 NONAME ; QtMobility::QContactFamily::~QContactFamily(void) - ?SubTypeMobile@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$06@2@B @ 448 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactPhoneNumber::SubTypeMobile - ?testFilter@QContactManagerEngine@QtMobility@@SA_NABVQContactFilter@2@ABVQContact@2@@Z @ 449 NONAME ; bool QtMobility::QContactManagerEngine::testFilter(class QtMobility::QContactFilter const &, class QtMobility::QContact const &) - ??0QContactIntersectionFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 450 NONAME ; QtMobility::QContactIntersectionFilter::QContactIntersectionFilter(class QtMobility::QContactFilter const &) - ?getStaticMetaObject@QContactSaveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 451 NONAME ; struct QMetaObject const & QtMobility::QContactSaveRequest::getStaticMetaObject(void) - ?SubTypePager@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$05@2@B @ 452 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactPhoneNumber::SubTypePager - ?setContactType@QContactDetailDefinitionFetchRequest@QtMobility@@QAEXABVQString@@@Z @ 453 NONAME ; void QtMobility::QContactDetailDefinitionFetchRequest::setContactType(class QString const &) - ??1QContactUnionFilter@QtMobility@@UAE@XZ @ 454 NONAME ; QtMobility::QContactUnionFilter::~QContactUnionFilter(void) - ?managerParameters@QContactManager@QtMobility@@QBE?AV?$QMap@VQString@@V1@@@XZ @ 455 NONAME ; class QMap QtMobility::QContactManager::managerParameters(void) const - ?relationshipType@QContactRelationshipRemoveRequest@QtMobility@@QBE?AVQString@@XZ @ 456 NONAME ; class QString QtMobility::QContactRelationshipRemoveRequest::relationshipType(void) const - ??4QContactType@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 457 NONAME ; class QtMobility::QContactType & QtMobility::QContactType::operator=(class QtMobility::QContactDetail const &) - ?DefinitionName@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$0M@@2@B @ 458 NONAME ; struct QtMobility::Latin1Literal<12> const QtMobility::QContactPhoneNumber::DefinitionName - ?setLocalId@QContactId@QtMobility@@QAEXABI@Z @ 459 NONAME ; void QtMobility::QContactId::setLocalId(unsigned int const &) - ?getStaticMetaObject@QContactDetailDefinitionFetchRequest@QtMobility@@SAABUQMetaObject@@XZ @ 460 NONAME ; struct QMetaObject const & QtMobility::QContactDetailDefinitionFetchRequest::getStaticMetaObject(void) - ?contact@QContactManager@QtMobility@@QBE?AVQContact@2@ABI@Z @ 461 NONAME ; class QtMobility::QContact QtMobility::QContactManager::contact(unsigned int const &) const - ??0QContactName@QtMobility@@QAE@XZ @ 462 NONAME ; QtMobility::QContactName::QContactName(void) - ?filter@QContactLocalIdFetchRequest@QtMobility@@QBE?AVQContactFilter@2@XZ @ 463 NONAME ; class QtMobility::QContactFilter QtMobility::QContactLocalIdFetchRequest::filter(void) const - ?trUtf8@QContactLocalIdFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 464 NONAME ; class QString QtMobility::QContactLocalIdFetchRequest::trUtf8(char const *, char const *, int) - ?setValue@QContactActionFilter@QtMobility@@QAEXABVQVariant@@@Z @ 465 NONAME ; void QtMobility::QContactActionFilter::setValue(class QVariant const &) - ??_EQContactSaveRequest@QtMobility@@UAE@I@Z @ 466 NONAME ; QtMobility::QContactSaveRequest::~QContactSaveRequest(unsigned int) - ?relationshipsAdded@QContactManager@QtMobility@@IAEXABV?$QList@I@@@Z @ 467 NONAME ; void QtMobility::QContactManager::relationshipsAdded(class QList const &) - ?d_func@QContactRemoveRequest@QtMobility@@AAEPAVQContactRemoveRequestPrivate@2@XZ @ 468 NONAME ; class QtMobility::QContactRemoveRequestPrivate * QtMobility::QContactRemoveRequest::d_func(void) - ??0QContactGeolocation@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 469 NONAME ; QtMobility::QContactGeolocation::QContactGeolocation(class QtMobility::QContactDetail const &) - ??0QContactGuid@QtMobility@@QAE@XZ @ 470 NONAME ; QtMobility::QContactGuid::QContactGuid(void) - ?setAltitudeAccuracy@QContactGeolocation@QtMobility@@QAEXN@Z @ 471 NONAME ; void QtMobility::QContactGeolocation::setAltitudeAccuracy(double) - ??1QContactManagerEngineFactory@QtMobility@@UAE@XZ @ 472 NONAME ; QtMobility::QContactManagerEngineFactory::~QContactManagerEngineFactory(void) - ?saveDetail@QContact@QtMobility@@QAE_NPAVQContactDetail@2@@Z @ 473 NONAME ; bool QtMobility::QContact::saveDetail(class QtMobility::QContactDetail *) - ?updateRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactAbstractRequest@2@ABV?$QList@VQContactRelationship@QtMobility@@@@W4Error@QContactManager@2@ABV?$QList@W4Error@QContactManager@QtMobility@@@@W4Status@32@_N@Z @ 474 NONAME ; void QtMobility::QContactManagerEngine::updateRequest(class QtMobility::QContactAbstractRequest *, class QList const &, enum QtMobility::QContactManager::Error, class QList const &, enum QtMobility::QContactAbstractRequest::Status, bool) - ?trUtf8@QContactRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 475 NONAME ; class QString QtMobility::QContactRemoveRequest::trUtf8(char const *, char const *) - ??9QContactDetailDefinition@QtMobility@@QBE_NABV01@@Z @ 476 NONAME ; bool QtMobility::QContactDetailDefinition::operator!=(class QtMobility::QContactDetailDefinition const &) const - ?trUtf8@QContactDetailDefinitionSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 477 NONAME ; class QString QtMobility::QContactDetailDefinitionSaveRequest::trUtf8(char const *, char const *, int) - ?setContactDisplayLabel@QContactManagerEngine@QtMobility@@QBE?AVQContact@2@ABVQString@@ABV32@@Z @ 478 NONAME ; class QtMobility::QContact QtMobility::QContactManagerEngine::setContactDisplayLabel(class QString const &, class QtMobility::QContact const &) const - ?filterSupported@QContactMemoryEngine@QtMobility@@UBE_NABVQContactFilter@2@@Z @ 479 NONAME ; bool QtMobility::QContactMemoryEngine::filterSupported(class QtMobility::QContactFilter const &) const - ?FieldCalendarId@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 480 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactAnniversary::FieldCalendarId - ?metaObject@QContactSaveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 481 NONAME ; struct QMetaObject const * QtMobility::QContactSaveRequest::metaObject(void) const - ?postOfficeBox@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 482 NONAME ; class QString QtMobility::QContactAddress::postOfficeBox(void) const - ?originalDate@QContactAnniversary@QtMobility@@QBE?AVQDate@@XZ @ 483 NONAME ; class QDate QtMobility::QContactAnniversary::originalDate(void) const - ?HasAssistant@QContactRelationship@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 484 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactRelationship::HasAssistant - ??_EQContactName@QtMobility@@UAE@I@Z @ 485 NONAME ; QtMobility::QContactName::~QContactName(unsigned int) - ?saveContact@QContactManagerEngine@QtMobility@@UAE_NPAVQContact@2@AAW4Error@QContactManager@2@@Z @ 486 NONAME ; bool QtMobility::QContactManagerEngine::saveContact(class QtMobility::QContact *, enum QtMobility::QContactManager::Error &) - ?waitForRequestFinished@QContactManagerEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@H@Z @ 487 NONAME ; bool QtMobility::QContactManagerEngine::waitForRequestFinished(class QtMobility::QContactAbstractRequest *, int) - ??4QContactChangeSet@QtMobility@@QAEAAV01@ABV01@@Z @ 488 NONAME ; class QtMobility::QContactChangeSet & QtMobility::QContactChangeSet::operator=(class QtMobility::QContactChangeSet const &) - ?staticMetaObject@QContactDetailDefinitionRemoveRequest@QtMobility@@2UQMetaObject@@B @ 489 NONAME ; struct QMetaObject const QtMobility::QContactDetailDefinitionRemoveRequest::staticMetaObject - ?qt_metacast@QContactLocalIdFetchRequest@QtMobility@@UAEPAXPBD@Z @ 490 NONAME ; void * QtMobility::QContactLocalIdFetchRequest::qt_metacast(char const *) - ?second@QContactRelationshipRemoveRequest@QtMobility@@QBE?AVQContactId@2@XZ @ 491 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipRemoveRequest::second(void) const - ??_EQContactDisplayLabel@QtMobility@@UAE@I@Z @ 492 NONAME ; QtMobility::QContactDisplayLabel::~QContactDisplayLabel(unsigned int) - ?getStaticMetaObject@QContactDetailDefinitionSaveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 493 NONAME ; struct QMetaObject const & QtMobility::QContactDetailDefinitionSaveRequest::getStaticMetaObject(void) - ??0QContactTimestamp@QtMobility@@QAE@XZ @ 494 NONAME ; QtMobility::QContactTimestamp::QContactTimestamp(void) - ?removeContact@QContactMemoryEngine@QtMobility@@AAE_NABIAAVQContactChangeSet@2@AAW4Error@QContactManager@2@@Z @ 495 NONAME ; bool QtMobility::QContactMemoryEngine::removeContact(unsigned int const &, class QtMobility::QContactChangeSet &, enum QtMobility::QContactManager::Error &) - ?qt_metacall@QContactDetailDefinitionFetchRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 496 NONAME ; int QtMobility::QContactDetailDefinitionFetchRequest::qt_metacall(enum QMetaObject::Call, int, void * *) - ??1QContactNickname@QtMobility@@UAE@XZ @ 497 NONAME ; QtMobility::QContactNickname::~QContactNickname(void) - ?d_func@QContactDetailRangeFilter@QtMobility@@AAEPAVQContactDetailRangeFilterPrivate@2@XZ @ 498 NONAME ; class QtMobility::QContactDetailRangeFilterPrivate * QtMobility::QContactDetailRangeFilter::d_func(void) - ??0QContactDetailRangeFilter@QtMobility@@QAE@XZ @ 499 NONAME ; QtMobility::QContactDetailRangeFilter::QContactDetailRangeFilter(void) - ?created@QContactTimestamp@QtMobility@@QBE?AVQDateTime@@XZ @ 500 NONAME ; class QDateTime QtMobility::QContactTimestamp::created(void) const - ??1QContactUrl@QtMobility@@UAE@XZ @ 501 NONAME ; QtMobility::QContactUrl::~QContactUrl(void) - ??1QContactFilter@QtMobility@@UAE@XZ @ 502 NONAME ; QtMobility::QContactFilter::~QContactFilter(void) - ?setPixmap@QContactAvatar@QtMobility@@QAE_NABVQPixmap@@@Z @ 503 NONAME ; bool QtMobility::QContactAvatar::setPixmap(class QPixmap const &) - ?first@QContactRelationshipRemoveRequest@QtMobility@@QBE?AVQContactId@2@XZ @ 504 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipRemoveRequest::first(void) const - ?label@QContactGeolocation@QtMobility@@QBE?AVQString@@XZ @ 505 NONAME ; class QString QtMobility::QContactGeolocation::label(void) const - ?updateRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactAbstractRequest@2@ABV?$QList@VQContactDetailDefinition@QtMobility@@@@W4Error@QContactManager@2@ABV?$QList@W4Error@QContactManager@QtMobility@@@@W4Status@32@@Z @ 506 NONAME ; void QtMobility::QContactManagerEngine::updateRequest(class QtMobility::QContactAbstractRequest *, class QList const &, enum QtMobility::QContactManager::Error, class QList const &, enum QtMobility::QContactAbstractRequest::Status) - ?contactsAdded@QContactManager@QtMobility@@IAEXABV?$QList@I@@@Z @ 507 NONAME ; void QtMobility::QContactManager::contactsAdded(class QList const &) - ??_EQContactDetailDefinitionRemoveRequest@QtMobility@@UAE@I@Z @ 508 NONAME ; QtMobility::QContactDetailDefinitionRemoveRequest::~QContactDetailDefinitionRemoveRequest(unsigned int) - ?staticMetaObject@QContactDetailDefinitionSaveRequest@QtMobility@@2UQMetaObject@@B @ 509 NONAME ; struct QMetaObject const QtMobility::QContactDetailDefinitionSaveRequest::staticMetaObject - ?version@QContactManager@QtMobility@@SAHXZ @ 510 NONAME ; int QtMobility::QContactManager::version(void) - ?GenderMale@QContactGender@QtMobility@@2U?$Latin1Literal@$04@2@B @ 511 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactGender::GenderMale - ?setRelationshipType@QContactRelationshipRemoveRequest@QtMobility@@QAEXABVQString@@@Z @ 512 NONAME ; void QtMobility::QContactRelationshipRemoveRequest::setRelationshipType(class QString const &) - ?supportedDataTypes@QContactManagerEngine@QtMobility@@UBE?AV?$QList@W4Type@QVariant@@@@XZ @ 513 NONAME ; class QList QtMobility::QContactManagerEngine::supportedDataTypes(void) const - ?removeRelationship@QContactMemoryEngine@QtMobility@@UAE_NABVQContactRelationship@2@AAW4Error@QContactManager@2@@Z @ 514 NONAME ; bool QtMobility::QContactMemoryEngine::removeRelationship(class QtMobility::QContactRelationship const &, enum QtMobility::QContactManager::Error &) - ?setPostcode@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 515 NONAME ; void QtMobility::QContactAddress::setPostcode(class QString const &) - ?setActionName@QContactActionFilter@QtMobility@@QAEXABVQString@@@Z @ 516 NONAME ; void QtMobility::QContactActionFilter::setActionName(class QString const &) - ??4QContactFilter@QtMobility@@QAEAAV01@ABV01@@Z @ 517 NONAME ; class QtMobility::QContactFilter & QtMobility::QContactFilter::operator=(class QtMobility::QContactFilter const &) - ?relationships@QContactRelationshipSaveRequest@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@XZ @ 518 NONAME ; class QList QtMobility::QContactRelationshipSaveRequest::relationships(void) const - ?removeRelationship@QContactManager@QtMobility@@QAE_NABVQContactRelationship@2@@Z @ 519 NONAME ; bool QtMobility::QContactManager::removeRelationship(class QtMobility::QContactRelationship const &) - ?setFirst@QContactRelationshipFetchRequest@QtMobility@@QAEXABVQContactId@2@@Z @ 520 NONAME ; void QtMobility::QContactRelationshipFetchRequest::setFirst(class QtMobility::QContactId const &) - ?FieldCountry@QContactAddress@QtMobility@@2U?$Latin1Literal@$07@2@B @ 521 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactAddress::FieldCountry - ??4QContactGuid@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 522 NONAME ; class QtMobility::QContactGuid & QtMobility::QContactGuid::operator=(class QtMobility::QContactDetail const &) - ?d_func@QContactRelationshipFetchRequest@QtMobility@@AAEPAVQContactRelationshipFetchRequestPrivate@2@XZ @ 523 NONAME ; class QtMobility::QContactRelationshipFetchRequestPrivate * QtMobility::QContactRelationshipFetchRequest::d_func(void) - ?setFirst@QContactRelationshipRemoveRequest@QtMobility@@QAEXABVQContactId@2@@Z @ 524 NONAME ; void QtMobility::QContactRelationshipRemoveRequest::setFirst(class QtMobility::QContactId const &) - ?supportedImplementationVersions@QContactManagerEngineFactory@QtMobility@@UBE?AV?$QList@H@@XZ @ 525 NONAME ; class QList QtMobility::QContactManagerEngineFactory::supportedImplementationVersions(void) const - ??0QContactAnniversary@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 526 NONAME ; QtMobility::QContactAnniversary::QContactAnniversary(class QtMobility::QContactDetail const &) - ?manager@QContactAbstractRequest@QtMobility@@QBEPAVQContactManager@2@XZ @ 527 NONAME ; class QtMobility::QContactManager * QtMobility::QContactAbstractRequest::manager(void) const - ?saveDetailDefinition@QContactMemoryEngine@QtMobility@@UAE_NABVQContactDetailDefinition@2@ABVQString@@AAW4Error@QContactManager@2@@Z @ 528 NONAME ; bool QtMobility::QContactMemoryEngine::saveDetailDefinition(class QtMobility::QContactDetailDefinition const &, class QString const &, enum QtMobility::QContactManager::Error &) - ??0QContact@QtMobility@@QAE@ABV01@@Z @ 529 NONAME ; QtMobility::QContact::QContact(class QtMobility::QContact const &) - ?setType@QContact@QtMobility@@QAEXABVQContactType@2@@Z @ 530 NONAME ; void QtMobility::QContact::setType(class QtMobility::QContactType const &) - ?setUrl@QContactUrl@QtMobility@@QAEXABVQString@@@Z @ 531 NONAME ; void QtMobility::QContactUrl::setUrl(class QString const &) - ?setGuid@QContactGuid@QtMobility@@QAEXABVQString@@@Z @ 532 NONAME ; void QtMobility::QContactGuid::setGuid(class QString const &) - ?nickname@QContactNickname@QtMobility@@QBE?AVQString@@XZ @ 533 NONAME ; class QString QtMobility::QContactNickname::nickname(void) const - ?trUtf8@QContactMemoryEngine@QtMobility@@SA?AVQString@@PBD0H@Z @ 534 NONAME ; class QString QtMobility::QContactMemoryEngine::trUtf8(char const *, char const *, int) - ??1QContactActionFilter@QtMobility@@UAE@XZ @ 535 NONAME ; QtMobility::QContactActionFilter::~QContactActionFilter(void) - ??0QContactDetail@QtMobility@@IAE@ABV01@ABVQString@@@Z @ 536 NONAME ; QtMobility::QContactDetail::QContactDetail(class QtMobility::QContactDetail const &, class QString const &) - ??1QContactChangeSet@QtMobility@@QAE@XZ @ 537 NONAME ; QtMobility::QContactChangeSet::~QContactChangeSet(void) - ?avatar@QContactAvatar@QtMobility@@QBE?AVQString@@XZ @ 538 NONAME ; class QString QtMobility::QContactAvatar::avatar(void) const - ?FieldSyncTarget@QContactSyncTarget@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 539 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactSyncTarget::FieldSyncTarget - ?name@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 540 NONAME ; class QString QtMobility::QContactOrganization::name(void) const - ?validateActionFilter@QContactManagerEngine@QtMobility@@SA_NABVQContactFilter@2@@Z @ 541 NONAME ; bool QtMobility::QContactManagerEngine::validateActionFilter(class QtMobility::QContactFilter const &) - ?setManager@QContactAbstractRequest@QtMobility@@QAEXPAVQContactManager@2@@Z @ 542 NONAME ; void QtMobility::QContactAbstractRequest::setManager(class QtMobility::QContactManager *) - ?subTypes@QContactAddress@QtMobility@@QBE?AVQStringList@@XZ @ 543 NONAME ; class QStringList QtMobility::QContactAddress::subTypes(void) const - ?relationshipsAdded@QContactManagerEngine@QtMobility@@IAEXABV?$QList@I@@@Z @ 544 NONAME ; void QtMobility::QContactManagerEngine::relationshipsAdded(class QList const &) - ??0QContactFilter@QtMobility@@QAE@ABV01@@Z @ 545 NONAME ; QtMobility::QContactFilter::QContactFilter(class QtMobility::QContactFilter const &) - ?SubTypeSip@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$03@2@B @ 546 NONAME ; struct QtMobility::Latin1Literal<4> const QtMobility::QContactOnlineAccount::SubTypeSip - ??_EQContactAction@QtMobility@@UAE@I@Z @ 547 NONAME ; QtMobility::QContactAction::~QContactAction(unsigned int) - ??_EQContactRemoveRequest@QtMobility@@UAE@I@Z @ 548 NONAME ; QtMobility::QContactRemoveRequest::~QContactRemoveRequest(unsigned int) - ?supportedRelationshipTypes@QContactManagerEngine@QtMobility@@UBE?AVQStringList@@ABVQString@@@Z @ 549 NONAME ; class QStringList QtMobility::QContactManagerEngine::supportedRelationshipTypes(class QString const &) const - ??0QContactDetailDefinition@QtMobility@@QAE@XZ @ 550 NONAME ; QtMobility::QContactDetailDefinition::QContactDetailDefinition(void) - ?setSyncTarget@QContactSyncTarget@QtMobility@@QAEXABVQString@@@Z @ 551 NONAME ; void QtMobility::QContactSyncTarget::setSyncTarget(class QString const &) - ??4QContactAvatar@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 552 NONAME ; class QtMobility::QContactAvatar & QtMobility::QContactAvatar::operator=(class QtMobility::QContactDetail const &) - ?synthesizeDisplayLabel@QContactManagerEngine@QtMobility@@UBE?AVQString@@ABVQContact@2@AAW4Error@QContactManager@2@@Z @ 553 NONAME ; class QString QtMobility::QContactManagerEngine::synthesizeDisplayLabel(class QtMobility::QContact const &, enum QtMobility::QContactManager::Error &) const - ?setFields@QContactDetailDefinition@QtMobility@@QAEXABV?$QMap@VQString@@VQContactDetailDefinitionField@QtMobility@@@@@Z @ 554 NONAME ; void QtMobility::QContactDetailDefinition::setFields(class QMap const &) - ?FieldContext@QContactDetail@QtMobility@@2U?$Latin1Literal@$07@2@B @ 555 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactDetail::FieldContext - ??0QContactManager@QtMobility@@QAE@ABVQString@@ABV?$QMap@VQString@@V1@@@PAVQObject@@@Z @ 556 NONAME ; QtMobility::QContactManager::QContactManager(class QString const &, class QMap const &, class QObject *) - ?trUtf8@QContactActionFactory@QtMobility@@SA?AVQString@@PBD0H@Z @ 557 NONAME ; class QString QtMobility::QContactActionFactory::trUtf8(char const *, char const *, int) - ??0QContactPhoneNumber@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 558 NONAME ; QtMobility::QContactPhoneNumber::QContactPhoneNumber(class QtMobility::QContactDetail const &) - ?d_func@QContactLocalIdFilter@QtMobility@@ABEPBVQContactLocalIdFilterPrivate@2@XZ @ 559 NONAME ; class QtMobility::QContactLocalIdFilterPrivate const * QtMobility::QContactLocalIdFilter::d_func(void) const - ?FieldStreet@QContactAddress@QtMobility@@2U?$Latin1Literal@$06@2@B @ 560 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactAddress::FieldStreet - ?FieldAvatar@QContactAvatar@QtMobility@@2U?$Latin1Literal@$06@2@B @ 561 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactAvatar::FieldAvatar - ?detailDefinitionName@QContactSortOrder@QtMobility@@QBE?AVQString@@XZ @ 562 NONAME ; class QString QtMobility::QContactSortOrder::detailDefinitionName(void) const - ?type@QContactAbstractRequest@QtMobility@@QBE?AW4RequestType@12@XZ @ 563 NONAME ; enum QtMobility::QContactAbstractRequest::RequestType QtMobility::QContactAbstractRequest::type(void) const - ??0QContactDetail@QtMobility@@QAE@ABV01@@Z @ 564 NONAME ; QtMobility::QContactDetail::QContactDetail(class QtMobility::QContactDetail const &) - ?definitions@QContactDetailDefinitionSaveRequest@QtMobility@@QBE?AV?$QList@VQContactDetailDefinition@QtMobility@@@@XZ @ 565 NONAME ; class QList QtMobility::QContactDetailDefinitionSaveRequest::definitions(void) const - ?supportedDataTypes@QContactMemoryEngine@QtMobility@@UBE?AV?$QList@W4Type@QVariant@@@@XZ @ 566 NONAME ; class QList QtMobility::QContactMemoryEngine::supportedDataTypes(void) const - ?removedRelationshipsContacts@QContactChangeSet@QtMobility@@QAEAAV?$QSet@I@@XZ @ 567 NONAME ; class QSet & QtMobility::QContactChangeSet::removedRelationshipsContacts(void) - ?type@QContactFilter@QtMobility@@QBE?AW4FilterType@12@XZ @ 568 NONAME ; enum QtMobility::QContactFilter::FilterType QtMobility::QContactFilter::type(void) const - ?street@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 569 NONAME ; class QString QtMobility::QContactAddress::street(void) const - ?FieldModificationTimestamp@QContactTimestamp@QtMobility@@2U?$Latin1Literal@$0BG@@2@B @ 570 NONAME ; struct QtMobility::Latin1Literal<22> const QtMobility::QContactTimestamp::FieldModificationTimestamp - ?localId@QContactId@QtMobility@@QBEIXZ @ 571 NONAME ; unsigned int QtMobility::QContactId::localId(void) const - ?updateRequestStatus@QContactManagerEngine@QtMobility@@SAXPAVQContactAbstractRequest@2@W4Error@QContactManager@2@AAV?$QList@W4Error@QContactManager@QtMobility@@@@W4Status@32@_N@Z @ 572 NONAME ; void QtMobility::QContactManagerEngine::updateRequestStatus(class QtMobility::QContactAbstractRequest *, enum QtMobility::QContactManager::Error, class QList &, enum QtMobility::QContactAbstractRequest::Status, bool) - ??_EQContactOnlineAccount@QtMobility@@UAE@I@Z @ 573 NONAME ; QtMobility::QContactOnlineAccount::~QContactOnlineAccount(unsigned int) - ?supportedContactTypes@QContactManager@QtMobility@@QBE?AVQStringList@@XZ @ 574 NONAME ; class QStringList QtMobility::QContactManager::supportedContactTypes(void) const - ?tr@QContactLocalIdFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 575 NONAME ; class QString QtMobility::QContactLocalIdFetchRequest::tr(char const *, char const *, int) - ?trUtf8@QContactActionFactory@QtMobility@@SA?AVQString@@PBD0@Z @ 576 NONAME ; class QString QtMobility::QContactActionFactory::trUtf8(char const *, char const *) - ?qt_metacall@QContactActionFactory@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 577 NONAME ; int QtMobility::QContactActionFactory::qt_metacall(enum QMetaObject::Call, int, void * *) - ?relationshipOrder@QContact@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@XZ @ 578 NONAME ; class QList QtMobility::QContact::relationshipOrder(void) const - ?setSubTypes@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 579 NONAME ; void QtMobility::QContactOnlineAccount::setSubTypes(class QString const &) - ?tr@QContactAction@QtMobility@@SA?AVQString@@PBD0H@Z @ 580 NONAME ; class QString QtMobility::QContactAction::tr(char const *, char const *, int) - ??8QContactFilter@QtMobility@@QBE_NABV01@@Z @ 581 NONAME ; bool QtMobility::QContactFilter::operator==(class QtMobility::QContactFilter const &) const - ?metaObject@QContactFetchRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 582 NONAME ; struct QMetaObject const * QtMobility::QContactFetchRequest::metaObject(void) const - ??0QContactRelationshipFetchRequest@QtMobility@@QAE@XZ @ 583 NONAME ; QtMobility::QContactRelationshipFetchRequest::QContactRelationshipFetchRequest(void) - ?logo@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 584 NONAME ; class QString QtMobility::QContactOrganization::logo(void) const - ?SubTypeHomePage@QContactUrl@QtMobility@@2U?$Latin1Literal@$08@2@B @ 585 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactUrl::SubTypeHomePage - ?isEmpty@QContactDetailDefinition@QtMobility@@QBE_NXZ @ 586 NONAME ; bool QtMobility::QContactDetailDefinition::isEmpty(void) const - ?caseSensitivity@QContactSortOrder@QtMobility@@QBE?AW4CaseSensitivity@Qt@@XZ @ 587 NONAME ; enum Qt::CaseSensitivity QtMobility::QContactSortOrder::caseSensitivity(void) const - ?d_func@QContactIntersectionFilter@QtMobility@@ABEPBVQContactIntersectionFilterPrivate@2@XZ @ 588 NONAME ; class QtMobility::QContactIntersectionFilterPrivate const * QtMobility::QContactIntersectionFilter::d_func(void) const - ??_EQContactBirthday@QtMobility@@UAE@I@Z @ 589 NONAME ; QtMobility::QContactBirthday::~QContactBirthday(unsigned int) - ?FieldCreationTimestamp@QContactTimestamp@QtMobility@@2U?$Latin1Literal@$0BC@@2@B @ 590 NONAME ; struct QtMobility::Latin1Literal<18> const QtMobility::QContactTimestamp::FieldCreationTimestamp - ?tr@QContactRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 591 NONAME ; class QString QtMobility::QContactRemoveRequest::tr(char const *, char const *) - ?FieldGuid@QContactGuid@QtMobility@@2U?$Latin1Literal@$04@2@B @ 592 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactGuid::FieldGuid - ?getStaticMetaObject@QContactRemoveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 593 NONAME ; struct QMetaObject const & QtMobility::QContactRemoveRequest::getStaticMetaObject(void) - ?setSpeed@QContactGeolocation@QtMobility@@QAEXN@Z @ 594 NONAME ; void QtMobility::QContactGeolocation::setSpeed(double) - ?DefinitionName@QContactAddress@QtMobility@@2U?$Latin1Literal@$0O@@2@B @ 595 NONAME ; struct QtMobility::Latin1Literal<14> const QtMobility::QContactAddress::DefinitionName - ??0QContactRelationship@QtMobility@@QAE@ABV01@@Z @ 596 NONAME ; QtMobility::QContactRelationship::QContactRelationship(class QtMobility::QContactRelationship const &) - ?setAltitude@QContactGeolocation@QtMobility@@QAEXN@Z @ 597 NONAME ; void QtMobility::QContactGeolocation::setAltitude(double) - ?supportedContactTypes@QContactManagerEngine@QtMobility@@UBE?AVQStringList@@XZ @ 598 NONAME ; class QStringList QtMobility::QContactManagerEngine::supportedContactTypes(void) const - ?serviceProvider@QContactOnlineAccount@QtMobility@@QBE?AVQString@@XZ @ 599 NONAME ; class QString QtMobility::QContactOnlineAccount::serviceProvider(void) const - ?FieldLast@QContactName@QtMobility@@2U?$Latin1Literal@$04@2@B @ 600 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactName::FieldLast - ?d_func@QContactDetailDefinitionRemoveRequest@QtMobility@@ABEPBVQContactDetailDefinitionRemoveRequestPrivate@2@XZ @ 601 NONAME ; class QtMobility::QContactDetailDefinitionRemoveRequestPrivate const * QtMobility::QContactDetailDefinitionRemoveRequest::d_func(void) const - ?SubTypeMemorial@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$08@2@B @ 602 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactAnniversary::SubTypeMemorial - ?customLabel@QContactName@QtMobility@@QBE?AVQString@@XZ @ 603 NONAME ; class QString QtMobility::QContactName::customLabel(void) const - ?hasFeature@QContactMemoryEngine@QtMobility@@UBE_NW4ManagerFeature@QContactManager@2@ABVQString@@@Z @ 604 NONAME ; bool QtMobility::QContactMemoryEngine::hasFeature(enum QtMobility::QContactManager::ManagerFeature, class QString const &) const - ?sorting@QContactLocalIdFetchRequest@QtMobility@@QBE?AV?$QList@VQContactSortOrder@QtMobility@@@@XZ @ 605 NONAME ; class QList QtMobility::QContactLocalIdFetchRequest::sorting(void) const - ?name@QContactDetailDefinition@QtMobility@@QBE?AVQString@@XZ @ 606 NONAME ; class QString QtMobility::QContactDetailDefinition::name(void) const - ?preferredDetail@QContact@QtMobility@@QBE?AVQContactDetail@2@ABVQString@@@Z @ 607 NONAME ; class QtMobility::QContactDetail QtMobility::QContact::preferredDetail(class QString const &) const - ?trUtf8@QContactDetailDefinitionSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 608 NONAME ; class QString QtMobility::QContactDetailDefinitionSaveRequest::trUtf8(char const *, char const *) - ?definitionName@QContactDetail@QtMobility@@QBE?AVQString@@XZ @ 609 NONAME ; class QString QtMobility::QContactDetail::definitionName(void) const - ?d_func@QContactDetailFilter@QtMobility@@AAEPAVQContactDetailFilterPrivate@2@XZ @ 610 NONAME ; class QtMobility::QContactDetailFilterPrivate * QtMobility::QContactDetailFilter::d_func(void) - ?requestDestroyed@QContactMemoryEngine@QtMobility@@UAEXPAVQContactAbstractRequest@2@@Z @ 611 NONAME ; void QtMobility::QContactMemoryEngine::requestDestroyed(class QtMobility::QContactAbstractRequest *) - ?saveRelationship@QContactManager@QtMobility@@QAE_NPAVQContactRelationship@2@@Z @ 612 NONAME ; bool QtMobility::QContactManager::saveRelationship(class QtMobility::QContactRelationship *) - ?setFilter@QContactFetchRequest@QtMobility@@QAEXABVQContactFilter@2@@Z @ 613 NONAME ; void QtMobility::QContactFetchRequest::setFilter(class QtMobility::QContactFilter const &) - ?tr@QContactDetailDefinitionFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 614 NONAME ; class QString QtMobility::QContactDetailDefinitionFetchRequest::tr(char const *, char const *, int) - ?eventType@QContactChangeLogFilter@QtMobility@@QBE?AW4EventType@12@XZ @ 615 NONAME ; enum QtMobility::QContactChangeLogFilter::EventType QtMobility::QContactChangeLogFilter::eventType(void) const - ?setSubTypes@QContactPhoneNumber@QtMobility@@QAEXABVQStringList@@@Z @ 616 NONAME ; void QtMobility::QContactPhoneNumber::setSubTypes(class QStringList const &) - ??0QContactRemoveRequest@QtMobility@@QAE@XZ @ 617 NONAME ; QtMobility::QContactRemoveRequest::QContactRemoveRequest(void) - ?SubTypePostal@QContactAddress@QtMobility@@2U?$Latin1Literal@$06@2@B @ 618 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactAddress::SubTypePostal - ?progress@QContactFetchRequest@QtMobility@@IAEXPAV12@_N@Z @ 619 NONAME ; void QtMobility::QContactFetchRequest::progress(class QtMobility::QContactFetchRequest *, bool) - ?remove@QContactUnionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 620 NONAME ; void QtMobility::QContactUnionFilter::remove(class QtMobility::QContactFilter const &) - ?managerUri@QContactManager@QtMobility@@QBE?AVQString@@XZ @ 621 NONAME ; class QString QtMobility::QContactManager::managerUri(void) const - ?FieldHeading@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$07@2@B @ 622 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactGeolocation::FieldHeading - ??0QContactChangeLogFilter@QtMobility@@QAE@W4EventType@01@@Z @ 623 NONAME ; QtMobility::QContactChangeLogFilter::QContactChangeLogFilter(enum QtMobility::QContactChangeLogFilter::EventType) - ?trUtf8@QContactAbstractRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 624 NONAME ; class QString QtMobility::QContactAbstractRequest::trUtf8(char const *, char const *, int) - ?trUtf8@QContactManagerEngine@QtMobility@@SA?AVQString@@PBD0@Z @ 625 NONAME ; class QString QtMobility::QContactManagerEngine::trUtf8(char const *, char const *) - ?FieldRole@QContactOrganization@QtMobility@@2U?$Latin1Literal@$04@2@B @ 626 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactOrganization::FieldRole - ?setContexts@QContactDetail@QtMobility@@QAEXABVQString@@@Z @ 627 NONAME ; void QtMobility::QContactDetail::setContexts(class QString const &) - ?value@QContactDetailFilter@QtMobility@@QBE?AVQVariant@@XZ @ 628 NONAME ; class QVariant QtMobility::QContactDetailFilter::value(void) const - ?getStaticMetaObject@QContactMemoryEngine@QtMobility@@SAABUQMetaObject@@XZ @ 629 NONAME ; struct QMetaObject const & QtMobility::QContactMemoryEngine::getStaticMetaObject(void) - ?setRole@QContactRelationshipFilter@QtMobility@@QAEXW4Role@12@@Z @ 630 NONAME ; void QtMobility::QContactRelationshipFilter::setRole(enum QtMobility::QContactRelationshipFilter::Role) - ??1QContactDetailDefinitionSaveRequest@QtMobility@@UAE@XZ @ 631 NONAME ; QtMobility::QContactDetailDefinitionSaveRequest::~QContactDetailDefinitionSaveRequest(void) - ?number@QContactPhoneNumber@QtMobility@@QBE?AVQString@@XZ @ 632 NONAME ; class QString QtMobility::QContactPhoneNumber::number(void) const - ?trUtf8@QContactRelationshipFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 633 NONAME ; class QString QtMobility::QContactRelationshipFetchRequest::trUtf8(char const *, char const *, int) - ?trUtf8@QContactSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 634 NONAME ; class QString QtMobility::QContactSaveRequest::trUtf8(char const *, char const *) - ?selfContactId@QContactManagerEngine@QtMobility@@UBEIAAW4Error@QContactManager@2@@Z @ 635 NONAME ; unsigned int QtMobility::QContactManagerEngine::selfContactId(enum QtMobility::QContactManager::Error &) const - ??0QContactDetailDefinitionField@QtMobility@@QAE@XZ @ 636 NONAME ; QtMobility::QContactDetailDefinitionField::QContactDetailDefinitionField(void) - ?DefinitionName@QContactName@QtMobility@@2U?$Latin1Literal@$04@2@B @ 637 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactName::DefinitionName - ?d_func@QContactFetchRequest@QtMobility@@ABEPBVQContactFetchRequestPrivate@2@XZ @ 638 NONAME ; class QtMobility::QContactFetchRequestPrivate const * QtMobility::QContactFetchRequest::d_func(void) const - ??4QContactBirthday@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 639 NONAME ; class QtMobility::QContactBirthday & QtMobility::QContactBirthday::operator=(class QtMobility::QContactDetail const &) - ??0QContactDisplayLabel@QtMobility@@QAE@XZ @ 640 NONAME ; QtMobility::QContactDisplayLabel::QContactDisplayLabel(void) - ?accountUri@QContactOnlineAccount@QtMobility@@QBE?AVQString@@XZ @ 641 NONAME ; class QString QtMobility::QContactOnlineAccount::accountUri(void) const - ??4QContactRelationship@QtMobility@@QAEAAV01@ABV01@@Z @ 642 NONAME ; class QtMobility::QContactRelationship & QtMobility::QContactRelationship::operator=(class QtMobility::QContactRelationship const &) - ?date@QContactBirthday@QtMobility@@QBE?AVQDate@@XZ @ 643 NONAME ; class QDate QtMobility::QContactBirthday::date(void) const - ?validateDefinition@QContactManagerEngine@QtMobility@@UBE_NABVQContactDetailDefinition@2@AAW4Error@QContactManager@2@@Z @ 644 NONAME ; bool QtMobility::QContactManagerEngine::validateDefinition(class QtMobility::QContactDetailDefinition const &, enum QtMobility::QContactManager::Error &) const - ??_EQContactOrganization@QtMobility@@UAE@I@Z @ 645 NONAME ; QtMobility::QContactOrganization::~QContactOrganization(unsigned int) - ?trUtf8@QContactRelationshipRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 646 NONAME ; class QString QtMobility::QContactRelationshipRemoveRequest::trUtf8(char const *, char const *, int) - ?setPresence@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 647 NONAME ; void QtMobility::QContactOnlineAccount::setPresence(class QString const &) - ?setBlankPolicy@QContactSortOrder@QtMobility@@QAEXW4BlankPolicy@12@@Z @ 648 NONAME ; void QtMobility::QContactSortOrder::setBlankPolicy(enum QtMobility::QContactSortOrder::BlankPolicy) - ?tr@QContactMemoryEngine@QtMobility@@SA?AVQString@@PBD0H@Z @ 649 NONAME ; class QString QtMobility::QContactMemoryEngine::tr(char const *, char const *, int) - ?progress@QContactDetailDefinitionRemoveRequest@QtMobility@@IAEXPAV12@@Z @ 650 NONAME ; void QtMobility::QContactDetailDefinitionRemoveRequest::progress(class QtMobility::QContactDetailDefinitionRemoveRequest *) - ??0QContactEmailAddress@QtMobility@@QAE@XZ @ 651 NONAME ; QtMobility::QContactEmailAddress::QContactEmailAddress(void) - ?tr@QContactManager@QtMobility@@SA?AVQString@@PBD0H@Z @ 652 NONAME ; class QString QtMobility::QContactManager::tr(char const *, char const *, int) - ?staticMetaObject@QContactRelationshipFetchRequest@QtMobility@@2UQMetaObject@@B @ 653 NONAME ; struct QMetaObject const QtMobility::QContactRelationshipFetchRequest::staticMetaObject - ??0QContactActionDescriptor@QtMobility@@QAE@ABV01@@Z @ 654 NONAME ; QtMobility::QContactActionDescriptor::QContactActionDescriptor(class QtMobility::QContactActionDescriptor const &) - ?lastModified@QContactTimestamp@QtMobility@@QBE?AVQDateTime@@XZ @ 655 NONAME ; class QDateTime QtMobility::QContactTimestamp::lastModified(void) const - ?setSuffix@QContactName@QtMobility@@QAEXABVQString@@@Z @ 656 NONAME ; void QtMobility::QContactName::setSuffix(class QString const &) - ?filters@QContactIntersectionFilter@QtMobility@@QBE?AV?$QList@VQContactFilter@QtMobility@@@@XZ @ 657 NONAME ; class QList QtMobility::QContactIntersectionFilter::filters(void) const - ??6QContactIntersectionFilter@QtMobility@@QAEAAV01@ABVQContactFilter@1@@Z @ 658 NONAME ; class QtMobility::QContactIntersectionFilter & QtMobility::QContactIntersectionFilter::operator<<(class QtMobility::QContactFilter const &) - ??9QContact@QtMobility@@QBE_NABV01@@Z @ 659 NONAME ; bool QtMobility::QContact::operator!=(class QtMobility::QContact const &) const - ?cancelRequest@QContactMemoryEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@@Z @ 660 NONAME ; bool QtMobility::QContactMemoryEngine::cancelRequest(class QtMobility::QContactAbstractRequest *) - ?setServiceProvider@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 661 NONAME ; void QtMobility::QContactOnlineAccount::setServiceProvider(class QString const &) - ??4QContactNickname@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 662 NONAME ; class QtMobility::QContactNickname & QtMobility::QContactNickname::operator=(class QtMobility::QContactDetail const &) - ??0QContactAvatar@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 663 NONAME ; QtMobility::QContactAvatar::QContactAvatar(class QtMobility::QContactDetail const &) - ?setNickname@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 664 NONAME ; void QtMobility::QContactOnlineAccount::setNickname(class QString const &) - ??_EQContactAddress@QtMobility@@UAE@I@Z @ 665 NONAME ; QtMobility::QContactAddress::~QContactAddress(unsigned int) - ?tr@QContactMemoryEngine@QtMobility@@SA?AVQString@@PBD0@Z @ 666 NONAME ; class QString QtMobility::QContactMemoryEngine::tr(char const *, char const *) - ?contacts@QContactManagerEngine@QtMobility@@UBE?AV?$QList@I@@ABV?$QList@VQContactSortOrder@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 667 NONAME ; class QList QtMobility::QContactManagerEngine::contacts(class QList const &, enum QtMobility::QContactManager::Error &) const - ?start@QContactAbstractRequest@QtMobility@@QAE_NXZ @ 668 NONAME ; bool QtMobility::QContactAbstractRequest::start(void) - ?setLastModified@QContactTimestamp@QtMobility@@QAEXABVQDateTime@@@Z @ 669 NONAME ; void QtMobility::QContactTimestamp::setLastModified(class QDateTime const &) - ?isUnique@QContactDetailDefinition@QtMobility@@QBE_NXZ @ 670 NONAME ; bool QtMobility::QContactDetailDefinition::isUnique(void) const - ?setEmailAddress@QContactEmailAddress@QtMobility@@QAEXABVQString@@@Z @ 671 NONAME ; void QtMobility::QContactEmailAddress::setEmailAddress(class QString const &) - ?ContextHome@QContactDetail@QtMobility@@2U?$Latin1Literal@$04@2@B @ 672 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactDetail::ContextHome - ?metaObject@QContactManagerEngine@QtMobility@@UBEPBUQMetaObject@@XZ @ 673 NONAME ; struct QMetaObject const * QtMobility::QContactManagerEngine::metaObject(void) const - ?setNames@QContactDetailDefinitionRemoveRequest@QtMobility@@QAEXABVQStringList@@@Z @ 674 NONAME ; void QtMobility::QContactDetailDefinitionRemoveRequest::setNames(class QStringList const &) - ?qt_metacall@QContactFetchRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 675 NONAME ; int QtMobility::QContactFetchRequest::qt_metacall(enum QMetaObject::Call, int, void * *) - ?trUtf8@QContactDetailDefinitionFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 676 NONAME ; class QString QtMobility::QContactDetailDefinitionFetchRequest::trUtf8(char const *, char const *, int) - ??_EQContactFilter@QtMobility@@UAE@I@Z @ 677 NONAME ; QtMobility::QContactFilter::~QContactFilter(unsigned int) - ??_EQContactFamily@QtMobility@@UAE@I@Z @ 678 NONAME ; QtMobility::QContactFamily::~QContactFamily(unsigned int) - ??0QContactOrganization@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 679 NONAME ; QtMobility::QContactOrganization::QContactOrganization(class QtMobility::QContactDetail const &) - ?metaObject@QContactManager@QtMobility@@UBEPBUQMetaObject@@XZ @ 680 NONAME ; struct QMetaObject const * QtMobility::QContactManager::metaObject(void) const - ?qt_metacall@QContactAction@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 681 NONAME ; int QtMobility::QContactAction::qt_metacall(enum QMetaObject::Call, int, void * *) - ?setFirst@QContactName@QtMobility@@QAEXABVQString@@@Z @ 682 NONAME ; void QtMobility::QContactName::setFirst(class QString const &) - ?metaObject@QContactLocalIdFetchRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 683 NONAME ; struct QMetaObject const * QtMobility::QContactLocalIdFetchRequest::metaObject(void) const - ?setCountry@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 684 NONAME ; void QtMobility::QContactAddress::setCountry(class QString const &) - ?setSubType@QContactAvatar@QtMobility@@QAEXABVQString@@@Z @ 685 NONAME ; void QtMobility::QContactAvatar::setSubType(class QString const &) - ?HasSpouse@QContactRelationship@QtMobility@@2U?$Latin1Literal@$09@2@B @ 686 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactRelationship::HasSpouse - ?changedContacts@QContactChangeSet@QtMobility@@QAEAAV?$QSet@I@@XZ @ 687 NONAME ; class QSet & QtMobility::QContactChangeSet::changedContacts(void) - ?SubTypeVideo@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$05@2@B @ 688 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactPhoneNumber::SubTypeVideo - ??4QContactDisplayLabel@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 689 NONAME ; class QtMobility::QContactDisplayLabel & QtMobility::QContactDisplayLabel::operator=(class QtMobility::QContactDetail const &) - ?FieldTitle@QContactOrganization@QtMobility@@2U?$Latin1Literal@$05@2@B @ 690 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactOrganization::FieldTitle - ?sortContacts@QContactManagerEngine@QtMobility@@SA?AV?$QList@I@@ABV?$QList@VQContact@QtMobility@@@@ABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 691 NONAME ; class QList QtMobility::QContactManagerEngine::sortContacts(class QList const &, class QList const &) - ?tr@QContactActionFactory@QtMobility@@SA?AVQString@@PBD0@Z @ 692 NONAME ; class QString QtMobility::QContactActionFactory::tr(char const *, char const *) - ??0QContactNickname@QtMobility@@QAE@XZ @ 693 NONAME ; QtMobility::QContactNickname::QContactNickname(void) - ?getStaticMetaObject@QContactActionFactory@QtMobility@@SAABUQMetaObject@@XZ @ 694 NONAME ; struct QMetaObject const & QtMobility::QContactActionFactory::getStaticMetaObject(void) - ?Is@QContactRelationship@QtMobility@@2U?$Latin1Literal@$02@2@B @ 695 NONAME ; struct QtMobility::Latin1Literal<3> const QtMobility::QContactRelationship::Is - ?setCustomLabel@QContactName@QtMobility@@QAEXABVQString@@@Z @ 696 NONAME ; void QtMobility::QContactName::setCustomLabel(class QString const &) - ?relationshipsRemoved@QContactManager@QtMobility@@IAEXABV?$QList@I@@@Z @ 697 NONAME ; void QtMobility::QContactManager::relationshipsRemoved(class QList const &) - ?contacts@QContactFetchRequest@QtMobility@@QBE?AV?$QList@VQContact@QtMobility@@@@XZ @ 698 NONAME ; class QList QtMobility::QContactFetchRequest::contacts(void) const - ??0QContactSortOrder@QtMobility@@QAE@ABV01@@Z @ 699 NONAME ; QtMobility::QContactSortOrder::QContactSortOrder(class QtMobility::QContactSortOrder const &) - ?metaObject@QContactDetailDefinitionSaveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 700 NONAME ; struct QMetaObject const * QtMobility::QContactDetailDefinitionSaveRequest::metaObject(void) const - ??0QContactPhoneNumber@QtMobility@@QAE@XZ @ 701 NONAME ; QtMobility::QContactPhoneNumber::QContactPhoneNumber(void) - ?d_func@QContactChangeLogFilter@QtMobility@@AAEPAVQContactChangeLogFilterPrivate@2@XZ @ 702 NONAME ; class QtMobility::QContactChangeLogFilterPrivate * QtMobility::QContactChangeLogFilter::d_func(void) - ?performAsynchronousOperation@QContactMemoryEngine@QtMobility@@AAEXXZ @ 703 NONAME ; void QtMobility::QContactMemoryEngine::performAsynchronousOperation(void) - ?progress@QContactDetailDefinitionSaveRequest@QtMobility@@IAEXPAV12@@Z @ 704 NONAME ; void QtMobility::QContactDetailDefinitionSaveRequest::progress(class QtMobility::QContactDetailDefinitionSaveRequest *) - ?trUtf8@QContactRelationshipFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 705 NONAME ; class QString QtMobility::QContactRelationshipFetchRequest::trUtf8(char const *, char const *) - ??0QContactOrganization@QtMobility@@QAE@XZ @ 706 NONAME ; QtMobility::QContactOrganization::QContactOrganization(void) - ?removeContacts@QContactManager@QtMobility@@QAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@I@@@Z @ 707 NONAME ; class QList QtMobility::QContactManager::removeContacts(class QList *) - ?subType@QContactAvatar@QtMobility@@QBE?AVQString@@XZ @ 708 NONAME ; class QString QtMobility::QContactAvatar::subType(void) const - ?relationshipsRemoved@QContactManagerEngine@QtMobility@@IAEXABV?$QList@I@@@Z @ 709 NONAME ; void QtMobility::QContactManagerEngine::relationshipsRemoved(class QList const &) - ?setId@QContact@QtMobility@@QAEXABVQContactId@2@@Z @ 710 NONAME ; void QtMobility::QContact::setId(class QtMobility::QContactId const &) - ?metaObject@QContactAction@QtMobility@@UBEPBUQMetaObject@@XZ @ 711 NONAME ; struct QMetaObject const * QtMobility::QContactAction::metaObject(void) const - ?setAccessConstraint@QContactDetailDefinition@QtMobility@@QAEXABW4AccessConstraint@12@@Z @ 712 NONAME ; void QtMobility::QContactDetailDefinition::setAccessConstraint(enum QtMobility::QContactDetailDefinition::AccessConstraint const &) - ?setSince@QContactChangeLogFilter@QtMobility@@QAEXABVQDateTime@@@Z @ 713 NONAME ; void QtMobility::QContactChangeLogFilter::setSince(class QDateTime const &) - ?metaObject@QContactAbstractRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 714 NONAME ; struct QMetaObject const * QtMobility::QContactAbstractRequest::metaObject(void) const - ?filterSupported@QContactManagerEngine@QtMobility@@UBE_NABVQContactFilter@2@@Z @ 715 NONAME ; bool QtMobility::QContactManagerEngine::filterSupported(class QtMobility::QContactFilter const &) const - ?setOtherParticipantId@QContactRelationshipFilter@QtMobility@@QAEXABVQContactId@2@@Z @ 716 NONAME ; void QtMobility::QContactRelationshipFilter::setOtherParticipantId(class QtMobility::QContactId const &) - ??IQtMobility@@YA?BVQContactFilter@0@ABV10@0@Z @ 717 NONAME ; class QtMobility::QContactFilter const QtMobility::operator&(class QtMobility::QContactFilter const &, class QtMobility::QContactFilter const &) - ?event@QContactAnniversary@QtMobility@@QBE?AVQString@@XZ @ 718 NONAME ; class QString QtMobility::QContactAnniversary::event(void) const - ?removeDetailDefinition@QContactManager@QtMobility@@QAE_NABVQString@@0@Z @ 719 NONAME ; bool QtMobility::QContactManager::removeDetailDefinition(class QString const &, class QString const &) - ??4QContactActionDescriptor@QtMobility@@QAEAAV01@ABV01@@Z @ 720 NONAME ; class QtMobility::QContactActionDescriptor & QtMobility::QContactActionDescriptor::operator=(class QtMobility::QContactActionDescriptor const &) - ??0QContactFamily@QtMobility@@QAE@XZ @ 721 NONAME ; QtMobility::QContactFamily::QContactFamily(void) - ?setEvent@QContactAnniversary@QtMobility@@QAEXABVQString@@@Z @ 722 NONAME ; void QtMobility::QContactAnniversary::setEvent(class QString const &) - ?metaObject@QContactDetailDefinitionFetchRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 723 NONAME ; struct QMetaObject const * QtMobility::QContactDetailDefinitionFetchRequest::metaObject(void) const - ?preferredActions@QContactDetail@QtMobility@@QBE?AV?$QList@VQContactActionDescriptor@QtMobility@@@@XZ @ 724 NONAME ; class QList QtMobility::QContactDetail::preferredActions(void) const - ?setFilter@QContactRemoveRequest@QtMobility@@QAEXABVQContactFilter@2@@Z @ 725 NONAME ; void QtMobility::QContactRemoveRequest::setFilter(class QtMobility::QContactFilter const &) - ??1QContactType@QtMobility@@UAE@XZ @ 726 NONAME ; QtMobility::QContactType::~QContactType(void) - ??_EQContactAnniversary@QtMobility@@UAE@I@Z @ 727 NONAME ; QtMobility::QContactAnniversary::~QContactAnniversary(unsigned int) - ?trUtf8@QContactLocalIdFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 728 NONAME ; class QString QtMobility::QContactLocalIdFetchRequest::trUtf8(char const *, char const *) - ?FieldFirst@QContactName@QtMobility@@2U?$Latin1Literal@$05@2@B @ 729 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactName::FieldFirst - ?first@QContactName@QtMobility@@QBE?AVQString@@XZ @ 730 NONAME ; class QString QtMobility::QContactName::first(void) const - ??1QContactManager@QtMobility@@UAE@XZ @ 731 NONAME ; QtMobility::QContactManager::~QContactManager(void) - ?qt_metacast@QContactMemoryEngine@QtMobility@@UAEPAXPBD@Z @ 732 NONAME ; void * QtMobility::QContactMemoryEngine::qt_metacast(char const *) - ?DefinitionName@QContactSyncTarget@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 733 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactSyncTarget::DefinitionName - ?FieldAccountUri@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 734 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactOnlineAccount::FieldAccountUri - ?saveContacts@QContactManagerEngine@QtMobility@@UAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@VQContact@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 735 NONAME ; class QList QtMobility::QContactManagerEngine::saveContacts(class QList *, enum QtMobility::QContactManager::Error &) - ??_EQContactManagerEngineFactory@QtMobility@@UAE@I@Z @ 736 NONAME ; QtMobility::QContactManagerEngineFactory::~QContactManagerEngineFactory(unsigned int) - ??_EQContactGuid@QtMobility@@UAE@I@Z @ 737 NONAME ; QtMobility::QContactGuid::~QContactGuid(unsigned int) - ??_EQContactRelationshipSaveRequest@QtMobility@@UAE@I@Z @ 738 NONAME ; QtMobility::QContactRelationshipSaveRequest::~QContactRelationshipSaveRequest(unsigned int) - ?tr@QContactRelationshipFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 739 NONAME ; class QString QtMobility::QContactRelationshipFetchRequest::tr(char const *, char const *, int) - ?status@QContactAbstractRequest@QtMobility@@QBE?AW4Status@12@XZ @ 740 NONAME ; enum QtMobility::QContactAbstractRequest::Status QtMobility::QContactAbstractRequest::status(void) const - ?SubTypeLandline@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$08@2@B @ 741 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactPhoneNumber::SubTypeLandline - ?validateContact@QContactManagerEngine@QtMobility@@UBE_NABVQContact@2@AAW4Error@QContactManager@2@@Z @ 742 NONAME ; bool QtMobility::QContactManagerEngine::validateContact(class QtMobility::QContact const &, enum QtMobility::QContactManager::Error &) const - ?dataChanged@QContactChangeSet@QtMobility@@QAE_NXZ @ 743 NONAME ; bool QtMobility::QContactChangeSet::dataChanged(void) - ?timestamp@QContactGeolocation@QtMobility@@QBE?AVQDateTime@@XZ @ 744 NONAME ; class QDateTime QtMobility::QContactGeolocation::timestamp(void) const - ?managerParameters@QContactManagerEngine@QtMobility@@UBE?AV?$QMap@VQString@@V1@@@XZ @ 745 NONAME ; class QMap QtMobility::QContactManagerEngine::managerParameters(void) const - ?tr@QContactManagerEngine@QtMobility@@SA?AVQString@@PBD0@Z @ 746 NONAME ; class QString QtMobility::QContactManagerEngine::tr(char const *, char const *) - ?getStaticMetaObject@QContactManagerEngine@QtMobility@@SAABUQMetaObject@@XZ @ 747 NONAME ; struct QMetaObject const & QtMobility::QContactManagerEngine::getStaticMetaObject(void) - ?removeRelationships@QContactManager@QtMobility@@QAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@ABV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 748 NONAME ; class QList QtMobility::QContactManager::removeRelationships(class QList const &) - ?DefinitionName@QContactNote@QtMobility@@2U?$Latin1Literal@$04@2@B @ 749 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactNote::DefinitionName - ?qt_metacast@QContactAction@QtMobility@@UAEPAXPBD@Z @ 750 NONAME ; void * QtMobility::QContactAction::qt_metacast(char const *) - ?detailDefinitions@QContactMemoryEngine@QtMobility@@UBE?AV?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@ABVQString@@AAW4Error@QContactManager@2@@Z @ 751 NONAME ; class QMap QtMobility::QContactMemoryEngine::detailDefinitions(class QString const &, enum QtMobility::QContactManager::Error &) const - ?qt_metacast@QContactSaveRequest@QtMobility@@UAEPAXPBD@Z @ 752 NONAME ; void * QtMobility::QContactSaveRequest::qt_metacast(char const *) - ?emailAddress@QContactEmailAddress@QtMobility@@QBE?AVQString@@XZ @ 753 NONAME ; class QString QtMobility::QContactEmailAddress::emailAddress(void) const - ??1QContactPhoneNumber@QtMobility@@UAE@XZ @ 754 NONAME ; QtMobility::QContactPhoneNumber::~QContactPhoneNumber(void) - ?d_func@QContactLocalIdFilter@QtMobility@@AAEPAVQContactLocalIdFilterPrivate@2@XZ @ 755 NONAME ; class QtMobility::QContactLocalIdFilterPrivate * QtMobility::QContactLocalIdFilter::d_func(void) - ??8QContactRelationship@QtMobility@@QBE_NABV01@@Z @ 756 NONAME ; bool QtMobility::QContactRelationship::operator==(class QtMobility::QContactRelationship const &) const - ?SubTypeTexturedMesh@QContactAvatar@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 757 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactAvatar::SubTypeTexturedMesh - ?since@QContactChangeLogFilter@QtMobility@@QBE?AVQDateTime@@XZ @ 758 NONAME ; class QDateTime QtMobility::QContactChangeLogFilter::since(void) const - ?FieldMiddle@QContactName@QtMobility@@2U?$Latin1Literal@$06@2@B @ 759 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactName::FieldMiddle - ?setNickname@QContactNickname@QtMobility@@QAEXABVQString@@@Z @ 760 NONAME ; void QtMobility::QContactNickname::setNickname(class QString const &) - ?d_func@QContactIntersectionFilter@QtMobility@@AAEPAVQContactIntersectionFilterPrivate@2@XZ @ 761 NONAME ; class QtMobility::QContactIntersectionFilterPrivate * QtMobility::QContactIntersectionFilter::d_func(void) - ?d_func@QContactRelationshipFilter@QtMobility@@ABEPBVQContactRelationshipFilterPrivate@2@XZ @ 762 NONAME ; class QtMobility::QContactRelationshipFilterPrivate const * QtMobility::QContactRelationshipFilter::d_func(void) const - ??_EQContactUrl@QtMobility@@UAE@I@Z @ 763 NONAME ; QtMobility::QContactUrl::~QContactUrl(unsigned int) - ?setPreferredActions@QContactDetail@QtMobility@@QAEXABV?$QList@VQContactActionDescriptor@QtMobility@@@@@Z @ 764 NONAME ; void QtMobility::QContactDetail::setPreferredActions(class QList const &) - ?qt_metacast@QContactFetchRequest@QtMobility@@UAEPAXPBD@Z @ 765 NONAME ; void * QtMobility::QContactFetchRequest::qt_metacast(char const *) - ?relationshipType@QContactRelationship@QtMobility@@QBE?AVQString@@XZ @ 766 NONAME ; class QString QtMobility::QContactRelationship::relationshipType(void) const - ?d_func@QContactActionFilter@QtMobility@@AAEPAVQContactActionFilterPrivate@2@XZ @ 767 NONAME ; class QtMobility::QContactActionFilterPrivate * QtMobility::QContactActionFilter::d_func(void) - ?waitForRequestProgress@QContactManagerEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@H@Z @ 768 NONAME ; bool QtMobility::QContactManagerEngine::waitForRequestProgress(class QtMobility::QContactAbstractRequest *, int) - ?variantValue@QContactDetail@QtMobility@@QBE?AVQVariant@@ABVQString@@@Z @ 769 NONAME ; class QVariant QtMobility::QContactDetail::variantValue(class QString const &) const - ?FieldEmailAddress@QContactEmailAddress@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 770 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactEmailAddress::FieldEmailAddress - ?tr@QContactDetailDefinitionFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 771 NONAME ; class QString QtMobility::QContactDetailDefinitionFetchRequest::tr(char const *, char const *) - ?staticMetaObject@QContactManager@QtMobility@@2UQMetaObject@@B @ 772 NONAME ; struct QMetaObject const QtMobility::QContactManager::staticMetaObject - ?qt_metacast@QContactDetailDefinitionSaveRequest@QtMobility@@UAEPAXPBD@Z @ 773 NONAME ; void * QtMobility::QContactDetailDefinitionSaveRequest::qt_metacast(char const *) - ?qt_metacast@QContactManagerEngine@QtMobility@@UAEPAXPBD@Z @ 774 NONAME ; void * QtMobility::QContactManagerEngine::qt_metacast(char const *) - ?implementationVersion@QContactManager@QtMobility@@QBEHXZ @ 775 NONAME ; int QtMobility::QContactManager::implementationVersion(void) const - ??0QContactRelationshipFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 776 NONAME ; QtMobility::QContactRelationshipFilter::QContactRelationshipFilter(class QtMobility::QContactFilter const &) - ?clearDetails@QContact@QtMobility@@QAEXXZ @ 777 NONAME ; void QtMobility::QContact::clearDetails(void) - ?d_func@QContactDetailDefinitionRemoveRequest@QtMobility@@AAEPAVQContactDetailDefinitionRemoveRequestPrivate@2@XZ @ 778 NONAME ; class QtMobility::QContactDetailDefinitionRemoveRequestPrivate * QtMobility::QContactDetailDefinitionRemoveRequest::d_func(void) - ?requestDestroyed@QContactManagerEngine@QtMobility@@UAEXPAVQContactAbstractRequest@2@@Z @ 779 NONAME ; void QtMobility::QContactManagerEngine::requestDestroyed(class QtMobility::QContactAbstractRequest *) - ?trUtf8@QContactAction@QtMobility@@SA?AVQString@@PBD0@Z @ 780 NONAME ; class QString QtMobility::QContactAction::trUtf8(char const *, char const *) - ??0QContactNote@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 781 NONAME ; QtMobility::QContactNote::QContactNote(class QtMobility::QContactDetail const &) - ?filter@QContactRemoveRequest@QtMobility@@QBE?AVQContactFilter@2@XZ @ 782 NONAME ; class QtMobility::QContactFilter QtMobility::QContactRemoveRequest::filter(void) const - ?progress@QContactSaveRequest@QtMobility@@IAEXPAV12@@Z @ 783 NONAME ; void QtMobility::QContactSaveRequest::progress(class QtMobility::QContactSaveRequest *) - ??0QContactFilter@QtMobility@@IAE@PAVQContactFilterPrivate@1@@Z @ 784 NONAME ; QtMobility::QContactFilter::QContactFilter(class QtMobility::QContactFilterPrivate *) - ?prefix@QContactName@QtMobility@@QBE?AVQString@@XZ @ 785 NONAME ; class QString QtMobility::QContactName::prefix(void) const - ?selfContactIdChanged@QContactManager@QtMobility@@IAEXABI0@Z @ 786 NONAME ; void QtMobility::QContactManager::selfContactIdChanged(unsigned int const &, unsigned int const &) - ??0QContactSaveRequest@QtMobility@@QAE@XZ @ 787 NONAME ; QtMobility::QContactSaveRequest::QContactSaveRequest(void) - ?setContactType@QContactDetailDefinitionSaveRequest@QtMobility@@QAEXABVQString@@@Z @ 788 NONAME ; void QtMobility::QContactDetailDefinitionSaveRequest::setContactType(class QString const &) - ?HasMember@QContactRelationship@QtMobility@@2U?$Latin1Literal@$09@2@B @ 789 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactRelationship::HasMember - ??_EQContactRelationshipFilter@QtMobility@@UAE@I@Z @ 790 NONAME ; QtMobility::QContactRelationshipFilter::~QContactRelationshipFilter(unsigned int) - ??0QContactFilter@QtMobility@@QAE@XZ @ 791 NONAME ; QtMobility::QContactFilter::QContactFilter(void) - ?participantRole@QContactRelationshipFetchRequest@QtMobility@@QBE?AW4Role@QContactRelationshipFilter@2@XZ @ 792 NONAME ; enum QtMobility::QContactRelationshipFilter::Role QtMobility::QContactRelationshipFetchRequest::participantRole(void) const - ??0QContactUrl@QtMobility@@QAE@XZ @ 793 NONAME ; QtMobility::QContactUrl::QContactUrl(void) - ?qt_metacall@QContactMemoryEngine@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 794 NONAME ; int QtMobility::QContactMemoryEngine::qt_metacall(enum QMetaObject::Call, int, void * *) - ??9QContactId@QtMobility@@QBE_NABV01@@Z @ 795 NONAME ; bool QtMobility::QContactId::operator!=(class QtMobility::QContactId const &) const - ?setLongitude@QContactGeolocation@QtMobility@@QAEXN@Z @ 796 NONAME ; void QtMobility::QContactGeolocation::setLongitude(double) - ?GenderUnspecified@QContactGender@QtMobility@@2U?$Latin1Literal@$0M@@2@B @ 797 NONAME ; struct QtMobility::Latin1Literal<12> const QtMobility::QContactGender::GenderUnspecified - ??1QContactSyncTarget@QtMobility@@UAE@XZ @ 798 NONAME ; QtMobility::QContactSyncTarget::~QContactSyncTarget(void) - ??1QContactLocalIdFilter@QtMobility@@UAE@XZ @ 799 NONAME ; QtMobility::QContactLocalIdFilter::~QContactLocalIdFilter(void) - ?TypeContact@QContactType@QtMobility@@2U?$Latin1Literal@$07@2@B @ 800 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactType::TypeContact - ?dataChanged@QContactManagerEngine@QtMobility@@IAEXXZ @ 801 NONAME ; void QtMobility::QContactManagerEngine::dataChanged(void) - ?saveRelationship@QContactMemoryEngine@QtMobility@@AAE_NPAVQContactRelationship@2@AAVQContactChangeSet@2@AAW4Error@QContactManager@2@@Z @ 802 NONAME ; bool QtMobility::QContactMemoryEngine::saveRelationship(class QtMobility::QContactRelationship *, class QtMobility::QContactChangeSet &, enum QtMobility::QContactManager::Error &) - ??8QContactDetailDefinitionField@QtMobility@@QBE_NABV01@@Z @ 803 NONAME ; bool QtMobility::QContactDetailDefinitionField::operator==(class QtMobility::QContactDetailDefinitionField const &) const - ?getStaticMetaObject@QContactAbstractRequest@QtMobility@@SAABUQMetaObject@@XZ @ 804 NONAME ; struct QMetaObject const & QtMobility::QContactAbstractRequest::getStaticMetaObject(void) - ?qt_metacall@QContactRelationshipRemoveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 805 NONAME ; int QtMobility::QContactRelationshipRemoveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) - ??0QContactActionFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 806 NONAME ; QtMobility::QContactActionFilter::QContactActionFilter(class QtMobility::QContactFilter const &) - ??1QContactDisplayLabel@QtMobility@@UAE@XZ @ 807 NONAME ; QtMobility::QContactDisplayLabel::~QContactDisplayLabel(void) - ??0QContactDetailDefinitionField@QtMobility@@QAE@ABV01@@Z @ 808 NONAME ; QtMobility::QContactDetailDefinitionField::QContactDetailDefinitionField(class QtMobility::QContactDetailDefinitionField const &) - ?value@QContactDetail@QtMobility@@QBE?AVQString@@ABV3@@Z @ 809 NONAME ; class QString QtMobility::QContactDetail::value(class QString const &) const - ?DefinitionName@QContactBirthday@QtMobility@@2U?$Latin1Literal@$08@2@B @ 810 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactBirthday::DefinitionName - ?setRelationshipOrder@QContact@QtMobility@@QAEXABV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 811 NONAME ; void QtMobility::QContact::setRelationshipOrder(class QList const &) - ?relationships@QContact@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@ABVQString@@@Z @ 812 NONAME ; class QList QtMobility::QContact::relationships(class QString const &) const - ?assistantName@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 813 NONAME ; class QString QtMobility::QContactOrganization::assistantName(void) const - ?trUtf8@QContactFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 814 NONAME ; class QString QtMobility::QContactFetchRequest::trUtf8(char const *, char const *, int) - ??1QContactActionFactory@QtMobility@@UAE@XZ @ 815 NONAME ; QtMobility::QContactActionFactory::~QContactActionFactory(void) - ?append@QContactIntersectionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 816 NONAME ; void QtMobility::QContactIntersectionFilter::append(class QtMobility::QContactFilter const &) - ??1QContactEmailAddress@QtMobility@@UAE@XZ @ 817 NONAME ; QtMobility::QContactEmailAddress::~QContactEmailAddress(void) - ?definitionRestrictions@QContactFetchRequest@QtMobility@@QBE?AVQStringList@@XZ @ 818 NONAME ; class QStringList QtMobility::QContactFetchRequest::definitionRestrictions(void) const - ?setType@QContactType@QtMobility@@QAEXABVQString@@@Z @ 819 NONAME ; void QtMobility::QContactType::setType(class QString const &) - ?FieldDepartment@QContactOrganization@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 820 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactOrganization::FieldDepartment - ?relationshipType@QContactRelationshipFilter@QtMobility@@QBE?AVQString@@XZ @ 821 NONAME ; class QString QtMobility::QContactRelationshipFilter::relationshipType(void) const - ?buildUri@QContactManager@QtMobility@@SA?AVQString@@ABV3@ABV?$QMap@VQString@@V1@@@H@Z @ 822 NONAME ; class QString QtMobility::QContactManager::buildUri(class QString const &, class QMap const &, int) - ??_EQContactManager@QtMobility@@UAE@I@Z @ 823 NONAME ; QtMobility::QContactManager::~QContactManager(unsigned int) - ??4QContactFamily@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 824 NONAME ; class QtMobility::QContactFamily & QtMobility::QContactFamily::operator=(class QtMobility::QContactDetail const &) - ?trUtf8@QContactRelationshipSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 825 NONAME ; class QString QtMobility::QContactRelationshipSaveRequest::trUtf8(char const *, char const *, int) - ?qt_metacast@QContactRelationshipSaveRequest@QtMobility@@UAEPAXPBD@Z @ 826 NONAME ; void * QtMobility::QContactRelationshipSaveRequest::qt_metacast(char const *) - ?setOriginalDate@QContactAnniversary@QtMobility@@QAEXABVQDate@@@Z @ 827 NONAME ; void QtMobility::QContactAnniversary::setOriginalDate(class QDate const &) - ?DefinitionName@QContactEmailAddress@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 828 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactEmailAddress::DefinitionName - ?altitude@QContactGeolocation@QtMobility@@QBENXZ @ 829 NONAME ; double QtMobility::QContactGeolocation::altitude(void) const - ??0QContactDetailFilter@QtMobility@@QAE@XZ @ 830 NONAME ; QtMobility::QContactDetailFilter::QContactDetailFilter(void) - ?d_func@QContactDetailFilter@QtMobility@@ABEPBVQContactDetailFilterPrivate@2@XZ @ 831 NONAME ; class QtMobility::QContactDetailFilterPrivate const * QtMobility::QContactDetailFilter::d_func(void) const - ?setFilters@QContactIntersectionFilter@QtMobility@@QAEXABV?$QList@VQContactFilter@QtMobility@@@@@Z @ 832 NONAME ; void QtMobility::QContactIntersectionFilter::setFilters(class QList const &) - ?progress@QContactRemoveRequest@QtMobility@@IAEXPAV12@@Z @ 833 NONAME ; void QtMobility::QContactRemoveRequest::progress(class QtMobility::QContactRemoveRequest *) - ??1QContactSaveRequest@QtMobility@@UAE@XZ @ 834 NONAME ; QtMobility::QContactSaveRequest::~QContactSaveRequest(void) - ?contactsAdded@QContactManagerEngine@QtMobility@@IAEXABV?$QList@I@@@Z @ 835 NONAME ; void QtMobility::QContactManagerEngine::contactsAdded(class QList const &) - ?DefinitionName@QContactGender@QtMobility@@2U?$Latin1Literal@$06@2@B @ 836 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactGender::DefinitionName - ?trUtf8@QContactAbstractRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 837 NONAME ; class QString QtMobility::QContactAbstractRequest::trUtf8(char const *, char const *) - ?FieldAccuracy@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$08@2@B @ 838 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactGeolocation::FieldAccuracy - ?filter@QContactFetchRequest@QtMobility@@QBE?AVQContactFilter@2@XZ @ 839 NONAME ; class QtMobility::QContactFilter QtMobility::QContactFetchRequest::filter(void) const - ?tr@QContactManager@QtMobility@@SA?AVQString@@PBD0@Z @ 840 NONAME ; class QString QtMobility::QContactManager::tr(char const *, char const *) - ?staticMetaObject@QContactRelationshipRemoveRequest@QtMobility@@2UQMetaObject@@B @ 841 NONAME ; struct QMetaObject const QtMobility::QContactRelationshipRemoveRequest::staticMetaObject - ?tr@QContactRelationshipFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 842 NONAME ; class QString QtMobility::QContactRelationshipFetchRequest::tr(char const *, char const *) - ??1QContactSortOrder@QtMobility@@QAE@XZ @ 843 NONAME ; QtMobility::QContactSortOrder::~QContactSortOrder(void) - ??0QContactAbstractRequest@QtMobility@@QAE@XZ @ 844 NONAME ; QtMobility::QContactAbstractRequest::QContactAbstractRequest(void) - ?setRelationshipType@QContactRelationshipFetchRequest@QtMobility@@QAEXABVQString@@@Z @ 845 NONAME ; void QtMobility::QContactRelationshipFetchRequest::setRelationshipType(class QString const &) - ?setSubTypes@QContactAddress@QtMobility@@QAEXABVQStringList@@@Z @ 846 NONAME ; void QtMobility::QContactAddress::setSubTypes(class QStringList const &) - ?saveDetailDefinition@QContactMemoryEngine@QtMobility@@AAE_NABVQContactDetailDefinition@2@ABVQString@@AAVQContactChangeSet@2@AAW4Error@QContactManager@2@@Z @ 847 NONAME ; bool QtMobility::QContactMemoryEngine::saveDetailDefinition(class QtMobility::QContactDetailDefinition const &, class QString const &, class QtMobility::QContactChangeSet &, enum QtMobility::QContactManager::Error &) - ?subType@QContactUrl@QtMobility@@QBE?AVQString@@XZ @ 848 NONAME ; class QString QtMobility::QContactUrl::subType(void) const - ?saveContact@QContactMemoryEngine@QtMobility@@AAE_NPAVQContact@2@AAVQContactChangeSet@2@AAW4Error@QContactManager@2@@Z @ 849 NONAME ; bool QtMobility::QContactMemoryEngine::saveContact(class QtMobility::QContact *, class QtMobility::QContactChangeSet &, enum QtMobility::QContactManager::Error &) - ??1QContactManagerEngine@QtMobility@@UAE@XZ @ 850 NONAME ; QtMobility::QContactManagerEngine::~QContactManagerEngine(void) - ??0QContactGuid@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 851 NONAME ; QtMobility::QContactGuid::QContactGuid(class QtMobility::QContactDetail const &) - ??0QContactSyncTarget@QtMobility@@QAE@XZ @ 852 NONAME ; QtMobility::QContactSyncTarget::QContactSyncTarget(void) - ?qt_metacall@QContactDetailDefinitionSaveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 853 NONAME ; int QtMobility::QContactDetailDefinitionSaveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) - ?staticMetaObject@QContactLocalIdFetchRequest@QtMobility@@2UQMetaObject@@B @ 854 NONAME ; struct QMetaObject const QtMobility::QContactLocalIdFetchRequest::staticMetaObject - ?implementationVersion@QContactManagerEngine@QtMobility@@UBEHXZ @ 855 NONAME ; int QtMobility::QContactManagerEngine::implementationVersion(void) const - ??4QContactAddress@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 856 NONAME ; class QtMobility::QContactAddress & QtMobility::QContactAddress::operator=(class QtMobility::QContactDetail const &) - ?contactType@QContactDetailDefinitionSaveRequest@QtMobility@@QBE?AVQString@@XZ @ 857 NONAME ; class QString QtMobility::QContactDetailDefinitionSaveRequest::contactType(void) const - ??0QContactRelationshipFilter@QtMobility@@QAE@XZ @ 858 NONAME ; QtMobility::QContactRelationshipFilter::QContactRelationshipFilter(void) - ?FieldStatusMessage@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$0O@@2@B @ 859 NONAME ; struct QtMobility::Latin1Literal<14> const QtMobility::QContactOnlineAccount::FieldStatusMessage - ??0QContactBirthday@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 860 NONAME ; QtMobility::QContactBirthday::QContactBirthday(class QtMobility::QContactDetail const &) - ?SubTypeEmployment@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 861 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactAnniversary::SubTypeEmployment - ??0QContactDetailDefinitionFetchRequest@QtMobility@@QAE@XZ @ 862 NONAME ; QtMobility::QContactDetailDefinitionFetchRequest::QContactDetailDefinitionFetchRequest(void) - ?SubTypeVideo@QContactAvatar@QtMobility@@2U?$Latin1Literal@$05@2@B @ 863 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactAvatar::SubTypeVideo - ?SubTypeDtmfMenu@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$08@2@B @ 864 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactPhoneNumber::SubTypeDtmfMenu - ?SubTypeEngagement@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 865 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactAnniversary::SubTypeEngagement - ??8QContact@QtMobility@@QBE_NABV01@@Z @ 866 NONAME ; bool QtMobility::QContact::operator==(class QtMobility::QContact const &) const - ?trUtf8@QContactMemoryEngine@QtMobility@@SA?AVQString@@PBD0@Z @ 867 NONAME ; class QString QtMobility::QContactMemoryEngine::trUtf8(char const *, char const *) - ??0QContactChangeLogFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 868 NONAME ; QtMobility::QContactChangeLogFilter::QContactChangeLogFilter(class QtMobility::QContactFilter const &) - ??0QContactRelationshipSaveRequest@QtMobility@@QAE@XZ @ 869 NONAME ; QtMobility::QContactRelationshipSaveRequest::QContactRelationshipSaveRequest(void) - ?removeDetailDefinition@QContactMemoryEngine@QtMobility@@AAE_NABVQString@@0AAVQContactChangeSet@2@AAW4Error@QContactManager@2@@Z @ 870 NONAME ; bool QtMobility::QContactMemoryEngine::removeDetailDefinition(class QString const &, class QString const &, class QtMobility::QContactChangeSet &, enum QtMobility::QContactManager::Error &) - ?relationships@QContactMemoryEngine@QtMobility@@UBE?AV?$QList@VQContactRelationship@QtMobility@@@@ABVQString@@ABVQContactId@2@W4Role@QContactRelationshipFilter@2@AAW4Error@QContactManager@2@@Z @ 871 NONAME ; class QList QtMobility::QContactMemoryEngine::relationships(class QString const &, class QtMobility::QContactId const &, enum QtMobility::QContactRelationshipFilter::Role, enum QtMobility::QContactManager::Error &) const - ?contactsChanged@QContactManagerEngine@QtMobility@@IAEXABV?$QList@I@@@Z @ 872 NONAME ; void QtMobility::QContactManagerEngine::contactsChanged(class QList const &) - ?setDataType@QContactDetailDefinitionField@QtMobility@@QAEXW4Type@QVariant@@@Z @ 873 NONAME ; void QtMobility::QContactDetailDefinitionField::setDataType(enum QVariant::Type) - ?setDepartment@QContactOrganization@QtMobility@@QAEXABVQStringList@@@Z @ 874 NONAME ; void QtMobility::QContactOrganization::setDepartment(class QStringList const &) - ?tr@QContactManagerEngine@QtMobility@@SA?AVQString@@PBD0H@Z @ 875 NONAME ; class QString QtMobility::QContactManagerEngine::tr(char const *, char const *, int) - ?contactsRemoved@QContactManager@QtMobility@@IAEXABV?$QList@I@@@Z @ 876 NONAME ; void QtMobility::QContactManager::contactsRemoved(class QList const &) - ?contactType@QContactDetailDefinitionRemoveRequest@QtMobility@@QBE?AVQString@@XZ @ 877 NONAME ; class QString QtMobility::QContactDetailDefinitionRemoveRequest::contactType(void) const - ??0QContactLocalIdFetchRequest@QtMobility@@QAE@XZ @ 878 NONAME ; QtMobility::QContactLocalIdFetchRequest::QContactLocalIdFetchRequest(void) - ??1QContactOrganization@QtMobility@@UAE@XZ @ 879 NONAME ; QtMobility::QContactOrganization::~QContactOrganization(void) - ?FieldPostOfficeBox@QContactAddress@QtMobility@@2U?$Latin1Literal@$0O@@2@B @ 880 NONAME ; struct QtMobility::Latin1Literal<14> const QtMobility::QContactAddress::FieldPostOfficeBox - ?metaObject@QContactRemoveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 881 NONAME ; struct QMetaObject const * QtMobility::QContactRemoveRequest::metaObject(void) const - ?error@QContactAbstractRequest@QtMobility@@QBE?AW4Error@QContactManager@2@XZ @ 882 NONAME ; enum QtMobility::QContactManager::Error QtMobility::QContactAbstractRequest::error(void) const - ?supportedRelationshipTypes@QContactManager@QtMobility@@QBE?AVQStringList@@ABVQString@@@Z @ 883 NONAME ; class QStringList QtMobility::QContactManager::supportedRelationshipTypes(class QString const &) const - ?error@QContactManager@QtMobility@@QBE?AW4Error@12@XZ @ 884 NONAME ; enum QtMobility::QContactManager::Error QtMobility::QContactManager::error(void) const - ??0QContactRelationshipRemoveRequest@QtMobility@@QAE@XZ @ 885 NONAME ; QtMobility::QContactRelationshipRemoveRequest::QContactRelationshipRemoveRequest(void) - ?setSorting@QContactLocalIdFetchRequest@QtMobility@@QAEXABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 886 NONAME ; void QtMobility::QContactLocalIdFetchRequest::setSorting(class QList const &) - ??_EQContactEmailAddress@QtMobility@@UAE@I@Z @ 887 NONAME ; QtMobility::QContactEmailAddress::~QContactEmailAddress(unsigned int) - ?trUtf8@QContactAction@QtMobility@@SA?AVQString@@PBD0H@Z @ 888 NONAME ; class QString QtMobility::QContactAction::trUtf8(char const *, char const *, int) - ?startRequest@QContactManagerEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@@Z @ 889 NONAME ; bool QtMobility::QContactManagerEngine::startRequest(class QtMobility::QContactAbstractRequest *) - ?setNumber@QContactPhoneNumber@QtMobility@@QAEXABVQString@@@Z @ 890 NONAME ; void QtMobility::QContactPhoneNumber::setNumber(class QString const &) - ?progress@QContactRelationshipFetchRequest@QtMobility@@IAEXPAV12@_N@Z @ 891 NONAME ; void QtMobility::QContactRelationshipFetchRequest::progress(class QtMobility::QContactRelationshipFetchRequest *, bool) - ?otherParticipantId@QContactRelationshipFilter@QtMobility@@QBE?AVQContactId@2@XZ @ 892 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipFilter::otherParticipantId(void) const - ?tr@QContactDetailDefinitionSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 893 NONAME ; class QString QtMobility::QContactDetailDefinitionSaveRequest::tr(char const *, char const *, int) - ?detail@QContact@QtMobility@@QBE?AVQContactDetail@2@ABVQString@@@Z @ 894 NONAME ; class QtMobility::QContactDetail QtMobility::QContact::detail(class QString const &) const - ??_EQContactDetailDefinitionFetchRequest@QtMobility@@UAE@I@Z @ 895 NONAME ; QtMobility::QContactDetailDefinitionFetchRequest::~QContactDetailDefinitionFetchRequest(unsigned int) - ??4QContactDetailDefinition@QtMobility@@QAEAAV01@ABV01@@Z @ 896 NONAME ; class QtMobility::QContactDetailDefinition & QtMobility::QContactDetailDefinition::operator=(class QtMobility::QContactDetailDefinition const &) - ??1QContactTimestamp@QtMobility@@UAE@XZ @ 897 NONAME ; QtMobility::QContactTimestamp::~QContactTimestamp(void) - ?qt_metacall@QContactManagerEngine@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 898 NONAME ; int QtMobility::QContactManagerEngine::qt_metacall(enum QMetaObject::Call, int, void * *) - ??9QContactDetailDefinitionField@QtMobility@@QBE_NABV01@@Z @ 899 NONAME ; bool QtMobility::QContactDetailDefinitionField::operator!=(class QtMobility::QContactDetailDefinitionField const &) const - ?managerName@QContactMemoryEngine@QtMobility@@UBE?AVQString@@XZ @ 900 NONAME ; class QString QtMobility::QContactMemoryEngine::managerName(void) const - ??1QContactActionDescriptor@QtMobility@@QAE@XZ @ 901 NONAME ; QtMobility::QContactActionDescriptor::~QContactActionDescriptor(void) - ??1QContactDetailDefinitionFetchRequest@QtMobility@@UAE@XZ @ 902 NONAME ; QtMobility::QContactDetailDefinitionFetchRequest::~QContactDetailDefinitionFetchRequest(void) - ?setAssistantName@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 903 NONAME ; void QtMobility::QContactOrganization::setAssistantName(class QString const &) - ?staticMetaObject@QContactManagerEngine@QtMobility@@2UQMetaObject@@B @ 904 NONAME ; struct QMetaObject const QtMobility::QContactManagerEngine::staticMetaObject - ?values@QContactDetail@QtMobility@@QBE?AV?$QMap@VQString@@VQVariant@@@@XZ @ 905 NONAME ; class QMap QtMobility::QContactDetail::values(void) const - ??0QContactIntersectionFilter@QtMobility@@QAE@XZ @ 906 NONAME ; QtMobility::QContactIntersectionFilter::QContactIntersectionFilter(void) - ??_EQContactActionFilter@QtMobility@@UAE@I@Z @ 907 NONAME ; QtMobility::QContactActionFilter::~QContactActionFilter(unsigned int) - ?SubTypeHouse@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$05@2@B @ 908 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactAnniversary::SubTypeHouse - ?progress@QContactLocalIdFetchRequest@QtMobility@@IAEXPAV12@_N@Z @ 909 NONAME ; void QtMobility::QContactLocalIdFetchRequest::progress(class QtMobility::QContactLocalIdFetchRequest *, bool) - ?qt_metacall@QContactRemoveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 910 NONAME ; int QtMobility::QContactRemoveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) - ??_EQContactActionFactory@QtMobility@@UAE@I@Z @ 911 NONAME ; QtMobility::QContactActionFactory::~QContactActionFactory(unsigned int) - ?FieldRegion@QContactAddress@QtMobility@@2U?$Latin1Literal@$06@2@B @ 912 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactAddress::FieldRegion - ?detailWithAction@QContact@QtMobility@@QBE?AVQContactDetail@2@ABVQString@@@Z @ 913 NONAME ; class QtMobility::QContactDetail QtMobility::QContact::detailWithAction(class QString const &) const - ?details@QContact@QtMobility@@QBE?AV?$QList@VQContactDetail@QtMobility@@@@ABVQString@@@Z @ 914 NONAME ; class QList QtMobility::QContact::details(class QString const &) const - ?d_func@QContactDetailDefinitionSaveRequest@QtMobility@@AAEPAVQContactDetailDefinitionSaveRequestPrivate@2@XZ @ 915 NONAME ; class QtMobility::QContactDetailDefinitionSaveRequestPrivate * QtMobility::QContactDetailDefinitionSaveRequest::d_func(void) - ?removeDetailDefinition@QContactMemoryEngine@QtMobility@@UAE_NABVQString@@0AAW4Error@QContactManager@2@@Z @ 916 NONAME ; bool QtMobility::QContactMemoryEngine::removeDetailDefinition(class QString const &, class QString const &, enum QtMobility::QContactManager::Error &) - ??BQContactSortOrder@QtMobility@@QBE?AV?$QList@VQContactSortOrder@QtMobility@@@@XZ @ 917 NONAME ; QtMobility::QContactSortOrder::operator class QList(void) const - ?qt_metacast@QContactDetailDefinitionRemoveRequest@QtMobility@@UAEPAXPBD@Z @ 918 NONAME ; void * QtMobility::QContactDetailDefinitionRemoveRequest::qt_metacast(char const *) - ??0QContactUnionFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 919 NONAME ; QtMobility::QContactUnionFilter::QContactUnionFilter(class QtMobility::QContactFilter const &) - ?d_func@QContactDetailDefinitionFetchRequest@QtMobility@@ABEPBVQContactDetailDefinitionFetchRequestPrivate@2@XZ @ 920 NONAME ; class QtMobility::QContactDetailDefinitionFetchRequestPrivate const * QtMobility::QContactDetailDefinitionFetchRequest::d_func(void) const - ?SubTypeImage@QContactAvatar@QtMobility@@2U?$Latin1Literal@$05@2@B @ 921 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactAvatar::SubTypeImage - ??1QContactNote@QtMobility@@UAE@XZ @ 922 NONAME ; QtMobility::QContactNote::~QContactNote(void) - ?setMatchFlags@QContactDetailFilter@QtMobility@@QAEXV?$QFlags@W4MatchFlag@QContactFilter@QtMobility@@@@@Z @ 923 NONAME ; void QtMobility::QContactDetailFilter::setMatchFlags(class QFlags) - ?setParticipant@QContactRelationshipFetchRequest@QtMobility@@QAEXABVQContactId@2@W4Role@QContactRelationshipFilter@2@@Z @ 924 NONAME ; void QtMobility::QContactRelationshipFetchRequest::setParticipant(class QtMobility::QContactId const &, enum QtMobility::QContactRelationshipFilter::Role) - ??8QContactActionDescriptor@QtMobility@@QBE_NABV01@@Z @ 925 NONAME ; bool QtMobility::QContactActionDescriptor::operator==(class QtMobility::QContactActionDescriptor const &) const - ??_EQContactDetailDefinitionSaveRequest@QtMobility@@UAE@I@Z @ 926 NONAME ; QtMobility::QContactDetailDefinitionSaveRequest::~QContactDetailDefinitionSaveRequest(unsigned int) - ?region@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 927 NONAME ; class QString QtMobility::QContactAddress::region(void) const - ?setVendorName@QContactActionDescriptor@QtMobility@@QAEXABVQString@@@Z @ 928 NONAME ; void QtMobility::QContactActionDescriptor::setVendorName(class QString const &) - ?setSubTypes@QContactPhoneNumber@QtMobility@@QAEXABVQString@@@Z @ 929 NONAME ; void QtMobility::QContactPhoneNumber::setSubTypes(class QString const &) - ?saveRelationship@QContactMemoryEngine@QtMobility@@UAE_NPAVQContactRelationship@2@AAW4Error@QContactManager@2@@Z @ 930 NONAME ; bool QtMobility::QContactMemoryEngine::saveRelationship(class QtMobility::QContactRelationship *, enum QtMobility::QContactManager::Error &) - ??0QContactRelationship@QtMobility@@QAE@XZ @ 931 NONAME ; QtMobility::QContactRelationship::QContactRelationship(void) - ??0QContactGender@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 932 NONAME ; QtMobility::QContactGender::QContactGender(class QtMobility::QContactDetail const &) - ?FieldSubTypes@QContactAddress@QtMobility@@2U?$Latin1Literal@$08@2@B @ 933 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactAddress::FieldSubTypes - ?d_func@QContactRelationshipFilter@QtMobility@@AAEPAVQContactRelationshipFilterPrivate@2@XZ @ 934 NONAME ; class QtMobility::QContactRelationshipFilterPrivate * QtMobility::QContactRelationshipFilter::d_func(void) - ?staticMetaObject@QContactMemoryEngine@QtMobility@@2UQMetaObject@@B @ 935 NONAME ; struct QMetaObject const QtMobility::QContactMemoryEngine::staticMetaObject - ?tr@QContactFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 936 NONAME ; class QString QtMobility::QContactFetchRequest::tr(char const *, char const *, int) - ?managerUri@QContactId@QtMobility@@QBE?AVQString@@XZ @ 937 NONAME ; class QString QtMobility::QContactId::managerUri(void) const - ?setNote@QContactNote@QtMobility@@QAEXABVQString@@@Z @ 938 NONAME ; void QtMobility::QContactNote::setNote(class QString const &) - ?d_func@QContactRelationshipRemoveRequest@QtMobility@@ABEPBVQContactRelationshipRemoveRequestPrivate@2@XZ @ 939 NONAME ; class QtMobility::QContactRelationshipRemoveRequestPrivate const * QtMobility::QContactRelationshipRemoveRequest::d_func(void) const - ??1QContactGender@QtMobility@@UAE@XZ @ 940 NONAME ; QtMobility::QContactGender::~QContactGender(void) - ?setChildren@QContactFamily@QtMobility@@QAEXABVQStringList@@@Z @ 941 NONAME ; void QtMobility::QContactFamily::setChildren(class QStringList const &) - ?FieldAssistantName@QContactOrganization@QtMobility@@2U?$Latin1Literal@$0O@@2@B @ 942 NONAME ; struct QtMobility::Latin1Literal<14> const QtMobility::QContactOrganization::FieldAssistantName - ?dataType@QContactDetailDefinitionField@QtMobility@@QBE?AW4Type@QVariant@@XZ @ 943 NONAME ; enum QVariant::Type QtMobility::QContactDetailDefinitionField::dataType(void) const - ??0QContactMemoryEngine@QtMobility@@IAE@ABV?$QMap@VQString@@V1@@@@Z @ 944 NONAME ; QtMobility::QContactMemoryEngine::QContactMemoryEngine(class QMap const &) - ?SubTypeAssistant@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$09@2@B @ 945 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactPhoneNumber::SubTypeAssistant - ?FieldEvent@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$05@2@B @ 946 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactAnniversary::FieldEvent - ??0QContactSyncTarget@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 947 NONAME ; QtMobility::QContactSyncTarget::QContactSyncTarget(class QtMobility::QContactDetail const &) - ?selfContactId@QContactMemoryEngine@QtMobility@@UBEIAAW4Error@QContactManager@2@@Z @ 948 NONAME ; unsigned int QtMobility::QContactMemoryEngine::selfContactId(enum QtMobility::QContactManager::Error &) const - ?longitude@QContactGeolocation@QtMobility@@QBENXZ @ 949 NONAME ; double QtMobility::QContactGeolocation::longitude(void) const - ?setLocality@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 950 NONAME ; void QtMobility::QContactAddress::setLocality(class QString const &) - ?accuracy@QContactGeolocation@QtMobility@@QBENXZ @ 951 NONAME ; double QtMobility::QContactGeolocation::accuracy(void) const - ?removeRelationship@QContactMemoryEngine@QtMobility@@AAE_NABVQContactRelationship@2@AAVQContactChangeSet@2@AAW4Error@QContactManager@2@@Z @ 952 NONAME ; bool QtMobility::QContactMemoryEngine::removeRelationship(class QtMobility::QContactRelationship const &, class QtMobility::QContactChangeSet &, enum QtMobility::QContactManager::Error &) - ??6QContactUnionFilter@QtMobility@@QAEAAV01@ABVQContactFilter@1@@Z @ 953 NONAME ; class QtMobility::QContactUnionFilter & QtMobility::QContactUnionFilter::operator<<(class QtMobility::QContactFilter const &) - ?removeContact@QContactManager@QtMobility@@QAE_NABI@Z @ 954 NONAME ; bool QtMobility::QContactManager::removeContact(unsigned int const &) - ?tr@QContactRelationshipSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 955 NONAME ; class QString QtMobility::QContactRelationshipSaveRequest::tr(char const *, char const *, int) - ??1QContactId@QtMobility@@QAE@XZ @ 956 NONAME ; QtMobility::QContactId::~QContactId(void) - ?getStaticMetaObject@QContactFetchRequest@QtMobility@@SAABUQMetaObject@@XZ @ 957 NONAME ; struct QMetaObject const & QtMobility::QContactFetchRequest::getStaticMetaObject(void) - ?detailDefinitions@QContactManager@QtMobility@@QBE?AV?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@ABVQString@@@Z @ 958 NONAME ; class QMap QtMobility::QContactManager::detailDefinitions(class QString const &) const - ?type@QContact@QtMobility@@QBE?AVQString@@XZ @ 959 NONAME ; class QString QtMobility::QContact::type(void) const - ?sorting@QContactFetchRequest@QtMobility@@QBE?AV?$QList@VQContactSortOrder@QtMobility@@@@XZ @ 960 NONAME ; class QList QtMobility::QContactFetchRequest::sorting(void) const - ?setDate@QContactBirthday@QtMobility@@QAEXABVQDate@@@Z @ 961 NONAME ; void QtMobility::QContactBirthday::setDate(class QDate const &) - ?staticMetaObject@QContactAbstractRequest@QtMobility@@2UQMetaObject@@B @ 962 NONAME ; struct QMetaObject const QtMobility::QContactAbstractRequest::staticMetaObject - ?removeDetailDefinition@QContactManagerEngine@QtMobility@@UAE_NABVQString@@0AAW4Error@QContactManager@2@@Z @ 963 NONAME ; bool QtMobility::QContactManagerEngine::removeDetailDefinition(class QString const &, class QString const &, enum QtMobility::QContactManager::Error &) - ?vendorName@QContactActionDescriptor@QtMobility@@QBE?AVQString@@XZ @ 964 NONAME ; class QString QtMobility::QContactActionDescriptor::vendorName(void) const - ??1QContactDetailRangeFilter@QtMobility@@UAE@XZ @ 965 NONAME ; QtMobility::QContactDetailRangeFilter::~QContactDetailRangeFilter(void) - ?FieldUrl@QContactUrl@QtMobility@@2U?$Latin1Literal@$03@2@B @ 966 NONAME ; struct QtMobility::Latin1Literal<4> const QtMobility::QContactUrl::FieldUrl - ??0QContactDetailDefinitionSaveRequest@QtMobility@@QAE@XZ @ 967 NONAME ; QtMobility::QContactDetailDefinitionSaveRequest::QContactDetailDefinitionSaveRequest(void) - ?isPreferredDetail@QContact@QtMobility@@QBE_NABVQString@@ABVQContactDetail@2@@Z @ 968 NONAME ; bool QtMobility::QContact::isPreferredDetail(class QString const &, class QtMobility::QContactDetail const &) const - ??1QContactAvatar@QtMobility@@UAE@XZ @ 969 NONAME ; QtMobility::QContactAvatar::~QContactAvatar(void) - ?clear@QContactChangeSet@QtMobility@@QAEXXZ @ 970 NONAME ; void QtMobility::QContactChangeSet::clear(void) - ?isEmpty@QContact@QtMobility@@QBE_NXZ @ 971 NONAME ; bool QtMobility::QContact::isEmpty(void) const - ?implementationVersion@QContactMemoryEngine@QtMobility@@UBEHXZ @ 972 NONAME ; int QtMobility::QContactMemoryEngine::implementationVersion(void) const - ?FieldSubTypes@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$08@2@B @ 973 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactOnlineAccount::FieldSubTypes - ?FieldNote@QContactNote@QtMobility@@2U?$Latin1Literal@$04@2@B @ 974 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactNote::FieldNote - ?version@QContactManagerEngine@QtMobility@@SAHXZ @ 975 NONAME ; int QtMobility::QContactManagerEngine::version(void) - ??0QContactType@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 976 NONAME ; QtMobility::QContactType::QContactType(class QtMobility::QContactDetail const &) - ??1QContactAction@QtMobility@@UAE@XZ @ 977 NONAME ; QtMobility::QContactAction::~QContactAction(void) - ?role@QContactRelationshipFilter@QtMobility@@QBE?AW4Role@12@XZ @ 978 NONAME ; enum QtMobility::QContactRelationshipFilter::Role QtMobility::QContactRelationshipFilter::role(void) const - ?setRelationships@QContactRelationshipSaveRequest@QtMobility@@QAEXABV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 979 NONAME ; void QtMobility::QContactRelationshipSaveRequest::setRelationships(class QList const &) - ?tr@QContactAbstractRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 980 NONAME ; class QString QtMobility::QContactAbstractRequest::tr(char const *, char const *, int) - ??4QContactTimestamp@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 981 NONAME ; class QtMobility::QContactTimestamp & QtMobility::QContactTimestamp::operator=(class QtMobility::QContactDetail const &) - ?names@QContactDetailDefinitionFetchRequest@QtMobility@@QBE?AVQStringList@@XZ @ 982 NONAME ; class QStringList QtMobility::QContactDetailDefinitionFetchRequest::names(void) const - ?d_func@QContactActionFilter@QtMobility@@ABEPBVQContactActionFilterPrivate@2@XZ @ 983 NONAME ; class QtMobility::QContactActionFilterPrivate const * QtMobility::QContactActionFilter::d_func(void) const - ??_EQContactManagerEngine@QtMobility@@UAE@I@Z @ 984 NONAME ; QtMobility::QContactManagerEngine::~QContactManagerEngine(unsigned int) - ?waitForRequestFinished@QContactMemoryEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@H@Z @ 985 NONAME ; bool QtMobility::QContactMemoryEngine::waitForRequestFinished(class QtMobility::QContactAbstractRequest *, int) - ?managerUri@QContactManagerEngine@QtMobility@@QBE?AVQString@@XZ @ 986 NONAME ; class QString QtMobility::QContactManagerEngine::managerUri(void) const - ?hasFeature@QContactManagerEngine@QtMobility@@UBE_NW4ManagerFeature@QContactManager@2@ABVQString@@@Z @ 987 NONAME ; bool QtMobility::QContactManagerEngine::hasFeature(enum QtMobility::QContactManager::ManagerFeature, class QString const &) const - ?setDefinitions@QContactDetailDefinitionSaveRequest@QtMobility@@QAEXABV?$QList@VQContactDetailDefinition@QtMobility@@@@@Z @ 988 NONAME ; void QtMobility::QContactDetailDefinitionSaveRequest::setDefinitions(class QList const &) - ?locality@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 989 NONAME ; class QString QtMobility::QContactAddress::locality(void) const - ?FieldSpeed@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$05@2@B @ 990 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactGeolocation::FieldSpeed - ??1QContactDetailFilter@QtMobility@@UAE@XZ @ 991 NONAME ; QtMobility::QContactDetailFilter::~QContactDetailFilter(void) - ?isEmpty@QContactActionDescriptor@QtMobility@@QBE_NXZ @ 992 NONAME ; bool QtMobility::QContactActionDescriptor::isEmpty(void) const - ?setSelfContactId@QContactManager@QtMobility@@QAE_NABI@Z @ 993 NONAME ; bool QtMobility::QContactManager::setSelfContactId(unsigned int const &) - ?setContactRelationships@QContactManagerEngine@QtMobility@@SAXPAVQContact@2@ABV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 994 NONAME ; void QtMobility::QContactManagerEngine::setContactRelationships(class QtMobility::QContact *, class QList const &) - ?fields@QContactDetailDefinition@QtMobility@@QBE?AV?$QMap@VQString@@VQContactDetailDefinitionField@QtMobility@@@@XZ @ 995 NONAME ; class QMap QtMobility::QContactDetailDefinition::fields(void) const - ?getStaticMetaObject@QContactRelationshipRemoveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 996 NONAME ; struct QMetaObject const & QtMobility::QContactRelationshipRemoveRequest::getStaticMetaObject(void) - ?contactsRemoved@QContactManagerEngine@QtMobility@@IAEXABV?$QList@I@@@Z @ 997 NONAME ; void QtMobility::QContactManagerEngine::contactsRemoved(class QList const &) - ?isValid@QContactSortOrder@QtMobility@@QBE_NXZ @ 998 NONAME ; bool QtMobility::QContactSortOrder::isValid(void) const - ?metaObject@QContactRelationshipFetchRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 999 NONAME ; struct QMetaObject const * QtMobility::QContactRelationshipFetchRequest::metaObject(void) const - ?FieldTimestamp@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$09@2@B @ 1000 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactGeolocation::FieldTimestamp - ?FieldName@QContactOrganization@QtMobility@@2U?$Latin1Literal@$04@2@B @ 1001 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactOrganization::FieldName - ?tr@QContactFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 1002 NONAME ; class QString QtMobility::QContactFetchRequest::tr(char const *, char const *) - ?removeContact@QContactManagerEngine@QtMobility@@UAE_NABIAAW4Error@QContactManager@2@@Z @ 1003 NONAME ; bool QtMobility::QContactManagerEngine::removeContact(unsigned int const &, enum QtMobility::QContactManager::Error &) - ??1QContactRelationshipFilter@QtMobility@@UAE@XZ @ 1004 NONAME ; QtMobility::QContactRelationshipFilter::~QContactRelationshipFilter(void) - ??0QContactChangeSet@QtMobility@@QAE@ABV01@@Z @ 1005 NONAME ; QtMobility::QContactChangeSet::QContactChangeSet(class QtMobility::QContactChangeSet const &) - ?filters@QContactUnionFilter@QtMobility@@QBE?AV?$QList@VQContactFilter@QtMobility@@@@XZ @ 1006 NONAME ; class QList QtMobility::QContactUnionFilter::filters(void) const - ?waitForProgress@QContactAbstractRequest@QtMobility@@QAE_NH@Z @ 1007 NONAME ; bool QtMobility::QContactAbstractRequest::waitForProgress(int) - ?qt_metacast@QContactRelationshipFetchRequest@QtMobility@@UAEPAXPBD@Z @ 1008 NONAME ; void * QtMobility::QContactRelationshipFetchRequest::qt_metacast(char const *) - ?managerName@QContactManager@QtMobility@@QBE?AVQString@@XZ @ 1009 NONAME ; class QString QtMobility::QContactManager::managerName(void) const - ?DefinitionName@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$0O@@2@B @ 1010 NONAME ; struct QtMobility::Latin1Literal<14> const QtMobility::QContactOnlineAccount::DefinitionName - ?FieldNickname@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$08@2@B @ 1011 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactOnlineAccount::FieldNickname - ??4QContactSyncTarget@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 1012 NONAME ; class QtMobility::QContactSyncTarget & QtMobility::QContactSyncTarget::operator=(class QtMobility::QContactDetail const &) - ?qt_metacall@QContactSaveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 1013 NONAME ; int QtMobility::QContactSaveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) - ?label@QContactDisplayLabel@QtMobility@@QBE?AVQString@@XZ @ 1014 NONAME ; class QString QtMobility::QContactDisplayLabel::label(void) const - ?ids@QContactLocalIdFetchRequest@QtMobility@@QBE?AV?$QList@I@@XZ @ 1015 NONAME ; class QList QtMobility::QContactLocalIdFetchRequest::ids(void) const - ??_EQContactPhoneNumber@QtMobility@@UAE@I@Z @ 1016 NONAME ; QtMobility::QContactPhoneNumber::~QContactPhoneNumber(unsigned int) - ?presence@QContactOnlineAccount@QtMobility@@QBE?AVQString@@XZ @ 1017 NONAME ; class QString QtMobility::QContactOnlineAccount::presence(void) const - ?nickname@QContactOnlineAccount@QtMobility@@QBE?AVQString@@XZ @ 1018 NONAME ; class QString QtMobility::QContactOnlineAccount::nickname(void) const - ?dataChanged@QContactManager@QtMobility@@IAEXXZ @ 1019 NONAME ; void QtMobility::QContactManager::dataChanged(void) - ?contacts@QContactManager@QtMobility@@QBE?AV?$QList@I@@ABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 1020 NONAME ; class QList QtMobility::QContactManager::contacts(class QList const &) const - ?contacts@QContactSaveRequest@QtMobility@@QBE?AV?$QList@VQContact@QtMobility@@@@XZ @ 1021 NONAME ; class QList QtMobility::QContactSaveRequest::contacts(void) const - ??1QContactOnlineAccount@QtMobility@@UAE@XZ @ 1022 NONAME ; QtMobility::QContactOnlineAccount::~QContactOnlineAccount(void) - ??4QContactAnniversary@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 1023 NONAME ; class QtMobility::QContactAnniversary & QtMobility::QContactAnniversary::operator=(class QtMobility::QContactDetail const &) - ?staticMetaObject@QContactDetailDefinitionFetchRequest@QtMobility@@2UQMetaObject@@B @ 1024 NONAME ; struct QMetaObject const QtMobility::QContactDetailDefinitionFetchRequest::staticMetaObject - ?createMemoryEngine@QContactMemoryEngine@QtMobility@@SAPAV12@ABV?$QMap@VQString@@V1@@@@Z @ 1025 NONAME ; class QtMobility::QContactMemoryEngine * QtMobility::QContactMemoryEngine::createMemoryEngine(class QMap const &) - ?SubTypeDomestic@QContactAddress@QtMobility@@2U?$Latin1Literal@$08@2@B @ 1026 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactAddress::SubTypeDomestic - ??0QContactLocalIdFilter@QtMobility@@QAE@XZ @ 1027 NONAME ; QtMobility::QContactLocalIdFilter::QContactLocalIdFilter(void) - ??4QContactOrganization@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 1028 NONAME ; class QtMobility::QContactOrganization & QtMobility::QContactOrganization::operator=(class QtMobility::QContactDetail const &) - ?matchFlags@QContactDetailRangeFilter@QtMobility@@QBE?AV?$QFlags@W4MatchFlag@QContactFilter@QtMobility@@@@XZ @ 1029 NONAME ; class QFlags QtMobility::QContactDetailRangeFilter::matchFlags(void) const - ??0QContactType@QtMobility@@QAE@XZ @ 1030 NONAME ; QtMobility::QContactType::QContactType(void) - ?setRelationshipType@QContactRelationship@QtMobility@@QAEXABVQString@@@Z @ 1031 NONAME ; void QtMobility::QContactRelationship::setRelationshipType(class QString const &) - ?setSelfContactId@QContactManagerEngine@QtMobility@@UAE_NABIAAW4Error@QContactManager@2@@Z @ 1032 NONAME ; bool QtMobility::QContactManagerEngine::setSelfContactId(unsigned int const &, enum QtMobility::QContactManager::Error &) - ?setMiddle@QContactName@QtMobility@@QAEXABVQString@@@Z @ 1033 NONAME ; void QtMobility::QContactName::setMiddle(class QString const &) - ?children@QContactFamily@QtMobility@@QBE?AVQStringList@@XZ @ 1034 NONAME ; class QStringList QtMobility::QContactFamily::children(void) const - ?department@QContactOrganization@QtMobility@@QBE?AVQStringList@@XZ @ 1035 NONAME ; class QStringList QtMobility::QContactOrganization::department(void) const - ?d_func@QContactUnionFilter@QtMobility@@AAEPAVQContactUnionFilterPrivate@2@XZ @ 1036 NONAME ; class QtMobility::QContactUnionFilterPrivate * QtMobility::QContactUnionFilter::d_func(void) + ?setDetailAccessConstraints@QContactManagerEngine@QtMobility@@IBEXPAVQContactDetail@2@V?$QFlags@W4AccessConstraint@QContactDetail@QtMobility@@@@@Z @ 46 NONAME ; void QtMobility::QContactManagerEngine::setDetailAccessConstraints(class QtMobility::QContactDetail *, class QFlags) const + ?setDetailDefinitionName@QContactDetailFilter@QtMobility@@QAEXABVQString@@0@Z @ 47 NONAME ; void QtMobility::QContactDetailFilter::setDetailDefinitionName(class QString const &, class QString const &) + ??_EQContactRelationshipRemoveRequest@QtMobility@@UAE@I@Z @ 48 NONAME ; QtMobility::QContactRelationshipRemoveRequest::~QContactRelationshipRemoveRequest(unsigned int) + ??1QContactInvalidFilter@QtMobility@@UAE@XZ @ 49 NONAME ; QtMobility::QContactInvalidFilter::~QContactInvalidFilter(void) + ?participant@QContactRelationshipFetchRequest@QtMobility@@QBE?AVQContactId@2@XZ @ 50 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipFetchRequest::participant(void) const + ?linkedDetailUris@QContactDetail@QtMobility@@QBE?AVQStringList@@XZ @ 51 NONAME ; class QStringList QtMobility::QContactDetail::linkedDetailUris(void) const + ??0QContactManagerEngine@QtMobility@@QAE@XZ @ 52 NONAME ; QtMobility::QContactManagerEngine::QContactManagerEngine(void) + ?contactIds@QContactManager@QtMobility@@QBE?AV?$QList@I@@ABVQContactFilter@2@ABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 53 NONAME ; class QList QtMobility::QContactManager::contactIds(class QtMobility::QContactFilter const &, class QList const &) const + ?FieldLocation@QContactOrganization@QtMobility@@2U?$Latin1Literal@$08@2@B @ 54 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactOrganization::FieldLocation + ?progress@QContactDetailDefinitionFetchRequest@QtMobility@@IAEXPAV12@_N@Z @ 55 NONAME ; void QtMobility::QContactDetailDefinitionFetchRequest::progress(class QtMobility::QContactDetailDefinitionFetchRequest *, bool) + ?removeContacts@QContactManagerEngine@QtMobility@@UAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@I@@AAW4Error@QContactManager@2@@Z @ 56 NONAME ; class QList QtMobility::QContactManagerEngine::removeContacts(class QList *, enum QtMobility::QContactManager::Error &) + ?setAvatar@QContactAvatar@QtMobility@@QAEXABVQString@@@Z @ 57 NONAME ; void QtMobility::QContactAvatar::setAvatar(class QString const &) + ?DefinitionName@QContactAvatar@QtMobility@@2U?$Latin1Literal@$06@2@B @ 58 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactAvatar::DefinitionName + ?trUtf8@QContactManagerEngine@QtMobility@@SA?AVQString@@PBD0H@Z @ 59 NONAME ; class QString QtMobility::QContactManagerEngine::trUtf8(char const *, char const *, int) + ?relationshipType@QContactRelationshipFetchRequest@QtMobility@@QBE?AVQString@@XZ @ 60 NONAME ; class QString QtMobility::QContactRelationshipFetchRequest::relationshipType(void) const + ?second@QContactRelationship@QtMobility@@QBE?AVQContactId@2@XZ @ 61 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationship::second(void) const + ?d_func@QContactRelationshipSaveRequest@QtMobility@@AAEPAVQContactRelationshipSaveRequestPrivate@2@XZ @ 62 NONAME ; class QtMobility::QContactRelationshipSaveRequestPrivate * QtMobility::QContactRelationshipSaveRequest::d_func(void) + ?setStatusMessage@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 63 NONAME ; void QtMobility::QContactOnlineAccount::setStatusMessage(class QString const &) + ??0QContactFetchRequest@QtMobility@@QAE@XZ @ 64 NONAME ; QtMobility::QContactFetchRequest::QContactFetchRequest(void) + ??4QContactName@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 65 NONAME ; class QtMobility::QContactName & QtMobility::QContactName::operator=(class QtMobility::QContactDetail const &) + ?cancel@QContactAbstractRequest@QtMobility@@QAE_NXZ @ 66 NONAME ; bool QtMobility::QContactAbstractRequest::cancel(void) + ?setMatchFlags@QContactDetailRangeFilter@QtMobility@@QAEXV?$QFlags@W4MatchFlag@QContactFilter@QtMobility@@@@@Z @ 67 NONAME ; void QtMobility::QContactDetailRangeFilter::setMatchFlags(class QFlags) + ?actionName@QContactActionFilter@QtMobility@@QBE?AVQString@@XZ @ 68 NONAME ; class QString QtMobility::QContactActionFilter::actionName(void) const + ?FieldLocality@QContactAddress@QtMobility@@2U?$Latin1Literal@$08@2@B @ 69 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactAddress::FieldLocality + ?d_func@QContactDetailRangeFilter@QtMobility@@ABEPBVQContactDetailRangeFilterPrivate@2@XZ @ 70 NONAME ; class QtMobility::QContactDetailRangeFilterPrivate const * QtMobility::QContactDetailRangeFilter::d_func(void) const + ?type@QContactType@QtMobility@@QBE?AVQString@@XZ @ 71 NONAME ; class QString QtMobility::QContactType::type(void) const + ?setLabel@QContactGeolocation@QtMobility@@QAEXABVQString@@@Z @ 72 NONAME ; void QtMobility::QContactGeolocation::setLabel(class QString const &) + ?PresenceBusy@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$04@2@B @ 73 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactOnlineAccount::PresenceBusy + ?d_func@QContactLocalIdFetchRequest@QtMobility@@ABEPBVQContactLocalIdFetchRequestPrivate@2@XZ @ 74 NONAME ; class QtMobility::QContactLocalIdFetchRequestPrivate const * QtMobility::QContactLocalIdFetchRequest::d_func(void) const + ?DefinitionName@QContactType@QtMobility@@2U?$Latin1Literal@$04@2@B @ 75 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactType::DefinitionName + ??_EQContactLocalIdFetchRequest@QtMobility@@UAE@I@Z @ 76 NONAME ; QtMobility::QContactLocalIdFetchRequest::~QContactLocalIdFetchRequest(unsigned int) + ?FieldLogo@QContactOrganization@QtMobility@@2U?$Latin1Literal@$04@2@B @ 77 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactOrganization::FieldLogo + ?schemaDefinitions@QContactManagerEngine@QtMobility@@SA?AV?$QMap@VQString@@V?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@@@XZ @ 78 NONAME ; class QMap > QtMobility::QContactManagerEngine::schemaDefinitions(void) + ??1QContactGeolocation@QtMobility@@UAE@XZ @ 79 NONAME ; QtMobility::QContactGeolocation::~QContactGeolocation(void) + ?detailDefinitionName@QContactDetailFilter@QtMobility@@QBE?AVQString@@XZ @ 80 NONAME ; class QString QtMobility::QContactDetailFilter::detailDefinitionName(void) const + ?getStaticMetaObject@QContactLocalIdFetchRequest@QtMobility@@SAABUQMetaObject@@XZ @ 81 NONAME ; struct QMetaObject const & QtMobility::QContactLocalIdFetchRequest::getStaticMetaObject(void) + ?relatedContacts@QContact@QtMobility@@QBE?AV?$QList@VQContactId@QtMobility@@@@ABVQString@@W4Role@QContactRelationshipFilter@2@@Z @ 82 NONAME ; class QList QtMobility::QContact::relatedContacts(class QString const &, enum QtMobility::QContactRelationshipFilter::Role) const + ?FieldLatitude@QContactGeoLocation@QtMobility@@2U?$Latin1Literal@$08@2@B @ 83 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactGeoLocation::FieldLatitude + ?setName@QContactDetailDefinition@QtMobility@@QAEXABVQString@@@Z @ 84 NONAME ; void QtMobility::QContactDetailDefinition::setName(class QString const &) + ?displayLabel@QContact@QtMobility@@QBE?AVQString@@XZ @ 85 NONAME ; class QString QtMobility::QContact::displayLabel(void) const + ?assign@QContactDetail@QtMobility@@IAEAAV12@ABV12@ABVQString@@@Z @ 86 NONAME ; class QtMobility::QContactDetail & QtMobility::QContactDetail::assign(class QtMobility::QContactDetail const &, class QString const &) + ??4QContactEmailAddress@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 87 NONAME ; class QtMobility::QContactEmailAddress & QtMobility::QContactEmailAddress::operator=(class QtMobility::QContactDetail const &) + ?tr@QContactSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 88 NONAME ; class QString QtMobility::QContactSaveRequest::tr(char const *, char const *, int) + ?DefinitionName@QContactOrganization@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 89 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactOrganization::DefinitionName + ??1QContactBirthday@QtMobility@@UAE@XZ @ 90 NONAME ; QtMobility::QContactBirthday::~QContactBirthday(void) + ?removeRelationship@QContactManagerEngine@QtMobility@@UAE_NABVQContactRelationship@2@AAW4Error@QContactManager@2@@Z @ 91 NONAME ; bool QtMobility::QContactManagerEngine::removeRelationship(class QtMobility::QContactRelationship const &, enum QtMobility::QContactManager::Error &) + ?qt_metacall@QContactRelationshipSaveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 92 NONAME ; int QtMobility::QContactRelationshipSaveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ?managerVersion@QContactManagerEngine@QtMobility@@UBEHXZ @ 93 NONAME ; int QtMobility::QContactManagerEngine::managerVersion(void) const + ?setLastName@QContactName@QtMobility@@QAEXABVQString@@@Z @ 94 NONAME ; void QtMobility::QContactName::setLastName(class QString const &) + ?trUtf8@QContactManager@QtMobility@@SA?AVQString@@PBD0H@Z @ 95 NONAME ; class QString QtMobility::QContactManager::trUtf8(char const *, char const *, int) + ?setSelfContactId@QContactMemoryEngine@QtMobility@@UAE_NABIAAW4Error@QContactManager@2@@Z @ 96 NONAME ; bool QtMobility::QContactMemoryEngine::setSelfContactId(unsigned int const &, enum QtMobility::QContactManager::Error &) + ?tr@QContactDetailDefinitionRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 97 NONAME ; class QString QtMobility::QContactDetailDefinitionRemoveRequest::tr(char const *, char const *, int) + ?definitions@QContactDetailDefinitionFetchRequest@QtMobility@@QBE?AV?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@XZ @ 98 NONAME ; class QMap QtMobility::QContactDetailDefinitionFetchRequest::definitions(void) const + ?setSubType@QContactAnniversary@QtMobility@@QAEXABVQString@@@Z @ 99 NONAME ; void QtMobility::QContactAnniversary::setSubType(class QString const &) + ?detailDefinition@QContactManagerEngine@QtMobility@@UBE?AVQContactDetailDefinition@2@ABVQString@@0AAW4Error@QContactManager@2@@Z @ 100 NONAME ; class QtMobility::QContactDetailDefinition QtMobility::QContactManagerEngine::detailDefinition(class QString const &, class QString const &, enum QtMobility::QContactManager::Error &) const + ??1QContact@QtMobility@@QAE@XZ @ 101 NONAME ; QtMobility::QContact::~QContact(void) + ?updateRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactAbstractRequest@2@ABV?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@W4Error@QContactManager@2@ABV?$QList@W4Error@QContactManager@QtMobility@@@@W4Status@32@_N@Z @ 102 NONAME ; void QtMobility::QContactManagerEngine::updateRequest(class QtMobility::QContactAbstractRequest *, class QMap const &, enum QtMobility::QContactManager::Error, class QList const &, enum QtMobility::QContactAbstractRequest::Status, bool) + ?updateContactFetchRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactFetchRequest@2@ABV?$QList@VQContact@QtMobility@@@@W4Error@QContactManager@2@@Z @ 103 NONAME ; void QtMobility::QContactManagerEngine::updateContactFetchRequest(class QtMobility::QContactFetchRequest *, class QList const &, enum QtMobility::QContactManager::Error) + ??9QContactSortOrder@QtMobility@@QBE_NABV01@@Z @ 104 NONAME ; bool QtMobility::QContactSortOrder::operator!=(class QtMobility::QContactSortOrder const &) const + ?setLinkedDetailUris@QContactDetail@QtMobility@@QAEXABVQStringList@@@Z @ 105 NONAME ; void QtMobility::QContactDetail::setLinkedDetailUris(class QStringList const &) + ?FieldBirthday@QContactBirthday@QtMobility@@2U?$Latin1Literal@$08@2@B @ 106 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactBirthday::FieldBirthday + ?saveDetailDefinition@QContactManagerEngine@QtMobility@@UAE_NABVQContactDetailDefinition@2@ABVQString@@AAW4Error@QContactManager@2@@Z @ 107 NONAME ; bool QtMobility::QContactManagerEngine::saveDetailDefinition(class QtMobility::QContactDetailDefinition const &, class QString const &, enum QtMobility::QContactManager::Error &) + ?GenderFemale@QContactGender@QtMobility@@2U?$Latin1Literal@$06@2@B @ 108 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactGender::GenderFemale + ?trUtf8@QContactManager@QtMobility@@SA?AVQString@@PBD0@Z @ 109 NONAME ; class QString QtMobility::QContactManager::trUtf8(char const *, char const *) + ?details@QContact@QtMobility@@QBE?AV?$QList@VQContactDetail@QtMobility@@@@ABVQString@@00@Z @ 110 NONAME ; class QList QtMobility::QContact::details(class QString const &, class QString const &, class QString const &) const + ?FieldChildren@QContactFamily@QtMobility@@2U?$Latin1Literal@$08@2@B @ 111 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactFamily::FieldChildren + ?setName@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 112 NONAME ; void QtMobility::QContactOrganization::setName(class QString const &) + ?timestamp@QContactGeoLocation@QtMobility@@QBE?AVQDateTime@@XZ @ 113 NONAME ; class QDateTime QtMobility::QContactGeoLocation::timestamp(void) const + ?setNames@QContactDetailDefinitionFetchRequest@QtMobility@@QAEXABVQStringList@@@Z @ 114 NONAME ; void QtMobility::QContactDetailDefinitionFetchRequest::setNames(class QStringList const &) + ?append@QContactUnionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 115 NONAME ; void QtMobility::QContactUnionFilter::append(class QtMobility::QContactFilter const &) + ??0QContactGeoLocation@QtMobility@@QAE@XZ @ 116 NONAME ; QtMobility::QContactGeoLocation::QContactGeoLocation(void) + ?isFinished@QContactAbstractRequest@QtMobility@@QBE_NXZ @ 117 NONAME ; bool QtMobility::QContactAbstractRequest::isFinished(void) const + ??0QContactChangeSet@QtMobility@@QAE@XZ @ 118 NONAME ; QtMobility::QContactChangeSet::QContactChangeSet(void) + ??0QContactInvalidFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 119 NONAME ; QtMobility::QContactInvalidFilter::QContactInvalidFilter(class QtMobility::QContactFilter const &) + ?addedRelationshipsContacts@QContactChangeSet@QtMobility@@QAEAAV?$QSet@I@@XZ @ 120 NONAME ; class QSet & QtMobility::QContactChangeSet::addedRelationshipsContacts(void) + ?createEngine@QContactManager@QtMobility@@AAEXABVQString@@ABV?$QMap@VQString@@V1@@@@Z @ 121 NONAME ; void QtMobility::QContactManager::createEngine(class QString const &, class QMap const &) + ??0QContactAddress@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 122 NONAME ; QtMobility::QContactAddress::QContactAddress(class QtMobility::QContactDetail const &) + ??1QContactRelationship@QtMobility@@QAE@XZ @ 123 NONAME ; QtMobility::QContactRelationship::~QContactRelationship(void) + ?d_func@QContactRelationshipFetchRequest@QtMobility@@ABEPBVQContactRelationshipFetchRequestPrivate@2@XZ @ 124 NONAME ; class QtMobility::QContactRelationshipFetchRequestPrivate const * QtMobility::QContactRelationshipFetchRequest::d_func(void) const + ?ContextWork@QContactDetail@QtMobility@@2U?$Latin1Literal@$04@2@B @ 125 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactDetail::ContextWork + ?tr@QContactRelationshipRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 126 NONAME ; class QString QtMobility::QContactRelationshipRemoveRequest::tr(char const *, char const *, int) + ??4QContactDetail@QtMobility@@QAEAAV01@ABV01@@Z @ 127 NONAME ; class QtMobility::QContactDetail & QtMobility::QContactDetail::operator=(class QtMobility::QContactDetail const &) + ?dataType@QContactDetailFieldDefinition@QtMobility@@QBE?AW4Type@QVariant@@XZ @ 128 NONAME ; enum QVariant::Type QtMobility::QContactDetailFieldDefinition::dataType(void) const + ??0QContactId@QtMobility@@QAE@XZ @ 129 NONAME ; QtMobility::QContactId::QContactId(void) + ?url@QContactUrl@QtMobility@@QBE?AVQString@@XZ @ 130 NONAME ; class QString QtMobility::QContactUrl::url(void) const + ?managerParameters@QContactMemoryEngine@QtMobility@@UBE?AV?$QMap@VQString@@V1@@@XZ @ 131 NONAME ; class QMap QtMobility::QContactMemoryEngine::managerParameters(void) const + ?setPostOfficeBox@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 132 NONAME ; void QtMobility::QContactAddress::setPostOfficeBox(class QString const &) + ?contact@QContactManager@QtMobility@@QBE?AVQContact@2@ABIABVQStringList@@@Z @ 133 NONAME ; class QtMobility::QContact QtMobility::QContactManager::contact(unsigned int const &, class QStringList const &) const + ??_EQContactAbstractRequest@QtMobility@@UAE@I@Z @ 134 NONAME ; QtMobility::QContactAbstractRequest::~QContactAbstractRequest(unsigned int) + ?updateRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactAbstractRequest@2@ABV?$QList@VQContact@QtMobility@@@@W4Error@QContactManager@2@ABV?$QList@W4Error@QContactManager@QtMobility@@@@W4Status@32@_N@Z @ 135 NONAME ; void QtMobility::QContactManagerEngine::updateRequest(class QtMobility::QContactAbstractRequest *, class QList const &, enum QtMobility::QContactManager::Error, class QList const &, enum QtMobility::QContactAbstractRequest::Status, bool) + ?location@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 136 NONAME ; class QString QtMobility::QContactOrganization::location(void) const + ?FieldAltitude@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$08@2@B @ 137 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactGeolocation::FieldAltitude + ?minValue@QContactDetailRangeFilter@QtMobility@@QBE?AVQVariant@@XZ @ 138 NONAME ; class QVariant QtMobility::QContactDetailRangeFilter::minValue(void) const + ??_EQContactRelationshipFetchRequest@QtMobility@@UAE@I@Z @ 139 NONAME ; QtMobility::QContactRelationshipFetchRequest::~QContactRelationshipFetchRequest(unsigned int) + ??0QContactManager@QtMobility@@QAE@ABVQString@@HABV?$QMap@VQString@@V1@@@PAVQObject@@@Z @ 140 NONAME ; QtMobility::QContactManager::QContactManager(class QString const &, int, class QMap const &, class QObject *) + ?setDataType@QContactDetailFieldDefinition@QtMobility@@QAEXW4Type@QVariant@@@Z @ 141 NONAME ; void QtMobility::QContactDetailFieldDefinition::setDataType(enum QVariant::Type) + ??_EQContactNickname@QtMobility@@UAE@I@Z @ 142 NONAME ; QtMobility::QContactNickname::~QContactNickname(unsigned int) + ?contact@QContactManagerEngine@QtMobility@@UBE?AVQContact@2@ABIABVQStringList@@AAW4Error@QContactManager@2@@Z @ 143 NONAME ; class QtMobility::QContact QtMobility::QContactManagerEngine::contact(unsigned int const &, class QStringList const &, enum QtMobility::QContactManager::Error &) const + ?detailsWithAction@QContact@QtMobility@@QBE?AV?$QList@VQContactDetail@QtMobility@@@@ABVQString@@@Z @ 144 NONAME ; class QList QtMobility::QContact::detailsWithAction(class QString const &) const + ?capabilities@QContactOnlineAccount@QtMobility@@QBE?AVQStringList@@XZ @ 145 NONAME ; class QStringList QtMobility::QContactOnlineAccount::capabilities(void) const + ?DefinitionName@QContactGeoLocation@QtMobility@@2U?$Latin1Literal@$0M@@2@B @ 146 NONAME ; struct QtMobility::Latin1Literal<12> const QtMobility::QContactGeoLocation::DefinitionName + ?qt_metacall@QContactDetailDefinitionRemoveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 147 NONAME ; int QtMobility::QContactDetailDefinitionRemoveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ??_EQContactInvalidFilter@QtMobility@@UAE@I@Z @ 148 NONAME ; QtMobility::QContactInvalidFilter::~QContactInvalidFilter(unsigned int) + ??_EQContactGeolocation@QtMobility@@UAE@I@Z @ 149 NONAME ; QtMobility::QContactGeolocation::~QContactGeolocation(unsigned int) + ??0QContactOnlineAccount@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 150 NONAME ; QtMobility::QContactOnlineAccount::QContactOnlineAccount(class QtMobility::QContactDetail const &) + ?actionName@QContactActionDescriptor@QtMobility@@QBE?AVQString@@XZ @ 151 NONAME ; class QString QtMobility::QContactActionDescriptor::actionName(void) const + ?setHeading@QContactGeolocation@QtMobility@@QAEXN@Z @ 152 NONAME ; void QtMobility::QContactGeolocation::setHeading(double) + ?setAllowableValues@QContactDetailFieldDefinition@QtMobility@@QAEXV?$QList@VQVariant@@@@@Z @ 153 NONAME ; void QtMobility::QContactDetailFieldDefinition::setAllowableValues(class QList) + ??1QContactDetailFieldDefinition@QtMobility@@QAE@XZ @ 154 NONAME ; QtMobility::QContactDetailFieldDefinition::~QContactDetailFieldDefinition(void) + ?d_func@QContactUnionFilter@QtMobility@@ABEPBVQContactUnionFilterPrivate@2@XZ @ 155 NONAME ; class QtMobility::QContactUnionFilterPrivate const * QtMobility::QContactUnionFilter::d_func(void) const + ?actionDescriptors@QContactAction@QtMobility@@SA?AV?$QList@VQContactActionDescriptor@QtMobility@@@@ABVQString@@0H@Z @ 156 NONAME ; class QList QtMobility::QContactAction::actionDescriptors(class QString const &, class QString const &, int) + ?detailFieldName@QContactDetailRangeFilter@QtMobility@@QBE?AVQString@@XZ @ 157 NONAME ; class QString QtMobility::QContactDetailRangeFilter::detailFieldName(void) const + ?setFirst@QContactRelationship@QtMobility@@QAEXABVQContactId@2@@Z @ 158 NONAME ; void QtMobility::QContactRelationship::setFirst(class QtMobility::QContactId const &) + ??9QContactDetail@QtMobility@@QBE_NABV01@@Z @ 159 NONAME ; bool QtMobility::QContactDetail::operator!=(class QtMobility::QContactDetail const &) const + ?saveRelationships@QContactManager@QtMobility@@QAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 160 NONAME ; class QList QtMobility::QContactManager::saveRelationships(class QList *) + ?definitionNames@QContactDetailDefinitionFetchRequest@QtMobility@@QBE?AVQStringList@@XZ @ 161 NONAME ; class QStringList QtMobility::QContactDetailDefinitionFetchRequest::definitionNames(void) const + ?updateRelationshipRemoveRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactRelationshipRemoveRequest@2@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 162 NONAME ; void QtMobility::QContactManagerEngine::updateRelationshipRemoveRequest(class QtMobility::QContactRelationshipRemoveRequest *, enum QtMobility::QContactManager::Error, class QMap const &) + ?setSpeed@QContactGeoLocation@QtMobility@@QAEXN@Z @ 163 NONAME ; void QtMobility::QContactGeoLocation::setSpeed(double) + ?setSecond@QContactRelationshipFetchRequest@QtMobility@@QAEXABVQContactId@2@@Z @ 164 NONAME ; void QtMobility::QContactRelationshipFetchRequest::setSecond(class QtMobility::QContactId const &) + ?setAltitude@QContactGeoLocation@QtMobility@@QAEXN@Z @ 165 NONAME ; void QtMobility::QContactGeoLocation::setAltitude(double) + ?middle@QContactName@QtMobility@@QBE?AVQString@@XZ @ 166 NONAME ; class QString QtMobility::QContactName::middle(void) const + ?managerName@QContactManagerEngine@QtMobility@@UBE?AVQString@@XZ @ 167 NONAME ; class QString QtMobility::QContactManagerEngine::managerName(void) const + ?FieldSpouse@QContactFamily@QtMobility@@2U?$Latin1Literal@$06@2@B @ 168 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactFamily::FieldSpouse + ?cancelRequest@QContactManagerEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@@Z @ 169 NONAME ; bool QtMobility::QContactManagerEngine::cancelRequest(class QtMobility::QContactAbstractRequest *) + ?FieldAvatarPixmap@QContactAvatar@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 170 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactAvatar::FieldAvatarPixmap + ?contactIds@QContactMemoryEngine@QtMobility@@UBE?AV?$QList@I@@ABV?$QList@VQContactSortOrder@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 171 NONAME ; class QList QtMobility::QContactMemoryEngine::contactIds(class QList const &, enum QtMobility::QContactManager::Error &) const + ?trUtf8@QContactFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 172 NONAME ; class QString QtMobility::QContactFetchRequest::trUtf8(char const *, char const *) + ?trUtf8@QContactRelationshipSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 173 NONAME ; class QString QtMobility::QContactRelationshipSaveRequest::trUtf8(char const *, char const *) + ??1QContactGeoLocation@QtMobility@@UAE@XZ @ 174 NONAME ; QtMobility::QContactGeoLocation::~QContactGeoLocation(void) + ?setUnique@QContactDetailDefinition@QtMobility@@QAEX_N@Z @ 175 NONAME ; void QtMobility::QContactDetailDefinition::setUnique(bool) + ??0QContactManager@QtMobility@@QAE@PAVQObject@@@Z @ 176 NONAME ; QtMobility::QContactManager::QContactManager(class QObject *) + ?subType@QContactAnniversary@QtMobility@@QBE?AVQString@@XZ @ 177 NONAME ; class QString QtMobility::QContactAnniversary::subType(void) const + ?FieldSubType@QContactAvatar@QtMobility@@2U?$Latin1Literal@$07@2@B @ 178 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactAvatar::FieldSubType + ??9QContactRelationship@QtMobility@@QBE_NABV01@@Z @ 179 NONAME ; bool QtMobility::QContactRelationship::operator!=(class QtMobility::QContactRelationship const &) const + ?removeContacts@QContactManager@QtMobility@@QAE_NPAV?$QList@I@@PAV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 180 NONAME ; bool QtMobility::QContactManager::removeContacts(class QList *, class QMap *) + ?getStaticMetaObject@QContactRelationshipSaveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 181 NONAME ; struct QMetaObject const & QtMobility::QContactRelationshipSaveRequest::getStaticMetaObject(void) + ?FieldMiddle@QContactName@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 182 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactName::FieldMiddle + ??4QContactId@QtMobility@@QAEAAV01@ABV01@@Z @ 183 NONAME ; class QtMobility::QContactId & QtMobility::QContactId::operator=(class QtMobility::QContactId const &) + ??4QContact@QtMobility@@QAEAAV01@ABV01@@Z @ 184 NONAME ; class QtMobility::QContact & QtMobility::QContact::operator=(class QtMobility::QContact const &) + ??1QContactChangeLogFilter@QtMobility@@UAE@XZ @ 185 NONAME ; QtMobility::QContactChangeLogFilter::~QContactChangeLogFilter(void) + ?FieldLongitude@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$09@2@B @ 186 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactGeolocation::FieldLongitude + ?HasManager@QContactRelationship@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 187 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactRelationship::HasManager + ?subTypes@QContactPhoneNumber@QtMobility@@QBE?AVQStringList@@XZ @ 188 NONAME ; class QStringList QtMobility::QContactPhoneNumber::subTypes(void) const + ?prepend@QContactUnionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 189 NONAME ; void QtMobility::QContactUnionFilter::prepend(class QtMobility::QContactFilter const &) + ?postcode@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 190 NONAME ; class QString QtMobility::QContactAddress::postcode(void) const + ?setDefinitionNames@QContactDetailDefinitionFetchRequest@QtMobility@@QAEXABVQStringList@@@Z @ 191 NONAME ; void QtMobility::QContactDetailDefinitionFetchRequest::setDefinitionNames(class QStringList const &) + ?DefinitionName@QContactUrl@QtMobility@@2U?$Latin1Literal@$03@2@B @ 192 NONAME ; struct QtMobility::Latin1Literal<4> const QtMobility::QContactUrl::DefinitionName + ?setLatitude@QContactGeolocation@QtMobility@@QAEXN@Z @ 193 NONAME ; void QtMobility::QContactGeolocation::setLatitude(double) + ?errors@QContactAbstractRequest@QtMobility@@QBE?AV?$QList@W4Error@QContactManager@QtMobility@@@@XZ @ 194 NONAME ; class QList QtMobility::QContactAbstractRequest::errors(void) const + ?selfContactIdChanged@QContactManagerEngine@QtMobility@@IAEXABI0@Z @ 195 NONAME ; void QtMobility::QContactManagerEngine::selfContactIdChanged(unsigned int const &, unsigned int const &) + ?removeRelationships@QContactManagerEngine@QtMobility@@UAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@ABV?$QList@VQContactRelationship@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 196 NONAME ; class QList QtMobility::QContactManagerEngine::removeRelationships(class QList const &, enum QtMobility::QContactManager::Error &) + ?SubTypeInternational@QContactAddress@QtMobility@@2U?$Latin1Literal@$0O@@2@B @ 197 NONAME ; struct QtMobility::Latin1Literal<14> const QtMobility::QContactAddress::SubTypeInternational + ?d_func@QContactDetailDefinitionFetchRequest@QtMobility@@AAEPAVQContactDetailDefinitionFetchRequestPrivate@2@XZ @ 198 NONAME ; class QtMobility::QContactDetailDefinitionFetchRequestPrivate * QtMobility::QContactDetailDefinitionFetchRequest::d_func(void) + ?metaObject@QContactActionFactory@QtMobility@@UBEPBUQMetaObject@@XZ @ 199 NONAME ; struct QMetaObject const * QtMobility::QContactActionFactory::metaObject(void) const + ?setLast@QContactName@QtMobility@@QAEXABVQString@@@Z @ 200 NONAME ; void QtMobility::QContactName::setLast(class QString const &) + ??1QContactName@QtMobility@@UAE@XZ @ 201 NONAME ; QtMobility::QContactName::~QContactName(void) + ??0QContact@QtMobility@@QAE@XZ @ 202 NONAME ; QtMobility::QContact::QContact(void) + ?gender@QContactGender@QtMobility@@QBE?AVQString@@XZ @ 203 NONAME ; class QString QtMobility::QContactGender::gender(void) const + ?removeContact@QContactMemoryEngine@QtMobility@@UAE_NABIAAW4Error@QContactManager@2@@Z @ 204 NONAME ; bool QtMobility::QContactMemoryEngine::removeContact(unsigned int const &, enum QtMobility::QContactManager::Error &) + ??0QContactGender@QtMobility@@QAE@XZ @ 205 NONAME ; QtMobility::QContactGender::QContactGender(void) + ?availableManagers@QContactManager@QtMobility@@SA?AVQStringList@@XZ @ 206 NONAME ; class QStringList QtMobility::QContactManager::availableManagers(void) + ?setDefinitionNames@QContactDetailDefinitionRemoveRequest@QtMobility@@QAEXABVQString@@ABVQStringList@@@Z @ 207 NONAME ; void QtMobility::QContactDetailDefinitionRemoveRequest::setDefinitionNames(class QString const &, class QStringList const &) + ?setType@QContact@QtMobility@@QAEXABVQString@@@Z @ 208 NONAME ; void QtMobility::QContact::setType(class QString const &) + ??0QContactNote@QtMobility@@QAE@XZ @ 209 NONAME ; QtMobility::QContactNote::QContactNote(void) + ??1QContactGuid@QtMobility@@UAE@XZ @ 210 NONAME ; QtMobility::QContactGuid::~QContactGuid(void) + ?saveContacts@QContactManager@QtMobility@@QAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@VQContact@QtMobility@@@@@Z @ 211 NONAME ; class QList QtMobility::QContactManager::saveContacts(class QList *) + ??_EQContactGender@QtMobility@@UAE@I@Z @ 212 NONAME ; QtMobility::QContactGender::~QContactGender(unsigned int) + ?errorMap@QContactRelationshipSaveRequest@QtMobility@@QBE?AV?$QMap@HW4Error@QContactManager@QtMobility@@@@XZ @ 213 NONAME ; class QMap QtMobility::QContactRelationshipSaveRequest::errorMap(void) const + ?supportedDetails@QContactAction@QtMobility@@UBE?AV?$QList@VQContactDetail@QtMobility@@@@ABVQContact@2@@Z @ 214 NONAME ; class QList QtMobility::QContactAction::supportedDetails(class QtMobility::QContact const &) const + ?SubTypeCar@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$03@2@B @ 215 NONAME ; struct QtMobility::Latin1Literal<4> const QtMobility::QContactPhoneNumber::SubTypeCar + ?tr@QContactRelationshipSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 216 NONAME ; class QString QtMobility::QContactRelationshipSaveRequest::tr(char const *, char const *) + ?tr@QContactAbstractRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 217 NONAME ; class QString QtMobility::QContactAbstractRequest::tr(char const *, char const *) + ?selfContactId@QContactManager@QtMobility@@QBEIXZ @ 218 NONAME ; unsigned int QtMobility::QContactManager::selfContactId(void) const + ?d_func@QContactRelationshipSaveRequest@QtMobility@@ABEPBVQContactRelationshipSaveRequestPrivate@2@XZ @ 219 NONAME ; class QtMobility::QContactRelationshipSaveRequestPrivate const * QtMobility::QContactRelationshipSaveRequest::d_func(void) const + ?FieldNumber@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$0M@@2@B @ 220 NONAME ; struct QtMobility::Latin1Literal<12> const QtMobility::QContactPhoneNumber::FieldNumber + ?isActive@QContactAbstractRequest@QtMobility@@QBE_NXZ @ 221 NONAME ; bool QtMobility::QContactAbstractRequest::isActive(void) const + ??_EQContactDetail@QtMobility@@UAE@I@Z @ 222 NONAME ; QtMobility::QContactDetail::~QContactDetail(unsigned int) + ?getStaticMetaObject@QContactAction@QtMobility@@SAABUQMetaObject@@XZ @ 223 NONAME ; struct QMetaObject const & QtMobility::QContactAction::getStaticMetaObject(void) + ?deref@QContactMemoryEngine@QtMobility@@UAEXXZ @ 224 NONAME ; void QtMobility::QContactMemoryEngine::deref(void) + ??1QContactAddress@QtMobility@@UAE@XZ @ 225 NONAME ; QtMobility::QContactAddress::~QContactAddress(void) + ??_EQContactChangeLogFilter@QtMobility@@UAE@I@Z @ 226 NONAME ; QtMobility::QContactChangeLogFilter::~QContactChangeLogFilter(unsigned int) + ?setSubType@QContactUrl@QtMobility@@QAEXABVQString@@@Z @ 227 NONAME ; void QtMobility::QContactUrl::setSubType(class QString const &) + ?fields@QContactDetailDefinition@QtMobility@@QAEAAV?$QMap@VQString@@VQContactDetailFieldDefinition@QtMobility@@@@XZ @ 228 NONAME ; class QMap & QtMobility::QContactDetailDefinition::fields(void) + ?SubTypeModem@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$05@2@B @ 229 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactPhoneNumber::SubTypeModem + ?FieldLinkedDetailUris@QContactDetail@QtMobility@@2U?$Latin1Literal@$0BB@@2@B @ 230 NONAME ; struct QtMobility::Latin1Literal<17> const QtMobility::QContactDetail::FieldLinkedDetailUris + ??4QContactNote@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 231 NONAME ; class QtMobility::QContactNote & QtMobility::QContactNote::operator=(class QtMobility::QContactDetail const &) + ?setSubTypes@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 232 NONAME ; void QtMobility::QContactAddress::setSubTypes(class QString const &) + ?saveContacts@QContactManagerEngine@QtMobility@@UAE_NPAV?$QList@VQContact@QtMobility@@@@PAV?$QMap@HW4Error@QContactManager@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 233 NONAME ; bool QtMobility::QContactManagerEngine::saveContacts(class QList *, class QMap *, enum QtMobility::QContactManager::Error &) + ??1QContactMemoryEngine@QtMobility@@UAE@XZ @ 234 NONAME ; QtMobility::QContactMemoryEngine::~QContactMemoryEngine(void) + ?setCreated@QContactTimestamp@QtMobility@@QAEXABVQDateTime@@@Z @ 235 NONAME ; void QtMobility::QContactTimestamp::setCreated(class QDateTime const &) + ?relationships@QContactRelationshipFetchRequest@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@XZ @ 236 NONAME ; class QList QtMobility::QContactRelationshipFetchRequest::relationships(void) const + ??1QContactFetchRequest@QtMobility@@UAE@XZ @ 237 NONAME ; QtMobility::QContactFetchRequest::~QContactFetchRequest(void) + ??0QContactAvatar@QtMobility@@QAE@XZ @ 238 NONAME ; QtMobility::QContactAvatar::QContactAvatar(void) + ?saveRelationship@QContactManagerEngine@QtMobility@@UAE_NPAVQContactRelationship@2@AAW4Error@QContactManager@2@@Z @ 239 NONAME ; bool QtMobility::QContactManagerEngine::saveRelationship(class QtMobility::QContactRelationship *, enum QtMobility::QContactManager::Error &) + ?ContextOther@QContactDetail@QtMobility@@2U?$Latin1Literal@$05@2@B @ 240 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactDetail::ContextOther + ??1QContactLocalIdFetchRequest@QtMobility@@UAE@XZ @ 241 NONAME ; QtMobility::QContactLocalIdFetchRequest::~QContactLocalIdFetchRequest(void) + ?setCaseSensitivity@QContactSortOrder@QtMobility@@QAEXW4CaseSensitivity@Qt@@@Z @ 242 NONAME ; void QtMobility::QContactSortOrder::setCaseSensitivity(enum Qt::CaseSensitivity) + ?saveContacts@QContactMemoryEngine@QtMobility@@UAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@VQContact@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 243 NONAME ; class QList QtMobility::QContactMemoryEngine::saveContacts(class QList *, enum QtMobility::QContactManager::Error &) + ??0QContactOnlineAccount@QtMobility@@QAE@XZ @ 244 NONAME ; QtMobility::QContactOnlineAccount::QContactOnlineAccount(void) + ?setSecond@QContactRelationship@QtMobility@@QAEXABVQContactId@2@@Z @ 245 NONAME ; void QtMobility::QContactRelationship::setSecond(class QtMobility::QContactId const &) + ?country@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 246 NONAME ; class QString QtMobility::QContactAddress::country(void) const + ?setTitle@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 247 NONAME ; void QtMobility::QContactOrganization::setTitle(class QString const &) + ?saveRelationships@QContactMemoryEngine@QtMobility@@UAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@VQContactRelationship@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 248 NONAME ; class QList QtMobility::QContactMemoryEngine::saveRelationships(class QList *, enum QtMobility::QContactManager::Error &) + ?FieldLabel@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$05@2@B @ 249 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactGeolocation::FieldLabel + ?setContactType@QContactDetailDefinitionRemoveRequest@QtMobility@@QAEXABVQString@@@Z @ 250 NONAME ; void QtMobility::QContactDetailDefinitionRemoveRequest::setContactType(class QString const &) + ??0QContactFamily@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 251 NONAME ; QtMobility::QContactFamily::QContactFamily(class QtMobility::QContactDetail const &) + ?latitude@QContactGeolocation@QtMobility@@QBENXZ @ 252 NONAME ; double QtMobility::QContactGeolocation::latitude(void) const + ?trUtf8@QContactDetailDefinitionRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 253 NONAME ; class QString QtMobility::QContactDetailDefinitionRemoveRequest::trUtf8(char const *, char const *, int) + ?FieldLast@QContactName@QtMobility@@2U?$Latin1Literal@$08@2@B @ 254 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactName::FieldLast + ??0QContactDetailDefinition@QtMobility@@QAE@ABV01@@Z @ 255 NONAME ; QtMobility::QContactDetailDefinition::QContactDetailDefinition(class QtMobility::QContactDetailDefinition const &) + ?prepend@QContactIntersectionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 256 NONAME ; void QtMobility::QContactIntersectionFilter::prepend(class QtMobility::QContactFilter const &) + ?detailUri@QContactDetail@QtMobility@@QBE?AVQString@@XZ @ 257 NONAME ; class QString QtMobility::QContactDetail::detailUri(void) const + ?splitUri@QContactManager@QtMobility@@SA_NABVQString@@PAV3@PAV?$QMap@VQString@@V1@@@@Z @ 258 NONAME ; bool QtMobility::QContactManager::splitUri(class QString const &, class QString *, class QMap *) + ?setFilters@QContactUnionFilter@QtMobility@@QAEXABV?$QList@VQContactFilter@QtMobility@@@@@Z @ 259 NONAME ; void QtMobility::QContactUnionFilter::setFilters(class QList const &) + ?saveDetailDefinition@QContactManager@QtMobility@@QAE_NABVQContactDetailDefinition@2@ABVQString@@@Z @ 260 NONAME ; bool QtMobility::QContactManager::saveDetailDefinition(class QtMobility::QContactDetailDefinition const &, class QString const &) + ??0QContactAnniversary@QtMobility@@QAE@XZ @ 261 NONAME ; QtMobility::QContactAnniversary::QContactAnniversary(void) + ??0QContactGeoLocation@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 262 NONAME ; QtMobility::QContactGeoLocation::QContactGeoLocation(class QtMobility::QContactDetail const &) + ?updateRequestState@QContactManagerEngine@QtMobility@@SAXPAVQContactAbstractRequest@2@W4State@32@@Z @ 263 NONAME ; void QtMobility::QContactManagerEngine::updateRequestState(class QtMobility::QContactAbstractRequest *, enum QtMobility::QContactAbstractRequest::State) + ?relationships@QContactRelationshipRemoveRequest@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@XZ @ 264 NONAME ; class QList QtMobility::QContactRelationshipRemoveRequest::relationships(void) const + ?version@QContactManagerEngineFactory@QtMobility@@QBEHXZ @ 265 NONAME ; int QtMobility::QContactManagerEngineFactory::version(void) const + ?lastName@QContactName@QtMobility@@QBE?AVQString@@XZ @ 266 NONAME ; class QString QtMobility::QContactName::lastName(void) const + ?waitForFinished@QContactAbstractRequest@QtMobility@@QAE_NH@Z @ 267 NONAME ; bool QtMobility::QContactAbstractRequest::waitForFinished(int) + ?qt_metacast@QContactManager@QtMobility@@UAEPAXPBD@Z @ 268 NONAME ; void * QtMobility::QContactManager::qt_metacast(char const *) + ?detailDefinitions@QContactManagerEngine@QtMobility@@UBE?AV?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@ABVQString@@AAW4Error@QContactManager@2@@Z @ 269 NONAME ; class QMap QtMobility::QContactManagerEngine::detailDefinitions(class QString const &, enum QtMobility::QContactManager::Error &) const + ?last@QContactName@QtMobility@@QBE?AVQString@@XZ @ 270 NONAME ; class QString QtMobility::QContactName::last(void) const + ?contacts@QContactManager@QtMobility@@QBE?AV?$QList@VQContact@QtMobility@@@@ABVQContactFilter@2@ABV?$QList@VQContactSortOrder@QtMobility@@@@ABVQStringList@@@Z @ 271 NONAME ; class QList QtMobility::QContactManager::contacts(class QtMobility::QContactFilter const &, class QList const &, class QStringList const &) const + ?oldAndNewSelfContactId@QContactChangeSet@QtMobility@@QAEAAU?$QPair@II@@XZ @ 272 NONAME ; struct QPair & QtMobility::QContactChangeSet::oldAndNewSelfContactId(void) + ?contacts@QContactMemoryEngine@QtMobility@@UBE?AV?$QList@I@@ABV?$QList@VQContactSortOrder@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 273 NONAME ; class QList QtMobility::QContactMemoryEngine::contacts(class QList const &, enum QtMobility::QContactManager::Error &) const + ?updateContactLocalIdFetchRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactLocalIdFetchRequest@2@ABV?$QList@I@@W4Error@QContactManager@2@@Z @ 274 NONAME ; void QtMobility::QContactManagerEngine::updateContactLocalIdFetchRequest(class QtMobility::QContactLocalIdFetchRequest *, class QList const &, enum QtMobility::QContactManager::Error) + ?trUtf8@QContactRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 275 NONAME ; class QString QtMobility::QContactRemoveRequest::trUtf8(char const *, char const *, int) + ??_EQContactSyncTarget@QtMobility@@UAE@I@Z @ 276 NONAME ; QtMobility::QContactSyncTarget::~QContactSyncTarget(unsigned int) + ?title@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 277 NONAME ; class QString QtMobility::QContactOrganization::title(void) const + ?FieldLabel@QContactDisplayLabel@QtMobility@@2U?$Latin1Literal@$05@2@B @ 278 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactDisplayLabel::FieldLabel + ??1QContactRelationshipSaveRequest@QtMobility@@UAE@XZ @ 279 NONAME ; QtMobility::QContactRelationshipSaveRequest::~QContactRelationshipSaveRequest(void) + ?isEmpty@QContactDetail@QtMobility@@QBE_NXZ @ 280 NONAME ; bool QtMobility::QContactDetail::isEmpty(void) const + ?supportedRelationshipTypes@QContactMemoryEngine@QtMobility@@UBE?AVQStringList@@ABVQString@@@Z @ 281 NONAME ; class QStringList QtMobility::QContactMemoryEngine::supportedRelationshipTypes(class QString const &) const + ?progress@QContactRelationshipRemoveRequest@QtMobility@@IAEXPAV12@@Z @ 282 NONAME ; void QtMobility::QContactRelationshipRemoveRequest::progress(class QtMobility::QContactRelationshipRemoveRequest *) + ?setFilter@QContactLocalIdFetchRequest@QtMobility@@QAEXABVQContactFilter@2@@Z @ 283 NONAME ; void QtMobility::QContactLocalIdFetchRequest::setFilter(class QtMobility::QContactFilter const &) + ?PresenceAway@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$04@2@B @ 284 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactOnlineAccount::PresenceAway + ?detailFieldName@QContactDetailFilter@QtMobility@@QBE?AVQString@@XZ @ 285 NONAME ; class QString QtMobility::QContactDetailFilter::detailFieldName(void) const + ?contactType@QContactDetailDefinitionFetchRequest@QtMobility@@QBE?AVQString@@XZ @ 286 NONAME ; class QString QtMobility::QContactDetailDefinitionFetchRequest::contactType(void) const + ?compareVariant@QContactManagerEngine@QtMobility@@SAHABVQVariant@@0W4CaseSensitivity@Qt@@@Z @ 287 NONAME ; int QtMobility::QContactManagerEngine::compareVariant(class QVariant const &, class QVariant const &, enum Qt::CaseSensitivity) + ?blankPolicy@QContactSortOrder@QtMobility@@QBE?AW4BlankPolicy@12@XZ @ 288 NONAME ; enum QtMobility::QContactSortOrder::BlankPolicy QtMobility::QContactSortOrder::blankPolicy(void) const + ?setSpouse@QContactFamily@QtMobility@@QAEXABVQString@@@Z @ 289 NONAME ; void QtMobility::QContactFamily::setSpouse(class QString const &) + ?progress@QContactAction@QtMobility@@IAEXW4Status@12@ABV?$QMap@VQString@@VQVariant@@@@@Z @ 290 NONAME ; void QtMobility::QContactAction::progress(enum QtMobility::QContactAction::Status, class QMap const &) + ?qt_metacast@QContactAbstractRequest@QtMobility@@UAEPAXPBD@Z @ 291 NONAME ; void * QtMobility::QContactAbstractRequest::qt_metacast(char const *) + ??_EQContactIntersectionFilter@QtMobility@@UAE@I@Z @ 292 NONAME ; QtMobility::QContactIntersectionFilter::~QContactIntersectionFilter(unsigned int) + ?setActionName@QContactActionDescriptor@QtMobility@@QAEXABVQString@@@Z @ 293 NONAME ; void QtMobility::QContactActionDescriptor::setActionName(class QString const &) + ?SubTypeVoice@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$05@2@B @ 294 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactPhoneNumber::SubTypeVoice + ?altitudeAccuracy@QContactGeolocation@QtMobility@@QBENXZ @ 295 NONAME ; double QtMobility::QContactGeolocation::altitudeAccuracy(void) const + ?setPreferredDetail@QContact@QtMobility@@QAE_NABVQString@@ABVQContactDetail@2@@Z @ 296 NONAME ; bool QtMobility::QContact::setPreferredDetail(class QString const &, class QtMobility::QContactDetail const &) + ??0QContactActionDescriptor@QtMobility@@QAE@ABVQString@@0H@Z @ 297 NONAME ; QtMobility::QContactActionDescriptor::QContactActionDescriptor(class QString const &, class QString const &, int) + ??0QContactInvalidFilter@QtMobility@@QAE@XZ @ 298 NONAME ; QtMobility::QContactInvalidFilter::QContactInvalidFilter(void) + ?trUtf8@QContactSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 299 NONAME ; class QString QtMobility::QContactSaveRequest::trUtf8(char const *, char const *, int) + ?staticMetaObject@QContactSaveRequest@QtMobility@@2UQMetaObject@@B @ 300 NONAME ; struct QMetaObject const QtMobility::QContactSaveRequest::staticMetaObject + ?engines@QContactMemoryEngine@QtMobility@@0V?$QMap@VQString@@PAVQContactMemoryEngine@QtMobility@@@@A @ 301 NONAME ; class QMap QtMobility::QContactMemoryEngine::engines + ?setValue@QContactDetail@QtMobility@@QAE_NABVQString@@ABVQVariant@@@Z @ 302 NONAME ; bool QtMobility::QContactDetail::setValue(class QString const &, class QVariant const &) + ??1QContactRelationshipFetchRequest@QtMobility@@UAE@XZ @ 303 NONAME ; QtMobility::QContactRelationshipFetchRequest::~QContactRelationshipFetchRequest(void) + ??_EQContactAvatar@QtMobility@@UAE@I@Z @ 304 NONAME ; QtMobility::QContactAvatar::~QContactAvatar(unsigned int) + ?contactIds@QContactManagerEngine@QtMobility@@UBE?AV?$QList@I@@ABVQContactFilter@2@ABV?$QList@VQContactSortOrder@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 305 NONAME ; class QList QtMobility::QContactManagerEngine::contactIds(class QtMobility::QContactFilter const &, class QList const &, enum QtMobility::QContactManager::Error &) const + ?setStreet@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 306 NONAME ; void QtMobility::QContactAddress::setStreet(class QString const &) + ?relationships@QContactManager@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@ABVQContactId@2@W4Role@QContactRelationshipFilter@2@@Z @ 307 NONAME ; class QList QtMobility::QContactManager::relationships(class QtMobility::QContactId const &, enum QtMobility::QContactRelationshipFilter::Role) const + ??0QContactBirthday@QtMobility@@QAE@XZ @ 308 NONAME ; QtMobility::QContactBirthday::QContactBirthday(void) + ??1QContactAnniversary@QtMobility@@UAE@XZ @ 309 NONAME ; QtMobility::QContactAnniversary::~QContactAnniversary(void) + ?availableActions@QContact@QtMobility@@QBE?AV?$QList@VQContactActionDescriptor@QtMobility@@@@ABVQString@@H@Z @ 310 NONAME ; class QList QtMobility::QContact::availableActions(class QString const &, int) const + ??4QContactPhoneNumber@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 311 NONAME ; class QtMobility::QContactPhoneNumber & QtMobility::QContactPhoneNumber::operator=(class QtMobility::QContactDetail const &) + ?updateRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactAbstractRequest@2@ABV?$QList@I@@W4Error@QContactManager@2@ABV?$QList@W4Error@QContactManager@QtMobility@@@@W4Status@32@_N@Z @ 312 NONAME ; void QtMobility::QContactManagerEngine::updateRequest(class QtMobility::QContactAbstractRequest *, class QList const &, enum QtMobility::QContactManager::Error, class QList const &, enum QtMobility::QContactAbstractRequest::Status, bool) + ?syncTarget@QContactSyncTarget@QtMobility@@QBE?AVQString@@XZ @ 313 NONAME ; class QString QtMobility::QContactSyncTarget::syncTarget(void) const + ?FieldFirstName@QContactName@QtMobility@@2U?$Latin1Literal@$09@2@B @ 314 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactName::FieldFirstName + ?detailDefinitionName@QContactDetailRangeFilter@QtMobility@@QBE?AVQString@@XZ @ 315 NONAME ; class QString QtMobility::QContactDetailRangeFilter::detailDefinitionName(void) const + ?setIds@QContactLocalIdFilter@QtMobility@@QAEXABV?$QList@I@@@Z @ 316 NONAME ; void QtMobility::QContactLocalIdFilter::setIds(class QList const &) + ?second@QContactRelationshipFetchRequest@QtMobility@@QBE?AVQContactId@2@XZ @ 317 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipFetchRequest::second(void) const + ?qt_metacast@QContactActionFactory@QtMobility@@UAEPAXPBD@Z @ 318 NONAME ; void * QtMobility::QContactActionFactory::qt_metacast(char const *) + ?d_func@QContactRemoveRequest@QtMobility@@ABEPBVQContactRemoveRequestPrivate@2@XZ @ 319 NONAME ; class QtMobility::QContactRemoveRequestPrivate const * QtMobility::QContactRemoveRequest::d_func(void) const + ?relatedContactRole@QContactRelationshipFilter@QtMobility@@QBE?AW4Role@12@XZ @ 320 NONAME ; enum QtMobility::QContactRelationshipFilter::Role QtMobility::QContactRelationshipFilter::relatedContactRole(void) const + ?tr@QContactDetailDefinitionRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 321 NONAME ; class QString QtMobility::QContactDetailDefinitionRemoveRequest::tr(char const *, char const *) + ??4QContactUrl@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 322 NONAME ; class QtMobility::QContactUrl & QtMobility::QContactUrl::operator=(class QtMobility::QContactDetail const &) + ?progress@QContactAction@QtMobility@@IAEXW4State@12@ABV?$QMap@VQString@@VQVariant@@@@@Z @ 323 NONAME ; void QtMobility::QContactAction::progress(enum QtMobility::QContactAction::State, class QMap const &) + ?setTimestamp@QContactGeolocation@QtMobility@@QAEXABVQDateTime@@@Z @ 324 NONAME ; void QtMobility::QContactGeolocation::setTimestamp(class QDateTime const &) + ?localId@QContact@QtMobility@@QBEIXZ @ 325 NONAME ; unsigned int QtMobility::QContact::localId(void) const + ??0QContactUrl@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 326 NONAME ; QtMobility::QContactUrl::QContactUrl(class QtMobility::QContactDetail const &) + ?DefinitionName@QContactNickname@QtMobility@@2U?$Latin1Literal@$08@2@B @ 327 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactNickname::DefinitionName + ?updateContactRemoveRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactRemoveRequest@2@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 328 NONAME ; void QtMobility::QContactManagerEngine::updateContactRemoveRequest(class QtMobility::QContactRemoveRequest *, enum QtMobility::QContactManager::Error, class QMap const &) + ?removeContacts@QContactMemoryEngine@QtMobility@@UAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@I@@AAW4Error@QContactManager@2@@Z @ 329 NONAME ; class QList QtMobility::QContactMemoryEngine::removeContacts(class QList *, enum QtMobility::QContactManager::Error &) + ?PresenceExtendedAway@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 330 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactOnlineAccount::PresenceExtendedAway + ?setDirection@QContactSortOrder@QtMobility@@QAEXW4SortOrder@Qt@@@Z @ 331 NONAME ; void QtMobility::QContactSortOrder::setDirection(enum Qt::SortOrder) + ?implementationVersion@QContactActionDescriptor@QtMobility@@QBEHXZ @ 332 NONAME ; int QtMobility::QContactActionDescriptor::implementationVersion(void) const + ?d_func@QContactSaveRequest@QtMobility@@AAEPAVQContactSaveRequestPrivate@2@XZ @ 333 NONAME ; class QtMobility::QContactSaveRequestPrivate * QtMobility::QContactSaveRequest::d_func(void) + ?pixmap@QContactAvatar@QtMobility@@QBE?AVQPixmap@@XZ @ 334 NONAME ; class QPixmap QtMobility::QContactAvatar::pixmap(void) const + ?setRole@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 335 NONAME ; void QtMobility::QContactOrganization::setRole(class QString const &) + ??8QContactSortOrder@QtMobility@@QBE_NABV01@@Z @ 336 NONAME ; bool QtMobility::QContactSortOrder::operator==(class QtMobility::QContactSortOrder const &) const + ?FieldType@QContactType@QtMobility@@2U?$Latin1Literal@$04@2@B @ 337 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactType::FieldType + ?spouse@QContactFamily@QtMobility@@QBE?AVQString@@XZ @ 338 NONAME ; class QString QtMobility::QContactFamily::spouse(void) const + ?latitude@QContactGeoLocation@QtMobility@@QBENXZ @ 339 NONAME ; double QtMobility::QContactGeoLocation::latitude(void) const + ??_EQContactMemoryEngine@QtMobility@@UAE@I@Z @ 340 NONAME ; QtMobility::QContactMemoryEngine::~QContactMemoryEngine(unsigned int) + ?tr@QContactLocalIdFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 341 NONAME ; class QString QtMobility::QContactLocalIdFetchRequest::tr(char const *, char const *) + ?setDetailDefinitionName@QContactSortOrder@QtMobility@@QAEXABVQString@@0@Z @ 342 NONAME ; void QtMobility::QContactSortOrder::setDetailDefinitionName(class QString const &, class QString const &) + ?FieldLatitude@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$08@2@B @ 343 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactGeolocation::FieldLatitude + ?trUtf8@QContactRelationshipRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 344 NONAME ; class QString QtMobility::QContactRelationshipRemoveRequest::trUtf8(char const *, char const *) + ?role@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 345 NONAME ; class QString QtMobility::QContactOrganization::role(void) const + ?removeValue@QContactDetail@QtMobility@@QAE_NABVQString@@@Z @ 346 NONAME ; bool QtMobility::QContactDetail::removeValue(class QString const &) + ??0QContactId@QtMobility@@QAE@ABV01@@Z @ 347 NONAME ; QtMobility::QContactId::QContactId(class QtMobility::QContactId const &) + ??0QContactDetail@QtMobility@@QAE@XZ @ 348 NONAME ; QtMobility::QContactDetail::QContactDetail(void) + ?heading@QContactGeolocation@QtMobility@@QBENXZ @ 349 NONAME ; double QtMobility::QContactGeolocation::heading(void) const + ??0QContactName@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 350 NONAME ; QtMobility::QContactName::QContactName(class QtMobility::QContactDetail const &) + ?synthesizedDisplayLabel@QContactManager@QtMobility@@QBE?AVQString@@ABVQContact@2@@Z @ 351 NONAME ; class QString QtMobility::QContactManager::synthesizedDisplayLabel(class QtMobility::QContact const &) const + ?removeRelationships@QContactMemoryEngine@QtMobility@@UAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@ABV?$QList@VQContactRelationship@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 352 NONAME ; class QList QtMobility::QContactMemoryEngine::removeRelationships(class QList const &, enum QtMobility::QContactManager::Error &) + ?guid@QContactGuid@QtMobility@@QBE?AVQString@@XZ @ 353 NONAME ; class QString QtMobility::QContactGuid::guid(void) const + ??8QContactDetail@QtMobility@@QBE_NABV01@@Z @ 354 NONAME ; bool QtMobility::QContactDetail::operator==(class QtMobility::QContactDetail const &) const + ?FieldCustomLabel@QContactName@QtMobility@@2U?$Latin1Literal@$0M@@2@B @ 355 NONAME ; struct QtMobility::Latin1Literal<12> const QtMobility::QContactName::FieldCustomLabel + ?setPrefix@QContactName@QtMobility@@QAEXABVQString@@@Z @ 356 NONAME ; void QtMobility::QContactName::setPrefix(class QString const &) + ?metaObject@QContactMemoryEngine@QtMobility@@UBEPBUQMetaObject@@XZ @ 357 NONAME ; struct QMetaObject const * QtMobility::QContactMemoryEngine::metaObject(void) const + ?setGender@QContactGender@QtMobility@@QAEXABVQString@@@Z @ 358 NONAME ; void QtMobility::QContactGender::setGender(class QString const &) + ?DefinitionName@QContactFamily@QtMobility@@2U?$Latin1Literal@$06@2@B @ 359 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactFamily::DefinitionName + ?qt_metacast@QContactDetailDefinitionFetchRequest@QtMobility@@UAEPAXPBD@Z @ 360 NONAME ; void * QtMobility::QContactDetailDefinitionFetchRequest::qt_metacast(char const *) + ?fromUri@QContactManager@QtMobility@@SAPAV12@ABVQString@@PAVQObject@@@Z @ 361 NONAME ; class QtMobility::QContactManager * QtMobility::QContactManager::fromUri(class QString const &, class QObject *) + ?contact@QContactMemoryEngine@QtMobility@@UBE?AVQContact@2@ABIAAW4Error@QContactManager@2@@Z @ 362 NONAME ; class QtMobility::QContact QtMobility::QContactMemoryEngine::contact(unsigned int const &, enum QtMobility::QContactManager::Error &) const + ?setRelationshipType@QContactRelationshipFilter@QtMobility@@QAEXABVQString@@@Z @ 363 NONAME ; void QtMobility::QContactRelationshipFilter::setRelationshipType(class QString const &) + ?FieldSubTypes@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$08@2@B @ 364 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactPhoneNumber::FieldSubTypes + ?FieldSuffix@QContactName@QtMobility@@2U?$Latin1Literal@$06@2@B @ 365 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactName::FieldSuffix + ?setFields@QContactDetailDefinition@QtMobility@@QAEXABV?$QMap@VQString@@VQContactDetailFieldDefinition@QtMobility@@@@@Z @ 366 NONAME ; void QtMobility::QContactDetailDefinition::setFields(class QMap const &) + ?startRequest@QContactMemoryEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@@Z @ 367 NONAME ; bool QtMobility::QContactMemoryEngine::startRequest(class QtMobility::QContactAbstractRequest *) + ?staticMetaObject@QContactRelationshipSaveRequest@QtMobility@@2UQMetaObject@@B @ 368 NONAME ; struct QMetaObject const QtMobility::QContactRelationshipSaveRequest::staticMetaObject + ?note@QContactNote@QtMobility@@QBE?AVQString@@XZ @ 369 NONAME ; class QString QtMobility::QContactNote::note(void) const + ??0QContactAbstractRequest@QtMobility@@IAE@PAVQContactAbstractRequestPrivate@1@@Z @ 370 NONAME ; QtMobility::QContactAbstractRequest::QContactAbstractRequest(class QtMobility::QContactAbstractRequestPrivate *) + ?saveContact@QContactMemoryEngine@QtMobility@@UAE_NPAVQContact@2@AAW4Error@QContactManager@2@@Z @ 371 NONAME ; bool QtMobility::QContactMemoryEngine::saveContact(class QtMobility::QContact *, enum QtMobility::QContactManager::Error &) + ?implementationVersion@QContactActionFilter@QtMobility@@QBEHXZ @ 372 NONAME ; int QtMobility::QContactActionFilter::implementationVersion(void) const + ?suffix@QContactName@QtMobility@@QBE?AVQString@@XZ @ 373 NONAME ; class QString QtMobility::QContactName::suffix(void) const + ?FieldSubType@QContactUrl@QtMobility@@2U?$Latin1Literal@$07@2@B @ 374 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactUrl::FieldSubType + ?contacts@QContactMemoryEngine@QtMobility@@UBE?AV?$QList@VQContact@QtMobility@@@@ABV?$QList@VQContactSortOrder@QtMobility@@@@ABVQStringList@@AAW4Error@QContactManager@2@@Z @ 375 NONAME ; class QList QtMobility::QContactMemoryEngine::contacts(class QList const &, class QStringList const &, enum QtMobility::QContactManager::Error &) const + ??_EQContactNote@QtMobility@@UAE@I@Z @ 376 NONAME ; QtMobility::QContactNote::~QContactNote(unsigned int) + ?d_func@QContactChangeLogFilter@QtMobility@@ABEPBVQContactChangeLogFilterPrivate@2@XZ @ 377 NONAME ; class QtMobility::QContactChangeLogFilterPrivate const * QtMobility::QContactChangeLogFilter::d_func(void) const + ??4QContactOnlineAccount@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 378 NONAME ; class QtMobility::QContactOnlineAccount & QtMobility::QContactOnlineAccount::operator=(class QtMobility::QContactDetail const &) + ?detailDefinition@QContactManager@QtMobility@@QBE?AVQContactDetailDefinition@2@ABVQString@@0@Z @ 379 NONAME ; class QtMobility::QContactDetailDefinition QtMobility::QContactManager::detailDefinition(class QString const &, class QString const &) const + ?d_func@QContactRelationshipRemoveRequest@QtMobility@@AAEPAVQContactRelationshipRemoveRequestPrivate@2@XZ @ 380 NONAME ; class QtMobility::QContactRelationshipRemoveRequestPrivate * QtMobility::QContactRelationshipRemoveRequest::d_func(void) + ?filterSupported@QContactManager@QtMobility@@QBE_NABVQContactFilter@2@@Z @ 381 NONAME ; bool QtMobility::QContactManager::filterSupported(class QtMobility::QContactFilter const &) const + ?id@QContact@QtMobility@@QBE?AVQContactId@2@XZ @ 382 NONAME ; class QtMobility::QContactId QtMobility::QContact::id(void) const + ?getStaticMetaObject@QContactRelationshipFetchRequest@QtMobility@@SAABUQMetaObject@@XZ @ 383 NONAME ; struct QMetaObject const & QtMobility::QContactRelationshipFetchRequest::getStaticMetaObject(void) + ?TypeGroup@QContactType@QtMobility@@2U?$Latin1Literal@$05@2@B @ 384 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactType::TypeGroup + ?maxValue@QContactDetailRangeFilter@QtMobility@@QBE?AVQVariant@@XZ @ 385 NONAME ; class QVariant QtMobility::QContactDetailRangeFilter::maxValue(void) const + ?tr@QContactDetailDefinitionSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 386 NONAME ; class QString QtMobility::QContactDetailDefinitionSaveRequest::tr(char const *, char const *) + ?setSubTypes@QContactOnlineAccount@QtMobility@@QAEXABVQStringList@@@Z @ 387 NONAME ; void QtMobility::QContactOnlineAccount::setSubTypes(class QStringList const &) + ?setLongitude@QContactGeoLocation@QtMobility@@QAEXN@Z @ 388 NONAME ; void QtMobility::QContactGeoLocation::setLongitude(double) + ?emitSignals@QContactChangeSet@QtMobility@@QAEXPAVQContactManagerEngine@2@@Z @ 389 NONAME ; void QtMobility::QContactChangeSet::emitSignals(class QtMobility::QContactManagerEngine *) + ?SubTypeVideoRingtone@QContactAvatar@QtMobility@@2U?$Latin1Literal@$0O@@2@B @ 390 NONAME ; struct QtMobility::Latin1Literal<14> const QtMobility::QContactAvatar::SubTypeVideoRingtone + ?FieldServiceProvider@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$0BA@@2@B @ 391 NONAME ; struct QtMobility::Latin1Literal<16> const QtMobility::QContactOnlineAccount::FieldServiceProvider + ?altitudeAccuracy@QContactGeoLocation@QtMobility@@QBENXZ @ 392 NONAME ; double QtMobility::QContactGeoLocation::altitudeAccuracy(void) const + ?PresenceAvailable@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$09@2@B @ 393 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactOnlineAccount::PresenceAvailable + ??UQtMobility@@YA?BVQContactFilter@0@ABV10@0@Z @ 394 NONAME ; class QtMobility::QContactFilter const QtMobility::operator|(class QtMobility::QContactFilter const &, class QtMobility::QContactFilter const &) + ??8QContactDetailFieldDefinition@QtMobility@@QBE_NABV01@@Z @ 395 NONAME ; bool QtMobility::QContactDetailFieldDefinition::operator==(class QtMobility::QContactDetailFieldDefinition const &) const + ?calendarId@QContactAnniversary@QtMobility@@QBE?AVQString@@XZ @ 396 NONAME ; class QString QtMobility::QContactAnniversary::calendarId(void) const + ?staticMetaObject@QContactRemoveRequest@QtMobility@@2UQMetaObject@@B @ 397 NONAME ; struct QMetaObject const QtMobility::QContactRemoveRequest::staticMetaObject + ?contactsChanged@QContactManager@QtMobility@@IAEXABV?$QList@I@@@Z @ 398 NONAME ; void QtMobility::QContactManager::contactsChanged(class QList const &) + ?updateDefinitionFetchRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactDetailDefinitionFetchRequest@2@ABV?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 399 NONAME ; void QtMobility::QContactManagerEngine::updateDefinitionFetchRequest(class QtMobility::QContactDetailDefinitionFetchRequest *, class QMap const &, enum QtMobility::QContactManager::Error, class QMap const &) + ?setCalendarId@QContactAnniversary@QtMobility@@QAEXABVQString@@@Z @ 400 NONAME ; void QtMobility::QContactAnniversary::setCalendarId(class QString const &) + ?removedContacts@QContactChangeSet@QtMobility@@QAEAAV?$QSet@I@@XZ @ 401 NONAME ; class QSet & QtMobility::QContactChangeSet::removedContacts(void) + ??9QContactActionDescriptor@QtMobility@@QBE_NABV01@@Z @ 402 NONAME ; bool QtMobility::QContactActionDescriptor::operator!=(class QtMobility::QContactActionDescriptor const &) const + ?FieldOriginalDate@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 403 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactAnniversary::FieldOriginalDate + ??1QContactDetailDefinition@QtMobility@@QAE@XZ @ 404 NONAME ; QtMobility::QContactDetailDefinition::~QContactDetailDefinition(void) + ?errorMap@QContactDetailDefinitionSaveRequest@QtMobility@@QBE?AV?$QMap@HW4Error@QContactManager@QtMobility@@@@XZ @ 405 NONAME ; class QMap QtMobility::QContactDetailDefinitionSaveRequest::errorMap(void) const + ?trUtf8@QContactDetailDefinitionRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 406 NONAME ; class QString QtMobility::QContactDetailDefinitionRemoveRequest::trUtf8(char const *, char const *) + ?metaObject@QContactDetailDefinitionRemoveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 407 NONAME ; struct QMetaObject const * QtMobility::QContactDetailDefinitionRemoveRequest::metaObject(void) const + ??4QContactGender@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 408 NONAME ; class QtMobility::QContactGender & QtMobility::QContactGender::operator=(class QtMobility::QContactDetail const &) + ?qt_metacast@QContactRemoveRequest@QtMobility@@UAEPAXPBD@Z @ 409 NONAME ; void * QtMobility::QContactRemoveRequest::qt_metacast(char const *) + ?SubTypeVideoShare@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 410 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactOnlineAccount::SubTypeVideoShare + ??1QContactDetailDefinitionRemoveRequest@QtMobility@@UAE@XZ @ 411 NONAME ; QtMobility::QContactDetailDefinitionRemoveRequest::~QContactDetailDefinitionRemoveRequest(void) + ??8QContactId@QtMobility@@QBE_NABV01@@Z @ 412 NONAME ; bool QtMobility::QContactId::operator==(class QtMobility::QContactId const &) const + ?contacts@QContactManagerEngine@QtMobility@@UBE?AV?$QList@VQContact@QtMobility@@@@ABV?$QList@VQContactSortOrder@QtMobility@@@@ABVQStringList@@AAW4Error@QContactManager@2@@Z @ 413 NONAME ; class QList QtMobility::QContactManagerEngine::contacts(class QList const &, class QStringList const &, enum QtMobility::QContactManager::Error &) const + ?FieldSubType@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$07@2@B @ 414 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactAnniversary::FieldSubType + ?tr@QContactActionFactory@QtMobility@@SA?AVQString@@PBD0H@Z @ 415 NONAME ; class QString QtMobility::QContactActionFactory::tr(char const *, char const *, int) + ?FieldPresence@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$08@2@B @ 416 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactOnlineAccount::FieldPresence + ?FieldFirst@QContactName@QtMobility@@2U?$Latin1Literal@$09@2@B @ 417 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactName::FieldFirst + ?PresenceOffline@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$07@2@B @ 418 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactOnlineAccount::PresenceOffline + ?contexts@QContactDetail@QtMobility@@QBE?AVQStringList@@XZ @ 419 NONAME ; class QStringList QtMobility::QContactDetail::contexts(void) const + ?contacts@QContactManagerEngine@QtMobility@@UBE?AV?$QList@VQContact@QtMobility@@@@ABVQContactFilter@2@ABV?$QList@VQContactSortOrder@QtMobility@@@@ABVQStringList@@AAW4Error@QContactManager@2@@Z @ 420 NONAME ; class QList QtMobility::QContactManagerEngine::contacts(class QtMobility::QContactFilter const &, class QList const &, class QStringList const &, enum QtMobility::QContactManager::Error &) const + ??_EQContactDetailFilter@QtMobility@@UAE@I@Z @ 421 NONAME ; QtMobility::QContactDetailFilter::~QContactDetailFilter(unsigned int) + ?setAccountUri@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 422 NONAME ; void QtMobility::QContactOnlineAccount::setAccountUri(class QString const &) + ?trUtf8@QContactDetailDefinitionFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 423 NONAME ; class QString QtMobility::QContactDetailDefinitionFetchRequest::trUtf8(char const *, char const *) + ?FieldDetailUri@QContactDetail@QtMobility@@2U?$Latin1Literal@$09@2@B @ 424 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactDetail::FieldDetailUri + ?DefinitionName@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$0M@@2@B @ 425 NONAME ; struct QtMobility::Latin1Literal<12> const QtMobility::QContactGeolocation::DefinitionName + ?SubTypeFavourite@QContactUrl@QtMobility@@2U?$Latin1Literal@$09@2@B @ 426 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactUrl::SubTypeFavourite + ?waitForRequestProgress@QContactMemoryEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@H@Z @ 427 NONAME ; bool QtMobility::QContactMemoryEngine::waitForRequestProgress(class QtMobility::QContactAbstractRequest *, int) + ?setImplementationVersion@QContactActionDescriptor@QtMobility@@QAEXH@Z @ 428 NONAME ; void QtMobility::QContactActionDescriptor::setImplementationVersion(int) + ?first@QContactRelationship@QtMobility@@QBE?AVQContactId@2@XZ @ 429 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationship::first(void) const + ??1QContactRelationshipRemoveRequest@QtMobility@@UAE@XZ @ 430 NONAME ; QtMobility::QContactRelationshipRemoveRequest::~QContactRelationshipRemoveRequest(void) + ?SubTypeAudioRingtone@QContactAvatar@QtMobility@@2U?$Latin1Literal@$0O@@2@B @ 431 NONAME ; struct QtMobility::Latin1Literal<14> const QtMobility::QContactAvatar::SubTypeAudioRingtone + ??4QContactDetailFieldDefinition@QtMobility@@QAEAAV01@ABV01@@Z @ 432 NONAME ; class QtMobility::QContactDetailFieldDefinition & QtMobility::QContactDetailFieldDefinition::operator=(class QtMobility::QContactDetailFieldDefinition const &) + ?accessConstraint@QContactDetailDefinition@QtMobility@@QBE?AW4AccessConstraint@12@XZ @ 433 NONAME ; enum QtMobility::QContactDetailDefinition::AccessConstraint QtMobility::QContactDetailDefinition::accessConstraint(void) const + ??_EQContactDetailRangeFilter@QtMobility@@UAE@I@Z @ 434 NONAME ; QtMobility::QContactDetailRangeFilter::~QContactDetailRangeFilter(unsigned int) + ??0QContactActionFilter@QtMobility@@QAE@XZ @ 435 NONAME ; QtMobility::QContactActionFilter::QContactActionFilter(void) + ??0QContactDetailRangeFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 436 NONAME ; QtMobility::QContactDetailRangeFilter::QContactDetailRangeFilter(class QtMobility::QContactFilter const &) + ?hasFeature@QContactManager@QtMobility@@QBE_NW4ManagerFeature@12@ABVQString@@@Z @ 437 NONAME ; bool QtMobility::QContactManager::hasFeature(enum QtMobility::QContactManager::ManagerFeature, class QString const &) const + ?SubTypeBulletinBoardSystem@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$0BE@@2@B @ 438 NONAME ; struct QtMobility::Latin1Literal<20> const QtMobility::QContactPhoneNumber::SubTypeBulletinBoardSystem + ?detailFieldName@QContactSortOrder@QtMobility@@QBE?AVQString@@XZ @ 439 NONAME ; class QString QtMobility::QContactSortOrder::detailFieldName(void) const + ?setRange@QContactDetailRangeFilter@QtMobility@@QAEXABVQVariant@@0V?$QFlags@W4RangeFlag@QContactDetailRangeFilter@QtMobility@@@@@Z @ 440 NONAME ; void QtMobility::QContactDetailRangeFilter::setRange(class QVariant const &, class QVariant const &, class QFlags) + ?removeDetail@QContact@QtMobility@@QAE_NPAVQContactDetail@2@@Z @ 441 NONAME ; bool QtMobility::QContact::removeDetail(class QtMobility::QContactDetail *) + ?FieldGender@QContactGender@QtMobility@@2U?$Latin1Literal@$06@2@B @ 442 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactGender::FieldGender + ?setDetailDefinitionName@QContactDetailRangeFilter@QtMobility@@QAEXABVQString@@0@Z @ 443 NONAME ; void QtMobility::QContactDetailRangeFilter::setDetailDefinitionName(class QString const &, class QString const &) + ?setLocation@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 444 NONAME ; void QtMobility::QContactOrganization::setLocation(class QString const &) + ??_EQContactFetchRequest@QtMobility@@UAE@I@Z @ 445 NONAME ; QtMobility::QContactFetchRequest::~QContactFetchRequest(unsigned int) + ?heading@QContactGeoLocation@QtMobility@@QBENXZ @ 446 NONAME ; double QtMobility::QContactGeoLocation::heading(void) const + ?relationships@QContactManager@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@ABVQString@@ABVQContactId@2@W4Role@QContactRelationshipFilter@2@@Z @ 447 NONAME ; class QList QtMobility::QContactManager::relationships(class QString const &, class QtMobility::QContactId const &, enum QtMobility::QContactRelationshipFilter::Role) const + ?names@QContactDetailDefinitionRemoveRequest@QtMobility@@QBE?AVQStringList@@XZ @ 448 NONAME ; class QStringList QtMobility::QContactDetailDefinitionRemoveRequest::names(void) const + ?rangeFlags@QContactDetailRangeFilter@QtMobility@@QBE?AV?$QFlags@W4RangeFlag@QContactDetailRangeFilter@QtMobility@@@@XZ @ 449 NONAME ; class QFlags QtMobility::QContactDetailRangeFilter::rangeFlags(void) const + ?compareContact@QContactManagerEngine@QtMobility@@SAHABVQContact@2@0ABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 450 NONAME ; int QtMobility::QContactManagerEngine::compareContact(class QtMobility::QContact const &, class QtMobility::QContact const &, class QList const &) + ?setCapabilities@QContactOnlineAccount@QtMobility@@QAEXABVQStringList@@@Z @ 451 NONAME ; void QtMobility::QContactOnlineAccount::setCapabilities(class QStringList const &) + ??_EQContactTimestamp@QtMobility@@UAE@I@Z @ 452 NONAME ; QtMobility::QContactTimestamp::~QContactTimestamp(unsigned int) + ?removeContacts@QContactMemoryEngine@QtMobility@@UAE_NPAV?$QList@I@@PAV?$QMap@HW4Error@QContactManager@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 453 NONAME ; bool QtMobility::QContactMemoryEngine::removeContacts(class QList *, class QMap *, enum QtMobility::QContactManager::Error &) + ?setManagerUri@QContactId@QtMobility@@QAEXABVQString@@@Z @ 454 NONAME ; void QtMobility::QContactId::setManagerUri(class QString const &) + ??1QContactRemoveRequest@QtMobility@@UAE@XZ @ 455 NONAME ; QtMobility::QContactRemoveRequest::~QContactRemoveRequest(void) + ?updateDefinitionSaveRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactDetailDefinitionSaveRequest@2@ABV?$QList@VQContactDetailDefinition@QtMobility@@@@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 456 NONAME ; void QtMobility::QContactManagerEngine::updateDefinitionSaveRequest(class QtMobility::QContactDetailDefinitionSaveRequest *, class QList const &, enum QtMobility::QContactManager::Error, class QMap const &) + ?FieldHeading@QContactGeoLocation@QtMobility@@2U?$Latin1Literal@$07@2@B @ 457 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactGeoLocation::FieldHeading + ?speed@QContactGeolocation@QtMobility@@QBENXZ @ 458 NONAME ; double QtMobility::QContactGeolocation::speed(void) const + ?addedContacts@QContactChangeSet@QtMobility@@QAEAAV?$QSet@I@@XZ @ 459 NONAME ; class QSet & QtMobility::QContactChangeSet::addedContacts(void) + ?setSorting@QContactFetchRequest@QtMobility@@QAEXABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 460 NONAME ; void QtMobility::QContactFetchRequest::setSorting(class QList const &) + ?matchFlags@QContactDetailFilter@QtMobility@@QBE?AV?$QFlags@W4MatchFlag@QContactFilter@QtMobility@@@@XZ @ 461 NONAME ; class QFlags QtMobility::QContactDetailFilter::matchFlags(void) const + ?FieldPostcode@QContactAddress@QtMobility@@2U?$Latin1Literal@$08@2@B @ 462 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactAddress::FieldPostcode + ??0QContactSortOrder@QtMobility@@QAE@XZ @ 463 NONAME ; QtMobility::QContactSortOrder::QContactSortOrder(void) + ??0QContactEmailAddress@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 464 NONAME ; QtMobility::QContactEmailAddress::QContactEmailAddress(class QtMobility::QContactDetail const &) + ?staticMetaObject@QContactAction@QtMobility@@2UQMetaObject@@B @ 465 NONAME ; struct QMetaObject const QtMobility::QContactAction::staticMetaObject + ?contact@QContactManagerEngine@QtMobility@@UBE?AVQContact@2@ABIAAW4Error@QContactManager@2@@Z @ 466 NONAME ; class QtMobility::QContact QtMobility::QContactManagerEngine::contact(unsigned int const &, enum QtMobility::QContactManager::Error &) const + ?metaObject@QContactRelationshipSaveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 467 NONAME ; struct QMetaObject const * QtMobility::QContactRelationshipSaveRequest::metaObject(void) const + ?setSecond@QContactRelationshipRemoveRequest@QtMobility@@QAEXABVQContactId@2@@Z @ 468 NONAME ; void QtMobility::QContactRelationshipRemoveRequest::setSecond(class QtMobility::QContactId const &) + ?setDefinitionRestrictions@QContactFetchRequest@QtMobility@@QAEXABVQStringList@@@Z @ 469 NONAME ; void QtMobility::QContactFetchRequest::setDefinitionRestrictions(class QStringList const &) + ?progress@QContactRelationshipSaveRequest@QtMobility@@IAEXPAV12@@Z @ 470 NONAME ; void QtMobility::QContactRelationshipSaveRequest::progress(class QtMobility::QContactRelationshipSaveRequest *) + ?saveRelationships@QContactManagerEngine@QtMobility@@UAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@VQContactRelationship@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 471 NONAME ; class QList QtMobility::QContactManagerEngine::saveRelationships(class QList *, enum QtMobility::QContactManager::Error &) + ?setRegion@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 472 NONAME ; void QtMobility::QContactAddress::setRegion(class QString const &) + ?contacts@QContactManager@QtMobility@@QBE?AV?$QList@I@@ABVQContactFilter@2@ABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 473 NONAME ; class QList QtMobility::QContactManager::contacts(class QtMobility::QContactFilter const &, class QList const &) const + ??0QContactDetailFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 474 NONAME ; QtMobility::QContactDetailFilter::QContactDetailFilter(class QtMobility::QContactFilter const &) + ?qt_metacall@QContactManager@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 475 NONAME ; int QtMobility::QContactManager::qt_metacall(enum QMetaObject::Call, int, void * *) + ??1QContactAbstractRequest@QtMobility@@UAE@XZ @ 476 NONAME ; QtMobility::QContactAbstractRequest::~QContactAbstractRequest(void) + ?synthesizeDisplayLabel@QContactManager@QtMobility@@QBE?AVQString@@ABVQContact@2@@Z @ 477 NONAME ; class QString QtMobility::QContactManager::synthesizeDisplayLabel(class QtMobility::QContact const &) const + ?setLogo@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 478 NONAME ; void QtMobility::QContactOrganization::setLogo(class QString const &) + ??0QContactUnionFilter@QtMobility@@QAE@XZ @ 479 NONAME ; QtMobility::QContactUnionFilter::QContactUnionFilter(void) + ?tr@QContactRelationshipRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 480 NONAME ; class QString QtMobility::QContactRelationshipRemoveRequest::tr(char const *, char const *) + ??9QContactFilter@QtMobility@@QBE_NABV01@@Z @ 481 NONAME ; bool QtMobility::QContactFilter::operator!=(class QtMobility::QContactFilter const &) const + ?relationships@QContactManagerEngine@QtMobility@@UBE?AV?$QList@VQContactRelationship@QtMobility@@@@ABVQString@@ABVQContactId@2@W4Role@QContactRelationshipFilter@2@AAW4Error@QContactManager@2@@Z @ 482 NONAME ; class QList QtMobility::QContactManagerEngine::relationships(class QString const &, class QtMobility::QContactId const &, enum QtMobility::QContactRelationshipFilter::Role, enum QtMobility::QContactManager::Error &) const + ?label@QContactGeoLocation@QtMobility@@QBE?AVQString@@XZ @ 483 NONAME ; class QString QtMobility::QContactGeoLocation::label(void) const + ?setContacts@QContactSaveRequest@QtMobility@@QAEXABV?$QList@VQContact@QtMobility@@@@@Z @ 484 NONAME ; void QtMobility::QContactSaveRequest::setContacts(class QList const &) + ?FieldAltitudeAccuracy@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$0BB@@2@B @ 485 NONAME ; struct QtMobility::Latin1Literal<17> const QtMobility::QContactGeolocation::FieldAltitudeAccuracy + ?setDataChanged@QContactChangeSet@QtMobility@@QAEX_N@Z @ 486 NONAME ; void QtMobility::QContactChangeSet::setDataChanged(bool) + ?setAccuracy@QContactGeolocation@QtMobility@@QAEXN@Z @ 487 NONAME ; void QtMobility::QContactGeolocation::setAccuracy(double) + ?staticMetaObject@QContactActionFactory@QtMobility@@2UQMetaObject@@B @ 488 NONAME ; struct QMetaObject const QtMobility::QContactActionFactory::staticMetaObject + ?DefinitionName@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$0M@@2@B @ 489 NONAME ; struct QtMobility::Latin1Literal<12> const QtMobility::QContactAnniversary::DefinitionName + ?FieldPrefix@QContactName@QtMobility@@2U?$Latin1Literal@$06@2@B @ 490 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactName::FieldPrefix + ??0QContactLocalIdFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 491 NONAME ; QtMobility::QContactLocalIdFilter::QContactLocalIdFilter(class QtMobility::QContactFilter const &) + ?subTypes@QContactOnlineAccount@QtMobility@@QBE?AVQStringList@@XZ @ 492 NONAME ; class QStringList QtMobility::QContactOnlineAccount::subTypes(void) const + ??_EQContactLocalIdFilter@QtMobility@@UAE@I@Z @ 493 NONAME ; QtMobility::QContactLocalIdFilter::~QContactLocalIdFilter(unsigned int) + ??_EQContactUnionFilter@QtMobility@@UAE@I@Z @ 494 NONAME ; QtMobility::QContactUnionFilter::~QContactUnionFilter(unsigned int) + ?d_func@QContactFetchRequest@QtMobility@@AAEPAVQContactFetchRequestPrivate@2@XZ @ 495 NONAME ; class QtMobility::QContactFetchRequestPrivate * QtMobility::QContactFetchRequest::d_func(void) + ?d_func@QContactSaveRequest@QtMobility@@ABEPBVQContactSaveRequestPrivate@2@XZ @ 496 NONAME ; class QtMobility::QContactSaveRequestPrivate const * QtMobility::QContactSaveRequest::d_func(void) const + ??0QContactNickname@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 497 NONAME ; QtMobility::QContactNickname::QContactNickname(class QtMobility::QContactDetail const &) + ?removeContacts@QContactManagerEngine@QtMobility@@UAE_NPAV?$QList@I@@PAV?$QMap@HW4Error@QContactManager@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 498 NONAME ; bool QtMobility::QContactManagerEngine::removeContacts(class QList *, class QMap *, enum QtMobility::QContactManager::Error &) + ?SubTypeFacsimile@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$09@2@B @ 499 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactPhoneNumber::SubTypeFacsimile + ?SubTypeWedding@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$07@2@B @ 500 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactAnniversary::SubTypeWedding + ??0QContactTimestamp@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 501 NONAME ; QtMobility::QContactTimestamp::QContactTimestamp(class QtMobility::QContactDetail const &) + ??4QContactGeolocation@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 502 NONAME ; class QtMobility::QContactGeolocation & QtMobility::QContactGeolocation::operator=(class QtMobility::QContactDetail const &) + ?setContexts@QContactDetail@QtMobility@@QAEXABVQStringList@@@Z @ 503 NONAME ; void QtMobility::QContactDetail::setContexts(class QStringList const &) + ??9QContactDetailFieldDefinition@QtMobility@@QBE_NABV01@@Z @ 504 NONAME ; bool QtMobility::QContactDetailFieldDefinition::operator!=(class QtMobility::QContactDetailFieldDefinition const &) const + ??_EQContactType@QtMobility@@UAE@I@Z @ 505 NONAME ; QtMobility::QContactType::~QContactType(unsigned int) + ?FieldNickname@QContactNickname@QtMobility@@2U?$Latin1Literal@$08@2@B @ 506 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactNickname::FieldNickname + ??0QContactDetailDefinitionRemoveRequest@QtMobility@@QAE@XZ @ 507 NONAME ; QtMobility::QContactDetailDefinitionRemoveRequest::QContactDetailDefinitionRemoveRequest(void) + ??0QContactDetail@QtMobility@@QAE@ABVQString@@@Z @ 508 NONAME ; QtMobility::QContactDetail::QContactDetail(class QString const &) + ?d_func@QContactLocalIdFetchRequest@QtMobility@@AAEPAVQContactLocalIdFetchRequestPrivate@2@XZ @ 509 NONAME ; class QtMobility::QContactLocalIdFetchRequestPrivate * QtMobility::QContactLocalIdFetchRequest::d_func(void) + ?hasValue@QContactDetail@QtMobility@@QBE_NABVQString@@@Z @ 510 NONAME ; bool QtMobility::QContactDetail::hasValue(class QString const &) const + ??0QContactAddress@QtMobility@@QAE@XZ @ 511 NONAME ; QtMobility::QContactAddress::QContactAddress(void) + ?DefinitionName@QContactDisplayLabel@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 512 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactDisplayLabel::DefinitionName + ??1QContactFamily@QtMobility@@UAE@XZ @ 513 NONAME ; QtMobility::QContactFamily::~QContactFamily(void) + ?SubTypeMobile@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$06@2@B @ 514 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactPhoneNumber::SubTypeMobile + ?variantValues@QContactDetail@QtMobility@@QBE?AV?$QMap@VQString@@VQVariant@@@@XZ @ 515 NONAME ; class QMap QtMobility::QContactDetail::variantValues(void) const + ?testFilter@QContactManagerEngine@QtMobility@@SA_NABVQContactFilter@2@ABVQContact@2@@Z @ 516 NONAME ; bool QtMobility::QContactManagerEngine::testFilter(class QtMobility::QContactFilter const &, class QtMobility::QContact const &) + ??0QContactIntersectionFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 517 NONAME ; QtMobility::QContactIntersectionFilter::QContactIntersectionFilter(class QtMobility::QContactFilter const &) + ?getStaticMetaObject@QContactSaveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 518 NONAME ; struct QMetaObject const & QtMobility::QContactSaveRequest::getStaticMetaObject(void) + ?SubTypePager@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$05@2@B @ 519 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactPhoneNumber::SubTypePager + ?setContactType@QContactDetailDefinitionFetchRequest@QtMobility@@QAEXABVQString@@@Z @ 520 NONAME ; void QtMobility::QContactDetailDefinitionFetchRequest::setContactType(class QString const &) + ??1QContactUnionFilter@QtMobility@@UAE@XZ @ 521 NONAME ; QtMobility::QContactUnionFilter::~QContactUnionFilter(void) + ?managerParameters@QContactManager@QtMobility@@QBE?AV?$QMap@VQString@@V1@@@XZ @ 522 NONAME ; class QMap QtMobility::QContactManager::managerParameters(void) const + ?relationshipType@QContactRelationshipRemoveRequest@QtMobility@@QBE?AVQString@@XZ @ 523 NONAME ; class QString QtMobility::QContactRelationshipRemoveRequest::relationshipType(void) const + ??4QContactType@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 524 NONAME ; class QtMobility::QContactType & QtMobility::QContactType::operator=(class QtMobility::QContactDetail const &) + ?DefinitionName@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$0M@@2@B @ 525 NONAME ; struct QtMobility::Latin1Literal<12> const QtMobility::QContactPhoneNumber::DefinitionName + ?setLocalId@QContactId@QtMobility@@QAEXABI@Z @ 526 NONAME ; void QtMobility::QContactId::setLocalId(unsigned int const &) + ?getStaticMetaObject@QContactDetailDefinitionFetchRequest@QtMobility@@SAABUQMetaObject@@XZ @ 527 NONAME ; struct QMetaObject const & QtMobility::QContactDetailDefinitionFetchRequest::getStaticMetaObject(void) + ?synthesizedDisplayLabel@QContactManagerEngine@QtMobility@@UBE?AVQString@@ABVQContact@2@AAW4Error@QContactManager@2@@Z @ 528 NONAME ; class QString QtMobility::QContactManagerEngine::synthesizedDisplayLabel(class QtMobility::QContact const &, enum QtMobility::QContactManager::Error &) const + ??0QContactName@QtMobility@@QAE@XZ @ 529 NONAME ; QtMobility::QContactName::QContactName(void) + ?filter@QContactLocalIdFetchRequest@QtMobility@@QBE?AVQContactFilter@2@XZ @ 530 NONAME ; class QtMobility::QContactFilter QtMobility::QContactLocalIdFetchRequest::filter(void) const + ?trUtf8@QContactLocalIdFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 531 NONAME ; class QString QtMobility::QContactLocalIdFetchRequest::trUtf8(char const *, char const *, int) + ?setValue@QContactActionFilter@QtMobility@@QAEXABVQVariant@@@Z @ 532 NONAME ; void QtMobility::QContactActionFilter::setValue(class QVariant const &) + ??_EQContactSaveRequest@QtMobility@@UAE@I@Z @ 533 NONAME ; QtMobility::QContactSaveRequest::~QContactSaveRequest(unsigned int) + ?relationshipsAdded@QContactManager@QtMobility@@IAEXABV?$QList@I@@@Z @ 534 NONAME ; void QtMobility::QContactManager::relationshipsAdded(class QList const &) + ?d_func@QContactRemoveRequest@QtMobility@@AAEPAVQContactRemoveRequestPrivate@2@XZ @ 535 NONAME ; class QtMobility::QContactRemoveRequestPrivate * QtMobility::QContactRemoveRequest::d_func(void) + ?setContactIds@QContactRemoveRequest@QtMobility@@QAEXABV?$QList@I@@@Z @ 536 NONAME ; void QtMobility::QContactRemoveRequest::setContactIds(class QList const &) + ??0QContactGeolocation@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 537 NONAME ; QtMobility::QContactGeolocation::QContactGeolocation(class QtMobility::QContactDetail const &) + ??0QContactGuid@QtMobility@@QAE@XZ @ 538 NONAME ; QtMobility::QContactGuid::QContactGuid(void) + ?setAltitudeAccuracy@QContactGeolocation@QtMobility@@QAEXN@Z @ 539 NONAME ; void QtMobility::QContactGeolocation::setAltitudeAccuracy(double) + ??1QContactManagerEngineFactory@QtMobility@@UAE@XZ @ 540 NONAME ; QtMobility::QContactManagerEngineFactory::~QContactManagerEngineFactory(void) + ?saveDetail@QContact@QtMobility@@QAE_NPAVQContactDetail@2@@Z @ 541 NONAME ; bool QtMobility::QContact::saveDetail(class QtMobility::QContactDetail *) + ?speed@QContactGeoLocation@QtMobility@@QBENXZ @ 542 NONAME ; double QtMobility::QContactGeoLocation::speed(void) const + ?updateRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactAbstractRequest@2@ABV?$QList@VQContactRelationship@QtMobility@@@@W4Error@QContactManager@2@ABV?$QList@W4Error@QContactManager@QtMobility@@@@W4Status@32@_N@Z @ 543 NONAME ; void QtMobility::QContactManagerEngine::updateRequest(class QtMobility::QContactAbstractRequest *, class QList const &, enum QtMobility::QContactManager::Error, class QList const &, enum QtMobility::QContactAbstractRequest::Status, bool) + ?trUtf8@QContactRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 544 NONAME ; class QString QtMobility::QContactRemoveRequest::trUtf8(char const *, char const *) + ??9QContactDetailDefinition@QtMobility@@QBE_NABV01@@Z @ 545 NONAME ; bool QtMobility::QContactDetailDefinition::operator!=(class QtMobility::QContactDetailDefinition const &) const + ?trUtf8@QContactDetailDefinitionSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 546 NONAME ; class QString QtMobility::QContactDetailDefinitionSaveRequest::trUtf8(char const *, char const *, int) + ?setContactDisplayLabel@QContactManagerEngine@QtMobility@@QBE?AVQContact@2@ABVQString@@ABV32@@Z @ 547 NONAME ; class QtMobility::QContact QtMobility::QContactManagerEngine::setContactDisplayLabel(class QString const &, class QtMobility::QContact const &) const + ?filterSupported@QContactMemoryEngine@QtMobility@@UBE_NABVQContactFilter@2@@Z @ 548 NONAME ; bool QtMobility::QContactMemoryEngine::filterSupported(class QtMobility::QContactFilter const &) const + ?FieldCalendarId@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 549 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactAnniversary::FieldCalendarId + ?metaObject@QContactSaveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 550 NONAME ; struct QMetaObject const * QtMobility::QContactSaveRequest::metaObject(void) const + ?postOfficeBox@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 551 NONAME ; class QString QtMobility::QContactAddress::postOfficeBox(void) const + ?originalDate@QContactAnniversary@QtMobility@@QBE?AVQDate@@XZ @ 552 NONAME ; class QDate QtMobility::QContactAnniversary::originalDate(void) const + ?FieldCapabilities@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 553 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactOnlineAccount::FieldCapabilities + ?HasAssistant@QContactRelationship@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 554 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactRelationship::HasAssistant + ??_EQContactName@QtMobility@@UAE@I@Z @ 555 NONAME ; QtMobility::QContactName::~QContactName(unsigned int) + ?accessConstraint@QContactDetailFieldDefinition@QtMobility@@QBE?AW4AccessConstraint@12@XZ @ 556 NONAME ; enum QtMobility::QContactDetailFieldDefinition::AccessConstraint QtMobility::QContactDetailFieldDefinition::accessConstraint(void) const + ?isCanceled@QContactAbstractRequest@QtMobility@@QBE_NXZ @ 557 NONAME ; bool QtMobility::QContactAbstractRequest::isCanceled(void) const + ?saveContact@QContactManagerEngine@QtMobility@@UAE_NPAVQContact@2@AAW4Error@QContactManager@2@@Z @ 558 NONAME ; bool QtMobility::QContactManagerEngine::saveContact(class QtMobility::QContact *, enum QtMobility::QContactManager::Error &) + ?waitForRequestFinished@QContactManagerEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@H@Z @ 559 NONAME ; bool QtMobility::QContactManagerEngine::waitForRequestFinished(class QtMobility::QContactAbstractRequest *, int) + ??4QContactChangeSet@QtMobility@@QAEAAV01@ABV01@@Z @ 560 NONAME ; class QtMobility::QContactChangeSet & QtMobility::QContactChangeSet::operator=(class QtMobility::QContactChangeSet const &) + ?staticMetaObject@QContactDetailDefinitionRemoveRequest@QtMobility@@2UQMetaObject@@B @ 561 NONAME ; struct QMetaObject const QtMobility::QContactDetailDefinitionRemoveRequest::staticMetaObject + ?qt_metacast@QContactLocalIdFetchRequest@QtMobility@@UAEPAXPBD@Z @ 562 NONAME ; void * QtMobility::QContactLocalIdFetchRequest::qt_metacast(char const *) + ?second@QContactRelationshipRemoveRequest@QtMobility@@QBE?AVQContactId@2@XZ @ 563 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipRemoveRequest::second(void) const + ??_EQContactDisplayLabel@QtMobility@@UAE@I@Z @ 564 NONAME ; QtMobility::QContactDisplayLabel::~QContactDisplayLabel(unsigned int) + ?getStaticMetaObject@QContactDetailDefinitionSaveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 565 NONAME ; struct QMetaObject const & QtMobility::QContactDetailDefinitionSaveRequest::getStaticMetaObject(void) + ?errorMap@QContactDetailDefinitionFetchRequest@QtMobility@@QBE?AV?$QMap@HW4Error@QContactManager@QtMobility@@@@XZ @ 566 NONAME ; class QMap QtMobility::QContactDetailDefinitionFetchRequest::errorMap(void) const + ??0QContactTimestamp@QtMobility@@QAE@XZ @ 567 NONAME ; QtMobility::QContactTimestamp::QContactTimestamp(void) + ?removeContact@QContactMemoryEngine@QtMobility@@AAE_NABIAAVQContactChangeSet@2@AAW4Error@QContactManager@2@@Z @ 568 NONAME ; bool QtMobility::QContactMemoryEngine::removeContact(unsigned int const &, class QtMobility::QContactChangeSet &, enum QtMobility::QContactManager::Error &) + ?qt_metacall@QContactDetailDefinitionFetchRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 569 NONAME ; int QtMobility::QContactDetailDefinitionFetchRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ??1QContactNickname@QtMobility@@UAE@XZ @ 570 NONAME ; QtMobility::QContactNickname::~QContactNickname(void) + ?d_func@QContactDetailRangeFilter@QtMobility@@AAEPAVQContactDetailRangeFilterPrivate@2@XZ @ 571 NONAME ; class QtMobility::QContactDetailRangeFilterPrivate * QtMobility::QContactDetailRangeFilter::d_func(void) + ??0QContactDetailRangeFilter@QtMobility@@QAE@XZ @ 572 NONAME ; QtMobility::QContactDetailRangeFilter::QContactDetailRangeFilter(void) + ?created@QContactTimestamp@QtMobility@@QBE?AVQDateTime@@XZ @ 573 NONAME ; class QDateTime QtMobility::QContactTimestamp::created(void) const + ??1QContactUrl@QtMobility@@UAE@XZ @ 574 NONAME ; QtMobility::QContactUrl::~QContactUrl(void) + ??1QContactFilter@QtMobility@@UAE@XZ @ 575 NONAME ; QtMobility::QContactFilter::~QContactFilter(void) + ?setPixmap@QContactAvatar@QtMobility@@QAE_NABVQPixmap@@@Z @ 576 NONAME ; bool QtMobility::QContactAvatar::setPixmap(class QPixmap const &) + ?first@QContactRelationshipRemoveRequest@QtMobility@@QBE?AVQContactId@2@XZ @ 577 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipRemoveRequest::first(void) const + ?label@QContactGeolocation@QtMobility@@QBE?AVQString@@XZ @ 578 NONAME ; class QString QtMobility::QContactGeolocation::label(void) const + ?updateRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactAbstractRequest@2@ABV?$QList@VQContactDetailDefinition@QtMobility@@@@W4Error@QContactManager@2@ABV?$QList@W4Error@QContactManager@QtMobility@@@@W4Status@32@@Z @ 579 NONAME ; void QtMobility::QContactManagerEngine::updateRequest(class QtMobility::QContactAbstractRequest *, class QList const &, enum QtMobility::QContactManager::Error, class QList const &, enum QtMobility::QContactAbstractRequest::Status) + ?resetKey@QContactDetail@QtMobility@@QAEXXZ @ 580 NONAME ; void QtMobility::QContactDetail::resetKey(void) + ?contactsAdded@QContactManager@QtMobility@@IAEXABV?$QList@I@@@Z @ 581 NONAME ; void QtMobility::QContactManager::contactsAdded(class QList const &) + ??_EQContactDetailDefinitionRemoveRequest@QtMobility@@UAE@I@Z @ 582 NONAME ; QtMobility::QContactDetailDefinitionRemoveRequest::~QContactDetailDefinitionRemoveRequest(unsigned int) + ?staticMetaObject@QContactDetailDefinitionSaveRequest@QtMobility@@2UQMetaObject@@B @ 583 NONAME ; struct QMetaObject const QtMobility::QContactDetailDefinitionSaveRequest::staticMetaObject + ?version@QContactManager@QtMobility@@SAHXZ @ 584 NONAME ; int QtMobility::QContactManager::version(void) + ?GenderMale@QContactGender@QtMobility@@2U?$Latin1Literal@$04@2@B @ 585 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactGender::GenderMale + ?setRelationshipType@QContactRelationshipRemoveRequest@QtMobility@@QAEXABVQString@@@Z @ 586 NONAME ; void QtMobility::QContactRelationshipRemoveRequest::setRelationshipType(class QString const &) + ?supportedDataTypes@QContactManagerEngine@QtMobility@@UBE?AV?$QList@W4Type@QVariant@@@@XZ @ 587 NONAME ; class QList QtMobility::QContactManagerEngine::supportedDataTypes(void) const + ?removeRelationship@QContactMemoryEngine@QtMobility@@UAE_NABVQContactRelationship@2@AAW4Error@QContactManager@2@@Z @ 588 NONAME ; bool QtMobility::QContactMemoryEngine::removeRelationship(class QtMobility::QContactRelationship const &, enum QtMobility::QContactManager::Error &) + ?setPostcode@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 589 NONAME ; void QtMobility::QContactAddress::setPostcode(class QString const &) + ?setActionName@QContactActionFilter@QtMobility@@QAEXABVQString@@@Z @ 590 NONAME ; void QtMobility::QContactActionFilter::setActionName(class QString const &) + ??4QContactFilter@QtMobility@@QAEAAV01@ABV01@@Z @ 591 NONAME ; class QtMobility::QContactFilter & QtMobility::QContactFilter::operator=(class QtMobility::QContactFilter const &) + ?relationships@QContactRelationshipSaveRequest@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@XZ @ 592 NONAME ; class QList QtMobility::QContactRelationshipSaveRequest::relationships(void) const + ?removeRelationship@QContactManager@QtMobility@@QAE_NABVQContactRelationship@2@@Z @ 593 NONAME ; bool QtMobility::QContactManager::removeRelationship(class QtMobility::QContactRelationship const &) + ?setFirst@QContactRelationshipFetchRequest@QtMobility@@QAEXABVQContactId@2@@Z @ 594 NONAME ; void QtMobility::QContactRelationshipFetchRequest::setFirst(class QtMobility::QContactId const &) + ?FieldCountry@QContactAddress@QtMobility@@2U?$Latin1Literal@$07@2@B @ 595 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactAddress::FieldCountry + ??4QContactGuid@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 596 NONAME ; class QtMobility::QContactGuid & QtMobility::QContactGuid::operator=(class QtMobility::QContactDetail const &) + ?FieldMiddleName@QContactName@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 597 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactName::FieldMiddleName + ?setRelatedContactId@QContactRelationshipFilter@QtMobility@@QAEXABVQContactId@2@@Z @ 598 NONAME ; void QtMobility::QContactRelationshipFilter::setRelatedContactId(class QtMobility::QContactId const &) + ?d_func@QContactRelationshipFetchRequest@QtMobility@@AAEPAVQContactRelationshipFetchRequestPrivate@2@XZ @ 599 NONAME ; class QtMobility::QContactRelationshipFetchRequestPrivate * QtMobility::QContactRelationshipFetchRequest::d_func(void) + ?supportedImplementationVersions@QContactManagerEngineFactory@QtMobility@@UBE?AV?$QList@H@@XZ @ 600 NONAME ; class QList QtMobility::QContactManagerEngineFactory::supportedImplementationVersions(void) const + ?setFirst@QContactRelationshipRemoveRequest@QtMobility@@QAEXABVQContactId@2@@Z @ 601 NONAME ; void QtMobility::QContactRelationshipRemoveRequest::setFirst(class QtMobility::QContactId const &) + ??0QContactAnniversary@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 602 NONAME ; QtMobility::QContactAnniversary::QContactAnniversary(class QtMobility::QContactDetail const &) + ?manager@QContactAbstractRequest@QtMobility@@QBEPAVQContactManager@2@XZ @ 603 NONAME ; class QtMobility::QContactManager * QtMobility::QContactAbstractRequest::manager(void) const + ?saveDetailDefinition@QContactMemoryEngine@QtMobility@@UAE_NABVQContactDetailDefinition@2@ABVQString@@AAW4Error@QContactManager@2@@Z @ 604 NONAME ; bool QtMobility::QContactMemoryEngine::saveDetailDefinition(class QtMobility::QContactDetailDefinition const &, class QString const &, enum QtMobility::QContactManager::Error &) + ??0QContact@QtMobility@@QAE@ABV01@@Z @ 605 NONAME ; QtMobility::QContact::QContact(class QtMobility::QContact const &) + ?setType@QContact@QtMobility@@QAEXABVQContactType@2@@Z @ 606 NONAME ; void QtMobility::QContact::setType(class QtMobility::QContactType const &) + ?setUrl@QContactUrl@QtMobility@@QAEXABVQString@@@Z @ 607 NONAME ; void QtMobility::QContactUrl::setUrl(class QString const &) + ?setGuid@QContactGuid@QtMobility@@QAEXABVQString@@@Z @ 608 NONAME ; void QtMobility::QContactGuid::setGuid(class QString const &) + ?nickname@QContactNickname@QtMobility@@QBE?AVQString@@XZ @ 609 NONAME ; class QString QtMobility::QContactNickname::nickname(void) const + ?trUtf8@QContactMemoryEngine@QtMobility@@SA?AVQString@@PBD0H@Z @ 610 NONAME ; class QString QtMobility::QContactMemoryEngine::trUtf8(char const *, char const *, int) + ?contact@QContactMemoryEngine@QtMobility@@UBE?AVQContact@2@ABIABVQStringList@@AAW4Error@QContactManager@2@@Z @ 611 NONAME ; class QtMobility::QContact QtMobility::QContactMemoryEngine::contact(unsigned int const &, class QStringList const &, enum QtMobility::QContactManager::Error &) const + ??1QContactActionFilter@QtMobility@@UAE@XZ @ 612 NONAME ; QtMobility::QContactActionFilter::~QContactActionFilter(void) + ??0QContactDetail@QtMobility@@IAE@ABV01@ABVQString@@@Z @ 613 NONAME ; QtMobility::QContactDetail::QContactDetail(class QtMobility::QContactDetail const &, class QString const &) + ??1QContactChangeSet@QtMobility@@QAE@XZ @ 614 NONAME ; QtMobility::QContactChangeSet::~QContactChangeSet(void) + ?avatar@QContactAvatar@QtMobility@@QBE?AVQString@@XZ @ 615 NONAME ; class QString QtMobility::QContactAvatar::avatar(void) const + ?FieldSyncTarget@QContactSyncTarget@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 616 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactSyncTarget::FieldSyncTarget + ?validateActionFilter@QContactManagerEngine@QtMobility@@SA_NABVQContactFilter@2@@Z @ 617 NONAME ; bool QtMobility::QContactManagerEngine::validateActionFilter(class QtMobility::QContactFilter const &) + ?name@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 618 NONAME ; class QString QtMobility::QContactOrganization::name(void) const + ?setManager@QContactAbstractRequest@QtMobility@@QAEXPAVQContactManager@2@@Z @ 619 NONAME ; void QtMobility::QContactAbstractRequest::setManager(class QtMobility::QContactManager *) + ?subTypes@QContactAddress@QtMobility@@QBE?AVQStringList@@XZ @ 620 NONAME ; class QStringList QtMobility::QContactAddress::subTypes(void) const + ?relationshipsAdded@QContactManagerEngine@QtMobility@@IAEXABV?$QList@I@@@Z @ 621 NONAME ; void QtMobility::QContactManagerEngine::relationshipsAdded(class QList const &) + ??0QContactFilter@QtMobility@@QAE@ABV01@@Z @ 622 NONAME ; QtMobility::QContactFilter::QContactFilter(class QtMobility::QContactFilter const &) + ?SubTypeSip@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$03@2@B @ 623 NONAME ; struct QtMobility::Latin1Literal<4> const QtMobility::QContactOnlineAccount::SubTypeSip + ??_EQContactAction@QtMobility@@UAE@I@Z @ 624 NONAME ; QtMobility::QContactAction::~QContactAction(unsigned int) + ??_EQContactRemoveRequest@QtMobility@@UAE@I@Z @ 625 NONAME ; QtMobility::QContactRemoveRequest::~QContactRemoveRequest(unsigned int) + ?setRelatedContactRole@QContactRelationshipFilter@QtMobility@@QAEXW4Role@12@@Z @ 626 NONAME ; void QtMobility::QContactRelationshipFilter::setRelatedContactRole(enum QtMobility::QContactRelationshipFilter::Role) + ?supportedRelationshipTypes@QContactManagerEngine@QtMobility@@UBE?AVQStringList@@ABVQString@@@Z @ 627 NONAME ; class QStringList QtMobility::QContactManagerEngine::supportedRelationshipTypes(class QString const &) const + ?definitionNames@QContactDetailDefinitionRemoveRequest@QtMobility@@QBE?AVQStringList@@XZ @ 628 NONAME ; class QStringList QtMobility::QContactDetailDefinitionRemoveRequest::definitionNames(void) const + ??0QContactDetailDefinition@QtMobility@@QAE@XZ @ 629 NONAME ; QtMobility::QContactDetailDefinition::QContactDetailDefinition(void) + ?setSyncTarget@QContactSyncTarget@QtMobility@@QAEXABVQString@@@Z @ 630 NONAME ; void QtMobility::QContactSyncTarget::setSyncTarget(class QString const &) + ??4QContactAvatar@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 631 NONAME ; class QtMobility::QContactAvatar & QtMobility::QContactAvatar::operator=(class QtMobility::QContactDetail const &) + ?synthesizeDisplayLabel@QContactManagerEngine@QtMobility@@UBE?AVQString@@ABVQContact@2@AAW4Error@QContactManager@2@@Z @ 632 NONAME ; class QString QtMobility::QContactManagerEngine::synthesizeDisplayLabel(class QtMobility::QContact const &, enum QtMobility::QContactManager::Error &) const + ?FieldContext@QContactDetail@QtMobility@@2U?$Latin1Literal@$07@2@B @ 633 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactDetail::FieldContext + ?trUtf8@QContactActionFactory@QtMobility@@SA?AVQString@@PBD0H@Z @ 634 NONAME ; class QString QtMobility::QContactActionFactory::trUtf8(char const *, char const *, int) + ??0QContactManager@QtMobility@@QAE@ABVQString@@ABV?$QMap@VQString@@V1@@@PAVQObject@@@Z @ 635 NONAME ; QtMobility::QContactManager::QContactManager(class QString const &, class QMap const &, class QObject *) + ??0QContactPhoneNumber@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 636 NONAME ; QtMobility::QContactPhoneNumber::QContactPhoneNumber(class QtMobility::QContactDetail const &) + ?d_func@QContactLocalIdFilter@QtMobility@@ABEPBVQContactLocalIdFilterPrivate@2@XZ @ 637 NONAME ; class QtMobility::QContactLocalIdFilterPrivate const * QtMobility::QContactLocalIdFilter::d_func(void) const + ?FieldStreet@QContactAddress@QtMobility@@2U?$Latin1Literal@$06@2@B @ 638 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactAddress::FieldStreet + ?FieldAvatar@QContactAvatar@QtMobility@@2U?$Latin1Literal@$06@2@B @ 639 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactAvatar::FieldAvatar + ?detailDefinitionName@QContactSortOrder@QtMobility@@QBE?AVQString@@XZ @ 640 NONAME ; class QString QtMobility::QContactSortOrder::detailDefinitionName(void) const + ?type@QContactAbstractRequest@QtMobility@@QBE?AW4RequestType@12@XZ @ 641 NONAME ; enum QtMobility::QContactAbstractRequest::RequestType QtMobility::QContactAbstractRequest::type(void) const + ?supportedDataTypes@QContactMemoryEngine@QtMobility@@UBE?AV?$QList@W4Type@QVariant@@@@XZ @ 642 NONAME ; class QList QtMobility::QContactMemoryEngine::supportedDataTypes(void) const + ??0QContactDetail@QtMobility@@QAE@ABV01@@Z @ 643 NONAME ; QtMobility::QContactDetail::QContactDetail(class QtMobility::QContactDetail const &) + ?definitions@QContactDetailDefinitionSaveRequest@QtMobility@@QBE?AV?$QList@VQContactDetailDefinition@QtMobility@@@@XZ @ 644 NONAME ; class QList QtMobility::QContactDetailDefinitionSaveRequest::definitions(void) const + ?removedRelationshipsContacts@QContactChangeSet@QtMobility@@QAEAAV?$QSet@I@@XZ @ 645 NONAME ; class QSet & QtMobility::QContactChangeSet::removedRelationshipsContacts(void) + ?type@QContactFilter@QtMobility@@QBE?AW4FilterType@12@XZ @ 646 NONAME ; enum QtMobility::QContactFilter::FilterType QtMobility::QContactFilter::type(void) const + ?street@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 647 NONAME ; class QString QtMobility::QContactAddress::street(void) const + ?allowableValues@QContactDetailFieldDefinition@QtMobility@@QBE?AV?$QList@VQVariant@@@@XZ @ 648 NONAME ; class QList QtMobility::QContactDetailFieldDefinition::allowableValues(void) const + ?FieldModificationTimestamp@QContactTimestamp@QtMobility@@2U?$Latin1Literal@$0BG@@2@B @ 649 NONAME ; struct QtMobility::Latin1Literal<22> const QtMobility::QContactTimestamp::FieldModificationTimestamp + ?updateRequestStatus@QContactManagerEngine@QtMobility@@SAXPAVQContactAbstractRequest@2@W4Error@QContactManager@2@AAV?$QList@W4Error@QContactManager@QtMobility@@@@W4Status@32@_N@Z @ 650 NONAME ; void QtMobility::QContactManagerEngine::updateRequestStatus(class QtMobility::QContactAbstractRequest *, enum QtMobility::QContactManager::Error, class QList &, enum QtMobility::QContactAbstractRequest::Status, bool) + ?localId@QContactId@QtMobility@@QBEIXZ @ 651 NONAME ; unsigned int QtMobility::QContactId::localId(void) const + ??_EQContactOnlineAccount@QtMobility@@UAE@I@Z @ 652 NONAME ; QtMobility::QContactOnlineAccount::~QContactOnlineAccount(unsigned int) + ?saveContacts@QContactMemoryEngine@QtMobility@@UAE_NPAV?$QList@VQContact@QtMobility@@@@PAV?$QMap@HW4Error@QContactManager@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 653 NONAME ; bool QtMobility::QContactMemoryEngine::saveContacts(class QList *, class QMap *, enum QtMobility::QContactManager::Error &) + ?trUtf8@QContactActionFactory@QtMobility@@SA?AVQString@@PBD0@Z @ 654 NONAME ; class QString QtMobility::QContactActionFactory::trUtf8(char const *, char const *) + ?tr@QContactLocalIdFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 655 NONAME ; class QString QtMobility::QContactLocalIdFetchRequest::tr(char const *, char const *, int) + ?supportedContactTypes@QContactManager@QtMobility@@QBE?AVQStringList@@XZ @ 656 NONAME ; class QStringList QtMobility::QContactManager::supportedContactTypes(void) const + ?qt_metacall@QContactActionFactory@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 657 NONAME ; int QtMobility::QContactActionFactory::qt_metacall(enum QMetaObject::Call, int, void * *) + ?relationshipOrder@QContact@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@XZ @ 658 NONAME ; class QList QtMobility::QContact::relationshipOrder(void) const + ?tr@QContactAction@QtMobility@@SA?AVQString@@PBD0H@Z @ 659 NONAME ; class QString QtMobility::QContactAction::tr(char const *, char const *, int) + ?setSubTypes@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 660 NONAME ; void QtMobility::QContactOnlineAccount::setSubTypes(class QString const &) + ??8QContactFilter@QtMobility@@QBE_NABV01@@Z @ 661 NONAME ; bool QtMobility::QContactFilter::operator==(class QtMobility::QContactFilter const &) const + ?metaObject@QContactFetchRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 662 NONAME ; struct QMetaObject const * QtMobility::QContactFetchRequest::metaObject(void) const + ??0QContactRelationshipFetchRequest@QtMobility@@QAE@XZ @ 663 NONAME ; QtMobility::QContactRelationshipFetchRequest::QContactRelationshipFetchRequest(void) + ?errorMap@QContactDetailDefinitionRemoveRequest@QtMobility@@QBE?AV?$QMap@HW4Error@QContactManager@QtMobility@@@@XZ @ 664 NONAME ; class QMap QtMobility::QContactDetailDefinitionRemoveRequest::errorMap(void) const + ?logo@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 665 NONAME ; class QString QtMobility::QContactOrganization::logo(void) const + ?SubTypeHomePage@QContactUrl@QtMobility@@2U?$Latin1Literal@$08@2@B @ 666 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactUrl::SubTypeHomePage + ?isEmpty@QContactDetailDefinition@QtMobility@@QBE_NXZ @ 667 NONAME ; bool QtMobility::QContactDetailDefinition::isEmpty(void) const + ?caseSensitivity@QContactSortOrder@QtMobility@@QBE?AW4CaseSensitivity@Qt@@XZ @ 668 NONAME ; enum Qt::CaseSensitivity QtMobility::QContactSortOrder::caseSensitivity(void) const + ?d_func@QContactIntersectionFilter@QtMobility@@ABEPBVQContactIntersectionFilterPrivate@2@XZ @ 669 NONAME ; class QtMobility::QContactIntersectionFilterPrivate const * QtMobility::QContactIntersectionFilter::d_func(void) const + ??_EQContactBirthday@QtMobility@@UAE@I@Z @ 670 NONAME ; QtMobility::QContactBirthday::~QContactBirthday(unsigned int) + ?FieldCreationTimestamp@QContactTimestamp@QtMobility@@2U?$Latin1Literal@$0BC@@2@B @ 671 NONAME ; struct QtMobility::Latin1Literal<18> const QtMobility::QContactTimestamp::FieldCreationTimestamp + ?tr@QContactRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 672 NONAME ; class QString QtMobility::QContactRemoveRequest::tr(char const *, char const *) + ?FieldGuid@QContactGuid@QtMobility@@2U?$Latin1Literal@$04@2@B @ 673 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactGuid::FieldGuid + ?getStaticMetaObject@QContactRemoveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 674 NONAME ; struct QMetaObject const & QtMobility::QContactRemoveRequest::getStaticMetaObject(void) + ?setSpeed@QContactGeolocation@QtMobility@@QAEXN@Z @ 675 NONAME ; void QtMobility::QContactGeolocation::setSpeed(double) + ?DefinitionName@QContactAddress@QtMobility@@2U?$Latin1Literal@$0O@@2@B @ 676 NONAME ; struct QtMobility::Latin1Literal<14> const QtMobility::QContactAddress::DefinitionName + ?supportedContactTypes@QContactManagerEngine@QtMobility@@UBE?AVQStringList@@XZ @ 677 NONAME ; class QStringList QtMobility::QContactManagerEngine::supportedContactTypes(void) const + ??0QContactRelationship@QtMobility@@QAE@ABV01@@Z @ 678 NONAME ; QtMobility::QContactRelationship::QContactRelationship(class QtMobility::QContactRelationship const &) + ?setAltitude@QContactGeolocation@QtMobility@@QAEXN@Z @ 679 NONAME ; void QtMobility::QContactGeolocation::setAltitude(double) + ?serviceProvider@QContactOnlineAccount@QtMobility@@QBE?AVQString@@XZ @ 680 NONAME ; class QString QtMobility::QContactOnlineAccount::serviceProvider(void) const + ?d_func@QContactDetailDefinitionRemoveRequest@QtMobility@@ABEPBVQContactDetailDefinitionRemoveRequestPrivate@2@XZ @ 681 NONAME ; class QtMobility::QContactDetailDefinitionRemoveRequestPrivate const * QtMobility::QContactDetailDefinitionRemoveRequest::d_func(void) const + ?SubTypeMemorial@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$08@2@B @ 682 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactAnniversary::SubTypeMemorial + ?customLabel@QContactName@QtMobility@@QBE?AVQString@@XZ @ 683 NONAME ; class QString QtMobility::QContactName::customLabel(void) const + ?hasFeature@QContactMemoryEngine@QtMobility@@UBE_NW4ManagerFeature@QContactManager@2@ABVQString@@@Z @ 684 NONAME ; bool QtMobility::QContactMemoryEngine::hasFeature(enum QtMobility::QContactManager::ManagerFeature, class QString const &) const + ?sorting@QContactLocalIdFetchRequest@QtMobility@@QBE?AV?$QList@VQContactSortOrder@QtMobility@@@@XZ @ 685 NONAME ; class QList QtMobility::QContactLocalIdFetchRequest::sorting(void) const + ?FieldAccuracy@QContactGeoLocation@QtMobility@@2U?$Latin1Literal@$08@2@B @ 686 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactGeoLocation::FieldAccuracy + ?trUtf8@QContactDetailDefinitionSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 687 NONAME ; class QString QtMobility::QContactDetailDefinitionSaveRequest::trUtf8(char const *, char const *) + ?name@QContactDetailDefinition@QtMobility@@QBE?AVQString@@XZ @ 688 NONAME ; class QString QtMobility::QContactDetailDefinition::name(void) const + ?preferredDetail@QContact@QtMobility@@QBE?AVQContactDetail@2@ABVQString@@@Z @ 689 NONAME ; class QtMobility::QContactDetail QtMobility::QContact::preferredDetail(class QString const &) const + ?definitionName@QContactDetail@QtMobility@@QBE?AVQString@@XZ @ 690 NONAME ; class QString QtMobility::QContactDetail::definitionName(void) const + ?setDetailUri@QContactDetail@QtMobility@@QAEXABVQString@@@Z @ 691 NONAME ; void QtMobility::QContactDetail::setDetailUri(class QString const &) + ?d_func@QContactDetailFilter@QtMobility@@AAEPAVQContactDetailFilterPrivate@2@XZ @ 692 NONAME ; class QtMobility::QContactDetailFilterPrivate * QtMobility::QContactDetailFilter::d_func(void) + ?requestDestroyed@QContactMemoryEngine@QtMobility@@UAEXPAVQContactAbstractRequest@2@@Z @ 693 NONAME ; void QtMobility::QContactMemoryEngine::requestDestroyed(class QtMobility::QContactAbstractRequest *) + ?saveRelationship@QContactManager@QtMobility@@QAE_NPAVQContactRelationship@2@@Z @ 694 NONAME ; bool QtMobility::QContactManager::saveRelationship(class QtMobility::QContactRelationship *) + ?tr@QContactDetailDefinitionFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 695 NONAME ; class QString QtMobility::QContactDetailDefinitionFetchRequest::tr(char const *, char const *, int) + ?setFilter@QContactFetchRequest@QtMobility@@QAEXABVQContactFilter@2@@Z @ 696 NONAME ; void QtMobility::QContactFetchRequest::setFilter(class QtMobility::QContactFilter const &) + ?eventType@QContactChangeLogFilter@QtMobility@@QBE?AW4EventType@12@XZ @ 697 NONAME ; enum QtMobility::QContactChangeLogFilter::EventType QtMobility::QContactChangeLogFilter::eventType(void) const + ?match@QContactName@QtMobility@@SA?AVQContactFilter@2@ABVQString@@0@Z @ 698 NONAME ; class QtMobility::QContactFilter QtMobility::QContactName::match(class QString const &, class QString const &) + ?setSubTypes@QContactPhoneNumber@QtMobility@@QAEXABVQStringList@@@Z @ 699 NONAME ; void QtMobility::QContactPhoneNumber::setSubTypes(class QStringList const &) + ??0QContactRemoveRequest@QtMobility@@QAE@XZ @ 700 NONAME ; QtMobility::QContactRemoveRequest::QContactRemoveRequest(void) + ?SubTypePostal@QContactAddress@QtMobility@@2U?$Latin1Literal@$06@2@B @ 701 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactAddress::SubTypePostal + ?progress@QContactFetchRequest@QtMobility@@IAEXPAV12@_N@Z @ 702 NONAME ; void QtMobility::QContactFetchRequest::progress(class QtMobility::QContactFetchRequest *, bool) + ?remove@QContactUnionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 703 NONAME ; void QtMobility::QContactUnionFilter::remove(class QtMobility::QContactFilter const &) + ?managerUri@QContactManager@QtMobility@@QBE?AVQString@@XZ @ 704 NONAME ; class QString QtMobility::QContactManager::managerUri(void) const + ?FieldHeading@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$07@2@B @ 705 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactGeolocation::FieldHeading + ??0QContactChangeLogFilter@QtMobility@@QAE@W4EventType@01@@Z @ 706 NONAME ; QtMobility::QContactChangeLogFilter::QContactChangeLogFilter(enum QtMobility::QContactChangeLogFilter::EventType) + ?trUtf8@QContactAbstractRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 707 NONAME ; class QString QtMobility::QContactAbstractRequest::trUtf8(char const *, char const *, int) + ?trUtf8@QContactManagerEngine@QtMobility@@SA?AVQString@@PBD0@Z @ 708 NONAME ; class QString QtMobility::QContactManagerEngine::trUtf8(char const *, char const *) + ?FieldRole@QContactOrganization@QtMobility@@2U?$Latin1Literal@$04@2@B @ 709 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactOrganization::FieldRole + ?setContexts@QContactDetail@QtMobility@@QAEXABVQString@@@Z @ 710 NONAME ; void QtMobility::QContactDetail::setContexts(class QString const &) + ?value@QContactDetailFilter@QtMobility@@QBE?AVQVariant@@XZ @ 711 NONAME ; class QVariant QtMobility::QContactDetailFilter::value(void) const + ?getStaticMetaObject@QContactMemoryEngine@QtMobility@@SAABUQMetaObject@@XZ @ 712 NONAME ; struct QMetaObject const & QtMobility::QContactMemoryEngine::getStaticMetaObject(void) + ??4QContactGeoLocation@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 713 NONAME ; class QtMobility::QContactGeoLocation & QtMobility::QContactGeoLocation::operator=(class QtMobility::QContactDetail const &) + ?setRole@QContactRelationshipFilter@QtMobility@@QAEXW4Role@12@@Z @ 714 NONAME ; void QtMobility::QContactRelationshipFilter::setRole(enum QtMobility::QContactRelationshipFilter::Role) + ??1QContactDetailDefinitionSaveRequest@QtMobility@@UAE@XZ @ 715 NONAME ; QtMobility::QContactDetailDefinitionSaveRequest::~QContactDetailDefinitionSaveRequest(void) + ?number@QContactPhoneNumber@QtMobility@@QBE?AVQString@@XZ @ 716 NONAME ; class QString QtMobility::QContactPhoneNumber::number(void) const + ?trUtf8@QContactSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 717 NONAME ; class QString QtMobility::QContactSaveRequest::trUtf8(char const *, char const *) + ?trUtf8@QContactRelationshipFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 718 NONAME ; class QString QtMobility::QContactRelationshipFetchRequest::trUtf8(char const *, char const *, int) + ?IsSameAs@QContactRelationship@QtMobility@@2U?$Latin1Literal@$08@2@B @ 719 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactRelationship::IsSameAs + ?selfContactId@QContactManagerEngine@QtMobility@@UBEIAAW4Error@QContactManager@2@@Z @ 720 NONAME ; unsigned int QtMobility::QContactManagerEngine::selfContactId(enum QtMobility::QContactManager::Error &) const + ?DefinitionName@QContactName@QtMobility@@2U?$Latin1Literal@$04@2@B @ 721 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactName::DefinitionName + ?d_func@QContactFetchRequest@QtMobility@@ABEPBVQContactFetchRequestPrivate@2@XZ @ 722 NONAME ; class QtMobility::QContactFetchRequestPrivate const * QtMobility::QContactFetchRequest::d_func(void) const + ??4QContactBirthday@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 723 NONAME ; class QtMobility::QContactBirthday & QtMobility::QContactBirthday::operator=(class QtMobility::QContactDetail const &) + ??0QContactDisplayLabel@QtMobility@@QAE@XZ @ 724 NONAME ; QtMobility::QContactDisplayLabel::QContactDisplayLabel(void) + ?accountUri@QContactOnlineAccount@QtMobility@@QBE?AVQString@@XZ @ 725 NONAME ; class QString QtMobility::QContactOnlineAccount::accountUri(void) const + ??4QContactRelationship@QtMobility@@QAEAAV01@ABV01@@Z @ 726 NONAME ; class QtMobility::QContactRelationship & QtMobility::QContactRelationship::operator=(class QtMobility::QContactRelationship const &) + ?date@QContactBirthday@QtMobility@@QBE?AVQDate@@XZ @ 727 NONAME ; class QDate QtMobility::QContactBirthday::date(void) const + ?validateDefinition@QContactManagerEngine@QtMobility@@UBE_NABVQContactDetailDefinition@2@AAW4Error@QContactManager@2@@Z @ 728 NONAME ; bool QtMobility::QContactManagerEngine::validateDefinition(class QtMobility::QContactDetailDefinition const &, enum QtMobility::QContactManager::Error &) const + ??_EQContactOrganization@QtMobility@@UAE@I@Z @ 729 NONAME ; QtMobility::QContactOrganization::~QContactOrganization(unsigned int) + ?trUtf8@QContactRelationshipRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 730 NONAME ; class QString QtMobility::QContactRelationshipRemoveRequest::trUtf8(char const *, char const *, int) + ?setPresence@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 731 NONAME ; void QtMobility::QContactOnlineAccount::setPresence(class QString const &) + ?Is@QContactRelationship@QtMobility@@2U?$Latin1Literal@$08@2@B @ 732 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactRelationship::Is + ?setBlankPolicy@QContactSortOrder@QtMobility@@QAEXW4BlankPolicy@12@@Z @ 733 NONAME ; void QtMobility::QContactSortOrder::setBlankPolicy(enum QtMobility::QContactSortOrder::BlankPolicy) + ?tr@QContactMemoryEngine@QtMobility@@SA?AVQString@@PBD0H@Z @ 734 NONAME ; class QString QtMobility::QContactMemoryEngine::tr(char const *, char const *, int) + ?progress@QContactDetailDefinitionRemoveRequest@QtMobility@@IAEXPAV12@@Z @ 735 NONAME ; void QtMobility::QContactDetailDefinitionRemoveRequest::progress(class QtMobility::QContactDetailDefinitionRemoveRequest *) + ?tr@QContactManager@QtMobility@@SA?AVQString@@PBD0H@Z @ 736 NONAME ; class QString QtMobility::QContactManager::tr(char const *, char const *, int) + ??0QContactEmailAddress@QtMobility@@QAE@XZ @ 737 NONAME ; QtMobility::QContactEmailAddress::QContactEmailAddress(void) + ?staticMetaObject@QContactRelationshipFetchRequest@QtMobility@@2UQMetaObject@@B @ 738 NONAME ; struct QMetaObject const QtMobility::QContactRelationshipFetchRequest::staticMetaObject + ??0QContactActionDescriptor@QtMobility@@QAE@ABV01@@Z @ 739 NONAME ; QtMobility::QContactActionDescriptor::QContactActionDescriptor(class QtMobility::QContactActionDescriptor const &) + ?insertField@QContactDetailDefinition@QtMobility@@QAEXABVQString@@ABVQContactDetailFieldDefinition@2@@Z @ 740 NONAME ; void QtMobility::QContactDetailDefinition::insertField(class QString const &, class QtMobility::QContactDetailFieldDefinition const &) + ?setTimestamp@QContactGeoLocation@QtMobility@@QAEXABVQDateTime@@@Z @ 741 NONAME ; void QtMobility::QContactGeoLocation::setTimestamp(class QDateTime const &) + ?lastModified@QContactTimestamp@QtMobility@@QBE?AVQDateTime@@XZ @ 742 NONAME ; class QDateTime QtMobility::QContactTimestamp::lastModified(void) const + ?setSuffix@QContactName@QtMobility@@QAEXABVQString@@@Z @ 743 NONAME ; void QtMobility::QContactName::setSuffix(class QString const &) + ?removeField@QContactDetailDefinition@QtMobility@@QAEXABVQString@@@Z @ 744 NONAME ; void QtMobility::QContactDetailDefinition::removeField(class QString const &) + ?filters@QContactIntersectionFilter@QtMobility@@QBE?AV?$QList@VQContactFilter@QtMobility@@@@XZ @ 745 NONAME ; class QList QtMobility::QContactIntersectionFilter::filters(void) const + ??6QContactIntersectionFilter@QtMobility@@QAEAAV01@ABVQContactFilter@1@@Z @ 746 NONAME ; class QtMobility::QContactIntersectionFilter & QtMobility::QContactIntersectionFilter::operator<<(class QtMobility::QContactFilter const &) + ??9QContact@QtMobility@@QBE_NABV01@@Z @ 747 NONAME ; bool QtMobility::QContact::operator!=(class QtMobility::QContact const &) const + ?cancelRequest@QContactMemoryEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@@Z @ 748 NONAME ; bool QtMobility::QContactMemoryEngine::cancelRequest(class QtMobility::QContactAbstractRequest *) + ?setServiceProvider@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 749 NONAME ; void QtMobility::QContactOnlineAccount::setServiceProvider(class QString const &) + ??4QContactNickname@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 750 NONAME ; class QtMobility::QContactNickname & QtMobility::QContactNickname::operator=(class QtMobility::QContactDetail const &) + ??0QContactAvatar@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 751 NONAME ; QtMobility::QContactAvatar::QContactAvatar(class QtMobility::QContactDetail const &) + ?FieldAltitudeAccuracy@QContactGeoLocation@QtMobility@@2U?$Latin1Literal@$0BB@@2@B @ 752 NONAME ; struct QtMobility::Latin1Literal<17> const QtMobility::QContactGeoLocation::FieldAltitudeAccuracy + ?setNickname@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 753 NONAME ; void QtMobility::QContactOnlineAccount::setNickname(class QString const &) + ??_EQContactAddress@QtMobility@@UAE@I@Z @ 754 NONAME ; QtMobility::QContactAddress::~QContactAddress(unsigned int) + ?tr@QContactMemoryEngine@QtMobility@@SA?AVQString@@PBD0@Z @ 755 NONAME ; class QString QtMobility::QContactMemoryEngine::tr(char const *, char const *) + ?contacts@QContactManagerEngine@QtMobility@@UBE?AV?$QList@I@@ABV?$QList@VQContactSortOrder@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 756 NONAME ; class QList QtMobility::QContactManagerEngine::contacts(class QList const &, enum QtMobility::QContactManager::Error &) const + ?start@QContactAbstractRequest@QtMobility@@QAE_NXZ @ 757 NONAME ; bool QtMobility::QContactAbstractRequest::start(void) + ?setLastModified@QContactTimestamp@QtMobility@@QAEXABVQDateTime@@@Z @ 758 NONAME ; void QtMobility::QContactTimestamp::setLastModified(class QDateTime const &) + ?isUnique@QContactDetailDefinition@QtMobility@@QBE_NXZ @ 759 NONAME ; bool QtMobility::QContactDetailDefinition::isUnique(void) const + ?setEmailAddress@QContactEmailAddress@QtMobility@@QAEXABVQString@@@Z @ 760 NONAME ; void QtMobility::QContactEmailAddress::setEmailAddress(class QString const &) + ?ContextHome@QContactDetail@QtMobility@@2U?$Latin1Literal@$04@2@B @ 761 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactDetail::ContextHome + ?metaObject@QContactManagerEngine@QtMobility@@UBEPBUQMetaObject@@XZ @ 762 NONAME ; struct QMetaObject const * QtMobility::QContactManagerEngine::metaObject(void) const + ?setNames@QContactDetailDefinitionRemoveRequest@QtMobility@@QAEXABVQStringList@@@Z @ 763 NONAME ; void QtMobility::QContactDetailDefinitionRemoveRequest::setNames(class QStringList const &) + ?trUtf8@QContactDetailDefinitionFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 764 NONAME ; class QString QtMobility::QContactDetailDefinitionFetchRequest::trUtf8(char const *, char const *, int) + ?qt_metacall@QContactFetchRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 765 NONAME ; int QtMobility::QContactFetchRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ??_EQContactFilter@QtMobility@@UAE@I@Z @ 766 NONAME ; QtMobility::QContactFilter::~QContactFilter(unsigned int) + ??_EQContactFamily@QtMobility@@UAE@I@Z @ 767 NONAME ; QtMobility::QContactFamily::~QContactFamily(unsigned int) + ??0QContactOrganization@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 768 NONAME ; QtMobility::QContactOrganization::QContactOrganization(class QtMobility::QContactDetail const &) + ?metaObject@QContactManager@QtMobility@@UBEPBUQMetaObject@@XZ @ 769 NONAME ; struct QMetaObject const * QtMobility::QContactManager::metaObject(void) const + ?qt_metacall@QContactAction@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 770 NONAME ; int QtMobility::QContactAction::qt_metacall(enum QMetaObject::Call, int, void * *) + ?setFirst@QContactName@QtMobility@@QAEXABVQString@@@Z @ 771 NONAME ; void QtMobility::QContactName::setFirst(class QString const &) + ?metaObject@QContactLocalIdFetchRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 772 NONAME ; struct QMetaObject const * QtMobility::QContactLocalIdFetchRequest::metaObject(void) const + ?setCountry@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 773 NONAME ; void QtMobility::QContactAddress::setCountry(class QString const &) + ?setSubType@QContactAvatar@QtMobility@@QAEXABVQString@@@Z @ 774 NONAME ; void QtMobility::QContactAvatar::setSubType(class QString const &) + ?updateContactSaveRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactSaveRequest@2@ABV?$QList@VQContact@QtMobility@@@@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 775 NONAME ; void QtMobility::QContactManagerEngine::updateContactSaveRequest(class QtMobility::QContactSaveRequest *, class QList const &, enum QtMobility::QContactManager::Error, class QMap const &) + ?HasSpouse@QContactRelationship@QtMobility@@2U?$Latin1Literal@$09@2@B @ 776 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactRelationship::HasSpouse + ?isFilterSupported@QContactManager@QtMobility@@QBE_NABVQContactFilter@2@@Z @ 777 NONAME ; bool QtMobility::QContactManager::isFilterSupported(class QtMobility::QContactFilter const &) const + ?changedContacts@QContactChangeSet@QtMobility@@QAEAAV?$QSet@I@@XZ @ 778 NONAME ; class QSet & QtMobility::QContactChangeSet::changedContacts(void) + ?SubTypeVideo@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$05@2@B @ 779 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactPhoneNumber::SubTypeVideo + ??4QContactDisplayLabel@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 780 NONAME ; class QtMobility::QContactDisplayLabel & QtMobility::QContactDisplayLabel::operator=(class QtMobility::QContactDetail const &) + ?FieldTitle@QContactOrganization@QtMobility@@2U?$Latin1Literal@$05@2@B @ 781 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactOrganization::FieldTitle + ?sortContacts@QContactManagerEngine@QtMobility@@SA?AV?$QList@I@@ABV?$QList@VQContact@QtMobility@@@@ABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 782 NONAME ; class QList QtMobility::QContactManagerEngine::sortContacts(class QList const &, class QList const &) + ?tr@QContactActionFactory@QtMobility@@SA?AVQString@@PBD0@Z @ 783 NONAME ; class QString QtMobility::QContactActionFactory::tr(char const *, char const *) + ??0QContactNickname@QtMobility@@QAE@XZ @ 784 NONAME ; QtMobility::QContactNickname::QContactNickname(void) + ?getStaticMetaObject@QContactActionFactory@QtMobility@@SAABUQMetaObject@@XZ @ 785 NONAME ; struct QMetaObject const & QtMobility::QContactActionFactory::getStaticMetaObject(void) + ?setCustomLabel@QContactName@QtMobility@@QAEXABVQString@@@Z @ 786 NONAME ; void QtMobility::QContactName::setCustomLabel(class QString const &) + ?relationshipsRemoved@QContactManager@QtMobility@@IAEXABV?$QList@I@@@Z @ 787 NONAME ; void QtMobility::QContactManager::relationshipsRemoved(class QList const &) + ?contacts@QContactFetchRequest@QtMobility@@QBE?AV?$QList@VQContact@QtMobility@@@@XZ @ 788 NONAME ; class QList QtMobility::QContactFetchRequest::contacts(void) const + ?setFirstName@QContactName@QtMobility@@QAEXABVQString@@@Z @ 789 NONAME ; void QtMobility::QContactName::setFirstName(class QString const &) + ??_EQContactGeoLocation@QtMobility@@UAE@I@Z @ 790 NONAME ; QtMobility::QContactGeoLocation::~QContactGeoLocation(unsigned int) + ??0QContactSortOrder@QtMobility@@QAE@ABV01@@Z @ 791 NONAME ; QtMobility::QContactSortOrder::QContactSortOrder(class QtMobility::QContactSortOrder const &) + ?metaObject@QContactDetailDefinitionSaveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 792 NONAME ; struct QMetaObject const * QtMobility::QContactDetailDefinitionSaveRequest::metaObject(void) const + ??0QContactPhoneNumber@QtMobility@@QAE@XZ @ 793 NONAME ; QtMobility::QContactPhoneNumber::QContactPhoneNumber(void) + ?d_func@QContactChangeLogFilter@QtMobility@@AAEPAVQContactChangeLogFilterPrivate@2@XZ @ 794 NONAME ; class QtMobility::QContactChangeLogFilterPrivate * QtMobility::QContactChangeLogFilter::d_func(void) + ?performAsynchronousOperation@QContactMemoryEngine@QtMobility@@AAEXXZ @ 795 NONAME ; void QtMobility::QContactMemoryEngine::performAsynchronousOperation(void) + ?progress@QContactDetailDefinitionSaveRequest@QtMobility@@IAEXPAV12@@Z @ 796 NONAME ; void QtMobility::QContactDetailDefinitionSaveRequest::progress(class QtMobility::QContactDetailDefinitionSaveRequest *) + ?trUtf8@QContactRelationshipFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 797 NONAME ; class QString QtMobility::QContactRelationshipFetchRequest::trUtf8(char const *, char const *) + ?setHeading@QContactGeoLocation@QtMobility@@QAEXN@Z @ 798 NONAME ; void QtMobility::QContactGeoLocation::setHeading(double) + ?errorMap@QContactSaveRequest@QtMobility@@QBE?AV?$QMap@HW4Error@QContactManager@QtMobility@@@@XZ @ 799 NONAME ; class QMap QtMobility::QContactSaveRequest::errorMap(void) const + ??0QContactOrganization@QtMobility@@QAE@XZ @ 800 NONAME ; QtMobility::QContactOrganization::QContactOrganization(void) + ?removeContacts@QContactManager@QtMobility@@QAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@I@@@Z @ 801 NONAME ; class QList QtMobility::QContactManager::removeContacts(class QList *) + ?subType@QContactAvatar@QtMobility@@QBE?AVQString@@XZ @ 802 NONAME ; class QString QtMobility::QContactAvatar::subType(void) const + ?relationshipsRemoved@QContactManagerEngine@QtMobility@@IAEXABV?$QList@I@@@Z @ 803 NONAME ; void QtMobility::QContactManagerEngine::relationshipsRemoved(class QList const &) + ?setId@QContact@QtMobility@@QAEXABVQContactId@2@@Z @ 804 NONAME ; void QtMobility::QContact::setId(class QtMobility::QContactId const &) + ?metaObject@QContactAction@QtMobility@@UBEPBUQMetaObject@@XZ @ 805 NONAME ; struct QMetaObject const * QtMobility::QContactAction::metaObject(void) const + ?setAccessConstraint@QContactDetailDefinition@QtMobility@@QAEXABW4AccessConstraint@12@@Z @ 806 NONAME ; void QtMobility::QContactDetailDefinition::setAccessConstraint(enum QtMobility::QContactDetailDefinition::AccessConstraint const &) + ?setSince@QContactChangeLogFilter@QtMobility@@QAEXABVQDateTime@@@Z @ 807 NONAME ; void QtMobility::QContactChangeLogFilter::setSince(class QDateTime const &) + ?metaObject@QContactAbstractRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 808 NONAME ; struct QMetaObject const * QtMobility::QContactAbstractRequest::metaObject(void) const + ?filterSupported@QContactManagerEngine@QtMobility@@UBE_NABVQContactFilter@2@@Z @ 809 NONAME ; bool QtMobility::QContactManagerEngine::filterSupported(class QtMobility::QContactFilter const &) const + ?setOtherParticipantId@QContactRelationshipFilter@QtMobility@@QAEXABVQContactId@2@@Z @ 810 NONAME ; void QtMobility::QContactRelationshipFilter::setOtherParticipantId(class QtMobility::QContactId const &) + ??IQtMobility@@YA?BVQContactFilter@0@ABV10@0@Z @ 811 NONAME ; class QtMobility::QContactFilter const QtMobility::operator&(class QtMobility::QContactFilter const &, class QtMobility::QContactFilter const &) + ?event@QContactAnniversary@QtMobility@@QBE?AVQString@@XZ @ 812 NONAME ; class QString QtMobility::QContactAnniversary::event(void) const + ?removeDetailDefinition@QContactManager@QtMobility@@QAE_NABVQString@@0@Z @ 813 NONAME ; bool QtMobility::QContactManager::removeDetailDefinition(class QString const &, class QString const &) + ??4QContactActionDescriptor@QtMobility@@QAEAAV01@ABV01@@Z @ 814 NONAME ; class QtMobility::QContactActionDescriptor & QtMobility::QContactActionDescriptor::operator=(class QtMobility::QContactActionDescriptor const &) + ??0QContactFamily@QtMobility@@QAE@XZ @ 815 NONAME ; QtMobility::QContactFamily::QContactFamily(void) + ?setEvent@QContactAnniversary@QtMobility@@QAEXABVQString@@@Z @ 816 NONAME ; void QtMobility::QContactAnniversary::setEvent(class QString const &) + ?metaObject@QContactDetailDefinitionFetchRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 817 NONAME ; struct QMetaObject const * QtMobility::QContactDetailDefinitionFetchRequest::metaObject(void) const + ?preferredActions@QContactDetail@QtMobility@@QBE?AV?$QList@VQContactActionDescriptor@QtMobility@@@@XZ @ 818 NONAME ; class QList QtMobility::QContactDetail::preferredActions(void) const + ?setFilter@QContactRemoveRequest@QtMobility@@QAEXABVQContactFilter@2@@Z @ 819 NONAME ; void QtMobility::QContactRemoveRequest::setFilter(class QtMobility::QContactFilter const &) + ??1QContactType@QtMobility@@UAE@XZ @ 820 NONAME ; QtMobility::QContactType::~QContactType(void) + ?state@QContactAbstractRequest@QtMobility@@QBE?AW4State@12@XZ @ 821 NONAME ; enum QtMobility::QContactAbstractRequest::State QtMobility::QContactAbstractRequest::state(void) const + ?trUtf8@QContactLocalIdFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 822 NONAME ; class QString QtMobility::QContactLocalIdFetchRequest::trUtf8(char const *, char const *) + ??_EQContactAnniversary@QtMobility@@UAE@I@Z @ 823 NONAME ; QtMobility::QContactAnniversary::~QContactAnniversary(unsigned int) + ?first@QContactName@QtMobility@@QBE?AVQString@@XZ @ 824 NONAME ; class QString QtMobility::QContactName::first(void) const + ??1QContactManager@QtMobility@@UAE@XZ @ 825 NONAME ; QtMobility::QContactManager::~QContactManager(void) + ?qt_metacast@QContactMemoryEngine@QtMobility@@UAEPAXPBD@Z @ 826 NONAME ; void * QtMobility::QContactMemoryEngine::qt_metacast(char const *) + ?DefinitionName@QContactSyncTarget@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 827 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactSyncTarget::DefinitionName + ?FieldAccountUri@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 828 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactOnlineAccount::FieldAccountUri + ?saveContacts@QContactManagerEngine@QtMobility@@UAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@VQContact@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 829 NONAME ; class QList QtMobility::QContactManagerEngine::saveContacts(class QList *, enum QtMobility::QContactManager::Error &) + ??_EQContactManagerEngineFactory@QtMobility@@UAE@I@Z @ 830 NONAME ; QtMobility::QContactManagerEngineFactory::~QContactManagerEngineFactory(unsigned int) + ?parseUri@QContactManager@QtMobility@@SA_NABVQString@@PAV3@PAV?$QMap@VQString@@V1@@@@Z @ 831 NONAME ; bool QtMobility::QContactManager::parseUri(class QString const &, class QString *, class QMap *) + ??_EQContactGuid@QtMobility@@UAE@I@Z @ 832 NONAME ; QtMobility::QContactGuid::~QContactGuid(unsigned int) + ?tr@QContactRelationshipFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 833 NONAME ; class QString QtMobility::QContactRelationshipFetchRequest::tr(char const *, char const *, int) + ??_EQContactRelationshipSaveRequest@QtMobility@@UAE@I@Z @ 834 NONAME ; QtMobility::QContactRelationshipSaveRequest::~QContactRelationshipSaveRequest(unsigned int) + ?status@QContactAbstractRequest@QtMobility@@QBE?AW4Status@12@XZ @ 835 NONAME ; enum QtMobility::QContactAbstractRequest::Status QtMobility::QContactAbstractRequest::status(void) const + ?validateContact@QContactManagerEngine@QtMobility@@UBE_NABVQContact@2@AAW4Error@QContactManager@2@@Z @ 836 NONAME ; bool QtMobility::QContactManagerEngine::validateContact(class QtMobility::QContact const &, enum QtMobility::QContactManager::Error &) const + ?SubTypeLandline@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$08@2@B @ 837 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactPhoneNumber::SubTypeLandline + ?timestamp@QContactGeolocation@QtMobility@@QBE?AVQDateTime@@XZ @ 838 NONAME ; class QDateTime QtMobility::QContactGeolocation::timestamp(void) const + ?dataChanged@QContactChangeSet@QtMobility@@QAE_NXZ @ 839 NONAME ; bool QtMobility::QContactChangeSet::dataChanged(void) + ?tr@QContactManagerEngine@QtMobility@@SA?AVQString@@PBD0@Z @ 840 NONAME ; class QString QtMobility::QContactManagerEngine::tr(char const *, char const *) + ?managerParameters@QContactManagerEngine@QtMobility@@UBE?AV?$QMap@VQString@@V1@@@XZ @ 841 NONAME ; class QMap QtMobility::QContactManagerEngine::managerParameters(void) const + ?getStaticMetaObject@QContactManagerEngine@QtMobility@@SAABUQMetaObject@@XZ @ 842 NONAME ; struct QMetaObject const & QtMobility::QContactManagerEngine::getStaticMetaObject(void) + ?fields@QContactDetailDefinition@QtMobility@@QBE?AV?$QMap@VQString@@VQContactDetailFieldDefinition@QtMobility@@@@XZ @ 843 NONAME ; class QMap QtMobility::QContactDetailDefinition::fields(void) const + ?removeRelationships@QContactManager@QtMobility@@QAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@ABV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 844 NONAME ; class QList QtMobility::QContactManager::removeRelationships(class QList const &) + ?setLatitude@QContactGeoLocation@QtMobility@@QAEXN@Z @ 845 NONAME ; void QtMobility::QContactGeoLocation::setLatitude(double) + ?DefinitionName@QContactNote@QtMobility@@2U?$Latin1Literal@$04@2@B @ 846 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactNote::DefinitionName + ??0QContactDetailFieldDefinition@QtMobility@@QAE@XZ @ 847 NONAME ; QtMobility::QContactDetailFieldDefinition::QContactDetailFieldDefinition(void) + ?qt_metacast@QContactAction@QtMobility@@UAEPAXPBD@Z @ 848 NONAME ; void * QtMobility::QContactAction::qt_metacast(char const *) + ?detailDefinitions@QContactMemoryEngine@QtMobility@@UBE?AV?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@ABVQString@@AAW4Error@QContactManager@2@@Z @ 849 NONAME ; class QMap QtMobility::QContactMemoryEngine::detailDefinitions(class QString const &, enum QtMobility::QContactManager::Error &) const + ?qt_metacast@QContactSaveRequest@QtMobility@@UAEPAXPBD@Z @ 850 NONAME ; void * QtMobility::QContactSaveRequest::qt_metacast(char const *) + ?emailAddress@QContactEmailAddress@QtMobility@@QBE?AVQString@@XZ @ 851 NONAME ; class QString QtMobility::QContactEmailAddress::emailAddress(void) const + ??1QContactPhoneNumber@QtMobility@@UAE@XZ @ 852 NONAME ; QtMobility::QContactPhoneNumber::~QContactPhoneNumber(void) + ?d_func@QContactLocalIdFilter@QtMobility@@AAEPAVQContactLocalIdFilterPrivate@2@XZ @ 853 NONAME ; class QtMobility::QContactLocalIdFilterPrivate * QtMobility::QContactLocalIdFilter::d_func(void) + ??8QContactRelationship@QtMobility@@QBE_NABV01@@Z @ 854 NONAME ; bool QtMobility::QContactRelationship::operator==(class QtMobility::QContactRelationship const &) const + ?SubTypeTexturedMesh@QContactAvatar@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 855 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactAvatar::SubTypeTexturedMesh + ?since@QContactChangeLogFilter@QtMobility@@QBE?AVQDateTime@@XZ @ 856 NONAME ; class QDateTime QtMobility::QContactChangeLogFilter::since(void) const + ?setNickname@QContactNickname@QtMobility@@QAEXABVQString@@@Z @ 857 NONAME ; void QtMobility::QContactNickname::setNickname(class QString const &) + ?d_func@QContactIntersectionFilter@QtMobility@@AAEPAVQContactIntersectionFilterPrivate@2@XZ @ 858 NONAME ; class QtMobility::QContactIntersectionFilterPrivate * QtMobility::QContactIntersectionFilter::d_func(void) + ?d_func@QContactRelationshipFilter@QtMobility@@ABEPBVQContactRelationshipFilterPrivate@2@XZ @ 859 NONAME ; class QtMobility::QContactRelationshipFilterPrivate const * QtMobility::QContactRelationshipFilter::d_func(void) const + ??_EQContactUrl@QtMobility@@UAE@I@Z @ 860 NONAME ; QtMobility::QContactUrl::~QContactUrl(unsigned int) + ?FieldSpeed@QContactGeoLocation@QtMobility@@2U?$Latin1Literal@$05@2@B @ 861 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactGeoLocation::FieldSpeed + ?setPreferredActions@QContactDetail@QtMobility@@QAEXABV?$QList@VQContactActionDescriptor@QtMobility@@@@@Z @ 862 NONAME ; void QtMobility::QContactDetail::setPreferredActions(class QList const &) + ?qt_metacast@QContactFetchRequest@QtMobility@@UAEPAXPBD@Z @ 863 NONAME ; void * QtMobility::QContactFetchRequest::qt_metacast(char const *) + ?relationshipType@QContactRelationship@QtMobility@@QBE?AVQString@@XZ @ 864 NONAME ; class QString QtMobility::QContactRelationship::relationshipType(void) const + ?d_func@QContactActionFilter@QtMobility@@AAEPAVQContactActionFilterPrivate@2@XZ @ 865 NONAME ; class QtMobility::QContactActionFilterPrivate * QtMobility::QContactActionFilter::d_func(void) + ?waitForRequestProgress@QContactManagerEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@H@Z @ 866 NONAME ; bool QtMobility::QContactManagerEngine::waitForRequestProgress(class QtMobility::QContactAbstractRequest *, int) + ?variantValue@QContactDetail@QtMobility@@QBE?AVQVariant@@ABVQString@@@Z @ 867 NONAME ; class QVariant QtMobility::QContactDetail::variantValue(class QString const &) const + ?tr@QContactDetailDefinitionFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 868 NONAME ; class QString QtMobility::QContactDetailDefinitionFetchRequest::tr(char const *, char const *) + ?FieldEmailAddress@QContactEmailAddress@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 869 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactEmailAddress::FieldEmailAddress + ?staticMetaObject@QContactManager@QtMobility@@2UQMetaObject@@B @ 870 NONAME ; struct QMetaObject const QtMobility::QContactManager::staticMetaObject + ?FieldTimestamp@QContactGeoLocation@QtMobility@@2U?$Latin1Literal@$09@2@B @ 871 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactGeoLocation::FieldTimestamp + ?qt_metacast@QContactDetailDefinitionSaveRequest@QtMobility@@UAEPAXPBD@Z @ 872 NONAME ; void * QtMobility::QContactDetailDefinitionSaveRequest::qt_metacast(char const *) + ?qt_metacast@QContactManagerEngine@QtMobility@@UAEPAXPBD@Z @ 873 NONAME ; void * QtMobility::QContactManagerEngine::qt_metacast(char const *) + ?implementationVersion@QContactManager@QtMobility@@QBEHXZ @ 874 NONAME ; int QtMobility::QContactManager::implementationVersion(void) const + ??0QContactRelationshipFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 875 NONAME ; QtMobility::QContactRelationshipFilter::QContactRelationshipFilter(class QtMobility::QContactFilter const &) + ?clearDetails@QContact@QtMobility@@QAEXXZ @ 876 NONAME ; void QtMobility::QContact::clearDetails(void) + ?d_func@QContactDetailDefinitionRemoveRequest@QtMobility@@AAEPAVQContactDetailDefinitionRemoveRequestPrivate@2@XZ @ 877 NONAME ; class QtMobility::QContactDetailDefinitionRemoveRequestPrivate * QtMobility::QContactDetailDefinitionRemoveRequest::d_func(void) + ?match@QContactName@QtMobility@@SA?AVQContactFilter@2@ABVQString@@@Z @ 878 NONAME ; class QtMobility::QContactFilter QtMobility::QContactName::match(class QString const &) + ?requestDestroyed@QContactManagerEngine@QtMobility@@UAEXPAVQContactAbstractRequest@2@@Z @ 879 NONAME ; void QtMobility::QContactManagerEngine::requestDestroyed(class QtMobility::QContactAbstractRequest *) + ?trUtf8@QContactAction@QtMobility@@SA?AVQString@@PBD0@Z @ 880 NONAME ; class QString QtMobility::QContactAction::trUtf8(char const *, char const *) + ??0QContactNote@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 881 NONAME ; QtMobility::QContactNote::QContactNote(class QtMobility::QContactDetail const &) + ?filter@QContactRemoveRequest@QtMobility@@QBE?AVQContactFilter@2@XZ @ 882 NONAME ; class QtMobility::QContactFilter QtMobility::QContactRemoveRequest::filter(void) const + ?progress@QContactSaveRequest@QtMobility@@IAEXPAV12@@Z @ 883 NONAME ; void QtMobility::QContactSaveRequest::progress(class QtMobility::QContactSaveRequest *) + ??0QContactFilter@QtMobility@@IAE@PAVQContactFilterPrivate@1@@Z @ 884 NONAME ; QtMobility::QContactFilter::QContactFilter(class QtMobility::QContactFilterPrivate *) + ?match@QContactEmailAddress@QtMobility@@SA?AVQContactFilter@2@ABVQString@@@Z @ 885 NONAME ; class QtMobility::QContactFilter QtMobility::QContactEmailAddress::match(class QString const &) + ?prefix@QContactName@QtMobility@@QBE?AVQString@@XZ @ 886 NONAME ; class QString QtMobility::QContactName::prefix(void) const + ?selfContactIdChanged@QContactManager@QtMobility@@IAEXABI0@Z @ 887 NONAME ; void QtMobility::QContactManager::selfContactIdChanged(unsigned int const &, unsigned int const &) + ??0QContactSaveRequest@QtMobility@@QAE@XZ @ 888 NONAME ; QtMobility::QContactSaveRequest::QContactSaveRequest(void) + ?setContactType@QContactDetailDefinitionSaveRequest@QtMobility@@QAEXABVQString@@@Z @ 889 NONAME ; void QtMobility::QContactDetailDefinitionSaveRequest::setContactType(class QString const &) + ?HasMember@QContactRelationship@QtMobility@@2U?$Latin1Literal@$09@2@B @ 890 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactRelationship::HasMember + ??_EQContactRelationshipFilter@QtMobility@@UAE@I@Z @ 891 NONAME ; QtMobility::QContactRelationshipFilter::~QContactRelationshipFilter(unsigned int) + ??0QContactFilter@QtMobility@@QAE@XZ @ 892 NONAME ; QtMobility::QContactFilter::QContactFilter(void) + ?participantRole@QContactRelationshipFetchRequest@QtMobility@@QBE?AW4Role@QContactRelationshipFilter@2@XZ @ 893 NONAME ; enum QtMobility::QContactRelationshipFilter::Role QtMobility::QContactRelationshipFetchRequest::participantRole(void) const + ??0QContactUrl@QtMobility@@QAE@XZ @ 894 NONAME ; QtMobility::QContactUrl::QContactUrl(void) + ?errorMap@QContactRemoveRequest@QtMobility@@QBE?AV?$QMap@HW4Error@QContactManager@QtMobility@@@@XZ @ 895 NONAME ; class QMap QtMobility::QContactRemoveRequest::errorMap(void) const + ?qt_metacall@QContactMemoryEngine@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 896 NONAME ; int QtMobility::QContactMemoryEngine::qt_metacall(enum QMetaObject::Call, int, void * *) + ??9QContactId@QtMobility@@QBE_NABV01@@Z @ 897 NONAME ; bool QtMobility::QContactId::operator!=(class QtMobility::QContactId const &) const + ?setLongitude@QContactGeolocation@QtMobility@@QAEXN@Z @ 898 NONAME ; void QtMobility::QContactGeolocation::setLongitude(double) + ?GenderUnspecified@QContactGender@QtMobility@@2U?$Latin1Literal@$0M@@2@B @ 899 NONAME ; struct QtMobility::Latin1Literal<12> const QtMobility::QContactGender::GenderUnspecified + ??1QContactSyncTarget@QtMobility@@UAE@XZ @ 900 NONAME ; QtMobility::QContactSyncTarget::~QContactSyncTarget(void) + ??1QContactLocalIdFilter@QtMobility@@UAE@XZ @ 901 NONAME ; QtMobility::QContactLocalIdFilter::~QContactLocalIdFilter(void) + ?TypeContact@QContactType@QtMobility@@2U?$Latin1Literal@$07@2@B @ 902 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactType::TypeContact + ?dataChanged@QContactManagerEngine@QtMobility@@IAEXXZ @ 903 NONAME ; void QtMobility::QContactManagerEngine::dataChanged(void) + ?saveRelationship@QContactMemoryEngine@QtMobility@@AAE_NPAVQContactRelationship@2@AAVQContactChangeSet@2@AAW4Error@QContactManager@2@@Z @ 904 NONAME ; bool QtMobility::QContactMemoryEngine::saveRelationship(class QtMobility::QContactRelationship *, class QtMobility::QContactChangeSet &, enum QtMobility::QContactManager::Error &) + ?getStaticMetaObject@QContactAbstractRequest@QtMobility@@SAABUQMetaObject@@XZ @ 905 NONAME ; struct QMetaObject const & QtMobility::QContactAbstractRequest::getStaticMetaObject(void) + ?qt_metacall@QContactRelationshipRemoveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 906 NONAME ; int QtMobility::QContactRelationshipRemoveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ?updateRelationshipSaveRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactRelationshipSaveRequest@2@ABV?$QList@VQContactRelationship@QtMobility@@@@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 907 NONAME ; void QtMobility::QContactManagerEngine::updateRelationshipSaveRequest(class QtMobility::QContactRelationshipSaveRequest *, class QList const &, enum QtMobility::QContactManager::Error, class QMap const &) + ??0QContactActionFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 908 NONAME ; QtMobility::QContactActionFilter::QContactActionFilter(class QtMobility::QContactFilter const &) + ??1QContactDisplayLabel@QtMobility@@UAE@XZ @ 909 NONAME ; QtMobility::QContactDisplayLabel::~QContactDisplayLabel(void) + ?value@QContactDetail@QtMobility@@QBE?AVQString@@ABV3@@Z @ 910 NONAME ; class QString QtMobility::QContactDetail::value(class QString const &) const + ?DefinitionName@QContactBirthday@QtMobility@@2U?$Latin1Literal@$08@2@B @ 911 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactBirthday::DefinitionName + ?setRelationshipOrder@QContact@QtMobility@@QAEXABV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 912 NONAME ; void QtMobility::QContact::setRelationshipOrder(class QList const &) + ?relationships@QContact@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@ABVQString@@@Z @ 913 NONAME ; class QList QtMobility::QContact::relationships(class QString const &) const + ?assistantName@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 914 NONAME ; class QString QtMobility::QContactOrganization::assistantName(void) const + ?trUtf8@QContactFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 915 NONAME ; class QString QtMobility::QContactFetchRequest::trUtf8(char const *, char const *, int) + ??1QContactActionFactory@QtMobility@@UAE@XZ @ 916 NONAME ; QtMobility::QContactActionFactory::~QContactActionFactory(void) + ?contactIds@QContactManager@QtMobility@@QBE?AV?$QList@I@@ABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 917 NONAME ; class QList QtMobility::QContactManager::contactIds(class QList const &) const + ?FieldLastName@QContactName@QtMobility@@2U?$Latin1Literal@$08@2@B @ 918 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactName::FieldLastName + ?append@QContactIntersectionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 919 NONAME ; void QtMobility::QContactIntersectionFilter::append(class QtMobility::QContactFilter const &) + ?contacts@QContactManager@QtMobility@@QBE?AV?$QList@VQContact@QtMobility@@@@ABV?$QList@VQContactSortOrder@QtMobility@@@@ABVQStringList@@@Z @ 920 NONAME ; class QList QtMobility::QContactManager::contacts(class QList const &, class QStringList const &) const + ??1QContactEmailAddress@QtMobility@@UAE@XZ @ 921 NONAME ; QtMobility::QContactEmailAddress::~QContactEmailAddress(void) + ?definitionRestrictions@QContactFetchRequest@QtMobility@@QBE?AVQStringList@@XZ @ 922 NONAME ; class QStringList QtMobility::QContactFetchRequest::definitionRestrictions(void) const + ?setType@QContactType@QtMobility@@QAEXABVQString@@@Z @ 923 NONAME ; void QtMobility::QContactType::setType(class QString const &) + ?FieldDepartment@QContactOrganization@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 924 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactOrganization::FieldDepartment + ?updateDefinitionRemoveRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactDetailDefinitionRemoveRequest@2@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 925 NONAME ; void QtMobility::QContactManagerEngine::updateDefinitionRemoveRequest(class QtMobility::QContactDetailDefinitionRemoveRequest *, enum QtMobility::QContactManager::Error, class QMap const &) + ?relationshipType@QContactRelationshipFilter@QtMobility@@QBE?AVQString@@XZ @ 926 NONAME ; class QString QtMobility::QContactRelationshipFilter::relationshipType(void) const + ?buildUri@QContactManager@QtMobility@@SA?AVQString@@ABV3@ABV?$QMap@VQString@@V1@@@H@Z @ 927 NONAME ; class QString QtMobility::QContactManager::buildUri(class QString const &, class QMap const &, int) + ??_EQContactManager@QtMobility@@UAE@I@Z @ 928 NONAME ; QtMobility::QContactManager::~QContactManager(unsigned int) + ??4QContactFamily@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 929 NONAME ; class QtMobility::QContactFamily & QtMobility::QContactFamily::operator=(class QtMobility::QContactDetail const &) + ?trUtf8@QContactRelationshipSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 930 NONAME ; class QString QtMobility::QContactRelationshipSaveRequest::trUtf8(char const *, char const *, int) + ?qt_metacast@QContactRelationshipSaveRequest@QtMobility@@UAEPAXPBD@Z @ 931 NONAME ; void * QtMobility::QContactRelationshipSaveRequest::qt_metacast(char const *) + ?setOriginalDate@QContactAnniversary@QtMobility@@QAEXABVQDate@@@Z @ 932 NONAME ; void QtMobility::QContactAnniversary::setOriginalDate(class QDate const &) + ?DefinitionName@QContactEmailAddress@QtMobility@@2U?$Latin1Literal@$0N@@2@B @ 933 NONAME ; struct QtMobility::Latin1Literal<13> const QtMobility::QContactEmailAddress::DefinitionName + ?altitude@QContactGeolocation@QtMobility@@QBENXZ @ 934 NONAME ; double QtMobility::QContactGeolocation::altitude(void) const + ??0QContactDetailFilter@QtMobility@@QAE@XZ @ 935 NONAME ; QtMobility::QContactDetailFilter::QContactDetailFilter(void) + ?d_func@QContactDetailFilter@QtMobility@@ABEPBVQContactDetailFilterPrivate@2@XZ @ 936 NONAME ; class QtMobility::QContactDetailFilterPrivate const * QtMobility::QContactDetailFilter::d_func(void) const + ?errorMap@QContactRelationshipRemoveRequest@QtMobility@@QBE?AV?$QMap@HW4Error@QContactManager@QtMobility@@@@XZ @ 937 NONAME ; class QMap QtMobility::QContactRelationshipRemoveRequest::errorMap(void) const + ?setFilters@QContactIntersectionFilter@QtMobility@@QAEXABV?$QList@VQContactFilter@QtMobility@@@@@Z @ 938 NONAME ; void QtMobility::QContactIntersectionFilter::setFilters(class QList const &) + ?progress@QContactRemoveRequest@QtMobility@@IAEXPAV12@@Z @ 939 NONAME ; void QtMobility::QContactRemoveRequest::progress(class QtMobility::QContactRemoveRequest *) + ??1QContactSaveRequest@QtMobility@@UAE@XZ @ 940 NONAME ; QtMobility::QContactSaveRequest::~QContactSaveRequest(void) + ?contactsAdded@QContactManagerEngine@QtMobility@@IAEXABV?$QList@I@@@Z @ 941 NONAME ; void QtMobility::QContactManagerEngine::contactsAdded(class QList const &) + ?trUtf8@QContactAbstractRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 942 NONAME ; class QString QtMobility::QContactAbstractRequest::trUtf8(char const *, char const *) + ?DefinitionName@QContactGender@QtMobility@@2U?$Latin1Literal@$06@2@B @ 943 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactGender::DefinitionName + ?tr@QContactManager@QtMobility@@SA?AVQString@@PBD0@Z @ 944 NONAME ; class QString QtMobility::QContactManager::tr(char const *, char const *) + ?FieldAccuracy@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$08@2@B @ 945 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactGeolocation::FieldAccuracy + ?filter@QContactFetchRequest@QtMobility@@QBE?AVQContactFilter@2@XZ @ 946 NONAME ; class QtMobility::QContactFilter QtMobility::QContactFetchRequest::filter(void) const + ?staticMetaObject@QContactRelationshipRemoveRequest@QtMobility@@2UQMetaObject@@B @ 947 NONAME ; struct QMetaObject const QtMobility::QContactRelationshipRemoveRequest::staticMetaObject + ?tr@QContactRelationshipFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 948 NONAME ; class QString QtMobility::QContactRelationshipFetchRequest::tr(char const *, char const *) + ??1QContactSortOrder@QtMobility@@QAE@XZ @ 949 NONAME ; QtMobility::QContactSortOrder::~QContactSortOrder(void) + ??0QContactAbstractRequest@QtMobility@@QAE@XZ @ 950 NONAME ; QtMobility::QContactAbstractRequest::QContactAbstractRequest(void) + ?firstName@QContactName@QtMobility@@QBE?AVQString@@XZ @ 951 NONAME ; class QString QtMobility::QContactName::firstName(void) const + ?setRelationshipType@QContactRelationshipFetchRequest@QtMobility@@QAEXABVQString@@@Z @ 952 NONAME ; void QtMobility::QContactRelationshipFetchRequest::setRelationshipType(class QString const &) + ?setSubTypes@QContactAddress@QtMobility@@QAEXABVQStringList@@@Z @ 953 NONAME ; void QtMobility::QContactAddress::setSubTypes(class QStringList const &) + ?subType@QContactUrl@QtMobility@@QBE?AVQString@@XZ @ 954 NONAME ; class QString QtMobility::QContactUrl::subType(void) const + ?saveDetailDefinition@QContactMemoryEngine@QtMobility@@AAE_NABVQContactDetailDefinition@2@ABVQString@@AAVQContactChangeSet@2@AAW4Error@QContactManager@2@@Z @ 955 NONAME ; bool QtMobility::QContactMemoryEngine::saveDetailDefinition(class QtMobility::QContactDetailDefinition const &, class QString const &, class QtMobility::QContactChangeSet &, enum QtMobility::QContactManager::Error &) + ?saveContact@QContactMemoryEngine@QtMobility@@AAE_NPAVQContact@2@AAVQContactChangeSet@2@AAW4Error@QContactManager@2@@Z @ 956 NONAME ; bool QtMobility::QContactMemoryEngine::saveContact(class QtMobility::QContact *, class QtMobility::QContactChangeSet &, enum QtMobility::QContactManager::Error &) + ?isFilterSupported@QContactManagerEngine@QtMobility@@UBE_NABVQContactFilter@2@@Z @ 957 NONAME ; bool QtMobility::QContactManagerEngine::isFilterSupported(class QtMobility::QContactFilter const &) const + ??1QContactManagerEngine@QtMobility@@UAE@XZ @ 958 NONAME ; QtMobility::QContactManagerEngine::~QContactManagerEngine(void) + ??0QContactGuid@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 959 NONAME ; QtMobility::QContactGuid::QContactGuid(class QtMobility::QContactDetail const &) + ??0QContactSyncTarget@QtMobility@@QAE@XZ @ 960 NONAME ; QtMobility::QContactSyncTarget::QContactSyncTarget(void) + ?qt_metacall@QContactDetailDefinitionSaveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 961 NONAME ; int QtMobility::QContactDetailDefinitionSaveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ?resultsAvailable@QContactAbstractRequest@QtMobility@@IAEXXZ @ 962 NONAME ; void QtMobility::QContactAbstractRequest::resultsAvailable(void) + ?staticMetaObject@QContactLocalIdFetchRequest@QtMobility@@2UQMetaObject@@B @ 963 NONAME ; struct QMetaObject const QtMobility::QContactLocalIdFetchRequest::staticMetaObject + ?implementationVersion@QContactManagerEngine@QtMobility@@UBEHXZ @ 964 NONAME ; int QtMobility::QContactManagerEngine::implementationVersion(void) const + ??4QContactAddress@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 965 NONAME ; class QtMobility::QContactAddress & QtMobility::QContactAddress::operator=(class QtMobility::QContactDetail const &) + ?contactType@QContactDetailDefinitionSaveRequest@QtMobility@@QBE?AVQString@@XZ @ 966 NONAME ; class QString QtMobility::QContactDetailDefinitionSaveRequest::contactType(void) const + ??0QContactRelationshipFilter@QtMobility@@QAE@XZ @ 967 NONAME ; QtMobility::QContactRelationshipFilter::QContactRelationshipFilter(void) + ?FieldStatusMessage@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$0O@@2@B @ 968 NONAME ; struct QtMobility::Latin1Literal<14> const QtMobility::QContactOnlineAccount::FieldStatusMessage + ??0QContactBirthday@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 969 NONAME ; QtMobility::QContactBirthday::QContactBirthday(class QtMobility::QContactDetail const &) + ?SubTypeEmployment@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 970 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactAnniversary::SubTypeEmployment + ??0QContactDetailDefinitionFetchRequest@QtMobility@@QAE@XZ @ 971 NONAME ; QtMobility::QContactDetailDefinitionFetchRequest::QContactDetailDefinitionFetchRequest(void) + ?SubTypeVideo@QContactAvatar@QtMobility@@2U?$Latin1Literal@$05@2@B @ 972 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactAvatar::SubTypeVideo + ?SubTypeDtmfMenu@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$08@2@B @ 973 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactPhoneNumber::SubTypeDtmfMenu + ?setRelationships@QContactRelationshipRemoveRequest@QtMobility@@QAEXABV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 974 NONAME ; void QtMobility::QContactRelationshipRemoveRequest::setRelationships(class QList const &) + ?SubTypeEngagement@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$0L@@2@B @ 975 NONAME ; struct QtMobility::Latin1Literal<11> const QtMobility::QContactAnniversary::SubTypeEngagement + ??8QContact@QtMobility@@QBE_NABV01@@Z @ 976 NONAME ; bool QtMobility::QContact::operator==(class QtMobility::QContact const &) const + ?trUtf8@QContactMemoryEngine@QtMobility@@SA?AVQString@@PBD0@Z @ 977 NONAME ; class QString QtMobility::QContactMemoryEngine::trUtf8(char const *, char const *) + ??0QContactChangeLogFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 978 NONAME ; QtMobility::QContactChangeLogFilter::QContactChangeLogFilter(class QtMobility::QContactFilter const &) + ??0QContactRelationshipSaveRequest@QtMobility@@QAE@XZ @ 979 NONAME ; QtMobility::QContactRelationshipSaveRequest::QContactRelationshipSaveRequest(void) + ?removeDetailDefinition@QContactMemoryEngine@QtMobility@@AAE_NABVQString@@0AAVQContactChangeSet@2@AAW4Error@QContactManager@2@@Z @ 980 NONAME ; bool QtMobility::QContactMemoryEngine::removeDetailDefinition(class QString const &, class QString const &, class QtMobility::QContactChangeSet &, enum QtMobility::QContactManager::Error &) + ?relationships@QContactMemoryEngine@QtMobility@@UBE?AV?$QList@VQContactRelationship@QtMobility@@@@ABVQString@@ABVQContactId@2@W4Role@QContactRelationshipFilter@2@AAW4Error@QContactManager@2@@Z @ 981 NONAME ; class QList QtMobility::QContactMemoryEngine::relationships(class QString const &, class QtMobility::QContactId const &, enum QtMobility::QContactRelationshipFilter::Role, enum QtMobility::QContactManager::Error &) const + ?contactsChanged@QContactManagerEngine@QtMobility@@IAEXABV?$QList@I@@@Z @ 982 NONAME ; void QtMobility::QContactManagerEngine::contactsChanged(class QList const &) + ?setDepartment@QContactOrganization@QtMobility@@QAEXABVQStringList@@@Z @ 983 NONAME ; void QtMobility::QContactOrganization::setDepartment(class QStringList const &) + ?tr@QContactManagerEngine@QtMobility@@SA?AVQString@@PBD0H@Z @ 984 NONAME ; class QString QtMobility::QContactManagerEngine::tr(char const *, char const *, int) + ?contactsRemoved@QContactManager@QtMobility@@IAEXABV?$QList@I@@@Z @ 985 NONAME ; void QtMobility::QContactManager::contactsRemoved(class QList const &) + ?contactType@QContactDetailDefinitionRemoveRequest@QtMobility@@QBE?AVQString@@XZ @ 986 NONAME ; class QString QtMobility::QContactDetailDefinitionRemoveRequest::contactType(void) const + ??0QContactLocalIdFetchRequest@QtMobility@@QAE@XZ @ 987 NONAME ; QtMobility::QContactLocalIdFetchRequest::QContactLocalIdFetchRequest(void) + ??1QContactOrganization@QtMobility@@UAE@XZ @ 988 NONAME ; QtMobility::QContactOrganization::~QContactOrganization(void) + ?relatedContactId@QContactRelationshipFilter@QtMobility@@QBE?AVQContactId@2@XZ @ 989 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipFilter::relatedContactId(void) const + ?FieldPostOfficeBox@QContactAddress@QtMobility@@2U?$Latin1Literal@$0O@@2@B @ 990 NONAME ; struct QtMobility::Latin1Literal<14> const QtMobility::QContactAddress::FieldPostOfficeBox + ?metaObject@QContactRemoveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 991 NONAME ; struct QMetaObject const * QtMobility::QContactRemoveRequest::metaObject(void) const + ?supportedRelationshipTypes@QContactManager@QtMobility@@QBE?AVQStringList@@ABVQString@@@Z @ 992 NONAME ; class QStringList QtMobility::QContactManager::supportedRelationshipTypes(class QString const &) const + ?error@QContactAbstractRequest@QtMobility@@QBE?AW4Error@QContactManager@2@XZ @ 993 NONAME ; enum QtMobility::QContactManager::Error QtMobility::QContactAbstractRequest::error(void) const + ?error@QContactManager@QtMobility@@QBE?AW4Error@12@XZ @ 994 NONAME ; enum QtMobility::QContactManager::Error QtMobility::QContactManager::error(void) const + ??0QContactRelationshipRemoveRequest@QtMobility@@QAE@XZ @ 995 NONAME ; QtMobility::QContactRelationshipRemoveRequest::QContactRelationshipRemoveRequest(void) + ?setSorting@QContactLocalIdFetchRequest@QtMobility@@QAEXABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 996 NONAME ; void QtMobility::QContactLocalIdFetchRequest::setSorting(class QList const &) + ?trUtf8@QContactAction@QtMobility@@SA?AVQString@@PBD0H@Z @ 997 NONAME ; class QString QtMobility::QContactAction::trUtf8(char const *, char const *, int) + ??_EQContactEmailAddress@QtMobility@@UAE@I@Z @ 998 NONAME ; QtMobility::QContactEmailAddress::~QContactEmailAddress(unsigned int) + ?startRequest@QContactManagerEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@@Z @ 999 NONAME ; bool QtMobility::QContactManagerEngine::startRequest(class QtMobility::QContactAbstractRequest *) + ?setNumber@QContactPhoneNumber@QtMobility@@QAEXABVQString@@@Z @ 1000 NONAME ; void QtMobility::QContactPhoneNumber::setNumber(class QString const &) + ?progress@QContactRelationshipFetchRequest@QtMobility@@IAEXPAV12@_N@Z @ 1001 NONAME ; void QtMobility::QContactRelationshipFetchRequest::progress(class QtMobility::QContactRelationshipFetchRequest *, bool) + ?otherParticipantId@QContactRelationshipFilter@QtMobility@@QBE?AVQContactId@2@XZ @ 1002 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipFilter::otherParticipantId(void) const + ?tr@QContactDetailDefinitionSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 1003 NONAME ; class QString QtMobility::QContactDetailDefinitionSaveRequest::tr(char const *, char const *, int) + ??_EQContactDetailDefinitionFetchRequest@QtMobility@@UAE@I@Z @ 1004 NONAME ; QtMobility::QContactDetailDefinitionFetchRequest::~QContactDetailDefinitionFetchRequest(unsigned int) + ??4QContactDetailDefinition@QtMobility@@QAEAAV01@ABV01@@Z @ 1005 NONAME ; class QtMobility::QContactDetailDefinition & QtMobility::QContactDetailDefinition::operator=(class QtMobility::QContactDetailDefinition const &) + ?detail@QContact@QtMobility@@QBE?AVQContactDetail@2@ABVQString@@@Z @ 1006 NONAME ; class QtMobility::QContactDetail QtMobility::QContact::detail(class QString const &) const + ??1QContactTimestamp@QtMobility@@UAE@XZ @ 1007 NONAME ; QtMobility::QContactTimestamp::~QContactTimestamp(void) + ?qt_metacall@QContactManagerEngine@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 1008 NONAME ; int QtMobility::QContactManagerEngine::qt_metacall(enum QMetaObject::Call, int, void * *) + ?managerName@QContactMemoryEngine@QtMobility@@UBE?AVQString@@XZ @ 1009 NONAME ; class QString QtMobility::QContactMemoryEngine::managerName(void) const + ?saveContacts@QContactManager@QtMobility@@QAE_NPAV?$QList@VQContact@QtMobility@@@@PAV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 1010 NONAME ; bool QtMobility::QContactManager::saveContacts(class QList *, class QMap *) + ??1QContactActionDescriptor@QtMobility@@QAE@XZ @ 1011 NONAME ; QtMobility::QContactActionDescriptor::~QContactActionDescriptor(void) + ??1QContactDetailDefinitionFetchRequest@QtMobility@@UAE@XZ @ 1012 NONAME ; QtMobility::QContactDetailDefinitionFetchRequest::~QContactDetailDefinitionFetchRequest(void) + ?setAssistantName@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 1013 NONAME ; void QtMobility::QContactOrganization::setAssistantName(class QString const &) + ?staticMetaObject@QContactManagerEngine@QtMobility@@2UQMetaObject@@B @ 1014 NONAME ; struct QMetaObject const QtMobility::QContactManagerEngine::staticMetaObject + ?values@QContactDetail@QtMobility@@QBE?AV?$QMap@VQString@@VQVariant@@@@XZ @ 1015 NONAME ; class QMap QtMobility::QContactDetail::values(void) const + ??0QContactIntersectionFilter@QtMobility@@QAE@XZ @ 1016 NONAME ; QtMobility::QContactIntersectionFilter::QContactIntersectionFilter(void) + ?setMiddleName@QContactName@QtMobility@@QAEXABVQString@@@Z @ 1017 NONAME ; void QtMobility::QContactName::setMiddleName(class QString const &) + ??_EQContactActionFilter@QtMobility@@UAE@I@Z @ 1018 NONAME ; QtMobility::QContactActionFilter::~QContactActionFilter(unsigned int) + ?SubTypeHouse@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$05@2@B @ 1019 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactAnniversary::SubTypeHouse + ?progress@QContactLocalIdFetchRequest@QtMobility@@IAEXPAV12@_N@Z @ 1020 NONAME ; void QtMobility::QContactLocalIdFetchRequest::progress(class QtMobility::QContactLocalIdFetchRequest *, bool) + ?qt_metacall@QContactRemoveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 1021 NONAME ; int QtMobility::QContactRemoveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ??_EQContactActionFactory@QtMobility@@UAE@I@Z @ 1022 NONAME ; QtMobility::QContactActionFactory::~QContactActionFactory(unsigned int) + ?FieldRegion@QContactAddress@QtMobility@@2U?$Latin1Literal@$06@2@B @ 1023 NONAME ; struct QtMobility::Latin1Literal<7> const QtMobility::QContactAddress::FieldRegion + ?altitude@QContactGeoLocation@QtMobility@@QBENXZ @ 1024 NONAME ; double QtMobility::QContactGeoLocation::altitude(void) const + ?detailWithAction@QContact@QtMobility@@QBE?AVQContactDetail@2@ABVQString@@@Z @ 1025 NONAME ; class QtMobility::QContactDetail QtMobility::QContact::detailWithAction(class QString const &) const + ?details@QContact@QtMobility@@QBE?AV?$QList@VQContactDetail@QtMobility@@@@ABVQString@@@Z @ 1026 NONAME ; class QList QtMobility::QContact::details(class QString const &) const + ?d_func@QContactDetailDefinitionSaveRequest@QtMobility@@AAEPAVQContactDetailDefinitionSaveRequestPrivate@2@XZ @ 1027 NONAME ; class QtMobility::QContactDetailDefinitionSaveRequestPrivate * QtMobility::QContactDetailDefinitionSaveRequest::d_func(void) + ?removeDetailDefinition@QContactMemoryEngine@QtMobility@@UAE_NABVQString@@0AAW4Error@QContactManager@2@@Z @ 1028 NONAME ; bool QtMobility::QContactMemoryEngine::removeDetailDefinition(class QString const &, class QString const &, enum QtMobility::QContactManager::Error &) + ??BQContactSortOrder@QtMobility@@QBE?AV?$QList@VQContactSortOrder@QtMobility@@@@XZ @ 1029 NONAME ; QtMobility::QContactSortOrder::operator class QList(void) const + ?isInactive@QContactAbstractRequest@QtMobility@@QBE_NXZ @ 1030 NONAME ; bool QtMobility::QContactAbstractRequest::isInactive(void) const + ?key@QContactDetail@QtMobility@@QBEHXZ @ 1031 NONAME ; int QtMobility::QContactDetail::key(void) const + ?qt_metacast@QContactDetailDefinitionRemoveRequest@QtMobility@@UAEPAXPBD@Z @ 1032 NONAME ; void * QtMobility::QContactDetailDefinitionRemoveRequest::qt_metacast(char const *) + ?contactIds@QContactRemoveRequest@QtMobility@@QBE?AV?$QList@I@@XZ @ 1033 NONAME ; class QList QtMobility::QContactRemoveRequest::contactIds(void) const + ??0QContactUnionFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 1034 NONAME ; QtMobility::QContactUnionFilter::QContactUnionFilter(class QtMobility::QContactFilter const &) + ?d_func@QContactDetailDefinitionFetchRequest@QtMobility@@ABEPBVQContactDetailDefinitionFetchRequestPrivate@2@XZ @ 1035 NONAME ; class QtMobility::QContactDetailDefinitionFetchRequestPrivate const * QtMobility::QContactDetailDefinitionFetchRequest::d_func(void) const + ?SubTypeImage@QContactAvatar@QtMobility@@2U?$Latin1Literal@$05@2@B @ 1036 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactAvatar::SubTypeImage + ??1QContactNote@QtMobility@@UAE@XZ @ 1037 NONAME ; QtMobility::QContactNote::~QContactNote(void) + ?setMatchFlags@QContactDetailFilter@QtMobility@@QAEXV?$QFlags@W4MatchFlag@QContactFilter@QtMobility@@@@@Z @ 1038 NONAME ; void QtMobility::QContactDetailFilter::setMatchFlags(class QFlags) + ?setParticipant@QContactRelationshipFetchRequest@QtMobility@@QAEXABVQContactId@2@W4Role@QContactRelationshipFilter@2@@Z @ 1039 NONAME ; void QtMobility::QContactRelationshipFetchRequest::setParticipant(class QtMobility::QContactId const &, enum QtMobility::QContactRelationshipFilter::Role) + ??8QContactActionDescriptor@QtMobility@@QBE_NABV01@@Z @ 1040 NONAME ; bool QtMobility::QContactActionDescriptor::operator==(class QtMobility::QContactActionDescriptor const &) const + ??_EQContactDetailDefinitionSaveRequest@QtMobility@@UAE@I@Z @ 1041 NONAME ; QtMobility::QContactDetailDefinitionSaveRequest::~QContactDetailDefinitionSaveRequest(unsigned int) + ?region@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 1042 NONAME ; class QString QtMobility::QContactAddress::region(void) const + ?managerVersion@QContactManager@QtMobility@@QBEHXZ @ 1043 NONAME ; int QtMobility::QContactManager::managerVersion(void) const + ?setVendorName@QContactActionDescriptor@QtMobility@@QAEXABVQString@@@Z @ 1044 NONAME ; void QtMobility::QContactActionDescriptor::setVendorName(class QString const &) + ?FieldAltitude@QContactGeoLocation@QtMobility@@2U?$Latin1Literal@$08@2@B @ 1045 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactGeoLocation::FieldAltitude + ?setSubTypes@QContactPhoneNumber@QtMobility@@QAEXABVQString@@@Z @ 1046 NONAME ; void QtMobility::QContactPhoneNumber::setSubTypes(class QString const &) + ?saveRelationship@QContactMemoryEngine@QtMobility@@UAE_NPAVQContactRelationship@2@AAW4Error@QContactManager@2@@Z @ 1047 NONAME ; bool QtMobility::QContactMemoryEngine::saveRelationship(class QtMobility::QContactRelationship *, enum QtMobility::QContactManager::Error &) + ??0QContactRelationship@QtMobility@@QAE@XZ @ 1048 NONAME ; QtMobility::QContactRelationship::QContactRelationship(void) + ??0QContactGender@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 1049 NONAME ; QtMobility::QContactGender::QContactGender(class QtMobility::QContactDetail const &) + ?updateRelationshipFetchRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactRelationshipFetchRequest@2@ABV?$QList@VQContactRelationship@QtMobility@@@@W4Error@QContactManager@2@@Z @ 1050 NONAME ; void QtMobility::QContactManagerEngine::updateRelationshipFetchRequest(class QtMobility::QContactRelationshipFetchRequest *, class QList const &, enum QtMobility::QContactManager::Error) + ?FieldSubTypes@QContactAddress@QtMobility@@2U?$Latin1Literal@$08@2@B @ 1051 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactAddress::FieldSubTypes + ?setAccessConstraint@QContactDetailFieldDefinition@QtMobility@@QAEXW4AccessConstraint@12@@Z @ 1052 NONAME ; void QtMobility::QContactDetailFieldDefinition::setAccessConstraint(enum QtMobility::QContactDetailFieldDefinition::AccessConstraint) + ?tr@QContactFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 1053 NONAME ; class QString QtMobility::QContactFetchRequest::tr(char const *, char const *, int) + ?staticMetaObject@QContactMemoryEngine@QtMobility@@2UQMetaObject@@B @ 1054 NONAME ; struct QMetaObject const QtMobility::QContactMemoryEngine::staticMetaObject + ?d_func@QContactRelationshipFilter@QtMobility@@AAEPAVQContactRelationshipFilterPrivate@2@XZ @ 1055 NONAME ; class QtMobility::QContactRelationshipFilterPrivate * QtMobility::QContactRelationshipFilter::d_func(void) + ?managerUri@QContactId@QtMobility@@QBE?AVQString@@XZ @ 1056 NONAME ; class QString QtMobility::QContactId::managerUri(void) const + ?setNote@QContactNote@QtMobility@@QAEXABVQString@@@Z @ 1057 NONAME ; void QtMobility::QContactNote::setNote(class QString const &) + ?d_func@QContactRelationshipRemoveRequest@QtMobility@@ABEPBVQContactRelationshipRemoveRequestPrivate@2@XZ @ 1058 NONAME ; class QtMobility::QContactRelationshipRemoveRequestPrivate const * QtMobility::QContactRelationshipRemoveRequest::d_func(void) const + ??1QContactGender@QtMobility@@UAE@XZ @ 1059 NONAME ; QtMobility::QContactGender::~QContactGender(void) + ?setChildren@QContactFamily@QtMobility@@QAEXABVQStringList@@@Z @ 1060 NONAME ; void QtMobility::QContactFamily::setChildren(class QStringList const &) + ?FieldAssistantName@QContactOrganization@QtMobility@@2U?$Latin1Literal@$0O@@2@B @ 1061 NONAME ; struct QtMobility::Latin1Literal<14> const QtMobility::QContactOrganization::FieldAssistantName + ??0QContactMemoryEngine@QtMobility@@IAE@ABV?$QMap@VQString@@V1@@@@Z @ 1062 NONAME ; QtMobility::QContactMemoryEngine::QContactMemoryEngine(class QMap const &) + ?SubTypeAssistant@QContactPhoneNumber@QtMobility@@2U?$Latin1Literal@$09@2@B @ 1063 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactPhoneNumber::SubTypeAssistant + ?FieldEvent@QContactAnniversary@QtMobility@@2U?$Latin1Literal@$05@2@B @ 1064 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactAnniversary::FieldEvent + ??0QContactSyncTarget@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 1065 NONAME ; QtMobility::QContactSyncTarget::QContactSyncTarget(class QtMobility::QContactDetail const &) + ?middleName@QContactName@QtMobility@@QBE?AVQString@@XZ @ 1066 NONAME ; class QString QtMobility::QContactName::middleName(void) const + ?selfContactId@QContactMemoryEngine@QtMobility@@UBEIAAW4Error@QContactManager@2@@Z @ 1067 NONAME ; unsigned int QtMobility::QContactMemoryEngine::selfContactId(enum QtMobility::QContactManager::Error &) const + ?longitude@QContactGeolocation@QtMobility@@QBENXZ @ 1068 NONAME ; double QtMobility::QContactGeolocation::longitude(void) const + ?setLocality@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 1069 NONAME ; void QtMobility::QContactAddress::setLocality(class QString const &) + ?accuracy@QContactGeolocation@QtMobility@@QBENXZ @ 1070 NONAME ; double QtMobility::QContactGeolocation::accuracy(void) const + ?removeRelationship@QContactMemoryEngine@QtMobility@@AAE_NABVQContactRelationship@2@AAVQContactChangeSet@2@AAW4Error@QContactManager@2@@Z @ 1071 NONAME ; bool QtMobility::QContactMemoryEngine::removeRelationship(class QtMobility::QContactRelationship const &, class QtMobility::QContactChangeSet &, enum QtMobility::QContactManager::Error &) + ??6QContactUnionFilter@QtMobility@@QAEAAV01@ABVQContactFilter@1@@Z @ 1072 NONAME ; class QtMobility::QContactUnionFilter & QtMobility::QContactUnionFilter::operator<<(class QtMobility::QContactFilter const &) + ?removeContact@QContactManager@QtMobility@@QAE_NABI@Z @ 1073 NONAME ; bool QtMobility::QContactManager::removeContact(unsigned int const &) + ??0QContactDetailFieldDefinition@QtMobility@@QAE@ABV01@@Z @ 1074 NONAME ; QtMobility::QContactDetailFieldDefinition::QContactDetailFieldDefinition(class QtMobility::QContactDetailFieldDefinition const &) + ?tr@QContactRelationshipSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 1075 NONAME ; class QString QtMobility::QContactRelationshipSaveRequest::tr(char const *, char const *, int) + ??1QContactId@QtMobility@@QAE@XZ @ 1076 NONAME ; QtMobility::QContactId::~QContactId(void) + ?getStaticMetaObject@QContactFetchRequest@QtMobility@@SAABUQMetaObject@@XZ @ 1077 NONAME ; struct QMetaObject const & QtMobility::QContactFetchRequest::getStaticMetaObject(void) + ?detailDefinitions@QContactManager@QtMobility@@QBE?AV?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@ABVQString@@@Z @ 1078 NONAME ; class QMap QtMobility::QContactManager::detailDefinitions(class QString const &) const + ?type@QContact@QtMobility@@QBE?AVQString@@XZ @ 1079 NONAME ; class QString QtMobility::QContact::type(void) const + ?sorting@QContactFetchRequest@QtMobility@@QBE?AV?$QList@VQContactSortOrder@QtMobility@@@@XZ @ 1080 NONAME ; class QList QtMobility::QContactFetchRequest::sorting(void) const + ?setDate@QContactBirthday@QtMobility@@QAEXABVQDate@@@Z @ 1081 NONAME ; void QtMobility::QContactBirthday::setDate(class QDate const &) + ?match@QContactPhoneNumber@QtMobility@@SA?AVQContactFilter@2@ABVQString@@@Z @ 1082 NONAME ; class QtMobility::QContactFilter QtMobility::QContactPhoneNumber::match(class QString const &) + ?staticMetaObject@QContactAbstractRequest@QtMobility@@2UQMetaObject@@B @ 1083 NONAME ; struct QMetaObject const QtMobility::QContactAbstractRequest::staticMetaObject + ?removeDetailDefinition@QContactManagerEngine@QtMobility@@UAE_NABVQString@@0AAW4Error@QContactManager@2@@Z @ 1084 NONAME ; bool QtMobility::QContactManagerEngine::removeDetailDefinition(class QString const &, class QString const &, enum QtMobility::QContactManager::Error &) + ?vendorName@QContactActionDescriptor@QtMobility@@QBE?AVQString@@XZ @ 1085 NONAME ; class QString QtMobility::QContactActionDescriptor::vendorName(void) const + ??1QContactDetailRangeFilter@QtMobility@@UAE@XZ @ 1086 NONAME ; QtMobility::QContactDetailRangeFilter::~QContactDetailRangeFilter(void) + ?FieldUrl@QContactUrl@QtMobility@@2U?$Latin1Literal@$03@2@B @ 1087 NONAME ; struct QtMobility::Latin1Literal<4> const QtMobility::QContactUrl::FieldUrl + ?FieldLongitude@QContactGeoLocation@QtMobility@@2U?$Latin1Literal@$09@2@B @ 1088 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactGeoLocation::FieldLongitude + ??0QContactDetailDefinitionSaveRequest@QtMobility@@QAE@XZ @ 1089 NONAME ; QtMobility::QContactDetailDefinitionSaveRequest::QContactDetailDefinitionSaveRequest(void) + ?isPreferredDetail@QContact@QtMobility@@QBE_NABVQString@@ABVQContactDetail@2@@Z @ 1090 NONAME ; bool QtMobility::QContact::isPreferredDetail(class QString const &, class QtMobility::QContactDetail const &) const + ??1QContactAvatar@QtMobility@@UAE@XZ @ 1091 NONAME ; QtMobility::QContactAvatar::~QContactAvatar(void) + ?clear@QContactChangeSet@QtMobility@@QAEXXZ @ 1092 NONAME ; void QtMobility::QContactChangeSet::clear(void) + ?isEmpty@QContact@QtMobility@@QBE_NXZ @ 1093 NONAME ; bool QtMobility::QContact::isEmpty(void) const + ?implementationVersion@QContactMemoryEngine@QtMobility@@UBEHXZ @ 1094 NONAME ; int QtMobility::QContactMemoryEngine::implementationVersion(void) const + ?contactIds@QContactManagerEngine@QtMobility@@UBE?AV?$QList@I@@ABV?$QList@VQContactSortOrder@QtMobility@@@@AAW4Error@QContactManager@2@@Z @ 1095 NONAME ; class QList QtMobility::QContactManagerEngine::contactIds(class QList const &, enum QtMobility::QContactManager::Error &) const + ?FieldSubTypes@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$08@2@B @ 1096 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactOnlineAccount::FieldSubTypes + ?FieldNote@QContactNote@QtMobility@@2U?$Latin1Literal@$04@2@B @ 1097 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactNote::FieldNote + ?version@QContactManagerEngine@QtMobility@@SAHXZ @ 1098 NONAME ; int QtMobility::QContactManagerEngine::version(void) + ??0QContactType@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 1099 NONAME ; QtMobility::QContactType::QContactType(class QtMobility::QContactDetail const &) + ??1QContactAction@QtMobility@@UAE@XZ @ 1100 NONAME ; QtMobility::QContactAction::~QContactAction(void) + ?role@QContactRelationshipFilter@QtMobility@@QBE?AW4Role@12@XZ @ 1101 NONAME ; enum QtMobility::QContactRelationshipFilter::Role QtMobility::QContactRelationshipFilter::role(void) const + ?accessConstraints@QContactDetail@QtMobility@@QBE?AV?$QFlags@W4AccessConstraint@QContactDetail@QtMobility@@@@XZ @ 1102 NONAME ; class QFlags QtMobility::QContactDetail::accessConstraints(void) const + ?tr@QContactAbstractRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 1103 NONAME ; class QString QtMobility::QContactAbstractRequest::tr(char const *, char const *, int) + ?setRelationships@QContactRelationshipSaveRequest@QtMobility@@QAEXABV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 1104 NONAME ; void QtMobility::QContactRelationshipSaveRequest::setRelationships(class QList const &) + ??4QContactTimestamp@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 1105 NONAME ; class QtMobility::QContactTimestamp & QtMobility::QContactTimestamp::operator=(class QtMobility::QContactDetail const &) + ?names@QContactDetailDefinitionFetchRequest@QtMobility@@QBE?AVQStringList@@XZ @ 1106 NONAME ; class QStringList QtMobility::QContactDetailDefinitionFetchRequest::names(void) const + ?d_func@QContactActionFilter@QtMobility@@ABEPBVQContactActionFilterPrivate@2@XZ @ 1107 NONAME ; class QtMobility::QContactActionFilterPrivate const * QtMobility::QContactActionFilter::d_func(void) const + ??_EQContactManagerEngine@QtMobility@@UAE@I@Z @ 1108 NONAME ; QtMobility::QContactManagerEngine::~QContactManagerEngine(unsigned int) + ?waitForRequestFinished@QContactMemoryEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@H@Z @ 1109 NONAME ; bool QtMobility::QContactMemoryEngine::waitForRequestFinished(class QtMobility::QContactAbstractRequest *, int) + ?managerUri@QContactManagerEngine@QtMobility@@QBE?AVQString@@XZ @ 1110 NONAME ; class QString QtMobility::QContactManagerEngine::managerUri(void) const + ?setLabel@QContactGeoLocation@QtMobility@@QAEXABVQString@@@Z @ 1111 NONAME ; void QtMobility::QContactGeoLocation::setLabel(class QString const &) + ?hasFeature@QContactManagerEngine@QtMobility@@UBE_NW4ManagerFeature@QContactManager@2@ABVQString@@@Z @ 1112 NONAME ; bool QtMobility::QContactManagerEngine::hasFeature(enum QtMobility::QContactManager::ManagerFeature, class QString const &) const + ?setDefinitions@QContactDetailDefinitionSaveRequest@QtMobility@@QAEXABV?$QList@VQContactDetailDefinition@QtMobility@@@@@Z @ 1113 NONAME ; void QtMobility::QContactDetailDefinitionSaveRequest::setDefinitions(class QList const &) + ?locality@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 1114 NONAME ; class QString QtMobility::QContactAddress::locality(void) const + ?match@QContactDisplayLabel@QtMobility@@SA?AVQContactFilter@2@ABVQString@@@Z @ 1115 NONAME ; class QtMobility::QContactFilter QtMobility::QContactDisplayLabel::match(class QString const &) + ?FieldSpeed@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$05@2@B @ 1116 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactGeolocation::FieldSpeed + ??1QContactDetailFilter@QtMobility@@UAE@XZ @ 1117 NONAME ; QtMobility::QContactDetailFilter::~QContactDetailFilter(void) + ?isEmpty@QContactActionDescriptor@QtMobility@@QBE_NXZ @ 1118 NONAME ; bool QtMobility::QContactActionDescriptor::isEmpty(void) const + ?setSelfContactId@QContactManager@QtMobility@@QAE_NABI@Z @ 1119 NONAME ; bool QtMobility::QContactManager::setSelfContactId(unsigned int const &) + ?setContactRelationships@QContactManagerEngine@QtMobility@@SAXPAVQContact@2@ABV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 1120 NONAME ; void QtMobility::QContactManagerEngine::setContactRelationships(class QtMobility::QContact *, class QList const &) + ?getStaticMetaObject@QContactRelationshipRemoveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 1121 NONAME ; struct QMetaObject const & QtMobility::QContactRelationshipRemoveRequest::getStaticMetaObject(void) + ?contactsRemoved@QContactManagerEngine@QtMobility@@IAEXABV?$QList@I@@@Z @ 1122 NONAME ; void QtMobility::QContactManagerEngine::contactsRemoved(class QList const &) + ?isValid@QContactSortOrder@QtMobility@@QBE_NXZ @ 1123 NONAME ; bool QtMobility::QContactSortOrder::isValid(void) const + ?metaObject@QContactRelationshipFetchRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 1124 NONAME ; struct QMetaObject const * QtMobility::QContactRelationshipFetchRequest::metaObject(void) const + ?FieldTimestamp@QContactGeolocation@QtMobility@@2U?$Latin1Literal@$09@2@B @ 1125 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactGeolocation::FieldTimestamp + ?FieldName@QContactOrganization@QtMobility@@2U?$Latin1Literal@$04@2@B @ 1126 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactOrganization::FieldName + ?tr@QContactFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 1127 NONAME ; class QString QtMobility::QContactFetchRequest::tr(char const *, char const *) + ?removeContact@QContactManagerEngine@QtMobility@@UAE_NABIAAW4Error@QContactManager@2@@Z @ 1128 NONAME ; bool QtMobility::QContactManagerEngine::removeContact(unsigned int const &, enum QtMobility::QContactManager::Error &) + ?setAccuracy@QContactGeoLocation@QtMobility@@QAEXN@Z @ 1129 NONAME ; void QtMobility::QContactGeoLocation::setAccuracy(double) + ??1QContactRelationshipFilter@QtMobility@@UAE@XZ @ 1130 NONAME ; QtMobility::QContactRelationshipFilter::~QContactRelationshipFilter(void) + ??0QContactChangeSet@QtMobility@@QAE@ABV01@@Z @ 1131 NONAME ; QtMobility::QContactChangeSet::QContactChangeSet(class QtMobility::QContactChangeSet const &) + ?filters@QContactUnionFilter@QtMobility@@QBE?AV?$QList@VQContactFilter@QtMobility@@@@XZ @ 1132 NONAME ; class QList QtMobility::QContactUnionFilter::filters(void) const + ?waitForProgress@QContactAbstractRequest@QtMobility@@QAE_NH@Z @ 1133 NONAME ; bool QtMobility::QContactAbstractRequest::waitForProgress(int) + ?qt_metacast@QContactRelationshipFetchRequest@QtMobility@@UAEPAXPBD@Z @ 1134 NONAME ; void * QtMobility::QContactRelationshipFetchRequest::qt_metacast(char const *) + ?managerName@QContactManager@QtMobility@@QBE?AVQString@@XZ @ 1135 NONAME ; class QString QtMobility::QContactManager::managerName(void) const + ?DefinitionName@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$0O@@2@B @ 1136 NONAME ; struct QtMobility::Latin1Literal<14> const QtMobility::QContactOnlineAccount::DefinitionName + ?FieldNickname@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$08@2@B @ 1137 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactOnlineAccount::FieldNickname + ??4QContactSyncTarget@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 1138 NONAME ; class QtMobility::QContactSyncTarget & QtMobility::QContactSyncTarget::operator=(class QtMobility::QContactDetail const &) + ?qt_metacall@QContactSaveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 1139 NONAME ; int QtMobility::QContactSaveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ?label@QContactDisplayLabel@QtMobility@@QBE?AVQString@@XZ @ 1140 NONAME ; class QString QtMobility::QContactDisplayLabel::label(void) const + ?ids@QContactLocalIdFetchRequest@QtMobility@@QBE?AV?$QList@I@@XZ @ 1141 NONAME ; class QList QtMobility::QContactLocalIdFetchRequest::ids(void) const + ??_EQContactPhoneNumber@QtMobility@@UAE@I@Z @ 1142 NONAME ; QtMobility::QContactPhoneNumber::~QContactPhoneNumber(unsigned int) + ?presence@QContactOnlineAccount@QtMobility@@QBE?AVQString@@XZ @ 1143 NONAME ; class QString QtMobility::QContactOnlineAccount::presence(void) const + ?nickname@QContactOnlineAccount@QtMobility@@QBE?AVQString@@XZ @ 1144 NONAME ; class QString QtMobility::QContactOnlineAccount::nickname(void) const + ?dataChanged@QContactManager@QtMobility@@IAEXXZ @ 1145 NONAME ; void QtMobility::QContactManager::dataChanged(void) + ?contacts@QContactManager@QtMobility@@QBE?AV?$QList@I@@ABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 1146 NONAME ; class QList QtMobility::QContactManager::contacts(class QList const &) const + ?contacts@QContactSaveRequest@QtMobility@@QBE?AV?$QList@VQContact@QtMobility@@@@XZ @ 1147 NONAME ; class QList QtMobility::QContactSaveRequest::contacts(void) const + ??1QContactOnlineAccount@QtMobility@@UAE@XZ @ 1148 NONAME ; QtMobility::QContactOnlineAccount::~QContactOnlineAccount(void) + ??4QContactAnniversary@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 1149 NONAME ; class QtMobility::QContactAnniversary & QtMobility::QContactAnniversary::operator=(class QtMobility::QContactDetail const &) + ?staticMetaObject@QContactDetailDefinitionFetchRequest@QtMobility@@2UQMetaObject@@B @ 1150 NONAME ; struct QMetaObject const QtMobility::QContactDetailDefinitionFetchRequest::staticMetaObject + ?createMemoryEngine@QContactMemoryEngine@QtMobility@@SAPAV12@ABV?$QMap@VQString@@V1@@@@Z @ 1151 NONAME ; class QtMobility::QContactMemoryEngine * QtMobility::QContactMemoryEngine::createMemoryEngine(class QMap const &) + ?SubTypeDomestic@QContactAddress@QtMobility@@2U?$Latin1Literal@$08@2@B @ 1152 NONAME ; struct QtMobility::Latin1Literal<9> const QtMobility::QContactAddress::SubTypeDomestic + ??0QContactLocalIdFilter@QtMobility@@QAE@XZ @ 1153 NONAME ; QtMobility::QContactLocalIdFilter::QContactLocalIdFilter(void) + ?stateChanged@QContactAbstractRequest@QtMobility@@IAEXW4State@12@@Z @ 1154 NONAME ; void QtMobility::QContactAbstractRequest::stateChanged(enum QtMobility::QContactAbstractRequest::State) + ?FieldLabel@QContactGeoLocation@QtMobility@@2U?$Latin1Literal@$05@2@B @ 1155 NONAME ; struct QtMobility::Latin1Literal<6> const QtMobility::QContactGeoLocation::FieldLabel + ?longitude@QContactGeoLocation@QtMobility@@QBENXZ @ 1156 NONAME ; double QtMobility::QContactGeoLocation::longitude(void) const + ?accuracy@QContactGeoLocation@QtMobility@@QBENXZ @ 1157 NONAME ; double QtMobility::QContactGeoLocation::accuracy(void) const + ??4QContactOrganization@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 1158 NONAME ; class QtMobility::QContactOrganization & QtMobility::QContactOrganization::operator=(class QtMobility::QContactDetail const &) + ?matchFlags@QContactDetailRangeFilter@QtMobility@@QBE?AV?$QFlags@W4MatchFlag@QContactFilter@QtMobility@@@@XZ @ 1159 NONAME ; class QFlags QtMobility::QContactDetailRangeFilter::matchFlags(void) const + ??0QContactType@QtMobility@@QAE@XZ @ 1160 NONAME ; QtMobility::QContactType::QContactType(void) + ?setRelationshipType@QContactRelationship@QtMobility@@QAEXABVQString@@@Z @ 1161 NONAME ; void QtMobility::QContactRelationship::setRelationshipType(class QString const &) + ?setSelfContactId@QContactManagerEngine@QtMobility@@UAE_NABIAAW4Error@QContactManager@2@@Z @ 1162 NONAME ; bool QtMobility::QContactManagerEngine::setSelfContactId(unsigned int const &, enum QtMobility::QContactManager::Error &) + ?setMiddle@QContactName@QtMobility@@QAEXABVQString@@@Z @ 1163 NONAME ; void QtMobility::QContactName::setMiddle(class QString const &) + ?children@QContactFamily@QtMobility@@QBE?AVQStringList@@XZ @ 1164 NONAME ; class QStringList QtMobility::QContactFamily::children(void) const + ?department@QContactOrganization@QtMobility@@QBE?AVQStringList@@XZ @ 1165 NONAME ; class QStringList QtMobility::QContactOrganization::department(void) const + ?d_func@QContactUnionFilter@QtMobility@@AAEPAVQContactUnionFilterPrivate@2@XZ @ 1166 NONAME ; class QtMobility::QContactUnionFilterPrivate * QtMobility::QContactUnionFilter::d_func(void) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/contacts.pro --- a/qtcontactsmobility/src/contacts/contacts.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/contacts.pro Fri Apr 16 14:53:18 2010 +0300 @@ -26,6 +26,7 @@ qcontactdetail.h \ qcontactdetaildefinition.h \ qcontactdetaildefinitionfield.h \ + qcontactdetailfielddefinition.h \ qcontactfilter.h \ qcontactid.h \ qcontactmanager.h \ @@ -44,7 +45,7 @@ qcontactchangeset_p.h \ qcontactdetail_p.h \ qcontactdetaildefinition_p.h \ - qcontactdetaildefinitionfield_p.h \ + qcontactdetailfielddefinition_p.h \ qcontactfilter_p.h \ qcontactid_p.h \ qcontactmanager_p.h \ @@ -60,7 +61,7 @@ qcontactchangeset.cpp \ qcontactdetail.cpp \ qcontactdetaildefinition.cpp \ - qcontactdetaildefinitionfield.cpp \ + qcontactdetailfielddefinition.cpp \ qcontactfilter.cpp \ qcontactid.cpp \ qcontactmanager_p.cpp \ @@ -92,6 +93,8 @@ TARGET.CAPABILITY = ALL -TCB TARGET.UID3 = 0x2002AC7A + LIBS += -lefsrv + ### Contacts # Main library defFiles = \ @@ -105,18 +108,9 @@ CONTACTS_DEPLOYMENT.sources = QtContacts.dll CONTACTS_DEPLOYMENT.path = \sys\bin DEPLOYMENT += CONTACTS_DEPLOYMENT - - deploy.path = $$EPOCROOT - exportheaders.sources = $$PUBLIC_HEADERS - exportheaders.path = epoc32/include/app - - #export headers into EPOCROOT - for(header, exportheaders.sources) { - BLD_INF_RULES.prj_exports += "$$header $$deploy.path$$exportheaders.path/$$basename(header)" - } } !isEmpty(CONTACTS_DEFAULT_ENGINE): DEFINES += Q_CONTACTS_DEFAULT_ENGINE=CONTACTS_DEFAULT_ENGINE +CONFIG += app include(../../features/deploy.pri) - diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/details/qcontactdetails.cpp --- a/qtcontactsmobility/src/contacts/details/qcontactdetails.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/details/qcontactdetails.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -104,10 +104,19 @@ /*! \class QContactGeolocation + \internal \brief The QContactGeolocation class contains the global location coordinate associated with a contact. + This class has been deprecated and is replaced by QContactGeoLocation. + It was deprecated in week 1 and will be removed after the transition period has elapsed. + */ + +/*! + \class QContactGeoLocation + \brief The QContactGeoLocation class contains the global location + coordinate associated with a contact. \ingroup contacts-details - */ +*/ /*! \class QContactGuid @@ -283,11 +292,23 @@ /*! \variable QContactGeolocation::DefinitionName + \internal + + The constant string which identifies the definition of details + which describe a location associated with a contact. + + Note: this class was deprecated in week 1 and will be removed after the transition period has elapsed. + Use QContactGeoLocation instead! + */ +Q_DEFINE_LATIN1_LITERAL(QContactGeolocation::DefinitionName, "GeoLocation"); + +/*! + \variable QContactGeoLocation::DefinitionName The constant string which identifies the definition of details which describe a location associated with a contact. */ -Q_DEFINE_LATIN1_LITERAL(QContactGeolocation::DefinitionName, "Geolocation"); +Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::DefinitionName, "GeoLocation"); /*! \variable QContactOnlineAccount::DefinitionName @@ -369,6 +390,14 @@ Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::FieldStatusMessage, "StatusMessage"); /*! + \variable QContactOnlineAccount::FieldCapabilities + + The constant key for which the account capabilities value is stored in + details of the QContactOnlineAccount type. + */ +Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::FieldCapabilities, "Capabilities"); + +/*! \variable QContactOrganization::DefinitionName The constant string which identifies the definition of details @@ -395,9 +424,9 @@ Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::FieldNumber, "PhoneNumber"); /*! - \variable QContactPhoneNumber::FieldSubType - - The constant key for which the subtypes value is stored in details + \variable QContactPhoneNumber::FieldSubTypes + + The constant key for which the subtype values are stored in details of the QContactPhoneNumber type. */ Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::FieldSubTypes, "SubTypes"); @@ -475,12 +504,36 @@ Q_DEFINE_LATIN1_LITERAL(QContactName::FieldPrefix, "Prefix"); /*! + \variable QContactName::FieldFirstName + + The constant key for which the first name value is stored in + details of the QContactName type. + */ +Q_DEFINE_LATIN1_LITERAL(QContactName::FieldFirstName, "FirstName"); + +/*! + \variable QContactName::FieldMiddleName + + The constant key for which the middle name value is stored in + details of the QContactName type. + */ +Q_DEFINE_LATIN1_LITERAL(QContactName::FieldMiddleName, "MiddleName"); + +/*! + \variable QContactName::FieldLastName + + The constant key for which the last name value is stored in details + of the QContactName type. + */ +Q_DEFINE_LATIN1_LITERAL(QContactName::FieldLastName, "LastName"); + +/*! \variable QContactName::FieldFirst The constant key for which the first name value is stored in details of the QContactName type. */ -Q_DEFINE_LATIN1_LITERAL(QContactName::FieldFirst, "First"); +Q_DEFINE_LATIN1_LITERAL(QContactName::FieldFirst, "FirstName"); /*! \variable QContactName::FieldMiddle @@ -488,7 +541,7 @@ The constant key for which the middle name value is stored in details of the QContactName type. */ -Q_DEFINE_LATIN1_LITERAL(QContactName::FieldMiddle, "Middle"); +Q_DEFINE_LATIN1_LITERAL(QContactName::FieldMiddle, "MiddleName"); /*! \variable QContactName::FieldLast @@ -496,7 +549,7 @@ The constant key for which the last name value is stored in details of the QContactName type. */ -Q_DEFINE_LATIN1_LITERAL(QContactName::FieldLast, "Last"); +Q_DEFINE_LATIN1_LITERAL(QContactName::FieldLast, "LastName"); /*! \variable QContactName::FieldSuffix @@ -671,7 +724,7 @@ /*! \variable QContactGeolocation::FieldLabel - + \internal The constant key for which the location label value is stored in details of the QContactGeolocation type. */ @@ -679,7 +732,7 @@ /*! \variable QContactGeolocation::FieldLatitude - + \internal The constant key for which the latitude value is stored in details of the QContactGeolocation type. */ @@ -687,7 +740,7 @@ /*! \variable QContactGeolocation::FieldLongitude - + \internal The constant key for which the longitude value is stored in details of the QContactGeolocation type. */ @@ -695,7 +748,7 @@ /*! \variable QContactGeolocation::FieldAccuracy - + \internal The constant key for which the location accuracy value is stored in details of the QContactGeolocation type. */ @@ -703,7 +756,7 @@ /*! \variable QContactGeolocation::FieldAltitude - + \internal The constant key for which the altitude value is stored in details of the QContactGeolocation type. */ @@ -712,7 +765,7 @@ /*! \variable QContactGeolocation::FieldAltitudeAccuracy - + \internal The constant key for which the altitude accuracy value is stored in details of the QContactGeolocation type. */ @@ -720,7 +773,7 @@ /*! \variable QContactGeolocation::FieldHeading - + \internal The constant key for which the heading value is stored in details of the QContactGeolocation type. */ @@ -728,7 +781,7 @@ /*! \variable QContactGeolocation::FieldSpeed - + \internal The constant key for which the speed value is stored in details of the QContactGeolocation type. */ @@ -736,12 +789,95 @@ /*! \variable QContactGeolocation::FieldTimestamp - + \internal The constant key for which the timestamp value is stored in details of the QContactGeolocation type. */ Q_DEFINE_LATIN1_LITERAL(QContactGeolocation::FieldTimestamp, "Timestamp"); + + + + + + + + + + +/*! + \variable QContactGeoLocation::FieldLabel + + The constant key for which the location label value is stored in + details of the QContactGeoLocation type. + */ +Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldLabel, "Label"); + +/*! + \variable QContactGeoLocation::FieldLatitude + + The constant key for which the latitude value is stored in details + of the QContactGeoLocation type. + */ +Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldLatitude, "Latitude"); + +/*! + \variable QContactGeoLocation::FieldLongitude + + The constant key for which the longitude value is stored in details + of the QContactGeoLocation type. + */ +Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldLongitude, "Longitude"); + +/*! + \variable QContactGeoLocation::FieldAccuracy + + The constant key for which the location accuracy value is stored in + details of the QContactGeoLocation type. + */ +Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldAccuracy, "Accuracy"); + +/*! + \variable QContactGeoLocation::FieldAltitude + + The constant key for which the altitude value is stored in details + of the QContactGeoLocation type. + */ +Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldAltitude, "Altitude"); + + +/*! + \variable QContactGeoLocation::FieldAltitudeAccuracy + + The constant key for which the altitude accuracy value is stored in + details of the QContactGeoLocation type. + */ +Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldAltitudeAccuracy, "AltitudeAccuracy"); + +/*! + \variable QContactGeoLocation::FieldHeading + + The constant key for which the heading value is stored in details + of the QContactGeoLocation type. + */ +Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldHeading, "Heading"); + +/*! + \variable QContactGeoLocation::FieldSpeed + + The constant key for which the speed value is stored in details of + the QContactGeoLocation type. + */ +Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldSpeed, "Speed"); + +/*! + \variable QContactGeoLocation::FieldTimestamp + + The constant key for which the timestamp value is stored in details + of the QContactGeoLocation type. + */ +Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldTimestamp, "Timestamp"); + /*! \variable QContactOnlineAccount::FieldAccountUri @@ -1396,86 +1532,317 @@ it to "Unspecified". */ + + + + + + /*! - \fn QContactGeolocation::setLabel(const QString& label) + \internal + Sets the label of the location stored in the detail to \a label. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +void QContactGeolocation::setLabel(const QString& label) +{ + setValue(FieldLabel, label); +} + +/*! + \internal + Returns the label of the location stored in the detail. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +QString QContactGeolocation::label() const +{ + return value(FieldLabel); +} + +/*! + \internal + Sets the latitude portion of the coordinate (in decimal degrees) of + the location stored in the detail to \a latitude. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +void QContactGeolocation::setLatitude(double latitude) +{ + setValue(FieldLatitude, latitude); +} + +/*! + \internal + Returns the latitude portion of the coordinate (specified in + decimal degrees) of the location stored in the detail. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +double QContactGeolocation::latitude() const +{ + return variantValue(FieldLatitude).toDouble(); +} + +/*! + \internal + Sets the longitude portion of the coordinate (in decimal degrees) + of the location stored in the detail to \a longitude. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +void QContactGeolocation::setLongitude(double longitude) +{ + setValue(FieldLongitude, longitude); +} + +/*! + \internal + Returns the longitude portion of the coordinate (specified in + decimal degrees) of the location stored in the detail. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +double QContactGeolocation::longitude() const +{ + return variantValue(FieldLongitude).toDouble(); +} + +/*! + \internal + Specifies that the latitude and longitude portions of the location + stored in the detail are accurate to within \a accuracy metres. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +void QContactGeolocation::setAccuracy(double accuracy) {setValue(FieldAccuracy, accuracy);} + +/*! + \internal + Returns the accuracy (in metres) of the latitude and longitude of + the location stored in the detail. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +double QContactGeolocation::accuracy() const +{ + return variantValue(FieldAccuracy).toDouble(); +} + +/*! + \internal + Sets the altitude portion of the coordinate (in metres above the + ellipsoid) of the location stored in the detail to \a altitude. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +void QContactGeolocation::setAltitude(double altitude) +{ + setValue(FieldAltitude, altitude); +} + +/*! + \internal + Returns the altitude (in metres) of the location stored in the detail. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +double QContactGeolocation::altitude() const +{ + return variantValue(FieldAltitude).toDouble(); +} + +/*! + \internal + Sets the altitude-accuracy portion of the coordinate (in metres) of + the location stored in the detail to \a altitudeAccuracy. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +void QContactGeolocation::setAltitudeAccuracy(double altitudeAccuracy) +{ + setValue(FieldAltitudeAccuracy, altitudeAccuracy); +} + +/*! + \internal + Returns the accuracy of the altitude portion of the location stored + in the detail. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +double QContactGeolocation::altitudeAccuracy() const +{ + return variantValue(FieldAltitudeAccuracy).toDouble(); +} + +/*! + \internal + Sets the heading portion of the coordinate (in decimal degrees + clockwise relative to true north) of the location-aware device at + the time of measurement to \a heading. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +void QContactGeolocation::setHeading(double heading) +{ + setValue(FieldHeading, heading); +} + +/*! + \internal + Returns the heading (at the time of measurement) of the + location-aware device that recorded (or was provided) the + measurement. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +double QContactGeolocation::heading() const +{ + return variantValue(FieldHeading).toDouble(); +} + +/*! + \internal + Sets the speed portion of the coordinate (in metres per second) of + the location-aware device at the time of measurement to \a speed. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +void QContactGeolocation::setSpeed(double speed) +{ + setValue(FieldSpeed, speed); +} + +/*! + \internal + Returns the speed (at the time of measurement) of the + location-aware device that recorded (or was provided) the + measurement. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +double QContactGeolocation::speed() const +{ + return variantValue(FieldSpeed).toDouble(); +} + +/*! + \internal + Sets the creation (or first-valid) timestamp of the location + information to \a timestamp. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +void QContactGeolocation::setTimestamp(const QDateTime& timestamp) +{ + setValue(FieldTimestamp, timestamp); +} + +/*! + \internal + Returns the timestamp associated with the location stored in the + detail. + The QContactGeolocation class is deprecated and will be removed after the transition period has elapsed. + Use the QContactGeoLocation class instead! + */ +QDateTime QContactGeolocation::timestamp() const +{ + return variantValue(FieldTimestamp).toDateTime(); +} + + + + + + + + + + + + + +/*! + \fn QContactGeoLocation::setLabel(const QString& label) Sets the label of the location stored in the detail to \a label. */ /*! - \fn QContactGeolocation::label() const + \fn QContactGeoLocation::label() const Returns the label of the location stored in the detail. */ /*! - \fn QContactGeolocation::setLatitude(double latitude) + \fn QContactGeoLocation::setLatitude(double latitude) Sets the latitude portion of the coordinate (in decimal degrees) of the location stored in the detail to \a latitude. */ /*! - \fn QContactGeolocation::latitude() const + \fn QContactGeoLocation::latitude() const Returns the latitude portion of the coordinate (specified in decimal degrees) of the location stored in the detail. */ /*! - \fn QContactGeolocation::setLongitude(double longitude) + \fn QContactGeoLocation::setLongitude(double longitude) Sets the longitude portion of the coordinate (in decimal degrees) of the location stored in the detail to \a longitude. */ /*! - \fn QContactGeolocation::longitude() const + \fn QContactGeoLocation::longitude() const Returns the longitude portion of the coordinate (specified in decimal degrees) of the location stored in the detail. */ /*! - \fn QContactGeolocation::setAccuracy(double accuracy) + \fn QContactGeoLocation::setAccuracy(double accuracy) Specifies that the latitude and longitude portions of the location stored in the detail are accurate to within \a accuracy metres. */ /*! - \fn QContactGeolocation::accuracy() const + \fn QContactGeoLocation::accuracy() const Returns the accuracy (in metres) of the latitude and longitude of the location stored in the detail. */ /*! - \fn QContactGeolocation::setAltitude(double altitude) + \fn QContactGeoLocation::setAltitude(double altitude) Sets the altitude portion of the coordinate (in metres above the ellipsoid) of the location stored in the detail to \a altitude. */ /*! - \fn QContactGeolocation::altitude() const + \fn QContactGeoLocation::altitude() const Returns the altitude (in metres) of the location stored in the detail. */ /*! - \fn QContactGeolocation::setAltitudeAccuracy(double altitudeAccuracy) + \fn QContactGeoLocation::setAltitudeAccuracy(double altitudeAccuracy) Sets the altitude-accuracy portion of the coordinate (in metres) of the location stored in the detail to \a altitudeAccuracy. */ /*! - \fn QContactGeolocation::altitudeAccuracy() const + \fn QContactGeoLocation::altitudeAccuracy() const Returns the accuracy of the altitude portion of the location stored in the detail. */ /*! - \fn QContactGeolocation::setHeading(double heading) + \fn QContactGeoLocation::setHeading(double heading) Sets the heading portion of the coordinate (in decimal degrees clockwise relative to true north) of the location-aware device at @@ -1483,7 +1850,7 @@ */ /*! - \fn QContactGeolocation::heading() const + \fn QContactGeoLocation::heading() const Returns the heading (at the time of measurement) of the location-aware device that recorded (or was provided) the @@ -1491,14 +1858,14 @@ */ /*! - \fn QContactGeolocation::setSpeed(double speed) + \fn QContactGeoLocation::setSpeed(double speed) Sets the speed portion of the coordinate (in metres per second) of the location-aware device at the time of measurement to \a speed. */ /*! - \fn QContactGeolocation::speed() const + \fn QContactGeoLocation::speed() const Returns the speed (at the time of measurement) of the location-aware device that recorded (or was provided) the @@ -1506,14 +1873,14 @@ */ /*! - \fn QContactGeolocation::setTimestamp(const QDateTime& timestamp) + \fn QContactGeoLocation::setTimestamp(const QDateTime& timestamp) Sets the creation (or first-valid) timestamp of the location information to \a timestamp. */ /*! - \fn QContactGeolocation::timestamp() const + \fn QContactGeoLocation::timestamp() const Returns the timestamp associated with the location stored in the detail. @@ -1542,38 +1909,102 @@ */ /*! - \fn QContactName::first() const + \fn QContactName::firstName() const Returns the first (given) name segment of the name stored in this detail. */ /*! - \fn QContactName::setFirst(const QString& first) - Sets the first name segment of the name stored in this detail to \a first. + \fn QContactName::setFirstName(const QString& firstName) + Sets the first name segment of the name stored in this detail to \a firstName. */ /*! - \fn QContactName::middle() const + \fn QContactName::middleName() const Returns the middle (additional, or other) name segment of the name stored in this detail. */ /*! - \fn QContactName::setMiddle(const QString& middle) - Sets the middle name segment of the name stored in this detail to \a middle. + \fn QContactName::setMiddleName(const QString& middleName) + Sets the middle name segment of the name stored in this detail to \a middleName. */ /*! - \fn QContactName::last() const + \fn QContactName::lastName() const Returns the last (family, or surname) name segment of the name stored in this detail. */ /*! - \fn QContactName::setLast(const QString& last) + \fn QContactName::setLastName(const QString& lastName) + Sets the last name segment of the name stored in this detail to \a lastName. + */ + +/*! + \internal + Returns the first (given) name segment of the name stored in this detail. + Deprecated. Use QContactName::firstName() instead. + */ +QString QContactName::first() const +{ + return firstName(); +} + +/*! + \internal + Sets the first name segment of the name stored in this detail to \a first. + Deprecated. Use QContactName::setFirstName() instead. + */ +void QContactName::setFirst(const QString& first) +{ + setFirstName(first); +} + +/*! + \internal + + Returns the middle (additional, or other) name segment of the name + stored in this detail. + Deprecated. Use QContactName::middleName() instead. + */ +QString QContactName::middle() const +{ + return middleName(); +} + +/*! + \internal + Sets the middle name segment of the name stored in this detail to \a middle. + Deprecated. Use QContactName::setMiddleName() instead. + */ +void QContactName::setMiddle(const QString& middle) +{ + setMiddleName(middle); +} + +/*! + \internal + + Returns the last (family, or surname) name segment of the name + stored in this detail. + Deprecated. Use QContactName::lastName() instead. + */ +QString QContactName::last() const +{ + return lastName(); +} + +/*! + \internal Sets the last name segment of the name stored in this detail to \a last. + Deprecated. Use QContactName::setLastName() instead. */ +void QContactName::setLast(const QString& last) +{ + setLastName(last); +} /*! \fn QContactName::suffix() const @@ -1740,6 +2171,22 @@ */ /*! + \fn QContactOnlineAccount::setCapabilities(const QStringList& capabilities) + + Sets the capabilities of the online account about which this detail stores + presence information to \a capabilities. The \a capabilities list is a + list of service-provider specified strings which together identify the + types of communication which may be possible. + */ + +/*! + \fn QContactOnlineAccount::capabilities() const + + Returns the capabilities of the online account about which this detail stores + presence information. + */ + +/*! \fn QContactOrganization::setName(const QString& name) Sets the name of the organization stored in this detail to \a name. */ @@ -1822,4 +2269,104 @@ this organization. */ + +/* Convenience filters */ + +/*! + Returns a filter suitable for finding + contacts with a display label matching the specified \a label. +*/ +QContactFilter QContactDisplayLabel::match(const QString &label) +{ + QContactDetailFilter f; + f.setDetailDefinitionName(QContactDisplayLabel::DefinitionName); + f.setValue(label); + + return f; +} + +/*! + Returns a filter suitable for finding + contacts with a name matching the specified \a firstName and + \a lastName. If either parameter is empty, any value will match + that component. +*/ +QContactFilter QContactName::match(const QString &firstName, const QString &lastName) +{ + if (firstName.isEmpty()) { + if (lastName.isEmpty()) { + // Matches contacts that have a name + QContactDetailFilter f; + f.setDetailDefinitionName(QContactName::DefinitionName); + return f; + } else { + // Contact with matching lastname + QContactDetailFilter f; + f.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldLastName); + f.setValue(lastName); + return f; + } + } else { + if (lastName.isEmpty()) { + // Contact with matching firstName + QContactDetailFilter f; + f.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldFirstName); + f.setValue(firstName); + return f; + } else { + // Match a contact with the specified first and last names + // XXX This needs multi detail filter! + + // Best we can currently do is "and" and assume there's only one name per contact + QContactDetailFilter f; + f.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldFirstName); + f.setValue(firstName); + QContactDetailFilter l; + l.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldLastName); + l.setValue(lastName); + + return f & l; + } + } +} + +/*! + Returns a filter suitable for finding + contacts with a name field (e.g. first, last) that + matches the supplied \a name. +*/ +QContactFilter QContactName::match(const QString &name) +{ + QContactDetailFilter l; + l.setDetailDefinitionName(QContactName::DefinitionName); + l.setValue(name); + return l; +} + +/*! + Returns a filter suitable for finding + contacts with an email address matching the specified \a emailAddress. +*/ +QContactFilter QContactEmailAddress::match(const QString &emailAddress) +{ + QContactDetailFilter l; + l.setDetailDefinitionName(QContactEmailAddress::DefinitionName, QContactEmailAddress::FieldEmailAddress); + l.setValue(emailAddress); + return l; +} + +/*! + Returns a filter suitable for finding + contacts with a phone number matching the specified \a number. +*/ +QContactFilter QContactPhoneNumber::match(const QString &number) +{ + QContactDetailFilter l; + l.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldNumber); + l.setValue(number); + l.setMatchFlags(QContactFilter::MatchPhoneNumber); + return l; +} + + QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/details/qcontactdisplaylabel.h --- a/qtcontactsmobility/src/contacts/details/qcontactdisplaylabel.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/details/qcontactdisplaylabel.h Fri Apr 16 14:53:18 2010 +0300 @@ -47,6 +47,7 @@ #include "qtcontactsglobal.h" #include "qcontactdetail.h" +#include "qcontactfilter.h" QTM_BEGIN_NAMESPACE @@ -63,6 +64,8 @@ #endif QString label() const {return value(FieldLabel);} + + static QContactFilter match(const QString& label); }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/details/qcontactemailaddress.h --- a/qtcontactsmobility/src/contacts/details/qcontactemailaddress.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/details/qcontactemailaddress.h Fri Apr 16 14:53:18 2010 +0300 @@ -47,7 +47,7 @@ #include "qtcontactsglobal.h" #include "qcontactdetail.h" -#include "qcontact.h" +#include "qcontactfilter.h" QTM_BEGIN_NAMESPACE @@ -65,6 +65,9 @@ void setEmailAddress(const QString& emailAddress) {setValue(FieldEmailAddress, emailAddress);} QString emailAddress() const {return value(FieldEmailAddress);} + + // Convenience filter + static QContactFilter match(const QString& emailAddress); }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/details/qcontactgeolocation.h --- a/qtcontactsmobility/src/contacts/details/qcontactgeolocation.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/details/qcontactgeolocation.h Fri Apr 16 14:53:18 2010 +0300 @@ -52,7 +52,8 @@ QTM_BEGIN_NAMESPACE /* Leaf class */ -class Q_CONTACTS_EXPORT QContactGeolocation : public QContactDetail +// replaces the below +class Q_CONTACTS_EXPORT QContactGeoLocation : public QContactDetail { public: #ifdef Q_QDOC @@ -67,7 +68,7 @@ const char* FieldSpeed; const char* FieldTimestamp; #else - Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactGeolocation, "Geolocation") + Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactGeoLocation, "GeoLocation") Q_DECLARE_LATIN1_LITERAL(FieldLabel, "Label"); Q_DECLARE_LATIN1_LITERAL(FieldLatitude, "Latitude"); Q_DECLARE_LATIN1_LITERAL(FieldLongitude, "Longitude"); @@ -99,6 +100,54 @@ QDateTime timestamp() const {return variantValue(FieldTimestamp).toDateTime();} }; +// deprecated! spelling changed to GeoLocation -- see above. +class Q_CONTACTS_EXPORT QContactGeolocation : public QContactDetail +{ +public: +#ifdef Q_QDOC + const char* DefinitionName; + const char* FieldLabel; + const char* FieldLatitude; + const char* FieldLongitude; + const char* FieldAccuracy; + const char* FieldAltitude; + const char* FieldAltitudeAccuracy; + const char* FieldHeading; + const char* FieldSpeed; + const char* FieldTimestamp; +#else + Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactGeolocation, "GeoLocation") // change defn name to point to the new class defn name. + Q_DECLARE_LATIN1_LITERAL(FieldLabel, "Label"); + Q_DECLARE_LATIN1_LITERAL(FieldLatitude, "Latitude"); + Q_DECLARE_LATIN1_LITERAL(FieldLongitude, "Longitude"); + Q_DECLARE_LATIN1_LITERAL(FieldAccuracy, "Accuracy"); + Q_DECLARE_LATIN1_LITERAL(FieldAltitude, "Altitude"); + Q_DECLARE_LATIN1_LITERAL(FieldAltitudeAccuracy, "AltitudeAccuracy"); + Q_DECLARE_LATIN1_LITERAL(FieldHeading, "Heading"); + Q_DECLARE_LATIN1_LITERAL(FieldSpeed, "Speed"); + Q_DECLARE_LATIN1_LITERAL(FieldTimestamp, "Timestamp"); +#endif + + void Q_DECL_DEPRECATED setLabel(const QString& label); + QString Q_DECL_DEPRECATED label() const; + void Q_DECL_DEPRECATED setLatitude(double latitude); + double Q_DECL_DEPRECATED latitude() const; + void Q_DECL_DEPRECATED setLongitude(double longitude); + double Q_DECL_DEPRECATED longitude() const; + void Q_DECL_DEPRECATED setAccuracy(double accuracy); + double Q_DECL_DEPRECATED accuracy() const; + void Q_DECL_DEPRECATED setAltitude(double altitude); + double Q_DECL_DEPRECATED altitude() const; + void Q_DECL_DEPRECATED setAltitudeAccuracy(double altitudeAccuracy); + double Q_DECL_DEPRECATED altitudeAccuracy() const; + void Q_DECL_DEPRECATED setHeading(double heading); + double Q_DECL_DEPRECATED heading() const; + void Q_DECL_DEPRECATED setSpeed(double speed); + double Q_DECL_DEPRECATED speed() const; + void Q_DECL_DEPRECATED setTimestamp(const QDateTime& timestamp); + QDateTime Q_DECL_DEPRECATED timestamp() const; +}; + QTM_END_NAMESPACE #endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/details/qcontactname.h --- a/qtcontactsmobility/src/contacts/details/qcontactname.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/details/qcontactname.h Fri Apr 16 14:53:18 2010 +0300 @@ -47,7 +47,7 @@ #include "qtcontactsglobal.h" #include "qcontactdetail.h" -#include "qcontact.h" +#include "qcontactfilter.h" QTM_BEGIN_NAMESPACE @@ -57,34 +57,52 @@ #ifdef Q_QDOC const char* DefinitionName; const char* FieldPrefix; - const char* FieldFirst; - const char* FieldMiddle; - const char* FieldLast; + const char* FieldFirst; // deprecated + const char* FieldMiddle;// deprecated + const char* FieldLast; // deprecated + const char* FieldFirstName; + const char* FieldMiddleName; + const char* FieldLastName; const char* FieldSuffix; const char* FieldCustomLabel; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactName, "Name") Q_DECLARE_LATIN1_LITERAL(FieldPrefix, "Prefix"); - Q_DECLARE_LATIN1_LITERAL(FieldFirst, "First"); - Q_DECLARE_LATIN1_LITERAL(FieldMiddle, "Middle"); - Q_DECLARE_LATIN1_LITERAL(FieldLast, "Last"); + Q_DECLARE_LATIN1_LITERAL(FieldFirst, "FirstName"); // deprecated + Q_DECLARE_LATIN1_LITERAL(FieldMiddle, "MiddleName");// deprecated + Q_DECLARE_LATIN1_LITERAL(FieldLast, "LastName"); // deprecated + Q_DECLARE_LATIN1_LITERAL(FieldFirstName, "FirstName"); + Q_DECLARE_LATIN1_LITERAL(FieldMiddleName, "MiddleName"); + Q_DECLARE_LATIN1_LITERAL(FieldLastName, "LastName"); Q_DECLARE_LATIN1_LITERAL(FieldSuffix, "Suffix"); Q_DECLARE_LATIN1_LITERAL(FieldCustomLabel, "CustomLabel"); #endif QString prefix() const {return value(FieldPrefix);} - QString first() const {return value(FieldFirst);} - QString middle() const {return value(FieldMiddle);} - QString last() const {return value(FieldLast);} + QString firstName() const {return value(FieldFirstName);} + QString middleName() const {return value(FieldMiddleName);} + QString lastName() const {return value(FieldLastName);} QString suffix() const {return value(FieldSuffix);} QString customLabel() const{return value(FieldCustomLabel);} void setPrefix(const QString& prefix) {setValue(FieldPrefix, prefix);} - void setFirst(const QString& first) {setValue(FieldFirst, first);} - void setMiddle(const QString& middle) {setValue(FieldMiddle, middle);} - void setLast(const QString& last) {setValue(FieldLast, last);} + void setFirstName(const QString& firstName) {setValue(FieldFirstName, firstName);} + void setMiddleName(const QString& middleName) {setValue(FieldMiddleName, middleName);} + void setLastName(const QString& lastName) {setValue(FieldLastName, lastName);} void setSuffix(const QString& suffix) {setValue(FieldSuffix, suffix);} void setCustomLabel(const QString& customLabel) {setValue(FieldCustomLabel, customLabel);} + + // deprecated functions, will be removed after transition period according to process. + QString Q_DECL_DEPRECATED first() const; + QString Q_DECL_DEPRECATED middle() const; + QString Q_DECL_DEPRECATED last() const; + void Q_DECL_DEPRECATED setFirst(const QString& first); + void Q_DECL_DEPRECATED setMiddle(const QString& middle); + void Q_DECL_DEPRECATED setLast(const QString& last); + + // Convenience filter + static QContactFilter match(const QString& name); + static QContactFilter match(const QString& firstName, const QString& lastName); }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/details/qcontactonlineaccount.h --- a/qtcontactsmobility/src/contacts/details/qcontactonlineaccount.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/details/qcontactonlineaccount.h Fri Apr 16 14:53:18 2010 +0300 @@ -63,6 +63,7 @@ const char* FieldNickname; const char* FieldPresence; const char* FieldStatusMessage; + const char* FieldCapabilities; const char* PresenceAvailable; const char* PresenceHidden; const char* PresenceBusy; @@ -81,6 +82,7 @@ Q_DECLARE_LATIN1_LITERAL(FieldNickname, "Nickname"); Q_DECLARE_LATIN1_LITERAL(FieldPresence, "Presence"); Q_DECLARE_LATIN1_LITERAL(FieldStatusMessage, "StatusMessage"); + Q_DECLARE_LATIN1_LITERAL(FieldCapabilities, "Capabilities"); Q_DECLARE_LATIN1_LITERAL(FieldSubTypes, "SubTypes"); Q_DECLARE_LATIN1_LITERAL(PresenceAvailable, "Available"); Q_DECLARE_LATIN1_LITERAL(PresenceHidden, "Hidden"); @@ -105,6 +107,8 @@ QString presence() const {return value(FieldPresence);} void setStatusMessage(const QString& statusMessage) {setValue(FieldStatusMessage, statusMessage);} QString statusMessage() const {return value(FieldStatusMessage);} + void setCapabilities(const QStringList& capabilities) {setValue(FieldCapabilities, capabilities);} + QStringList capabilities() const {return value(FieldCapabilities);} void setSubTypes(const QStringList& subTypes) {setValue(FieldSubTypes, subTypes);} void setSubTypes(const QString& subType) {setValue(FieldSubTypes, QStringList(subType));} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/details/qcontactphonenumber.h --- a/qtcontactsmobility/src/contacts/details/qcontactphonenumber.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/details/qcontactphonenumber.h Fri Apr 16 14:53:18 2010 +0300 @@ -47,7 +47,7 @@ #include "qtcontactsglobal.h" #include "qcontactdetail.h" -#include "qcontact.h" +#include "qcontactfilter.h" QTM_BEGIN_NAMESPACE @@ -59,7 +59,7 @@ #ifdef Q_QDOC const char* DefinitionName; const char* FieldNumber; - const char* FieldSubType; + const char* FieldSubTypes; const char* SubTypeLandline; const char* SubTypeMobile; const char* SubTypeFacsimile; @@ -96,6 +96,9 @@ void setSubTypes(const QStringList& subTypes) {setValue(FieldSubTypes, subTypes);} void setSubTypes(const QString& subType) {setValue(FieldSubTypes, QStringList(subType));} QStringList subTypes() const {return value(FieldSubTypes);} + + // Convenience filter + static QContactFilter match(const QString& number); }; //! [0] diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/eabi/QtContactsu.def --- a/qtcontactsmobility/src/contacts/eabi/QtContactsu.def Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/eabi/QtContactsu.def Fri Apr 16 14:53:18 2010 +0300 @@ -15,809 +15,935 @@ _ZN10QtMobility11QContactUrl8FieldUrlE @ 14 NONAME DATA 4 _ZN10QtMobility12QContactGuid14DefinitionNameE @ 15 NONAME DATA 5 _ZN10QtMobility12QContactGuid9FieldGuidE @ 16 NONAME DATA 5 - _ZN10QtMobility12QContactName10FieldFirstE @ 17 NONAME DATA 6 - _ZN10QtMobility12QContactName11FieldMiddleE @ 18 NONAME DATA 7 + _ZN10QtMobility12QContactName10FieldFirstE @ 17 NONAME DATA 10 + _ZN10QtMobility12QContactName11FieldMiddleE @ 18 NONAME DATA 11 _ZN10QtMobility12QContactName11FieldPrefixE @ 19 NONAME DATA 7 _ZN10QtMobility12QContactName11FieldSuffixE @ 20 NONAME DATA 7 - _ZN10QtMobility12QContactName14DefinitionNameE @ 21 NONAME DATA 5 - _ZN10QtMobility12QContactName16FieldCustomLabelE @ 22 NONAME DATA 12 - _ZN10QtMobility12QContactName9FieldLastE @ 23 NONAME DATA 5 - _ZN10QtMobility12QContactNote14DefinitionNameE @ 24 NONAME DATA 5 - _ZN10QtMobility12QContactNote9FieldNoteE @ 25 NONAME DATA 5 - _ZN10QtMobility12QContactType11TypeContactE @ 26 NONAME DATA 8 - _ZN10QtMobility12QContactType14DefinitionNameE @ 27 NONAME DATA 5 - _ZN10QtMobility12QContactType9FieldTypeE @ 28 NONAME DATA 5 - _ZN10QtMobility12QContactType9TypeGroupE @ 29 NONAME DATA 6 - _ZN10QtMobility14QContactAction11qt_metacallEN11QMetaObject4CallEiPPv @ 30 NONAME - _ZN10QtMobility14QContactAction11qt_metacastEPKc @ 31 NONAME - _ZN10QtMobility14QContactAction16availableActionsERK7QStringi @ 32 NONAME - _ZN10QtMobility14QContactAction16staticMetaObjectE @ 33 NONAME DATA 16 - _ZN10QtMobility14QContactAction17actionDescriptorsERK7QStringS3_i @ 34 NONAME - _ZN10QtMobility14QContactAction19getStaticMetaObjectEv @ 35 NONAME - _ZN10QtMobility14QContactAction6actionERKNS_24QContactActionDescriptorE @ 36 NONAME - _ZN10QtMobility14QContactAction8progressENS0_6StatusERK4QMapI7QString8QVariantE @ 37 NONAME - _ZN10QtMobility14QContactActionD0Ev @ 38 NONAME - _ZN10QtMobility14QContactActionD1Ev @ 39 NONAME - _ZN10QtMobility14QContactActionD2Ev @ 40 NONAME - _ZN10QtMobility14QContactAvatar11FieldAvatarE @ 41 NONAME DATA 7 - _ZN10QtMobility14QContactAvatar12FieldSubTypeE @ 42 NONAME DATA 8 - _ZN10QtMobility14QContactAvatar12SubTypeImageE @ 43 NONAME DATA 6 - _ZN10QtMobility14QContactAvatar12SubTypeVideoE @ 44 NONAME DATA 6 - _ZN10QtMobility14QContactAvatar14DefinitionNameE @ 45 NONAME DATA 7 - _ZN10QtMobility14QContactAvatar17FieldAvatarPixmapE @ 46 NONAME DATA 13 - _ZN10QtMobility14QContactAvatar19SubTypeTexturedMeshE @ 47 NONAME DATA 13 - _ZN10QtMobility14QContactAvatar20SubTypeAudioRingtoneE @ 48 NONAME DATA 14 - _ZN10QtMobility14QContactAvatar20SubTypeVideoRingtoneE @ 49 NONAME DATA 14 - _ZN10QtMobility14QContactDetail11ContextHomeE @ 50 NONAME DATA 5 - _ZN10QtMobility14QContactDetail11ContextWorkE @ 51 NONAME DATA 5 - _ZN10QtMobility14QContactDetail11removeValueERK7QString @ 52 NONAME - _ZN10QtMobility14QContactDetail12ContextOtherE @ 53 NONAME DATA 6 - _ZN10QtMobility14QContactDetail12FieldContextE @ 54 NONAME DATA 8 - _ZN10QtMobility14QContactDetail19setPreferredActionsERK5QListINS_24QContactActionDescriptorEE @ 55 NONAME - _ZN10QtMobility14QContactDetail6assignERKS0_RK7QString @ 56 NONAME - _ZN10QtMobility14QContactDetail8setValueERK7QStringRK8QVariant @ 57 NONAME - _ZN10QtMobility14QContactDetailC1ERK7QString @ 58 NONAME - _ZN10QtMobility14QContactDetailC1ERKS0_ @ 59 NONAME - _ZN10QtMobility14QContactDetailC1ERKS0_RK7QString @ 60 NONAME - _ZN10QtMobility14QContactDetailC1Ev @ 61 NONAME - _ZN10QtMobility14QContactDetailC2ERK7QString @ 62 NONAME - _ZN10QtMobility14QContactDetailC2ERKS0_ @ 63 NONAME - _ZN10QtMobility14QContactDetailC2ERKS0_RK7QString @ 64 NONAME - _ZN10QtMobility14QContactDetailC2Ev @ 65 NONAME - _ZN10QtMobility14QContactDetailD0Ev @ 66 NONAME - _ZN10QtMobility14QContactDetailD1Ev @ 67 NONAME - _ZN10QtMobility14QContactDetailD2Ev @ 68 NONAME - _ZN10QtMobility14QContactDetailaSERKS0_ @ 69 NONAME - _ZN10QtMobility14QContactFamily11FieldSpouseE @ 70 NONAME DATA 7 - _ZN10QtMobility14QContactFamily13FieldChildrenE @ 71 NONAME DATA 9 - _ZN10QtMobility14QContactFamily14DefinitionNameE @ 72 NONAME DATA 7 - _ZN10QtMobility14QContactFilterC1EPNS_21QContactFilterPrivateE @ 73 NONAME - _ZN10QtMobility14QContactFilterC1ERKS0_ @ 74 NONAME - _ZN10QtMobility14QContactFilterC1Ev @ 75 NONAME - _ZN10QtMobility14QContactFilterC2EPNS_21QContactFilterPrivateE @ 76 NONAME - _ZN10QtMobility14QContactFilterC2ERKS0_ @ 77 NONAME - _ZN10QtMobility14QContactFilterC2Ev @ 78 NONAME - _ZN10QtMobility14QContactFilterD0Ev @ 79 NONAME - _ZN10QtMobility14QContactFilterD1Ev @ 80 NONAME - _ZN10QtMobility14QContactFilterD2Ev @ 81 NONAME - _ZN10QtMobility14QContactFilteraSERKS0_ @ 82 NONAME - _ZN10QtMobility14QContactGender10GenderMaleE @ 83 NONAME DATA 5 - _ZN10QtMobility14QContactGender11FieldGenderE @ 84 NONAME DATA 7 - _ZN10QtMobility14QContactGender12GenderFemaleE @ 85 NONAME DATA 7 - _ZN10QtMobility14QContactGender14DefinitionNameE @ 86 NONAME DATA 7 - _ZN10QtMobility14QContactGender17GenderUnspecifiedE @ 87 NONAME DATA 12 - _ZN10QtMobility15QContactAddress11FieldRegionE @ 88 NONAME DATA 7 - _ZN10QtMobility15QContactAddress11FieldStreetE @ 89 NONAME DATA 7 - _ZN10QtMobility15QContactAddress12FieldCountryE @ 90 NONAME DATA 8 - _ZN10QtMobility15QContactAddress13FieldLocalityE @ 91 NONAME DATA 9 - _ZN10QtMobility15QContactAddress13FieldPostcodeE @ 92 NONAME DATA 9 - _ZN10QtMobility15QContactAddress13FieldSubTypesE @ 93 NONAME DATA 9 - _ZN10QtMobility15QContactAddress13SubTypeParcelE @ 94 NONAME DATA 7 - _ZN10QtMobility15QContactAddress13SubTypePostalE @ 95 NONAME DATA 7 - _ZN10QtMobility15QContactAddress14DefinitionNameE @ 96 NONAME DATA 14 - _ZN10QtMobility15QContactAddress15SubTypeDomesticE @ 97 NONAME DATA 9 - _ZN10QtMobility15QContactAddress18FieldPostOfficeBoxE @ 98 NONAME DATA 14 - _ZN10QtMobility15QContactAddress20SubTypeInternationalE @ 99 NONAME DATA 14 - _ZN10QtMobility15QContactManager11dataChangedEv @ 100 NONAME - _ZN10QtMobility15QContactManager11qt_metacallEN11QMetaObject4CallEiPPv @ 101 NONAME - _ZN10QtMobility15QContactManager11qt_metacastEPKc @ 102 NONAME - _ZN10QtMobility15QContactManager11saveContactEPNS_8QContactE @ 103 NONAME - _ZN10QtMobility15QContactManager12createEngineERK7QStringRK4QMapIS1_S1_E @ 104 NONAME - _ZN10QtMobility15QContactManager12saveContactsEP5QListINS_8QContactEE @ 105 NONAME - _ZN10QtMobility15QContactManager13contactsAddedERK5QListIjE @ 106 NONAME - _ZN10QtMobility15QContactManager13removeContactERKj @ 107 NONAME - _ZN10QtMobility15QContactManager14removeContactsEP5QListIjE @ 108 NONAME - _ZN10QtMobility15QContactManager15contactsChangedERK5QListIjE @ 109 NONAME - _ZN10QtMobility15QContactManager15contactsRemovedERK5QListIjE @ 110 NONAME - _ZN10QtMobility15QContactManager16saveRelationshipEPNS_20QContactRelationshipE @ 111 NONAME - _ZN10QtMobility15QContactManager16setSelfContactIdERKj @ 112 NONAME - _ZN10QtMobility15QContactManager16staticMetaObjectE @ 113 NONAME DATA 16 - _ZN10QtMobility15QContactManager17availableManagersEv @ 114 NONAME - _ZN10QtMobility15QContactManager17saveRelationshipsEP5QListINS_20QContactRelationshipEE @ 115 NONAME - _ZN10QtMobility15QContactManager18relationshipsAddedERK5QListIjE @ 116 NONAME - _ZN10QtMobility15QContactManager18removeRelationshipERKNS_20QContactRelationshipE @ 117 NONAME - _ZN10QtMobility15QContactManager19getStaticMetaObjectEv @ 118 NONAME - _ZN10QtMobility15QContactManager19removeRelationshipsERK5QListINS_20QContactRelationshipEE @ 119 NONAME - _ZN10QtMobility15QContactManager20relationshipsRemovedERK5QListIjE @ 120 NONAME - _ZN10QtMobility15QContactManager20saveDetailDefinitionERKNS_24QContactDetailDefinitionERK7QString @ 121 NONAME - _ZN10QtMobility15QContactManager20selfContactIdChangedERKjS2_ @ 122 NONAME - _ZN10QtMobility15QContactManager22removeDetailDefinitionERK7QStringS3_ @ 123 NONAME - _ZN10QtMobility15QContactManager7fromUriERK7QStringP7QObject @ 124 NONAME - _ZN10QtMobility15QContactManager7versionEv @ 125 NONAME - _ZN10QtMobility15QContactManager8buildUriERK7QStringRK4QMapIS1_S1_Ei @ 126 NONAME - _ZN10QtMobility15QContactManager8splitUriERK7QStringPS1_P4QMapIS1_S1_E @ 127 NONAME - _ZN10QtMobility15QContactManagerC1ERK7QStringRK4QMapIS1_S1_EP7QObject @ 128 NONAME - _ZN10QtMobility15QContactManagerC1ERK7QStringiRK4QMapIS1_S1_EP7QObject @ 129 NONAME - _ZN10QtMobility15QContactManagerC2ERK7QStringRK4QMapIS1_S1_EP7QObject @ 130 NONAME - _ZN10QtMobility15QContactManagerC2ERK7QStringiRK4QMapIS1_S1_EP7QObject @ 131 NONAME - _ZN10QtMobility15QContactManagerD0Ev @ 132 NONAME - _ZN10QtMobility15QContactManagerD1Ev @ 133 NONAME - _ZN10QtMobility15QContactManagerD2Ev @ 134 NONAME - _ZN10QtMobility16QContactBirthday13FieldBirthdayE @ 135 NONAME DATA 9 - _ZN10QtMobility16QContactBirthday14DefinitionNameE @ 136 NONAME DATA 9 - _ZN10QtMobility16QContactNickname13FieldNicknameE @ 137 NONAME DATA 9 - _ZN10QtMobility16QContactNickname14DefinitionNameE @ 138 NONAME DATA 9 - _ZN10QtMobility17QContactChangeSet11dataChangedEv @ 139 NONAME - _ZN10QtMobility17QContactChangeSet11emitSignalsEPNS_21QContactManagerEngineE @ 140 NONAME - _ZN10QtMobility17QContactChangeSet13addedContactsEv @ 141 NONAME - _ZN10QtMobility17QContactChangeSet14setDataChangedEb @ 142 NONAME - _ZN10QtMobility17QContactChangeSet15changedContactsEv @ 143 NONAME - _ZN10QtMobility17QContactChangeSet15removedContactsEv @ 144 NONAME - _ZN10QtMobility17QContactChangeSet22oldAndNewSelfContactIdEv @ 145 NONAME - _ZN10QtMobility17QContactChangeSet26addedRelationshipsContactsEv @ 146 NONAME - _ZN10QtMobility17QContactChangeSet28removedRelationshipsContactsEv @ 147 NONAME - _ZN10QtMobility17QContactChangeSet5clearEv @ 148 NONAME - _ZN10QtMobility17QContactChangeSetC1ERKS0_ @ 149 NONAME - _ZN10QtMobility17QContactChangeSetC1Ev @ 150 NONAME - _ZN10QtMobility17QContactChangeSetC2ERKS0_ @ 151 NONAME - _ZN10QtMobility17QContactChangeSetC2Ev @ 152 NONAME - _ZN10QtMobility17QContactChangeSetD1Ev @ 153 NONAME - _ZN10QtMobility17QContactChangeSetD2Ev @ 154 NONAME - _ZN10QtMobility17QContactChangeSetaSERKS0_ @ 155 NONAME - _ZN10QtMobility17QContactSortOrder12setDirectionEN2Qt9SortOrderE @ 156 NONAME - _ZN10QtMobility17QContactSortOrder14setBlankPolicyENS0_11BlankPolicyE @ 157 NONAME - _ZN10QtMobility17QContactSortOrder18setCaseSensitivityEN2Qt15CaseSensitivityE @ 158 NONAME - _ZN10QtMobility17QContactSortOrder23setDetailDefinitionNameERK7QStringS3_ @ 159 NONAME - _ZN10QtMobility17QContactSortOrderC1ERKS0_ @ 160 NONAME - _ZN10QtMobility17QContactSortOrderC1Ev @ 161 NONAME - _ZN10QtMobility17QContactSortOrderC2ERKS0_ @ 162 NONAME - _ZN10QtMobility17QContactSortOrderC2Ev @ 163 NONAME - _ZN10QtMobility17QContactSortOrderD1Ev @ 164 NONAME - _ZN10QtMobility17QContactSortOrderD2Ev @ 165 NONAME - _ZN10QtMobility17QContactSortOrderaSERKS0_ @ 166 NONAME - _ZN10QtMobility17QContactTimestamp14DefinitionNameE @ 167 NONAME DATA 10 - _ZN10QtMobility17QContactTimestamp22FieldCreationTimestampE @ 168 NONAME DATA 18 - _ZN10QtMobility17QContactTimestamp26FieldModificationTimestampE @ 169 NONAME DATA 22 - _ZN10QtMobility18QContactSyncTarget14DefinitionNameE @ 170 NONAME DATA 11 - _ZN10QtMobility18QContactSyncTarget15FieldSyncTargetE @ 171 NONAME DATA 11 - _ZN10QtMobility19QContactAnniversary10FieldEventE @ 172 NONAME DATA 6 - _ZN10QtMobility19QContactAnniversary12FieldSubTypeE @ 173 NONAME DATA 8 - _ZN10QtMobility19QContactAnniversary12SubTypeHouseE @ 174 NONAME DATA 6 - _ZN10QtMobility19QContactAnniversary14DefinitionNameE @ 175 NONAME DATA 12 - _ZN10QtMobility19QContactAnniversary14SubTypeWeddingE @ 176 NONAME DATA 8 - _ZN10QtMobility19QContactAnniversary15FieldCalendarIdE @ 177 NONAME DATA 11 - _ZN10QtMobility19QContactAnniversary15SubTypeMemorialE @ 178 NONAME DATA 9 - _ZN10QtMobility19QContactAnniversary17FieldOriginalDateE @ 179 NONAME DATA 13 - _ZN10QtMobility19QContactAnniversary17SubTypeEmploymentE @ 180 NONAME DATA 11 - _ZN10QtMobility19QContactAnniversary17SubTypeEngagementE @ 181 NONAME DATA 11 - _ZN10QtMobility19QContactGeolocation10FieldLabelE @ 182 NONAME DATA 6 - _ZN10QtMobility19QContactGeolocation10FieldSpeedE @ 183 NONAME DATA 6 - _ZN10QtMobility19QContactGeolocation12FieldHeadingE @ 184 NONAME DATA 8 - _ZN10QtMobility19QContactGeolocation13FieldAccuracyE @ 185 NONAME DATA 9 - _ZN10QtMobility19QContactGeolocation13FieldAltitudeE @ 186 NONAME DATA 9 - _ZN10QtMobility19QContactGeolocation13FieldLatitudeE @ 187 NONAME DATA 9 - _ZN10QtMobility19QContactGeolocation14DefinitionNameE @ 188 NONAME DATA 12 - _ZN10QtMobility19QContactGeolocation14FieldLongitudeE @ 189 NONAME DATA 10 - _ZN10QtMobility19QContactGeolocation14FieldTimestampE @ 190 NONAME DATA 10 - _ZN10QtMobility19QContactGeolocation21FieldAltitudeAccuracyE @ 191 NONAME DATA 17 - _ZN10QtMobility19QContactPhoneNumber10SubTypeCarE @ 192 NONAME DATA 4 - _ZN10QtMobility19QContactPhoneNumber11FieldNumberE @ 193 NONAME DATA 12 - _ZN10QtMobility19QContactPhoneNumber12SubTypeModemE @ 194 NONAME DATA 6 - _ZN10QtMobility19QContactPhoneNumber12SubTypePagerE @ 195 NONAME DATA 6 - _ZN10QtMobility19QContactPhoneNumber12SubTypeVideoE @ 196 NONAME DATA 6 - _ZN10QtMobility19QContactPhoneNumber12SubTypeVoiceE @ 197 NONAME DATA 6 - _ZN10QtMobility19QContactPhoneNumber13FieldSubTypesE @ 198 NONAME DATA 9 - _ZN10QtMobility19QContactPhoneNumber13SubTypeMobileE @ 199 NONAME DATA 7 - _ZN10QtMobility19QContactPhoneNumber14DefinitionNameE @ 200 NONAME DATA 12 - _ZN10QtMobility19QContactPhoneNumber15SubTypeDtmfMenuE @ 201 NONAME DATA 9 - _ZN10QtMobility19QContactPhoneNumber15SubTypeLandlineE @ 202 NONAME DATA 9 - _ZN10QtMobility19QContactPhoneNumber16SubTypeAssistantE @ 203 NONAME DATA 10 - _ZN10QtMobility19QContactPhoneNumber16SubTypeFacsimileE @ 204 NONAME DATA 10 - _ZN10QtMobility19QContactPhoneNumber23SubTypeMessagingCapableE @ 205 NONAME DATA 17 - _ZN10QtMobility19QContactPhoneNumber26SubTypeBulletinBoardSystemE @ 206 NONAME DATA 20 - _ZN10QtMobility19QContactSaveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 207 NONAME - _ZN10QtMobility19QContactSaveRequest11qt_metacastEPKc @ 208 NONAME - _ZN10QtMobility19QContactSaveRequest11setContactsERK5QListINS_8QContactEE @ 209 NONAME - _ZN10QtMobility19QContactSaveRequest16staticMetaObjectE @ 210 NONAME DATA 16 - _ZN10QtMobility19QContactSaveRequest19getStaticMetaObjectEv @ 211 NONAME - _ZN10QtMobility19QContactSaveRequest8progressEPS0_ @ 212 NONAME - _ZN10QtMobility19QContactSaveRequestC1Ev @ 213 NONAME - _ZN10QtMobility19QContactSaveRequestC2Ev @ 214 NONAME - _ZN10QtMobility19QContactSaveRequestD0Ev @ 215 NONAME - _ZN10QtMobility19QContactSaveRequestD1Ev @ 216 NONAME - _ZN10QtMobility19QContactSaveRequestD2Ev @ 217 NONAME - _ZN10QtMobility19QContactUnionFilter10setFiltersERK5QListINS_14QContactFilterEE @ 218 NONAME - _ZN10QtMobility19QContactUnionFilter6appendERKNS_14QContactFilterE @ 219 NONAME - _ZN10QtMobility19QContactUnionFilter6removeERKNS_14QContactFilterE @ 220 NONAME - _ZN10QtMobility19QContactUnionFilter7prependERKNS_14QContactFilterE @ 221 NONAME - _ZN10QtMobility19QContactUnionFilterC1ERKNS_14QContactFilterE @ 222 NONAME - _ZN10QtMobility19QContactUnionFilterC1Ev @ 223 NONAME - _ZN10QtMobility19QContactUnionFilterC2ERKNS_14QContactFilterE @ 224 NONAME - _ZN10QtMobility19QContactUnionFilterC2Ev @ 225 NONAME - _ZN10QtMobility19QContactUnionFilterlsERKNS_14QContactFilterE @ 226 NONAME - _ZN10QtMobility20QContactActionFilter13setActionNameERK7QString @ 227 NONAME - _ZN10QtMobility20QContactActionFilter8setValueERK8QVariant @ 228 NONAME - _ZN10QtMobility20QContactActionFilter9setVendorERK7QStringi @ 229 NONAME - _ZN10QtMobility20QContactActionFilterC1ERKNS_14QContactFilterE @ 230 NONAME - _ZN10QtMobility20QContactActionFilterC1Ev @ 231 NONAME - _ZN10QtMobility20QContactActionFilterC2ERKNS_14QContactFilterE @ 232 NONAME - _ZN10QtMobility20QContactActionFilterC2Ev @ 233 NONAME - _ZN10QtMobility20QContactDetailFilter13setMatchFlagsE6QFlagsINS_14QContactFilter9MatchFlagEE @ 234 NONAME - _ZN10QtMobility20QContactDetailFilter23setDetailDefinitionNameERK7QStringS3_ @ 235 NONAME - _ZN10QtMobility20QContactDetailFilter8setValueERK8QVariant @ 236 NONAME - _ZN10QtMobility20QContactDetailFilterC1ERKNS_14QContactFilterE @ 237 NONAME - _ZN10QtMobility20QContactDetailFilterC1Ev @ 238 NONAME - _ZN10QtMobility20QContactDetailFilterC2ERKNS_14QContactFilterE @ 239 NONAME - _ZN10QtMobility20QContactDetailFilterC2Ev @ 240 NONAME - _ZN10QtMobility20QContactDisplayLabel10FieldLabelE @ 241 NONAME DATA 6 - _ZN10QtMobility20QContactDisplayLabel14DefinitionNameE @ 242 NONAME DATA 13 - _ZN10QtMobility20QContactEmailAddress14DefinitionNameE @ 243 NONAME DATA 13 - _ZN10QtMobility20QContactEmailAddress17FieldEmailAddressE @ 244 NONAME DATA 13 - _ZN10QtMobility20QContactFetchRequest10setSortingERK5QListINS_17QContactSortOrderEE @ 245 NONAME - _ZN10QtMobility20QContactFetchRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 246 NONAME - _ZN10QtMobility20QContactFetchRequest11qt_metacastEPKc @ 247 NONAME - _ZN10QtMobility20QContactFetchRequest16staticMetaObjectE @ 248 NONAME DATA 16 - _ZN10QtMobility20QContactFetchRequest19getStaticMetaObjectEv @ 249 NONAME - _ZN10QtMobility20QContactFetchRequest25setDefinitionRestrictionsERK11QStringList @ 250 NONAME - _ZN10QtMobility20QContactFetchRequest8progressEPS0_b @ 251 NONAME - _ZN10QtMobility20QContactFetchRequest9setFilterERKNS_14QContactFilterE @ 252 NONAME - _ZN10QtMobility20QContactFetchRequestC1Ev @ 253 NONAME - _ZN10QtMobility20QContactFetchRequestC2Ev @ 254 NONAME - _ZN10QtMobility20QContactFetchRequestD0Ev @ 255 NONAME - _ZN10QtMobility20QContactFetchRequestD1Ev @ 256 NONAME - _ZN10QtMobility20QContactFetchRequestD2Ev @ 257 NONAME - _ZN10QtMobility20QContactMemoryEngine11qt_metacallEN11QMetaObject4CallEiPPv @ 258 NONAME - _ZN10QtMobility20QContactMemoryEngine11qt_metacastEPKc @ 259 NONAME - _ZN10QtMobility20QContactMemoryEngine11saveContactEPNS_8QContactERNS_15QContactManager5ErrorE @ 260 NONAME - _ZN10QtMobility20QContactMemoryEngine11saveContactEPNS_8QContactERNS_17QContactChangeSetERNS_15QContactManager5ErrorE @ 261 NONAME - _ZN10QtMobility20QContactMemoryEngine12saveContactsEP5QListINS_8QContactEERNS_15QContactManager5ErrorE @ 262 NONAME - _ZN10QtMobility20QContactMemoryEngine12startRequestEPNS_23QContactAbstractRequestE @ 263 NONAME - _ZN10QtMobility20QContactMemoryEngine13cancelRequestEPNS_23QContactAbstractRequestE @ 264 NONAME - _ZN10QtMobility20QContactMemoryEngine13removeContactERKjRNS_15QContactManager5ErrorE @ 265 NONAME - _ZN10QtMobility20QContactMemoryEngine13removeContactERKjRNS_17QContactChangeSetERNS_15QContactManager5ErrorE @ 266 NONAME - _ZN10QtMobility20QContactMemoryEngine14removeContactsEP5QListIjERNS_15QContactManager5ErrorE @ 267 NONAME - _ZN10QtMobility20QContactMemoryEngine16requestDestroyedEPNS_23QContactAbstractRequestE @ 268 NONAME - _ZN10QtMobility20QContactMemoryEngine16saveRelationshipEPNS_20QContactRelationshipERNS_15QContactManager5ErrorE @ 269 NONAME - _ZN10QtMobility20QContactMemoryEngine16saveRelationshipEPNS_20QContactRelationshipERNS_17QContactChangeSetERNS_15QContactManager5ErrorE @ 270 NONAME - _ZN10QtMobility20QContactMemoryEngine16setSelfContactIdERKjRNS_15QContactManager5ErrorE @ 271 NONAME - _ZN10QtMobility20QContactMemoryEngine16staticMetaObjectE @ 272 NONAME DATA 16 - _ZN10QtMobility20QContactMemoryEngine17saveRelationshipsEP5QListINS_20QContactRelationshipEERNS_15QContactManager5ErrorE @ 273 NONAME - _ZN10QtMobility20QContactMemoryEngine18createMemoryEngineERK4QMapI7QStringS2_E @ 274 NONAME - _ZN10QtMobility20QContactMemoryEngine18removeRelationshipERKNS_20QContactRelationshipERNS_15QContactManager5ErrorE @ 275 NONAME - _ZN10QtMobility20QContactMemoryEngine18removeRelationshipERKNS_20QContactRelationshipERNS_17QContactChangeSetERNS_15QContactManager5ErrorE @ 276 NONAME - _ZN10QtMobility20QContactMemoryEngine19getStaticMetaObjectEv @ 277 NONAME - _ZN10QtMobility20QContactMemoryEngine19removeRelationshipsERK5QListINS_20QContactRelationshipEERNS_15QContactManager5ErrorE @ 278 NONAME - _ZN10QtMobility20QContactMemoryEngine20saveDetailDefinitionERKNS_24QContactDetailDefinitionERK7QStringRNS_15QContactManager5ErrorE @ 279 NONAME - _ZN10QtMobility20QContactMemoryEngine20saveDetailDefinitionERKNS_24QContactDetailDefinitionERK7QStringRNS_17QContactChangeSetERNS_15QContactManager5ErrorE @ 280 NONAME - _ZN10QtMobility20QContactMemoryEngine22removeDetailDefinitionERK7QStringS3_RNS_15QContactManager5ErrorE @ 281 NONAME - _ZN10QtMobility20QContactMemoryEngine22removeDetailDefinitionERK7QStringS3_RNS_17QContactChangeSetERNS_15QContactManager5ErrorE @ 282 NONAME - _ZN10QtMobility20QContactMemoryEngine22waitForRequestFinishedEPNS_23QContactAbstractRequestEi @ 283 NONAME - _ZN10QtMobility20QContactMemoryEngine22waitForRequestProgressEPNS_23QContactAbstractRequestEi @ 284 NONAME - _ZN10QtMobility20QContactMemoryEngine28performAsynchronousOperationEv @ 285 NONAME - _ZN10QtMobility20QContactMemoryEngine5derefEv @ 286 NONAME - _ZN10QtMobility20QContactMemoryEngine7enginesE @ 287 NONAME DATA 4 - _ZN10QtMobility20QContactMemoryEngineC1ERK4QMapI7QStringS2_E @ 288 NONAME - _ZN10QtMobility20QContactMemoryEngineC2ERK4QMapI7QStringS2_E @ 289 NONAME - _ZN10QtMobility20QContactOrganization10FieldTitleE @ 290 NONAME DATA 6 - _ZN10QtMobility20QContactOrganization13FieldLocationE @ 291 NONAME DATA 9 - _ZN10QtMobility20QContactOrganization14DefinitionNameE @ 292 NONAME DATA 13 - _ZN10QtMobility20QContactOrganization15FieldDepartmentE @ 293 NONAME DATA 11 - _ZN10QtMobility20QContactOrganization18FieldAssistantNameE @ 294 NONAME DATA 14 - _ZN10QtMobility20QContactOrganization9FieldLogoE @ 295 NONAME DATA 5 - _ZN10QtMobility20QContactOrganization9FieldNameE @ 296 NONAME DATA 5 - _ZN10QtMobility20QContactOrganization9FieldRoleE @ 297 NONAME DATA 5 - _ZN10QtMobility20QContactRelationship10AggregatesE @ 298 NONAME DATA 11 - _ZN10QtMobility20QContactRelationship10HasManagerE @ 299 NONAME DATA 11 - _ZN10QtMobility20QContactRelationship12HasAssistantE @ 300 NONAME DATA 13 - _ZN10QtMobility20QContactRelationship19setRelationshipTypeERK7QString @ 301 NONAME - _ZN10QtMobility20QContactRelationship2IsE @ 302 NONAME DATA 3 - _ZN10QtMobility20QContactRelationship8setFirstERKNS_10QContactIdE @ 303 NONAME - _ZN10QtMobility20QContactRelationship9HasMemberE @ 304 NONAME DATA 10 - _ZN10QtMobility20QContactRelationship9HasSpouseE @ 305 NONAME DATA 10 - _ZN10QtMobility20QContactRelationship9setSecondERKNS_10QContactIdE @ 306 NONAME - _ZN10QtMobility20QContactRelationshipC1ERKS0_ @ 307 NONAME - _ZN10QtMobility20QContactRelationshipC1Ev @ 308 NONAME - _ZN10QtMobility20QContactRelationshipC2ERKS0_ @ 309 NONAME - _ZN10QtMobility20QContactRelationshipC2Ev @ 310 NONAME - _ZN10QtMobility20QContactRelationshipD1Ev @ 311 NONAME - _ZN10QtMobility20QContactRelationshipD2Ev @ 312 NONAME - _ZN10QtMobility20QContactRelationshipaSERKS0_ @ 313 NONAME - _ZN10QtMobility21QContactActionFactory11qt_metacallEN11QMetaObject4CallEiPPv @ 314 NONAME - _ZN10QtMobility21QContactActionFactory11qt_metacastEPKc @ 315 NONAME - _ZN10QtMobility21QContactActionFactory16staticMetaObjectE @ 316 NONAME DATA 16 - _ZN10QtMobility21QContactActionFactory19getStaticMetaObjectEv @ 317 NONAME - _ZN10QtMobility21QContactActionFactoryD0Ev @ 318 NONAME - _ZN10QtMobility21QContactActionFactoryD1Ev @ 319 NONAME - _ZN10QtMobility21QContactActionFactoryD2Ev @ 320 NONAME - _ZN10QtMobility21QContactInvalidFilterC1ERKNS_14QContactFilterE @ 321 NONAME - _ZN10QtMobility21QContactInvalidFilterC1Ev @ 322 NONAME - _ZN10QtMobility21QContactInvalidFilterC2ERKNS_14QContactFilterE @ 323 NONAME - _ZN10QtMobility21QContactInvalidFilterC2Ev @ 324 NONAME - _ZN10QtMobility21QContactLocalIdFilter6setIdsERK5QListIjE @ 325 NONAME - _ZN10QtMobility21QContactLocalIdFilterC1ERKNS_14QContactFilterE @ 326 NONAME - _ZN10QtMobility21QContactLocalIdFilterC1Ev @ 327 NONAME - _ZN10QtMobility21QContactLocalIdFilterC2ERKNS_14QContactFilterE @ 328 NONAME - _ZN10QtMobility21QContactLocalIdFilterC2Ev @ 329 NONAME - _ZN10QtMobility21QContactManagerEngine10testFilterERKNS_14QContactFilterERKNS_8QContactE @ 330 NONAME - _ZN10QtMobility21QContactManagerEngine11dataChangedEv @ 331 NONAME - _ZN10QtMobility21QContactManagerEngine11qt_metacallEN11QMetaObject4CallEiPPv @ 332 NONAME - _ZN10QtMobility21QContactManagerEngine11qt_metacastEPKc @ 333 NONAME - _ZN10QtMobility21QContactManagerEngine11saveContactEPNS_8QContactERNS_15QContactManager5ErrorE @ 334 NONAME - _ZN10QtMobility21QContactManagerEngine12saveContactsEP5QListINS_8QContactEERNS_15QContactManager5ErrorE @ 335 NONAME - _ZN10QtMobility21QContactManagerEngine12sortContactsERK5QListINS_8QContactEERKS1_INS_17QContactSortOrderEE @ 336 NONAME - _ZN10QtMobility21QContactManagerEngine12startRequestEPNS_23QContactAbstractRequestE @ 337 NONAME - _ZN10QtMobility21QContactManagerEngine13cancelRequestEPNS_23QContactAbstractRequestE @ 338 NONAME - _ZN10QtMobility21QContactManagerEngine13contactsAddedERK5QListIjE @ 339 NONAME - _ZN10QtMobility21QContactManagerEngine13removeContactERKjRNS_15QContactManager5ErrorE @ 340 NONAME - _ZN10QtMobility21QContactManagerEngine13updateRequestEPNS_23QContactAbstractRequestERK4QMapI7QStringNS_24QContactDetailDefinitionEENS_15QContactManager5ErrorERK5QListISA_ENS1_6StatusEb @ 341 NONAME - _ZN10QtMobility21QContactManagerEngine13updateRequestEPNS_23QContactAbstractRequestERK5QListINS_20QContactRelationshipEENS_15QContactManager5ErrorERKS3_IS9_ENS1_6StatusEb @ 342 NONAME - _ZN10QtMobility21QContactManagerEngine13updateRequestEPNS_23QContactAbstractRequestERK5QListINS_24QContactDetailDefinitionEENS_15QContactManager5ErrorERKS3_IS9_ENS1_6StatusE @ 343 NONAME - _ZN10QtMobility21QContactManagerEngine13updateRequestEPNS_23QContactAbstractRequestERK5QListINS_8QContactEENS_15QContactManager5ErrorERKS3_IS9_ENS1_6StatusEb @ 344 NONAME - _ZN10QtMobility21QContactManagerEngine13updateRequestEPNS_23QContactAbstractRequestERK5QListIjENS_15QContactManager5ErrorERKS3_IS8_ENS1_6StatusEb @ 345 NONAME - _ZN10QtMobility21QContactManagerEngine14compareContactERKNS_8QContactES3_RK5QListINS_17QContactSortOrderEE @ 346 NONAME - _ZN10QtMobility21QContactManagerEngine14compareVariantERK8QVariantS3_N2Qt15CaseSensitivityE @ 347 NONAME - _ZN10QtMobility21QContactManagerEngine14removeContactsEP5QListIjERNS_15QContactManager5ErrorE @ 348 NONAME - _ZN10QtMobility21QContactManagerEngine15contactsChangedERK5QListIjE @ 349 NONAME - _ZN10QtMobility21QContactManagerEngine15contactsRemovedERK5QListIjE @ 350 NONAME - _ZN10QtMobility21QContactManagerEngine16requestDestroyedEPNS_23QContactAbstractRequestE @ 351 NONAME - _ZN10QtMobility21QContactManagerEngine16saveRelationshipEPNS_20QContactRelationshipERNS_15QContactManager5ErrorE @ 352 NONAME - _ZN10QtMobility21QContactManagerEngine16setSelfContactIdERKjRNS_15QContactManager5ErrorE @ 353 NONAME - _ZN10QtMobility21QContactManagerEngine16staticMetaObjectE @ 354 NONAME DATA 16 - _ZN10QtMobility21QContactManagerEngine17saveRelationshipsEP5QListINS_20QContactRelationshipEERNS_15QContactManager5ErrorE @ 355 NONAME - _ZN10QtMobility21QContactManagerEngine17schemaDefinitionsEv @ 356 NONAME - _ZN10QtMobility21QContactManagerEngine18relationshipsAddedERK5QListIjE @ 357 NONAME - _ZN10QtMobility21QContactManagerEngine18removeRelationshipERKNS_20QContactRelationshipERNS_15QContactManager5ErrorE @ 358 NONAME - _ZN10QtMobility21QContactManagerEngine19getStaticMetaObjectEv @ 359 NONAME - _ZN10QtMobility21QContactManagerEngine19removeRelationshipsERK5QListINS_20QContactRelationshipEERNS_15QContactManager5ErrorE @ 360 NONAME - _ZN10QtMobility21QContactManagerEngine19updateRequestStatusEPNS_23QContactAbstractRequestENS_15QContactManager5ErrorER5QListIS4_ENS1_6StatusEb @ 361 NONAME - _ZN10QtMobility21QContactManagerEngine20relationshipsRemovedERK5QListIjE @ 362 NONAME - _ZN10QtMobility21QContactManagerEngine20saveDetailDefinitionERKNS_24QContactDetailDefinitionERK7QStringRNS_15QContactManager5ErrorE @ 363 NONAME - _ZN10QtMobility21QContactManagerEngine20selfContactIdChangedERKjS2_ @ 364 NONAME - _ZN10QtMobility21QContactManagerEngine20validateActionFilterERKNS_14QContactFilterE @ 365 NONAME - _ZN10QtMobility21QContactManagerEngine22removeDetailDefinitionERK7QStringS3_RNS_15QContactManager5ErrorE @ 366 NONAME - _ZN10QtMobility21QContactManagerEngine22waitForRequestFinishedEPNS_23QContactAbstractRequestEi @ 367 NONAME - _ZN10QtMobility21QContactManagerEngine22waitForRequestProgressEPNS_23QContactAbstractRequestEi @ 368 NONAME - _ZN10QtMobility21QContactManagerEngine23setContactRelationshipsEPNS_8QContactERK5QListINS_20QContactRelationshipEE @ 369 NONAME - _ZN10QtMobility21QContactManagerEngine7versionEv @ 370 NONAME - _ZN10QtMobility21QContactManagerEngine9addSortedEP5QListINS_8QContactEERKS2_RKS1_INS_17QContactSortOrderEE @ 371 NONAME - _ZN10QtMobility21QContactOnlineAccount10SubTypeSipE @ 372 NONAME DATA 4 - _ZN10QtMobility21QContactOnlineAccount11SubTypeImppE @ 373 NONAME DATA 5 - _ZN10QtMobility21QContactOnlineAccount12PresenceAwayE @ 374 NONAME DATA 5 - _ZN10QtMobility21QContactOnlineAccount12PresenceBusyE @ 375 NONAME DATA 5 - _ZN10QtMobility21QContactOnlineAccount13FieldNicknameE @ 376 NONAME DATA 9 - _ZN10QtMobility21QContactOnlineAccount13FieldPresenceE @ 377 NONAME DATA 9 - _ZN10QtMobility21QContactOnlineAccount13FieldSubTypesE @ 378 NONAME DATA 9 - _ZN10QtMobility21QContactOnlineAccount14DefinitionNameE @ 379 NONAME DATA 14 - _ZN10QtMobility21QContactOnlineAccount14PresenceHiddenE @ 380 NONAME DATA 7 - _ZN10QtMobility21QContactOnlineAccount14SubTypeSipVoipE @ 381 NONAME DATA 8 - _ZN10QtMobility21QContactOnlineAccount15FieldAccountUriE @ 382 NONAME DATA 11 - _ZN10QtMobility21QContactOnlineAccount15PresenceOfflineE @ 383 NONAME DATA 8 - _ZN10QtMobility21QContactOnlineAccount15PresenceUnknownE @ 384 NONAME DATA 8 - _ZN10QtMobility21QContactOnlineAccount17PresenceAvailableE @ 385 NONAME DATA 10 - _ZN10QtMobility21QContactOnlineAccount17SubTypeVideoShareE @ 386 NONAME DATA 11 - _ZN10QtMobility21QContactOnlineAccount18FieldStatusMessageE @ 387 NONAME DATA 14 - _ZN10QtMobility21QContactOnlineAccount20FieldServiceProviderE @ 388 NONAME DATA 16 - _ZN10QtMobility21QContactOnlineAccount20PresenceExtendedAwayE @ 389 NONAME DATA 13 - _ZN10QtMobility21QContactRemoveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 390 NONAME - _ZN10QtMobility21QContactRemoveRequest11qt_metacastEPKc @ 391 NONAME - _ZN10QtMobility21QContactRemoveRequest16staticMetaObjectE @ 392 NONAME DATA 16 - _ZN10QtMobility21QContactRemoveRequest19getStaticMetaObjectEv @ 393 NONAME - _ZN10QtMobility21QContactRemoveRequest8progressEPS0_ @ 394 NONAME - _ZN10QtMobility21QContactRemoveRequest9setFilterERKNS_14QContactFilterE @ 395 NONAME - _ZN10QtMobility21QContactRemoveRequestC1Ev @ 396 NONAME - _ZN10QtMobility21QContactRemoveRequestC2Ev @ 397 NONAME - _ZN10QtMobility21QContactRemoveRequestD0Ev @ 398 NONAME - _ZN10QtMobility21QContactRemoveRequestD1Ev @ 399 NONAME - _ZN10QtMobility21QContactRemoveRequestD2Ev @ 400 NONAME - _ZN10QtMobility23QContactAbstractRequest10setManagerEPNS_15QContactManagerE @ 401 NONAME - _ZN10QtMobility23QContactAbstractRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 402 NONAME - _ZN10QtMobility23QContactAbstractRequest11qt_metacastEPKc @ 403 NONAME - _ZN10QtMobility23QContactAbstractRequest15waitForFinishedEi @ 404 NONAME - _ZN10QtMobility23QContactAbstractRequest15waitForProgressEi @ 405 NONAME - _ZN10QtMobility23QContactAbstractRequest16staticMetaObjectE @ 406 NONAME DATA 16 - _ZN10QtMobility23QContactAbstractRequest19getStaticMetaObjectEv @ 407 NONAME - _ZN10QtMobility23QContactAbstractRequest5startEv @ 408 NONAME - _ZN10QtMobility23QContactAbstractRequest6cancelEv @ 409 NONAME - _ZN10QtMobility23QContactAbstractRequestC1EPNS_30QContactAbstractRequestPrivateE @ 410 NONAME - _ZN10QtMobility23QContactAbstractRequestC2EPNS_30QContactAbstractRequestPrivateE @ 411 NONAME - _ZN10QtMobility23QContactAbstractRequestD0Ev @ 412 NONAME - _ZN10QtMobility23QContactAbstractRequestD1Ev @ 413 NONAME - _ZN10QtMobility23QContactAbstractRequestD2Ev @ 414 NONAME - _ZN10QtMobility23QContactChangeLogFilter12setEventTypeENS0_9EventTypeE @ 415 NONAME - _ZN10QtMobility23QContactChangeLogFilter8setSinceERK9QDateTime @ 416 NONAME - _ZN10QtMobility23QContactChangeLogFilterC1ENS0_9EventTypeE @ 417 NONAME - _ZN10QtMobility23QContactChangeLogFilterC1ERKNS_14QContactFilterE @ 418 NONAME - _ZN10QtMobility23QContactChangeLogFilterC2ENS0_9EventTypeE @ 419 NONAME - _ZN10QtMobility23QContactChangeLogFilterC2ERKNS_14QContactFilterE @ 420 NONAME - _ZN10QtMobility24QContactActionDescriptor13setActionNameERK7QString @ 421 NONAME - _ZN10QtMobility24QContactActionDescriptor13setVendorNameERK7QString @ 422 NONAME - _ZN10QtMobility24QContactActionDescriptor24setImplementationVersionEi @ 423 NONAME - _ZN10QtMobility24QContactActionDescriptorC1ERK7QStringS3_i @ 424 NONAME - _ZN10QtMobility24QContactActionDescriptorC1ERKS0_ @ 425 NONAME - _ZN10QtMobility24QContactActionDescriptorC2ERK7QStringS3_i @ 426 NONAME - _ZN10QtMobility24QContactActionDescriptorC2ERKS0_ @ 427 NONAME - _ZN10QtMobility24QContactActionDescriptorD1Ev @ 428 NONAME - _ZN10QtMobility24QContactActionDescriptorD2Ev @ 429 NONAME - _ZN10QtMobility24QContactActionDescriptoraSERKS0_ @ 430 NONAME - _ZN10QtMobility24QContactDetailDefinition19setAccessConstraintERKNS0_16AccessConstraintE @ 431 NONAME - _ZN10QtMobility24QContactDetailDefinition6fieldsEv @ 432 NONAME - _ZN10QtMobility24QContactDetailDefinition7setNameERK7QString @ 433 NONAME - _ZN10QtMobility24QContactDetailDefinition9setFieldsERK4QMapI7QStringNS_29QContactDetailDefinitionFieldEE @ 434 NONAME - _ZN10QtMobility24QContactDetailDefinition9setUniqueEb @ 435 NONAME - _ZN10QtMobility24QContactDetailDefinitionC1ERKS0_ @ 436 NONAME - _ZN10QtMobility24QContactDetailDefinitionC1Ev @ 437 NONAME - _ZN10QtMobility24QContactDetailDefinitionC2ERKS0_ @ 438 NONAME - _ZN10QtMobility24QContactDetailDefinitionC2Ev @ 439 NONAME - _ZN10QtMobility24QContactDetailDefinitionD1Ev @ 440 NONAME - _ZN10QtMobility24QContactDetailDefinitionD2Ev @ 441 NONAME - _ZN10QtMobility24QContactDetailDefinitionaSERKS0_ @ 442 NONAME - _ZN10QtMobility25QContactDetailRangeFilter13setMatchFlagsE6QFlagsINS_14QContactFilter9MatchFlagEE @ 443 NONAME - _ZN10QtMobility25QContactDetailRangeFilter23setDetailDefinitionNameERK7QStringS3_ @ 444 NONAME - _ZN10QtMobility25QContactDetailRangeFilter8setRangeERK8QVariantS3_6QFlagsINS0_9RangeFlagEE @ 445 NONAME - _ZN10QtMobility25QContactDetailRangeFilterC1ERKNS_14QContactFilterE @ 446 NONAME - _ZN10QtMobility25QContactDetailRangeFilterC1Ev @ 447 NONAME - _ZN10QtMobility25QContactDetailRangeFilterC2ERKNS_14QContactFilterE @ 448 NONAME - _ZN10QtMobility25QContactDetailRangeFilterC2Ev @ 449 NONAME - _ZN10QtMobility26QContactIntersectionFilter10setFiltersERK5QListINS_14QContactFilterEE @ 450 NONAME - _ZN10QtMobility26QContactIntersectionFilter6appendERKNS_14QContactFilterE @ 451 NONAME - _ZN10QtMobility26QContactIntersectionFilter6removeERKNS_14QContactFilterE @ 452 NONAME - _ZN10QtMobility26QContactIntersectionFilter7prependERKNS_14QContactFilterE @ 453 NONAME - _ZN10QtMobility26QContactIntersectionFilterC1ERKNS_14QContactFilterE @ 454 NONAME - _ZN10QtMobility26QContactIntersectionFilterC1Ev @ 455 NONAME - _ZN10QtMobility26QContactIntersectionFilterC2ERKNS_14QContactFilterE @ 456 NONAME - _ZN10QtMobility26QContactIntersectionFilterC2Ev @ 457 NONAME - _ZN10QtMobility26QContactIntersectionFilterlsERKNS_14QContactFilterE @ 458 NONAME - _ZN10QtMobility26QContactRelationshipFilter19setRelationshipTypeERK7QString @ 459 NONAME - _ZN10QtMobility26QContactRelationshipFilter21setOtherParticipantIdERKNS_10QContactIdE @ 460 NONAME - _ZN10QtMobility26QContactRelationshipFilter7setRoleENS0_4RoleE @ 461 NONAME - _ZN10QtMobility26QContactRelationshipFilterC1ERKNS_14QContactFilterE @ 462 NONAME - _ZN10QtMobility26QContactRelationshipFilterC1Ev @ 463 NONAME - _ZN10QtMobility26QContactRelationshipFilterC2ERKNS_14QContactFilterE @ 464 NONAME - _ZN10QtMobility26QContactRelationshipFilterC2Ev @ 465 NONAME - _ZN10QtMobility27QContactLocalIdFetchRequest10setSortingERK5QListINS_17QContactSortOrderEE @ 466 NONAME - _ZN10QtMobility27QContactLocalIdFetchRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 467 NONAME - _ZN10QtMobility27QContactLocalIdFetchRequest11qt_metacastEPKc @ 468 NONAME - _ZN10QtMobility27QContactLocalIdFetchRequest16staticMetaObjectE @ 469 NONAME DATA 16 - _ZN10QtMobility27QContactLocalIdFetchRequest19getStaticMetaObjectEv @ 470 NONAME - _ZN10QtMobility27QContactLocalIdFetchRequest8progressEPS0_b @ 471 NONAME - _ZN10QtMobility27QContactLocalIdFetchRequest9setFilterERKNS_14QContactFilterE @ 472 NONAME - _ZN10QtMobility27QContactLocalIdFetchRequestC1Ev @ 473 NONAME - _ZN10QtMobility27QContactLocalIdFetchRequestC2Ev @ 474 NONAME - _ZN10QtMobility27QContactLocalIdFetchRequestD0Ev @ 475 NONAME - _ZN10QtMobility27QContactLocalIdFetchRequestD1Ev @ 476 NONAME - _ZN10QtMobility27QContactLocalIdFetchRequestD2Ev @ 477 NONAME - _ZN10QtMobility29QContactDetailDefinitionField11setDataTypeEN8QVariant4TypeE @ 478 NONAME - _ZN10QtMobility29QContactDetailDefinitionField18setAllowableValuesE5QListI8QVariantE @ 479 NONAME - _ZN10QtMobility29QContactDetailDefinitionField19setAccessConstraintENS0_16AccessConstraintE @ 480 NONAME - _ZN10QtMobility29QContactDetailDefinitionFieldC1ERKS0_ @ 481 NONAME - _ZN10QtMobility29QContactDetailDefinitionFieldC1Ev @ 482 NONAME - _ZN10QtMobility29QContactDetailDefinitionFieldC2ERKS0_ @ 483 NONAME - _ZN10QtMobility29QContactDetailDefinitionFieldC2Ev @ 484 NONAME - _ZN10QtMobility29QContactDetailDefinitionFieldD1Ev @ 485 NONAME - _ZN10QtMobility29QContactDetailDefinitionFieldD2Ev @ 486 NONAME - _ZN10QtMobility29QContactDetailDefinitionFieldaSERKS0_ @ 487 NONAME - _ZN10QtMobility31QContactRelationshipSaveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 488 NONAME - _ZN10QtMobility31QContactRelationshipSaveRequest11qt_metacastEPKc @ 489 NONAME - _ZN10QtMobility31QContactRelationshipSaveRequest16setRelationshipsERK5QListINS_20QContactRelationshipEE @ 490 NONAME - _ZN10QtMobility31QContactRelationshipSaveRequest16staticMetaObjectE @ 491 NONAME DATA 16 - _ZN10QtMobility31QContactRelationshipSaveRequest19getStaticMetaObjectEv @ 492 NONAME - _ZN10QtMobility31QContactRelationshipSaveRequest8progressEPS0_ @ 493 NONAME - _ZN10QtMobility31QContactRelationshipSaveRequestC1Ev @ 494 NONAME - _ZN10QtMobility31QContactRelationshipSaveRequestC2Ev @ 495 NONAME - _ZN10QtMobility31QContactRelationshipSaveRequestD0Ev @ 496 NONAME - _ZN10QtMobility31QContactRelationshipSaveRequestD1Ev @ 497 NONAME - _ZN10QtMobility31QContactRelationshipSaveRequestD2Ev @ 498 NONAME - _ZN10QtMobility32QContactRelationshipFetchRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 499 NONAME - _ZN10QtMobility32QContactRelationshipFetchRequest11qt_metacastEPKc @ 500 NONAME - _ZN10QtMobility32QContactRelationshipFetchRequest14setParticipantERKNS_10QContactIdENS_26QContactRelationshipFilter4RoleE @ 501 NONAME - _ZN10QtMobility32QContactRelationshipFetchRequest16staticMetaObjectE @ 502 NONAME DATA 16 - _ZN10QtMobility32QContactRelationshipFetchRequest19getStaticMetaObjectEv @ 503 NONAME - _ZN10QtMobility32QContactRelationshipFetchRequest19setRelationshipTypeERK7QString @ 504 NONAME - _ZN10QtMobility32QContactRelationshipFetchRequest8progressEPS0_b @ 505 NONAME - _ZN10QtMobility32QContactRelationshipFetchRequest8setFirstERKNS_10QContactIdE @ 506 NONAME - _ZN10QtMobility32QContactRelationshipFetchRequestC1Ev @ 507 NONAME - _ZN10QtMobility32QContactRelationshipFetchRequestC2Ev @ 508 NONAME - _ZN10QtMobility32QContactRelationshipFetchRequestD0Ev @ 509 NONAME - _ZN10QtMobility32QContactRelationshipFetchRequestD1Ev @ 510 NONAME - _ZN10QtMobility32QContactRelationshipFetchRequestD2Ev @ 511 NONAME - _ZN10QtMobility33QContactRelationshipRemoveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 512 NONAME - _ZN10QtMobility33QContactRelationshipRemoveRequest11qt_metacastEPKc @ 513 NONAME - _ZN10QtMobility33QContactRelationshipRemoveRequest16staticMetaObjectE @ 514 NONAME DATA 16 - _ZN10QtMobility33QContactRelationshipRemoveRequest19getStaticMetaObjectEv @ 515 NONAME - _ZN10QtMobility33QContactRelationshipRemoveRequest19setRelationshipTypeERK7QString @ 516 NONAME - _ZN10QtMobility33QContactRelationshipRemoveRequest8progressEPS0_ @ 517 NONAME - _ZN10QtMobility33QContactRelationshipRemoveRequest8setFirstERKNS_10QContactIdE @ 518 NONAME - _ZN10QtMobility33QContactRelationshipRemoveRequest9setSecondERKNS_10QContactIdE @ 519 NONAME - _ZN10QtMobility33QContactRelationshipRemoveRequestC1Ev @ 520 NONAME - _ZN10QtMobility33QContactRelationshipRemoveRequestC2Ev @ 521 NONAME - _ZN10QtMobility33QContactRelationshipRemoveRequestD0Ev @ 522 NONAME - _ZN10QtMobility33QContactRelationshipRemoveRequestD1Ev @ 523 NONAME - _ZN10QtMobility33QContactRelationshipRemoveRequestD2Ev @ 524 NONAME - _ZN10QtMobility35QContactDetailDefinitionSaveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 525 NONAME - _ZN10QtMobility35QContactDetailDefinitionSaveRequest11qt_metacastEPKc @ 526 NONAME - _ZN10QtMobility35QContactDetailDefinitionSaveRequest14setContactTypeERK7QString @ 527 NONAME - _ZN10QtMobility35QContactDetailDefinitionSaveRequest14setDefinitionsERK5QListINS_24QContactDetailDefinitionEE @ 528 NONAME - _ZN10QtMobility35QContactDetailDefinitionSaveRequest16staticMetaObjectE @ 529 NONAME DATA 16 - _ZN10QtMobility35QContactDetailDefinitionSaveRequest19getStaticMetaObjectEv @ 530 NONAME - _ZN10QtMobility35QContactDetailDefinitionSaveRequest8progressEPS0_ @ 531 NONAME - _ZN10QtMobility35QContactDetailDefinitionSaveRequestC1Ev @ 532 NONAME - _ZN10QtMobility35QContactDetailDefinitionSaveRequestC2Ev @ 533 NONAME - _ZN10QtMobility35QContactDetailDefinitionSaveRequestD0Ev @ 534 NONAME - _ZN10QtMobility35QContactDetailDefinitionSaveRequestD1Ev @ 535 NONAME - _ZN10QtMobility35QContactDetailDefinitionSaveRequestD2Ev @ 536 NONAME - _ZN10QtMobility36QContactDetailDefinitionFetchRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 537 NONAME - _ZN10QtMobility36QContactDetailDefinitionFetchRequest11qt_metacastEPKc @ 538 NONAME - _ZN10QtMobility36QContactDetailDefinitionFetchRequest14setContactTypeERK7QString @ 539 NONAME - _ZN10QtMobility36QContactDetailDefinitionFetchRequest16staticMetaObjectE @ 540 NONAME DATA 16 - _ZN10QtMobility36QContactDetailDefinitionFetchRequest19getStaticMetaObjectEv @ 541 NONAME - _ZN10QtMobility36QContactDetailDefinitionFetchRequest8progressEPS0_b @ 542 NONAME - _ZN10QtMobility36QContactDetailDefinitionFetchRequest8setNamesERK11QStringList @ 543 NONAME - _ZN10QtMobility36QContactDetailDefinitionFetchRequestC1Ev @ 544 NONAME - _ZN10QtMobility36QContactDetailDefinitionFetchRequestC2Ev @ 545 NONAME - _ZN10QtMobility36QContactDetailDefinitionFetchRequestD0Ev @ 546 NONAME - _ZN10QtMobility36QContactDetailDefinitionFetchRequestD1Ev @ 547 NONAME - _ZN10QtMobility36QContactDetailDefinitionFetchRequestD2Ev @ 548 NONAME - _ZN10QtMobility37QContactDetailDefinitionRemoveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 549 NONAME - _ZN10QtMobility37QContactDetailDefinitionRemoveRequest11qt_metacastEPKc @ 550 NONAME - _ZN10QtMobility37QContactDetailDefinitionRemoveRequest14setContactTypeERK7QString @ 551 NONAME - _ZN10QtMobility37QContactDetailDefinitionRemoveRequest16staticMetaObjectE @ 552 NONAME DATA 16 - _ZN10QtMobility37QContactDetailDefinitionRemoveRequest19getStaticMetaObjectEv @ 553 NONAME - _ZN10QtMobility37QContactDetailDefinitionRemoveRequest8progressEPS0_ @ 554 NONAME - _ZN10QtMobility37QContactDetailDefinitionRemoveRequest8setNamesERK11QStringList @ 555 NONAME - _ZN10QtMobility37QContactDetailDefinitionRemoveRequestC1Ev @ 556 NONAME - _ZN10QtMobility37QContactDetailDefinitionRemoveRequestC2Ev @ 557 NONAME - _ZN10QtMobility37QContactDetailDefinitionRemoveRequestD0Ev @ 558 NONAME - _ZN10QtMobility37QContactDetailDefinitionRemoveRequestD1Ev @ 559 NONAME - _ZN10QtMobility37QContactDetailDefinitionRemoveRequestD2Ev @ 560 NONAME - _ZN10QtMobility8QContact10saveDetailEPNS_14QContactDetailE @ 561 NONAME - _ZN10QtMobility8QContact12clearDetailsEv @ 562 NONAME - _ZN10QtMobility8QContact12removeDetailEPNS_14QContactDetailE @ 563 NONAME - _ZN10QtMobility8QContact18setPreferredDetailERK7QStringRKNS_14QContactDetailE @ 564 NONAME - _ZN10QtMobility8QContact20setRelationshipOrderERK5QListINS_20QContactRelationshipEE @ 565 NONAME - _ZN10QtMobility8QContact5setIdERKNS_10QContactIdE @ 566 NONAME - _ZN10QtMobility8QContact7setTypeERK7QString @ 567 NONAME - _ZN10QtMobility8QContact7setTypeERKNS_12QContactTypeE @ 568 NONAME - _ZN10QtMobility8QContactC1ERKS0_ @ 569 NONAME - _ZN10QtMobility8QContactC1Ev @ 570 NONAME - _ZN10QtMobility8QContactC2ERKS0_ @ 571 NONAME - _ZN10QtMobility8QContactC2Ev @ 572 NONAME - _ZN10QtMobility8QContactD1Ev @ 573 NONAME - _ZN10QtMobility8QContactD2Ev @ 574 NONAME - _ZN10QtMobility8QContactaSERKS0_ @ 575 NONAME - _ZN10QtMobilityanERKNS_14QContactFilterES2_ @ 576 NONAME - _ZN10QtMobilityorERKNS_14QContactFilterES2_ @ 577 NONAME - _ZNK10QtMobility10QContactId10managerUriEv @ 578 NONAME - _ZNK10QtMobility10QContactId7localIdEv @ 579 NONAME - _ZNK10QtMobility10QContactIdeqERKS0_ @ 580 NONAME - _ZNK10QtMobility10QContactIdneERKS0_ @ 581 NONAME - _ZNK10QtMobility14QContactAction10metaObjectEv @ 582 NONAME - _ZNK10QtMobility14QContactAction16supportedDetailsERKNS_8QContactE @ 583 NONAME - _ZNK10QtMobility14QContactDetail12variantValueERK7QString @ 584 NONAME - _ZNK10QtMobility14QContactDetail14definitionNameEv @ 585 NONAME - _ZNK10QtMobility14QContactDetail16preferredActionsEv @ 586 NONAME - _ZNK10QtMobility14QContactDetail5valueERK7QString @ 587 NONAME - _ZNK10QtMobility14QContactDetail6valuesEv @ 588 NONAME - _ZNK10QtMobility14QContactDetail7isEmptyEv @ 589 NONAME - _ZNK10QtMobility14QContactDetail8hasValueERK7QString @ 590 NONAME - _ZNK10QtMobility14QContactDetaileqERKS0_ @ 591 NONAME - _ZNK10QtMobility14QContactFilter4typeEv @ 592 NONAME - _ZNK10QtMobility14QContactFiltereqERKS0_ @ 593 NONAME - _ZNK10QtMobility15QContactManager10hasFeatureENS0_14ManagerFeatureERK7QString @ 594 NONAME - _ZNK10QtMobility15QContactManager10managerUriEv @ 595 NONAME - _ZNK10QtMobility15QContactManager10metaObjectEv @ 596 NONAME - _ZNK10QtMobility15QContactManager11managerNameEv @ 597 NONAME - _ZNK10QtMobility15QContactManager13relationshipsERK7QStringRKNS_10QContactIdENS_26QContactRelationshipFilter4RoleE @ 598 NONAME - _ZNK10QtMobility15QContactManager13relationshipsERKNS_10QContactIdENS_26QContactRelationshipFilter4RoleE @ 599 NONAME - _ZNK10QtMobility15QContactManager13selfContactIdEv @ 600 NONAME - _ZNK10QtMobility15QContactManager15filterSupportedERKNS_14QContactFilterE @ 601 NONAME - _ZNK10QtMobility15QContactManager16detailDefinitionERK7QStringS3_ @ 602 NONAME - _ZNK10QtMobility15QContactManager17detailDefinitionsERK7QString @ 603 NONAME - _ZNK10QtMobility15QContactManager17managerParametersEv @ 604 NONAME - _ZNK10QtMobility15QContactManager18supportedDataTypesEv @ 605 NONAME - _ZNK10QtMobility15QContactManager21implementationVersionEv @ 606 NONAME - _ZNK10QtMobility15QContactManager21supportedContactTypesEv @ 607 NONAME - _ZNK10QtMobility15QContactManager22synthesizeDisplayLabelERKNS_8QContactE @ 608 NONAME - _ZNK10QtMobility15QContactManager26supportedRelationshipTypesERK7QString @ 609 NONAME - _ZNK10QtMobility15QContactManager5errorEv @ 610 NONAME - _ZNK10QtMobility15QContactManager7contactERKj @ 611 NONAME - _ZNK10QtMobility15QContactManager8contactsERK5QListINS_17QContactSortOrderEE @ 612 NONAME - _ZNK10QtMobility15QContactManager8contactsERKNS_14QContactFilterERK5QListINS_17QContactSortOrderEE @ 613 NONAME - _ZNK10QtMobility17QContactSortOrder11blankPolicyEv @ 614 NONAME - _ZNK10QtMobility17QContactSortOrder15caseSensitivityEv @ 615 NONAME - _ZNK10QtMobility17QContactSortOrder15detailFieldNameEv @ 616 NONAME - _ZNK10QtMobility17QContactSortOrder20detailDefinitionNameEv @ 617 NONAME - _ZNK10QtMobility17QContactSortOrder7isValidEv @ 618 NONAME - _ZNK10QtMobility17QContactSortOrder9directionEv @ 619 NONAME - _ZNK10QtMobility17QContactSortOrdereqERKS0_ @ 620 NONAME - _ZNK10QtMobility19QContactSaveRequest10metaObjectEv @ 621 NONAME - _ZNK10QtMobility19QContactSaveRequest8contactsEv @ 622 NONAME - _ZNK10QtMobility19QContactUnionFilter7filtersEv @ 623 NONAME - _ZNK10QtMobility20QContactActionFilter10actionNameEv @ 624 NONAME - _ZNK10QtMobility20QContactActionFilter10vendorNameEv @ 625 NONAME - _ZNK10QtMobility20QContactActionFilter21implementationVersionEv @ 626 NONAME - _ZNK10QtMobility20QContactActionFilter5valueEv @ 627 NONAME - _ZNK10QtMobility20QContactDetailFilter10matchFlagsEv @ 628 NONAME - _ZNK10QtMobility20QContactDetailFilter15detailFieldNameEv @ 629 NONAME - _ZNK10QtMobility20QContactDetailFilter20detailDefinitionNameEv @ 630 NONAME - _ZNK10QtMobility20QContactDetailFilter5valueEv @ 631 NONAME - _ZNK10QtMobility20QContactFetchRequest10metaObjectEv @ 632 NONAME - _ZNK10QtMobility20QContactFetchRequest22definitionRestrictionsEv @ 633 NONAME - _ZNK10QtMobility20QContactFetchRequest6filterEv @ 634 NONAME - _ZNK10QtMobility20QContactFetchRequest7sortingEv @ 635 NONAME - _ZNK10QtMobility20QContactFetchRequest8contactsEv @ 636 NONAME - _ZNK10QtMobility20QContactMemoryEngine10hasFeatureENS_15QContactManager14ManagerFeatureERK7QString @ 637 NONAME - _ZNK10QtMobility20QContactMemoryEngine10metaObjectEv @ 638 NONAME - _ZNK10QtMobility20QContactMemoryEngine11managerNameEv @ 639 NONAME - _ZNK10QtMobility20QContactMemoryEngine13relationshipsERK7QStringRKNS_10QContactIdENS_26QContactRelationshipFilter4RoleERNS_15QContactManager5ErrorE @ 640 NONAME - _ZNK10QtMobility20QContactMemoryEngine13selfContactIdERNS_15QContactManager5ErrorE @ 641 NONAME - _ZNK10QtMobility20QContactMemoryEngine15filterSupportedERKNS_14QContactFilterE @ 642 NONAME - _ZNK10QtMobility20QContactMemoryEngine17detailDefinitionsERK7QStringRNS_15QContactManager5ErrorE @ 643 NONAME - _ZNK10QtMobility20QContactMemoryEngine17managerParametersEv @ 644 NONAME - _ZNK10QtMobility20QContactMemoryEngine18supportedDataTypesEv @ 645 NONAME - _ZNK10QtMobility20QContactMemoryEngine21implementationVersionEv @ 646 NONAME - _ZNK10QtMobility20QContactMemoryEngine7contactERKjRNS_15QContactManager5ErrorE @ 647 NONAME - _ZNK10QtMobility20QContactMemoryEngine8contactsERK5QListINS_17QContactSortOrderEERNS_15QContactManager5ErrorE @ 648 NONAME - _ZNK10QtMobility20QContactRelationship16relationshipTypeEv @ 649 NONAME - _ZNK10QtMobility20QContactRelationship5firstEv @ 650 NONAME - _ZNK10QtMobility20QContactRelationship6secondEv @ 651 NONAME - _ZNK10QtMobility20QContactRelationshipeqERKS0_ @ 652 NONAME - _ZNK10QtMobility21QContactActionFactory10metaObjectEv @ 653 NONAME - _ZNK10QtMobility21QContactLocalIdFilter3idsEv @ 654 NONAME - _ZNK10QtMobility21QContactManagerEngine10hasFeatureENS_15QContactManager14ManagerFeatureERK7QString @ 655 NONAME - _ZNK10QtMobility21QContactManagerEngine10managerUriEv @ 656 NONAME - _ZNK10QtMobility21QContactManagerEngine10metaObjectEv @ 657 NONAME - _ZNK10QtMobility21QContactManagerEngine11managerNameEv @ 658 NONAME - _ZNK10QtMobility21QContactManagerEngine13relationshipsERK7QStringRKNS_10QContactIdENS_26QContactRelationshipFilter4RoleERNS_15QContactManager5ErrorE @ 659 NONAME - _ZNK10QtMobility21QContactManagerEngine13selfContactIdERNS_15QContactManager5ErrorE @ 660 NONAME - _ZNK10QtMobility21QContactManagerEngine15filterSupportedERKNS_14QContactFilterE @ 661 NONAME - _ZNK10QtMobility21QContactManagerEngine15validateContactERKNS_8QContactERNS_15QContactManager5ErrorE @ 662 NONAME - _ZNK10QtMobility21QContactManagerEngine16detailDefinitionERK7QStringS3_RNS_15QContactManager5ErrorE @ 663 NONAME - _ZNK10QtMobility21QContactManagerEngine17detailDefinitionsERK7QStringRNS_15QContactManager5ErrorE @ 664 NONAME - _ZNK10QtMobility21QContactManagerEngine17managerParametersEv @ 665 NONAME - _ZNK10QtMobility21QContactManagerEngine18supportedDataTypesEv @ 666 NONAME - _ZNK10QtMobility21QContactManagerEngine18validateDefinitionERKNS_24QContactDetailDefinitionERNS_15QContactManager5ErrorE @ 667 NONAME - _ZNK10QtMobility21QContactManagerEngine21implementationVersionEv @ 668 NONAME - _ZNK10QtMobility21QContactManagerEngine21supportedContactTypesEv @ 669 NONAME - _ZNK10QtMobility21QContactManagerEngine22setContactDisplayLabelERK7QStringRKNS_8QContactE @ 670 NONAME - _ZNK10QtMobility21QContactManagerEngine22synthesizeDisplayLabelERKNS_8QContactERNS_15QContactManager5ErrorE @ 671 NONAME - _ZNK10QtMobility21QContactManagerEngine26supportedRelationshipTypesERK7QString @ 672 NONAME - _ZNK10QtMobility21QContactManagerEngine7contactERKjRNS_15QContactManager5ErrorE @ 673 NONAME - _ZNK10QtMobility21QContactManagerEngine8contactsERK5QListINS_17QContactSortOrderEERNS_15QContactManager5ErrorE @ 674 NONAME - _ZNK10QtMobility21QContactManagerEngine8contactsERKNS_14QContactFilterERK5QListINS_17QContactSortOrderEERNS_15QContactManager5ErrorE @ 675 NONAME - _ZNK10QtMobility21QContactRemoveRequest10metaObjectEv @ 676 NONAME - _ZNK10QtMobility21QContactRemoveRequest6filterEv @ 677 NONAME - _ZNK10QtMobility23QContactAbstractRequest10isFinishedEv @ 678 NONAME - _ZNK10QtMobility23QContactAbstractRequest10metaObjectEv @ 679 NONAME - _ZNK10QtMobility23QContactAbstractRequest4typeEv @ 680 NONAME - _ZNK10QtMobility23QContactAbstractRequest5errorEv @ 681 NONAME - _ZNK10QtMobility23QContactAbstractRequest6errorsEv @ 682 NONAME - _ZNK10QtMobility23QContactAbstractRequest6statusEv @ 683 NONAME - _ZNK10QtMobility23QContactAbstractRequest7managerEv @ 684 NONAME - _ZNK10QtMobility23QContactAbstractRequest8isActiveEv @ 685 NONAME - _ZNK10QtMobility23QContactChangeLogFilter5sinceEv @ 686 NONAME - _ZNK10QtMobility23QContactChangeLogFilter9eventTypeEv @ 687 NONAME - _ZNK10QtMobility24QContactActionDescriptor10actionNameEv @ 688 NONAME - _ZNK10QtMobility24QContactActionDescriptor10vendorNameEv @ 689 NONAME - _ZNK10QtMobility24QContactActionDescriptor21implementationVersionEv @ 690 NONAME - _ZNK10QtMobility24QContactActionDescriptor7isEmptyEv @ 691 NONAME - _ZNK10QtMobility24QContactActionDescriptoreqERKS0_ @ 692 NONAME - _ZNK10QtMobility24QContactActionDescriptorneERKS0_ @ 693 NONAME - _ZNK10QtMobility24QContactDetailDefinition16accessConstraintEv @ 694 NONAME - _ZNK10QtMobility24QContactDetailDefinition4nameEv @ 695 NONAME - _ZNK10QtMobility24QContactDetailDefinition6fieldsEv @ 696 NONAME - _ZNK10QtMobility24QContactDetailDefinition7isEmptyEv @ 697 NONAME - _ZNK10QtMobility24QContactDetailDefinition8isUniqueEv @ 698 NONAME - _ZNK10QtMobility24QContactDetailDefinitioneqERKS0_ @ 699 NONAME - _ZNK10QtMobility25QContactDetailRangeFilter10matchFlagsEv @ 700 NONAME - _ZNK10QtMobility25QContactDetailRangeFilter10rangeFlagsEv @ 701 NONAME - _ZNK10QtMobility25QContactDetailRangeFilter15detailFieldNameEv @ 702 NONAME - _ZNK10QtMobility25QContactDetailRangeFilter20detailDefinitionNameEv @ 703 NONAME - _ZNK10QtMobility25QContactDetailRangeFilter8maxValueEv @ 704 NONAME - _ZNK10QtMobility25QContactDetailRangeFilter8minValueEv @ 705 NONAME - _ZNK10QtMobility26QContactIntersectionFilter7filtersEv @ 706 NONAME - _ZNK10QtMobility26QContactRelationshipFilter16relationshipTypeEv @ 707 NONAME - _ZNK10QtMobility26QContactRelationshipFilter18otherParticipantIdEv @ 708 NONAME - _ZNK10QtMobility26QContactRelationshipFilter4roleEv @ 709 NONAME - _ZNK10QtMobility27QContactLocalIdFetchRequest10metaObjectEv @ 710 NONAME - _ZNK10QtMobility27QContactLocalIdFetchRequest3idsEv @ 711 NONAME - _ZNK10QtMobility27QContactLocalIdFetchRequest6filterEv @ 712 NONAME - _ZNK10QtMobility27QContactLocalIdFetchRequest7sortingEv @ 713 NONAME - _ZNK10QtMobility29QContactDetailDefinitionField15allowableValuesEv @ 714 NONAME - _ZNK10QtMobility29QContactDetailDefinitionField16accessConstraintEv @ 715 NONAME - _ZNK10QtMobility29QContactDetailDefinitionField8dataTypeEv @ 716 NONAME - _ZNK10QtMobility29QContactDetailDefinitionFieldeqERKS0_ @ 717 NONAME - _ZNK10QtMobility29QContactDetailDefinitionFieldneERKS0_ @ 718 NONAME - _ZNK10QtMobility31QContactRelationshipSaveRequest10metaObjectEv @ 719 NONAME - _ZNK10QtMobility31QContactRelationshipSaveRequest13relationshipsEv @ 720 NONAME - _ZNK10QtMobility32QContactRelationshipFetchRequest10metaObjectEv @ 721 NONAME - _ZNK10QtMobility32QContactRelationshipFetchRequest11participantEv @ 722 NONAME - _ZNK10QtMobility32QContactRelationshipFetchRequest13relationshipsEv @ 723 NONAME - _ZNK10QtMobility32QContactRelationshipFetchRequest15participantRoleEv @ 724 NONAME - _ZNK10QtMobility32QContactRelationshipFetchRequest16relationshipTypeEv @ 725 NONAME - _ZNK10QtMobility32QContactRelationshipFetchRequest5firstEv @ 726 NONAME - _ZNK10QtMobility33QContactRelationshipRemoveRequest10metaObjectEv @ 727 NONAME - _ZNK10QtMobility33QContactRelationshipRemoveRequest16relationshipTypeEv @ 728 NONAME - _ZNK10QtMobility33QContactRelationshipRemoveRequest5firstEv @ 729 NONAME - _ZNK10QtMobility33QContactRelationshipRemoveRequest6secondEv @ 730 NONAME - _ZNK10QtMobility35QContactDetailDefinitionSaveRequest10metaObjectEv @ 731 NONAME - _ZNK10QtMobility35QContactDetailDefinitionSaveRequest11contactTypeEv @ 732 NONAME - _ZNK10QtMobility35QContactDetailDefinitionSaveRequest11definitionsEv @ 733 NONAME - _ZNK10QtMobility36QContactDetailDefinitionFetchRequest10metaObjectEv @ 734 NONAME - _ZNK10QtMobility36QContactDetailDefinitionFetchRequest11contactTypeEv @ 735 NONAME - _ZNK10QtMobility36QContactDetailDefinitionFetchRequest11definitionsEv @ 736 NONAME - _ZNK10QtMobility36QContactDetailDefinitionFetchRequest5namesEv @ 737 NONAME - _ZNK10QtMobility37QContactDetailDefinitionRemoveRequest10metaObjectEv @ 738 NONAME - _ZNK10QtMobility37QContactDetailDefinitionRemoveRequest11contactTypeEv @ 739 NONAME - _ZNK10QtMobility37QContactDetailDefinitionRemoveRequest5namesEv @ 740 NONAME - _ZNK10QtMobility8QContact12displayLabelEv @ 741 NONAME - _ZNK10QtMobility8QContact13relationshipsERK7QString @ 742 NONAME - _ZNK10QtMobility8QContact15preferredDetailERK7QString @ 743 NONAME - _ZNK10QtMobility8QContact15relatedContactsERK7QStringNS_26QContactRelationshipFilter4RoleE @ 744 NONAME - _ZNK10QtMobility8QContact16availableActionsERK7QStringi @ 745 NONAME - _ZNK10QtMobility8QContact16detailWithActionERK7QString @ 746 NONAME - _ZNK10QtMobility8QContact17detailsWithActionERK7QString @ 747 NONAME - _ZNK10QtMobility8QContact17isPreferredDetailERK7QStringRKNS_14QContactDetailE @ 748 NONAME - _ZNK10QtMobility8QContact17relationshipOrderEv @ 749 NONAME - _ZNK10QtMobility8QContact2idEv @ 750 NONAME - _ZNK10QtMobility8QContact4typeEv @ 751 NONAME - _ZNK10QtMobility8QContact6detailERK7QString @ 752 NONAME - _ZNK10QtMobility8QContact7detailsERK7QString @ 753 NONAME - _ZNK10QtMobility8QContact7detailsERK7QStringS3_S3_ @ 754 NONAME - _ZNK10QtMobility8QContact7isEmptyEv @ 755 NONAME - _ZNK10QtMobility8QContact7localIdEv @ 756 NONAME - _ZNK10QtMobility8QContacteqERKS0_ @ 757 NONAME - _ZTIN10QtMobility12QContactNameE @ 758 NONAME - _ZTIN10QtMobility12QContactTypeE @ 759 NONAME - _ZTIN10QtMobility14QContactActionE @ 760 NONAME - _ZTIN10QtMobility14QContactDetailE @ 761 NONAME - _ZTIN10QtMobility14QContactFilterE @ 762 NONAME - _ZTIN10QtMobility15QContactManagerE @ 763 NONAME - _ZTIN10QtMobility17QContactTimestampE @ 764 NONAME - _ZTIN10QtMobility19QContactSaveRequestE @ 765 NONAME - _ZTIN10QtMobility19QContactUnionFilterE @ 766 NONAME - _ZTIN10QtMobility20QContactActionFilterE @ 767 NONAME - _ZTIN10QtMobility20QContactDetailFilterE @ 768 NONAME - _ZTIN10QtMobility20QContactDisplayLabelE @ 769 NONAME - _ZTIN10QtMobility20QContactFetchRequestE @ 770 NONAME - _ZTIN10QtMobility20QContactMemoryEngineE @ 771 NONAME - _ZTIN10QtMobility20QContactOrganizationE @ 772 NONAME - _ZTIN10QtMobility21QContactActionFactoryE @ 773 NONAME - _ZTIN10QtMobility21QContactInvalidFilterE @ 774 NONAME - _ZTIN10QtMobility21QContactLocalIdFilterE @ 775 NONAME - _ZTIN10QtMobility21QContactManagerEngineE @ 776 NONAME - _ZTIN10QtMobility21QContactRemoveRequestE @ 777 NONAME - _ZTIN10QtMobility23QContactAbstractRequestE @ 778 NONAME - _ZTIN10QtMobility23QContactChangeLogFilterE @ 779 NONAME - _ZTIN10QtMobility25QContactDetailRangeFilterE @ 780 NONAME - _ZTIN10QtMobility26QContactIntersectionFilterE @ 781 NONAME - _ZTIN10QtMobility26QContactRelationshipFilterE @ 782 NONAME - _ZTIN10QtMobility27QContactLocalIdFetchRequestE @ 783 NONAME - _ZTIN10QtMobility31QContactRelationshipSaveRequestE @ 784 NONAME - _ZTIN10QtMobility32QContactRelationshipFetchRequestE @ 785 NONAME - _ZTIN10QtMobility33QContactRelationshipRemoveRequestE @ 786 NONAME - _ZTIN10QtMobility35QContactDetailDefinitionSaveRequestE @ 787 NONAME - _ZTIN10QtMobility36QContactDetailDefinitionFetchRequestE @ 788 NONAME - _ZTIN10QtMobility37QContactDetailDefinitionRemoveRequestE @ 789 NONAME - _ZTVN10QtMobility12QContactNameE @ 790 NONAME - _ZTVN10QtMobility12QContactTypeE @ 791 NONAME - _ZTVN10QtMobility14QContactActionE @ 792 NONAME - _ZTVN10QtMobility14QContactDetailE @ 793 NONAME - _ZTVN10QtMobility14QContactFilterE @ 794 NONAME - _ZTVN10QtMobility15QContactManagerE @ 795 NONAME - _ZTVN10QtMobility17QContactTimestampE @ 796 NONAME - _ZTVN10QtMobility19QContactSaveRequestE @ 797 NONAME - _ZTVN10QtMobility19QContactUnionFilterE @ 798 NONAME - _ZTVN10QtMobility20QContactActionFilterE @ 799 NONAME - _ZTVN10QtMobility20QContactDetailFilterE @ 800 NONAME - _ZTVN10QtMobility20QContactDisplayLabelE @ 801 NONAME - _ZTVN10QtMobility20QContactFetchRequestE @ 802 NONAME - _ZTVN10QtMobility20QContactMemoryEngineE @ 803 NONAME - _ZTVN10QtMobility20QContactOrganizationE @ 804 NONAME - _ZTVN10QtMobility21QContactActionFactoryE @ 805 NONAME - _ZTVN10QtMobility21QContactInvalidFilterE @ 806 NONAME - _ZTVN10QtMobility21QContactLocalIdFilterE @ 807 NONAME - _ZTVN10QtMobility21QContactManagerEngineE @ 808 NONAME - _ZTVN10QtMobility21QContactRemoveRequestE @ 809 NONAME - _ZTVN10QtMobility23QContactAbstractRequestE @ 810 NONAME - _ZTVN10QtMobility23QContactChangeLogFilterE @ 811 NONAME - _ZTVN10QtMobility25QContactDetailRangeFilterE @ 812 NONAME - _ZTVN10QtMobility26QContactIntersectionFilterE @ 813 NONAME - _ZTVN10QtMobility26QContactRelationshipFilterE @ 814 NONAME - _ZTVN10QtMobility27QContactLocalIdFetchRequestE @ 815 NONAME - _ZTVN10QtMobility31QContactRelationshipSaveRequestE @ 816 NONAME - _ZTVN10QtMobility32QContactRelationshipFetchRequestE @ 817 NONAME - _ZTVN10QtMobility33QContactRelationshipRemoveRequestE @ 818 NONAME - _ZTVN10QtMobility35QContactDetailDefinitionSaveRequestE @ 819 NONAME - _ZTVN10QtMobility36QContactDetailDefinitionFetchRequestE @ 820 NONAME - _ZTVN10QtMobility37QContactDetailDefinitionRemoveRequestE @ 821 NONAME + _ZN10QtMobility12QContactName13FieldLastNameE @ 21 NONAME DATA 9 + _ZN10QtMobility12QContactName14DefinitionNameE @ 22 NONAME DATA 5 + _ZN10QtMobility12QContactName14FieldFirstNameE @ 23 NONAME DATA 10 + _ZN10QtMobility12QContactName15FieldMiddleNameE @ 24 NONAME DATA 11 + _ZN10QtMobility12QContactName16FieldCustomLabelE @ 25 NONAME DATA 12 + _ZN10QtMobility12QContactName5matchERK7QString @ 26 NONAME + _ZN10QtMobility12QContactName5matchERK7QStringS3_ @ 27 NONAME + _ZN10QtMobility12QContactName7setLastERK7QString @ 28 NONAME + _ZN10QtMobility12QContactName8setFirstERK7QString @ 29 NONAME + _ZN10QtMobility12QContactName9FieldLastE @ 30 NONAME DATA 9 + _ZN10QtMobility12QContactName9setMiddleERK7QString @ 31 NONAME + _ZN10QtMobility12QContactNote14DefinitionNameE @ 32 NONAME DATA 5 + _ZN10QtMobility12QContactNote9FieldNoteE @ 33 NONAME DATA 5 + _ZN10QtMobility12QContactType11TypeContactE @ 34 NONAME DATA 8 + _ZN10QtMobility12QContactType14DefinitionNameE @ 35 NONAME DATA 5 + _ZN10QtMobility12QContactType9FieldTypeE @ 36 NONAME DATA 5 + _ZN10QtMobility12QContactType9TypeGroupE @ 37 NONAME DATA 6 + _ZN10QtMobility14QContactAction11qt_metacallEN11QMetaObject4CallEiPPv @ 38 NONAME + _ZN10QtMobility14QContactAction11qt_metacastEPKc @ 39 NONAME + _ZN10QtMobility14QContactAction16availableActionsERK7QStringi @ 40 NONAME + _ZN10QtMobility14QContactAction16staticMetaObjectE @ 41 NONAME DATA 16 + _ZN10QtMobility14QContactAction17actionDescriptorsERK7QStringS3_i @ 42 NONAME + _ZN10QtMobility14QContactAction19getStaticMetaObjectEv @ 43 NONAME + _ZN10QtMobility14QContactAction6actionERKNS_24QContactActionDescriptorE @ 44 NONAME + _ZN10QtMobility14QContactAction8progressENS0_5StateERK4QMapI7QString8QVariantE @ 45 NONAME + _ZN10QtMobility14QContactAction8progressENS0_6StatusERK4QMapI7QString8QVariantE @ 46 NONAME + _ZN10QtMobility14QContactActionD0Ev @ 47 NONAME + _ZN10QtMobility14QContactActionD1Ev @ 48 NONAME + _ZN10QtMobility14QContactActionD2Ev @ 49 NONAME + _ZN10QtMobility14QContactAvatar11FieldAvatarE @ 50 NONAME DATA 7 + _ZN10QtMobility14QContactAvatar12FieldSubTypeE @ 51 NONAME DATA 8 + _ZN10QtMobility14QContactAvatar12SubTypeImageE @ 52 NONAME DATA 6 + _ZN10QtMobility14QContactAvatar12SubTypeVideoE @ 53 NONAME DATA 6 + _ZN10QtMobility14QContactAvatar14DefinitionNameE @ 54 NONAME DATA 7 + _ZN10QtMobility14QContactAvatar17FieldAvatarPixmapE @ 55 NONAME DATA 13 + _ZN10QtMobility14QContactAvatar19SubTypeTexturedMeshE @ 56 NONAME DATA 13 + _ZN10QtMobility14QContactAvatar20SubTypeAudioRingtoneE @ 57 NONAME DATA 14 + _ZN10QtMobility14QContactAvatar20SubTypeVideoRingtoneE @ 58 NONAME DATA 14 + _ZN10QtMobility14QContactDetail11ContextHomeE @ 59 NONAME DATA 5 + _ZN10QtMobility14QContactDetail11ContextWorkE @ 60 NONAME DATA 5 + _ZN10QtMobility14QContactDetail11removeValueERK7QString @ 61 NONAME + _ZN10QtMobility14QContactDetail12ContextOtherE @ 62 NONAME DATA 6 + _ZN10QtMobility14QContactDetail12FieldContextE @ 63 NONAME DATA 8 + _ZN10QtMobility14QContactDetail14FieldDetailUriE @ 64 NONAME DATA 10 + _ZN10QtMobility14QContactDetail19setPreferredActionsERK5QListINS_24QContactActionDescriptorEE @ 65 NONAME + _ZN10QtMobility14QContactDetail21FieldLinkedDetailUrisE @ 66 NONAME DATA 17 + _ZN10QtMobility14QContactDetail6assignERKS0_RK7QString @ 67 NONAME + _ZN10QtMobility14QContactDetail8resetKeyEv @ 68 NONAME + _ZN10QtMobility14QContactDetail8setValueERK7QStringRK8QVariant @ 69 NONAME + _ZN10QtMobility14QContactDetailC1ERK7QString @ 70 NONAME + _ZN10QtMobility14QContactDetailC1ERKS0_ @ 71 NONAME + _ZN10QtMobility14QContactDetailC1ERKS0_RK7QString @ 72 NONAME + _ZN10QtMobility14QContactDetailC1Ev @ 73 NONAME + _ZN10QtMobility14QContactDetailC2ERK7QString @ 74 NONAME + _ZN10QtMobility14QContactDetailC2ERKS0_ @ 75 NONAME + _ZN10QtMobility14QContactDetailC2ERKS0_RK7QString @ 76 NONAME + _ZN10QtMobility14QContactDetailC2Ev @ 77 NONAME + _ZN10QtMobility14QContactDetailD0Ev @ 78 NONAME + _ZN10QtMobility14QContactDetailD1Ev @ 79 NONAME + _ZN10QtMobility14QContactDetailD2Ev @ 80 NONAME + _ZN10QtMobility14QContactDetailaSERKS0_ @ 81 NONAME + _ZN10QtMobility14QContactFamily11FieldSpouseE @ 82 NONAME DATA 7 + _ZN10QtMobility14QContactFamily13FieldChildrenE @ 83 NONAME DATA 9 + _ZN10QtMobility14QContactFamily14DefinitionNameE @ 84 NONAME DATA 7 + _ZN10QtMobility14QContactFilterC1EPNS_21QContactFilterPrivateE @ 85 NONAME + _ZN10QtMobility14QContactFilterC1ERKS0_ @ 86 NONAME + _ZN10QtMobility14QContactFilterC1Ev @ 87 NONAME + _ZN10QtMobility14QContactFilterC2EPNS_21QContactFilterPrivateE @ 88 NONAME + _ZN10QtMobility14QContactFilterC2ERKS0_ @ 89 NONAME + _ZN10QtMobility14QContactFilterC2Ev @ 90 NONAME + _ZN10QtMobility14QContactFilterD0Ev @ 91 NONAME + _ZN10QtMobility14QContactFilterD1Ev @ 92 NONAME + _ZN10QtMobility14QContactFilterD2Ev @ 93 NONAME + _ZN10QtMobility14QContactFilteraSERKS0_ @ 94 NONAME + _ZN10QtMobility14QContactGender10GenderMaleE @ 95 NONAME DATA 5 + _ZN10QtMobility14QContactGender11FieldGenderE @ 96 NONAME DATA 7 + _ZN10QtMobility14QContactGender12GenderFemaleE @ 97 NONAME DATA 7 + _ZN10QtMobility14QContactGender14DefinitionNameE @ 98 NONAME DATA 7 + _ZN10QtMobility14QContactGender17GenderUnspecifiedE @ 99 NONAME DATA 12 + _ZN10QtMobility15QContactAddress11FieldRegionE @ 100 NONAME DATA 7 + _ZN10QtMobility15QContactAddress11FieldStreetE @ 101 NONAME DATA 7 + _ZN10QtMobility15QContactAddress12FieldCountryE @ 102 NONAME DATA 8 + _ZN10QtMobility15QContactAddress13FieldLocalityE @ 103 NONAME DATA 9 + _ZN10QtMobility15QContactAddress13FieldPostcodeE @ 104 NONAME DATA 9 + _ZN10QtMobility15QContactAddress13FieldSubTypesE @ 105 NONAME DATA 9 + _ZN10QtMobility15QContactAddress13SubTypeParcelE @ 106 NONAME DATA 7 + _ZN10QtMobility15QContactAddress13SubTypePostalE @ 107 NONAME DATA 7 + _ZN10QtMobility15QContactAddress14DefinitionNameE @ 108 NONAME DATA 14 + _ZN10QtMobility15QContactAddress15SubTypeDomesticE @ 109 NONAME DATA 9 + _ZN10QtMobility15QContactAddress18FieldPostOfficeBoxE @ 110 NONAME DATA 14 + _ZN10QtMobility15QContactAddress20SubTypeInternationalE @ 111 NONAME DATA 14 + _ZN10QtMobility15QContactManager11dataChangedEv @ 112 NONAME + _ZN10QtMobility15QContactManager11qt_metacallEN11QMetaObject4CallEiPPv @ 113 NONAME + _ZN10QtMobility15QContactManager11qt_metacastEPKc @ 114 NONAME + _ZN10QtMobility15QContactManager11saveContactEPNS_8QContactE @ 115 NONAME + _ZN10QtMobility15QContactManager12createEngineERK7QStringRK4QMapIS1_S1_E @ 116 NONAME + _ZN10QtMobility15QContactManager12saveContactsEP5QListINS_8QContactEE @ 117 NONAME + _ZN10QtMobility15QContactManager12saveContactsEP5QListINS_8QContactEEP4QMapIiNS0_5ErrorEE @ 118 NONAME + _ZN10QtMobility15QContactManager13contactsAddedERK5QListIjE @ 119 NONAME + _ZN10QtMobility15QContactManager13removeContactERKj @ 120 NONAME + _ZN10QtMobility15QContactManager14removeContactsEP5QListIjE @ 121 NONAME + _ZN10QtMobility15QContactManager14removeContactsEP5QListIjEP4QMapIiNS0_5ErrorEE @ 122 NONAME + _ZN10QtMobility15QContactManager15contactsChangedERK5QListIjE @ 123 NONAME + _ZN10QtMobility15QContactManager15contactsRemovedERK5QListIjE @ 124 NONAME + _ZN10QtMobility15QContactManager16saveRelationshipEPNS_20QContactRelationshipE @ 125 NONAME + _ZN10QtMobility15QContactManager16setSelfContactIdERKj @ 126 NONAME + _ZN10QtMobility15QContactManager16staticMetaObjectE @ 127 NONAME DATA 16 + _ZN10QtMobility15QContactManager17availableManagersEv @ 128 NONAME + _ZN10QtMobility15QContactManager17saveRelationshipsEP5QListINS_20QContactRelationshipEE @ 129 NONAME + _ZN10QtMobility15QContactManager18relationshipsAddedERK5QListIjE @ 130 NONAME + _ZN10QtMobility15QContactManager18removeRelationshipERKNS_20QContactRelationshipE @ 131 NONAME + _ZN10QtMobility15QContactManager19getStaticMetaObjectEv @ 132 NONAME + _ZN10QtMobility15QContactManager19removeRelationshipsERK5QListINS_20QContactRelationshipEE @ 133 NONAME + _ZN10QtMobility15QContactManager20relationshipsRemovedERK5QListIjE @ 134 NONAME + _ZN10QtMobility15QContactManager20saveDetailDefinitionERKNS_24QContactDetailDefinitionERK7QString @ 135 NONAME + _ZN10QtMobility15QContactManager20selfContactIdChangedERKjS2_ @ 136 NONAME + _ZN10QtMobility15QContactManager22removeDetailDefinitionERK7QStringS3_ @ 137 NONAME + _ZN10QtMobility15QContactManager7fromUriERK7QStringP7QObject @ 138 NONAME + _ZN10QtMobility15QContactManager7versionEv @ 139 NONAME + _ZN10QtMobility15QContactManager8buildUriERK7QStringRK4QMapIS1_S1_Ei @ 140 NONAME + _ZN10QtMobility15QContactManager8parseUriERK7QStringPS1_P4QMapIS1_S1_E @ 141 NONAME + _ZN10QtMobility15QContactManager8splitUriERK7QStringPS1_P4QMapIS1_S1_E @ 142 NONAME + _ZN10QtMobility15QContactManagerC1EP7QObject @ 143 NONAME + _ZN10QtMobility15QContactManagerC1ERK7QStringRK4QMapIS1_S1_EP7QObject @ 144 NONAME + _ZN10QtMobility15QContactManagerC1ERK7QStringiRK4QMapIS1_S1_EP7QObject @ 145 NONAME + _ZN10QtMobility15QContactManagerC2EP7QObject @ 146 NONAME + _ZN10QtMobility15QContactManagerC2ERK7QStringRK4QMapIS1_S1_EP7QObject @ 147 NONAME + _ZN10QtMobility15QContactManagerC2ERK7QStringiRK4QMapIS1_S1_EP7QObject @ 148 NONAME + _ZN10QtMobility15QContactManagerD0Ev @ 149 NONAME + _ZN10QtMobility15QContactManagerD1Ev @ 150 NONAME + _ZN10QtMobility15QContactManagerD2Ev @ 151 NONAME + _ZN10QtMobility16QContactBirthday13FieldBirthdayE @ 152 NONAME DATA 9 + _ZN10QtMobility16QContactBirthday14DefinitionNameE @ 153 NONAME DATA 9 + _ZN10QtMobility16QContactNickname13FieldNicknameE @ 154 NONAME DATA 9 + _ZN10QtMobility16QContactNickname14DefinitionNameE @ 155 NONAME DATA 9 + _ZN10QtMobility17QContactChangeSet11dataChangedEv @ 156 NONAME + _ZN10QtMobility17QContactChangeSet11emitSignalsEPNS_21QContactManagerEngineE @ 157 NONAME + _ZN10QtMobility17QContactChangeSet13addedContactsEv @ 158 NONAME + _ZN10QtMobility17QContactChangeSet14setDataChangedEb @ 159 NONAME + _ZN10QtMobility17QContactChangeSet15changedContactsEv @ 160 NONAME + _ZN10QtMobility17QContactChangeSet15removedContactsEv @ 161 NONAME + _ZN10QtMobility17QContactChangeSet22oldAndNewSelfContactIdEv @ 162 NONAME + _ZN10QtMobility17QContactChangeSet26addedRelationshipsContactsEv @ 163 NONAME + _ZN10QtMobility17QContactChangeSet28removedRelationshipsContactsEv @ 164 NONAME + _ZN10QtMobility17QContactChangeSet5clearEv @ 165 NONAME + _ZN10QtMobility17QContactChangeSetC1ERKS0_ @ 166 NONAME + _ZN10QtMobility17QContactChangeSetC1Ev @ 167 NONAME + _ZN10QtMobility17QContactChangeSetC2ERKS0_ @ 168 NONAME + _ZN10QtMobility17QContactChangeSetC2Ev @ 169 NONAME + _ZN10QtMobility17QContactChangeSetD1Ev @ 170 NONAME + _ZN10QtMobility17QContactChangeSetD2Ev @ 171 NONAME + _ZN10QtMobility17QContactChangeSetaSERKS0_ @ 172 NONAME + _ZN10QtMobility17QContactSortOrder12setDirectionEN2Qt9SortOrderE @ 173 NONAME + _ZN10QtMobility17QContactSortOrder14setBlankPolicyENS0_11BlankPolicyE @ 174 NONAME + _ZN10QtMobility17QContactSortOrder18setCaseSensitivityEN2Qt15CaseSensitivityE @ 175 NONAME + _ZN10QtMobility17QContactSortOrder23setDetailDefinitionNameERK7QStringS3_ @ 176 NONAME + _ZN10QtMobility17QContactSortOrderC1ERKS0_ @ 177 NONAME + _ZN10QtMobility17QContactSortOrderC1Ev @ 178 NONAME + _ZN10QtMobility17QContactSortOrderC2ERKS0_ @ 179 NONAME + _ZN10QtMobility17QContactSortOrderC2Ev @ 180 NONAME + _ZN10QtMobility17QContactSortOrderD1Ev @ 181 NONAME + _ZN10QtMobility17QContactSortOrderD2Ev @ 182 NONAME + _ZN10QtMobility17QContactSortOrderaSERKS0_ @ 183 NONAME + _ZN10QtMobility17QContactTimestamp14DefinitionNameE @ 184 NONAME DATA 10 + _ZN10QtMobility17QContactTimestamp22FieldCreationTimestampE @ 185 NONAME DATA 18 + _ZN10QtMobility17QContactTimestamp26FieldModificationTimestampE @ 186 NONAME DATA 22 + _ZN10QtMobility18QContactSyncTarget14DefinitionNameE @ 187 NONAME DATA 11 + _ZN10QtMobility18QContactSyncTarget15FieldSyncTargetE @ 188 NONAME DATA 11 + _ZN10QtMobility19QContactAnniversary10FieldEventE @ 189 NONAME DATA 6 + _ZN10QtMobility19QContactAnniversary12FieldSubTypeE @ 190 NONAME DATA 8 + _ZN10QtMobility19QContactAnniversary12SubTypeHouseE @ 191 NONAME DATA 6 + _ZN10QtMobility19QContactAnniversary14DefinitionNameE @ 192 NONAME DATA 12 + _ZN10QtMobility19QContactAnniversary14SubTypeWeddingE @ 193 NONAME DATA 8 + _ZN10QtMobility19QContactAnniversary15FieldCalendarIdE @ 194 NONAME DATA 11 + _ZN10QtMobility19QContactAnniversary15SubTypeMemorialE @ 195 NONAME DATA 9 + _ZN10QtMobility19QContactAnniversary17FieldOriginalDateE @ 196 NONAME DATA 13 + _ZN10QtMobility19QContactAnniversary17SubTypeEmploymentE @ 197 NONAME DATA 11 + _ZN10QtMobility19QContactAnniversary17SubTypeEngagementE @ 198 NONAME DATA 11 + _ZN10QtMobility19QContactGeoLocation10FieldLabelE @ 199 NONAME DATA 6 + _ZN10QtMobility19QContactGeoLocation10FieldSpeedE @ 200 NONAME DATA 6 + _ZN10QtMobility19QContactGeoLocation12FieldHeadingE @ 201 NONAME DATA 8 + _ZN10QtMobility19QContactGeoLocation13FieldAccuracyE @ 202 NONAME DATA 9 + _ZN10QtMobility19QContactGeoLocation13FieldAltitudeE @ 203 NONAME DATA 9 + _ZN10QtMobility19QContactGeoLocation13FieldLatitudeE @ 204 NONAME DATA 9 + _ZN10QtMobility19QContactGeoLocation14DefinitionNameE @ 205 NONAME DATA 12 + _ZN10QtMobility19QContactGeoLocation14FieldLongitudeE @ 206 NONAME DATA 10 + _ZN10QtMobility19QContactGeoLocation14FieldTimestampE @ 207 NONAME DATA 10 + _ZN10QtMobility19QContactGeoLocation21FieldAltitudeAccuracyE @ 208 NONAME DATA 17 + _ZN10QtMobility19QContactGeolocation10FieldLabelE @ 209 NONAME DATA 6 + _ZN10QtMobility19QContactGeolocation10FieldSpeedE @ 210 NONAME DATA 6 + _ZN10QtMobility19QContactGeolocation10setHeadingEd @ 211 NONAME + _ZN10QtMobility19QContactGeolocation11setAccuracyEd @ 212 NONAME + _ZN10QtMobility19QContactGeolocation11setAltitudeEd @ 213 NONAME + _ZN10QtMobility19QContactGeolocation11setLatitudeEd @ 214 NONAME + _ZN10QtMobility19QContactGeolocation12FieldHeadingE @ 215 NONAME DATA 8 + _ZN10QtMobility19QContactGeolocation12setLongitudeEd @ 216 NONAME + _ZN10QtMobility19QContactGeolocation12setTimestampERK9QDateTime @ 217 NONAME + _ZN10QtMobility19QContactGeolocation13FieldAccuracyE @ 218 NONAME DATA 9 + _ZN10QtMobility19QContactGeolocation13FieldAltitudeE @ 219 NONAME DATA 9 + _ZN10QtMobility19QContactGeolocation13FieldLatitudeE @ 220 NONAME DATA 9 + _ZN10QtMobility19QContactGeolocation14DefinitionNameE @ 221 NONAME DATA 12 + _ZN10QtMobility19QContactGeolocation14FieldLongitudeE @ 222 NONAME DATA 10 + _ZN10QtMobility19QContactGeolocation14FieldTimestampE @ 223 NONAME DATA 10 + _ZN10QtMobility19QContactGeolocation19setAltitudeAccuracyEd @ 224 NONAME + _ZN10QtMobility19QContactGeolocation21FieldAltitudeAccuracyE @ 225 NONAME DATA 17 + _ZN10QtMobility19QContactGeolocation8setLabelERK7QString @ 226 NONAME + _ZN10QtMobility19QContactGeolocation8setSpeedEd @ 227 NONAME + _ZN10QtMobility19QContactPhoneNumber10SubTypeCarE @ 228 NONAME DATA 4 + _ZN10QtMobility19QContactPhoneNumber11FieldNumberE @ 229 NONAME DATA 12 + _ZN10QtMobility19QContactPhoneNumber12SubTypeModemE @ 230 NONAME DATA 6 + _ZN10QtMobility19QContactPhoneNumber12SubTypePagerE @ 231 NONAME DATA 6 + _ZN10QtMobility19QContactPhoneNumber12SubTypeVideoE @ 232 NONAME DATA 6 + _ZN10QtMobility19QContactPhoneNumber12SubTypeVoiceE @ 233 NONAME DATA 6 + _ZN10QtMobility19QContactPhoneNumber13FieldSubTypesE @ 234 NONAME DATA 9 + _ZN10QtMobility19QContactPhoneNumber13SubTypeMobileE @ 235 NONAME DATA 7 + _ZN10QtMobility19QContactPhoneNumber14DefinitionNameE @ 236 NONAME DATA 12 + _ZN10QtMobility19QContactPhoneNumber15SubTypeDtmfMenuE @ 237 NONAME DATA 9 + _ZN10QtMobility19QContactPhoneNumber15SubTypeLandlineE @ 238 NONAME DATA 9 + _ZN10QtMobility19QContactPhoneNumber16SubTypeAssistantE @ 239 NONAME DATA 10 + _ZN10QtMobility19QContactPhoneNumber16SubTypeFacsimileE @ 240 NONAME DATA 10 + _ZN10QtMobility19QContactPhoneNumber23SubTypeMessagingCapableE @ 241 NONAME DATA 17 + _ZN10QtMobility19QContactPhoneNumber26SubTypeBulletinBoardSystemE @ 242 NONAME DATA 20 + _ZN10QtMobility19QContactPhoneNumber5matchERK7QString @ 243 NONAME + _ZN10QtMobility19QContactSaveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 244 NONAME + _ZN10QtMobility19QContactSaveRequest11qt_metacastEPKc @ 245 NONAME + _ZN10QtMobility19QContactSaveRequest11setContactsERK5QListINS_8QContactEE @ 246 NONAME + _ZN10QtMobility19QContactSaveRequest16staticMetaObjectE @ 247 NONAME DATA 16 + _ZN10QtMobility19QContactSaveRequest19getStaticMetaObjectEv @ 248 NONAME + _ZN10QtMobility19QContactSaveRequest8progressEPS0_ @ 249 NONAME + _ZN10QtMobility19QContactSaveRequestC1Ev @ 250 NONAME + _ZN10QtMobility19QContactSaveRequestC2Ev @ 251 NONAME + _ZN10QtMobility19QContactSaveRequestD0Ev @ 252 NONAME + _ZN10QtMobility19QContactSaveRequestD1Ev @ 253 NONAME + _ZN10QtMobility19QContactSaveRequestD2Ev @ 254 NONAME + _ZN10QtMobility19QContactUnionFilter10setFiltersERK5QListINS_14QContactFilterEE @ 255 NONAME + _ZN10QtMobility19QContactUnionFilter6appendERKNS_14QContactFilterE @ 256 NONAME + _ZN10QtMobility19QContactUnionFilter6removeERKNS_14QContactFilterE @ 257 NONAME + _ZN10QtMobility19QContactUnionFilter7prependERKNS_14QContactFilterE @ 258 NONAME + _ZN10QtMobility19QContactUnionFilterC1ERKNS_14QContactFilterE @ 259 NONAME + _ZN10QtMobility19QContactUnionFilterC1Ev @ 260 NONAME + _ZN10QtMobility19QContactUnionFilterC2ERKNS_14QContactFilterE @ 261 NONAME + _ZN10QtMobility19QContactUnionFilterC2Ev @ 262 NONAME + _ZN10QtMobility19QContactUnionFilterlsERKNS_14QContactFilterE @ 263 NONAME + _ZN10QtMobility20QContactActionFilter13setActionNameERK7QString @ 264 NONAME + _ZN10QtMobility20QContactActionFilter8setValueERK8QVariant @ 265 NONAME + _ZN10QtMobility20QContactActionFilter9setVendorERK7QStringi @ 266 NONAME + _ZN10QtMobility20QContactActionFilterC1ERKNS_14QContactFilterE @ 267 NONAME + _ZN10QtMobility20QContactActionFilterC1Ev @ 268 NONAME + _ZN10QtMobility20QContactActionFilterC2ERKNS_14QContactFilterE @ 269 NONAME + _ZN10QtMobility20QContactActionFilterC2Ev @ 270 NONAME + _ZN10QtMobility20QContactDetailFilter13setMatchFlagsE6QFlagsINS_14QContactFilter9MatchFlagEE @ 271 NONAME + _ZN10QtMobility20QContactDetailFilter23setDetailDefinitionNameERK7QStringS3_ @ 272 NONAME + _ZN10QtMobility20QContactDetailFilter8setValueERK8QVariant @ 273 NONAME + _ZN10QtMobility20QContactDetailFilterC1ERKNS_14QContactFilterE @ 274 NONAME + _ZN10QtMobility20QContactDetailFilterC1Ev @ 275 NONAME + _ZN10QtMobility20QContactDetailFilterC2ERKNS_14QContactFilterE @ 276 NONAME + _ZN10QtMobility20QContactDetailFilterC2Ev @ 277 NONAME + _ZN10QtMobility20QContactDisplayLabel10FieldLabelE @ 278 NONAME DATA 6 + _ZN10QtMobility20QContactDisplayLabel14DefinitionNameE @ 279 NONAME DATA 13 + _ZN10QtMobility20QContactDisplayLabel5matchERK7QString @ 280 NONAME + _ZN10QtMobility20QContactEmailAddress14DefinitionNameE @ 281 NONAME DATA 13 + _ZN10QtMobility20QContactEmailAddress17FieldEmailAddressE @ 282 NONAME DATA 13 + _ZN10QtMobility20QContactEmailAddress5matchERK7QString @ 283 NONAME + _ZN10QtMobility20QContactFetchRequest10setSortingERK5QListINS_17QContactSortOrderEE @ 284 NONAME + _ZN10QtMobility20QContactFetchRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 285 NONAME + _ZN10QtMobility20QContactFetchRequest11qt_metacastEPKc @ 286 NONAME + _ZN10QtMobility20QContactFetchRequest16staticMetaObjectE @ 287 NONAME DATA 16 + _ZN10QtMobility20QContactFetchRequest19getStaticMetaObjectEv @ 288 NONAME + _ZN10QtMobility20QContactFetchRequest25setDefinitionRestrictionsERK11QStringList @ 289 NONAME + _ZN10QtMobility20QContactFetchRequest8progressEPS0_b @ 290 NONAME + _ZN10QtMobility20QContactFetchRequest9setFilterERKNS_14QContactFilterE @ 291 NONAME + _ZN10QtMobility20QContactFetchRequestC1Ev @ 292 NONAME + _ZN10QtMobility20QContactFetchRequestC2Ev @ 293 NONAME + _ZN10QtMobility20QContactFetchRequestD0Ev @ 294 NONAME + _ZN10QtMobility20QContactFetchRequestD1Ev @ 295 NONAME + _ZN10QtMobility20QContactFetchRequestD2Ev @ 296 NONAME + _ZN10QtMobility20QContactMemoryEngine11qt_metacallEN11QMetaObject4CallEiPPv @ 297 NONAME + _ZN10QtMobility20QContactMemoryEngine11qt_metacastEPKc @ 298 NONAME + _ZN10QtMobility20QContactMemoryEngine11saveContactEPNS_8QContactERNS_15QContactManager5ErrorE @ 299 NONAME + _ZN10QtMobility20QContactMemoryEngine11saveContactEPNS_8QContactERNS_17QContactChangeSetERNS_15QContactManager5ErrorE @ 300 NONAME + _ZN10QtMobility20QContactMemoryEngine12saveContactsEP5QListINS_8QContactEEP4QMapIiNS_15QContactManager5ErrorEERS7_ @ 301 NONAME + _ZN10QtMobility20QContactMemoryEngine12saveContactsEP5QListINS_8QContactEERNS_15QContactManager5ErrorE @ 302 NONAME + _ZN10QtMobility20QContactMemoryEngine12startRequestEPNS_23QContactAbstractRequestE @ 303 NONAME + _ZN10QtMobility20QContactMemoryEngine13cancelRequestEPNS_23QContactAbstractRequestE @ 304 NONAME + _ZN10QtMobility20QContactMemoryEngine13removeContactERKjRNS_15QContactManager5ErrorE @ 305 NONAME + _ZN10QtMobility20QContactMemoryEngine13removeContactERKjRNS_17QContactChangeSetERNS_15QContactManager5ErrorE @ 306 NONAME + _ZN10QtMobility20QContactMemoryEngine14removeContactsEP5QListIjEP4QMapIiNS_15QContactManager5ErrorEERS6_ @ 307 NONAME + _ZN10QtMobility20QContactMemoryEngine14removeContactsEP5QListIjERNS_15QContactManager5ErrorE @ 308 NONAME + _ZN10QtMobility20QContactMemoryEngine16requestDestroyedEPNS_23QContactAbstractRequestE @ 309 NONAME + _ZN10QtMobility20QContactMemoryEngine16saveRelationshipEPNS_20QContactRelationshipERNS_15QContactManager5ErrorE @ 310 NONAME + _ZN10QtMobility20QContactMemoryEngine16saveRelationshipEPNS_20QContactRelationshipERNS_17QContactChangeSetERNS_15QContactManager5ErrorE @ 311 NONAME + _ZN10QtMobility20QContactMemoryEngine16setSelfContactIdERKjRNS_15QContactManager5ErrorE @ 312 NONAME + _ZN10QtMobility20QContactMemoryEngine16staticMetaObjectE @ 313 NONAME DATA 16 + _ZN10QtMobility20QContactMemoryEngine17saveRelationshipsEP5QListINS_20QContactRelationshipEERNS_15QContactManager5ErrorE @ 314 NONAME + _ZN10QtMobility20QContactMemoryEngine18createMemoryEngineERK4QMapI7QStringS2_E @ 315 NONAME + _ZN10QtMobility20QContactMemoryEngine18removeRelationshipERKNS_20QContactRelationshipERNS_15QContactManager5ErrorE @ 316 NONAME + _ZN10QtMobility20QContactMemoryEngine18removeRelationshipERKNS_20QContactRelationshipERNS_17QContactChangeSetERNS_15QContactManager5ErrorE @ 317 NONAME + _ZN10QtMobility20QContactMemoryEngine19getStaticMetaObjectEv @ 318 NONAME + _ZN10QtMobility20QContactMemoryEngine19removeRelationshipsERK5QListINS_20QContactRelationshipEERNS_15QContactManager5ErrorE @ 319 NONAME + _ZN10QtMobility20QContactMemoryEngine20saveDetailDefinitionERKNS_24QContactDetailDefinitionERK7QStringRNS_15QContactManager5ErrorE @ 320 NONAME + _ZN10QtMobility20QContactMemoryEngine20saveDetailDefinitionERKNS_24QContactDetailDefinitionERK7QStringRNS_17QContactChangeSetERNS_15QContactManager5ErrorE @ 321 NONAME + _ZN10QtMobility20QContactMemoryEngine22removeDetailDefinitionERK7QStringS3_RNS_15QContactManager5ErrorE @ 322 NONAME + _ZN10QtMobility20QContactMemoryEngine22removeDetailDefinitionERK7QStringS3_RNS_17QContactChangeSetERNS_15QContactManager5ErrorE @ 323 NONAME + _ZN10QtMobility20QContactMemoryEngine22waitForRequestFinishedEPNS_23QContactAbstractRequestEi @ 324 NONAME + _ZN10QtMobility20QContactMemoryEngine22waitForRequestProgressEPNS_23QContactAbstractRequestEi @ 325 NONAME + _ZN10QtMobility20QContactMemoryEngine28performAsynchronousOperationEv @ 326 NONAME + _ZN10QtMobility20QContactMemoryEngine5derefEv @ 327 NONAME + _ZN10QtMobility20QContactMemoryEngine7enginesE @ 328 NONAME DATA 4 + _ZN10QtMobility20QContactMemoryEngineC1ERK4QMapI7QStringS2_E @ 329 NONAME + _ZN10QtMobility20QContactMemoryEngineC2ERK4QMapI7QStringS2_E @ 330 NONAME + _ZN10QtMobility20QContactOrganization10FieldTitleE @ 331 NONAME DATA 6 + _ZN10QtMobility20QContactOrganization13FieldLocationE @ 332 NONAME DATA 9 + _ZN10QtMobility20QContactOrganization14DefinitionNameE @ 333 NONAME DATA 13 + _ZN10QtMobility20QContactOrganization15FieldDepartmentE @ 334 NONAME DATA 11 + _ZN10QtMobility20QContactOrganization18FieldAssistantNameE @ 335 NONAME DATA 14 + _ZN10QtMobility20QContactOrganization9FieldLogoE @ 336 NONAME DATA 5 + _ZN10QtMobility20QContactOrganization9FieldNameE @ 337 NONAME DATA 5 + _ZN10QtMobility20QContactOrganization9FieldRoleE @ 338 NONAME DATA 5 + _ZN10QtMobility20QContactRelationship10AggregatesE @ 339 NONAME DATA 11 + _ZN10QtMobility20QContactRelationship10HasManagerE @ 340 NONAME DATA 11 + _ZN10QtMobility20QContactRelationship12HasAssistantE @ 341 NONAME DATA 13 + _ZN10QtMobility20QContactRelationship19setRelationshipTypeERK7QString @ 342 NONAME + _ZN10QtMobility20QContactRelationship2IsE @ 343 NONAME DATA 9 + _ZN10QtMobility20QContactRelationship8IsSameAsE @ 344 NONAME DATA 9 + _ZN10QtMobility20QContactRelationship8setFirstERKNS_10QContactIdE @ 345 NONAME + _ZN10QtMobility20QContactRelationship9HasMemberE @ 346 NONAME DATA 10 + _ZN10QtMobility20QContactRelationship9HasSpouseE @ 347 NONAME DATA 10 + _ZN10QtMobility20QContactRelationship9setSecondERKNS_10QContactIdE @ 348 NONAME + _ZN10QtMobility20QContactRelationshipC1ERKS0_ @ 349 NONAME + _ZN10QtMobility20QContactRelationshipC1Ev @ 350 NONAME + _ZN10QtMobility20QContactRelationshipC2ERKS0_ @ 351 NONAME + _ZN10QtMobility20QContactRelationshipC2Ev @ 352 NONAME + _ZN10QtMobility20QContactRelationshipD1Ev @ 353 NONAME + _ZN10QtMobility20QContactRelationshipD2Ev @ 354 NONAME + _ZN10QtMobility20QContactRelationshipaSERKS0_ @ 355 NONAME + _ZN10QtMobility21QContactActionFactory11qt_metacallEN11QMetaObject4CallEiPPv @ 356 NONAME + _ZN10QtMobility21QContactActionFactory11qt_metacastEPKc @ 357 NONAME + _ZN10QtMobility21QContactActionFactory16staticMetaObjectE @ 358 NONAME DATA 16 + _ZN10QtMobility21QContactActionFactory19getStaticMetaObjectEv @ 359 NONAME + _ZN10QtMobility21QContactActionFactoryD0Ev @ 360 NONAME + _ZN10QtMobility21QContactActionFactoryD1Ev @ 361 NONAME + _ZN10QtMobility21QContactActionFactoryD2Ev @ 362 NONAME + _ZN10QtMobility21QContactInvalidFilterC1ERKNS_14QContactFilterE @ 363 NONAME + _ZN10QtMobility21QContactInvalidFilterC1Ev @ 364 NONAME + _ZN10QtMobility21QContactInvalidFilterC2ERKNS_14QContactFilterE @ 365 NONAME + _ZN10QtMobility21QContactInvalidFilterC2Ev @ 366 NONAME + _ZN10QtMobility21QContactLocalIdFilter6setIdsERK5QListIjE @ 367 NONAME + _ZN10QtMobility21QContactLocalIdFilterC1ERKNS_14QContactFilterE @ 368 NONAME + _ZN10QtMobility21QContactLocalIdFilterC1Ev @ 369 NONAME + _ZN10QtMobility21QContactLocalIdFilterC2ERKNS_14QContactFilterE @ 370 NONAME + _ZN10QtMobility21QContactLocalIdFilterC2Ev @ 371 NONAME + _ZN10QtMobility21QContactManagerEngine10testFilterERKNS_14QContactFilterERKNS_8QContactE @ 372 NONAME + _ZN10QtMobility21QContactManagerEngine11dataChangedEv @ 373 NONAME + _ZN10QtMobility21QContactManagerEngine11qt_metacallEN11QMetaObject4CallEiPPv @ 374 NONAME + _ZN10QtMobility21QContactManagerEngine11qt_metacastEPKc @ 375 NONAME + _ZN10QtMobility21QContactManagerEngine11saveContactEPNS_8QContactERNS_15QContactManager5ErrorE @ 376 NONAME + _ZN10QtMobility21QContactManagerEngine12saveContactsEP5QListINS_8QContactEEP4QMapIiNS_15QContactManager5ErrorEERS7_ @ 377 NONAME + _ZN10QtMobility21QContactManagerEngine12saveContactsEP5QListINS_8QContactEERNS_15QContactManager5ErrorE @ 378 NONAME + _ZN10QtMobility21QContactManagerEngine12sortContactsERK5QListINS_8QContactEERKS1_INS_17QContactSortOrderEE @ 379 NONAME + _ZN10QtMobility21QContactManagerEngine12startRequestEPNS_23QContactAbstractRequestE @ 380 NONAME + _ZN10QtMobility21QContactManagerEngine13cancelRequestEPNS_23QContactAbstractRequestE @ 381 NONAME + _ZN10QtMobility21QContactManagerEngine13contactsAddedERK5QListIjE @ 382 NONAME + _ZN10QtMobility21QContactManagerEngine13removeContactERKjRNS_15QContactManager5ErrorE @ 383 NONAME + _ZN10QtMobility21QContactManagerEngine13updateRequestEPNS_23QContactAbstractRequestERK4QMapI7QStringNS_24QContactDetailDefinitionEENS_15QContactManager5ErrorERK5QListISA_ENS1_6StatusEb @ 384 NONAME + _ZN10QtMobility21QContactManagerEngine13updateRequestEPNS_23QContactAbstractRequestERK5QListINS_20QContactRelationshipEENS_15QContactManager5ErrorERKS3_IS9_ENS1_6StatusEb @ 385 NONAME + _ZN10QtMobility21QContactManagerEngine13updateRequestEPNS_23QContactAbstractRequestERK5QListINS_24QContactDetailDefinitionEENS_15QContactManager5ErrorERKS3_IS9_ENS1_6StatusE @ 386 NONAME + _ZN10QtMobility21QContactManagerEngine13updateRequestEPNS_23QContactAbstractRequestERK5QListINS_8QContactEENS_15QContactManager5ErrorERKS3_IS9_ENS1_6StatusEb @ 387 NONAME + _ZN10QtMobility21QContactManagerEngine13updateRequestEPNS_23QContactAbstractRequestERK5QListIjENS_15QContactManager5ErrorERKS3_IS8_ENS1_6StatusEb @ 388 NONAME + _ZN10QtMobility21QContactManagerEngine14compareContactERKNS_8QContactES3_RK5QListINS_17QContactSortOrderEE @ 389 NONAME + _ZN10QtMobility21QContactManagerEngine14compareVariantERK8QVariantS3_N2Qt15CaseSensitivityE @ 390 NONAME + _ZN10QtMobility21QContactManagerEngine14removeContactsEP5QListIjEP4QMapIiNS_15QContactManager5ErrorEERS6_ @ 391 NONAME + _ZN10QtMobility21QContactManagerEngine14removeContactsEP5QListIjERNS_15QContactManager5ErrorE @ 392 NONAME + _ZN10QtMobility21QContactManagerEngine15contactsChangedERK5QListIjE @ 393 NONAME + _ZN10QtMobility21QContactManagerEngine15contactsRemovedERK5QListIjE @ 394 NONAME + _ZN10QtMobility21QContactManagerEngine16requestDestroyedEPNS_23QContactAbstractRequestE @ 395 NONAME + _ZN10QtMobility21QContactManagerEngine16saveRelationshipEPNS_20QContactRelationshipERNS_15QContactManager5ErrorE @ 396 NONAME + _ZN10QtMobility21QContactManagerEngine16setSelfContactIdERKjRNS_15QContactManager5ErrorE @ 397 NONAME + _ZN10QtMobility21QContactManagerEngine16staticMetaObjectE @ 398 NONAME DATA 16 + _ZN10QtMobility21QContactManagerEngine17saveRelationshipsEP5QListINS_20QContactRelationshipEERNS_15QContactManager5ErrorE @ 399 NONAME + _ZN10QtMobility21QContactManagerEngine17schemaDefinitionsEv @ 400 NONAME + _ZN10QtMobility21QContactManagerEngine18relationshipsAddedERK5QListIjE @ 401 NONAME + _ZN10QtMobility21QContactManagerEngine18removeRelationshipERKNS_20QContactRelationshipERNS_15QContactManager5ErrorE @ 402 NONAME + _ZN10QtMobility21QContactManagerEngine18updateRequestStateEPNS_23QContactAbstractRequestENS1_5StateE @ 403 NONAME + _ZN10QtMobility21QContactManagerEngine19getStaticMetaObjectEv @ 404 NONAME + _ZN10QtMobility21QContactManagerEngine19removeRelationshipsERK5QListINS_20QContactRelationshipEERNS_15QContactManager5ErrorE @ 405 NONAME + _ZN10QtMobility21QContactManagerEngine19updateRequestStatusEPNS_23QContactAbstractRequestENS_15QContactManager5ErrorER5QListIS4_ENS1_6StatusEb @ 406 NONAME + _ZN10QtMobility21QContactManagerEngine20relationshipsRemovedERK5QListIjE @ 407 NONAME + _ZN10QtMobility21QContactManagerEngine20saveDetailDefinitionERKNS_24QContactDetailDefinitionERK7QStringRNS_15QContactManager5ErrorE @ 408 NONAME + _ZN10QtMobility21QContactManagerEngine20selfContactIdChangedERKjS2_ @ 409 NONAME + _ZN10QtMobility21QContactManagerEngine20validateActionFilterERKNS_14QContactFilterE @ 410 NONAME + _ZN10QtMobility21QContactManagerEngine22removeDetailDefinitionERK7QStringS3_RNS_15QContactManager5ErrorE @ 411 NONAME + _ZN10QtMobility21QContactManagerEngine22waitForRequestFinishedEPNS_23QContactAbstractRequestEi @ 412 NONAME + _ZN10QtMobility21QContactManagerEngine22waitForRequestProgressEPNS_23QContactAbstractRequestEi @ 413 NONAME + _ZN10QtMobility21QContactManagerEngine23setContactRelationshipsEPNS_8QContactERK5QListINS_20QContactRelationshipEE @ 414 NONAME + _ZN10QtMobility21QContactManagerEngine24updateContactSaveRequestEPNS_19QContactSaveRequestERK5QListINS_8QContactEENS_15QContactManager5ErrorERK4QMapIiS9_E @ 415 NONAME + _ZN10QtMobility21QContactManagerEngine25updateContactFetchRequestEPNS_20QContactFetchRequestERK5QListINS_8QContactEENS_15QContactManager5ErrorE @ 416 NONAME + _ZN10QtMobility21QContactManagerEngine26updateContactRemoveRequestEPNS_21QContactRemoveRequestENS_15QContactManager5ErrorERK4QMapIiS4_E @ 417 NONAME + _ZN10QtMobility21QContactManagerEngine27updateDefinitionSaveRequestEPNS_35QContactDetailDefinitionSaveRequestERK5QListINS_24QContactDetailDefinitionEENS_15QContactManager5ErrorERK4QMapIiS9_E @ 418 NONAME + _ZN10QtMobility21QContactManagerEngine28updateDefinitionFetchRequestEPNS_36QContactDetailDefinitionFetchRequestERK4QMapI7QStringNS_24QContactDetailDefinitionEENS_15QContactManager5ErrorERKS3_IiSA_E @ 419 NONAME + _ZN10QtMobility21QContactManagerEngine29updateDefinitionRemoveRequestEPNS_37QContactDetailDefinitionRemoveRequestENS_15QContactManager5ErrorERK4QMapIiS4_E @ 420 NONAME + _ZN10QtMobility21QContactManagerEngine29updateRelationshipSaveRequestEPNS_31QContactRelationshipSaveRequestERK5QListINS_20QContactRelationshipEENS_15QContactManager5ErrorERK4QMapIiS9_E @ 421 NONAME + _ZN10QtMobility21QContactManagerEngine30updateRelationshipFetchRequestEPNS_32QContactRelationshipFetchRequestERK5QListINS_20QContactRelationshipEENS_15QContactManager5ErrorE @ 422 NONAME + _ZN10QtMobility21QContactManagerEngine31updateRelationshipRemoveRequestEPNS_33QContactRelationshipRemoveRequestENS_15QContactManager5ErrorERK4QMapIiS4_E @ 423 NONAME + _ZN10QtMobility21QContactManagerEngine32updateContactLocalIdFetchRequestEPNS_27QContactLocalIdFetchRequestERK5QListIjENS_15QContactManager5ErrorE @ 424 NONAME + _ZN10QtMobility21QContactManagerEngine7versionEv @ 425 NONAME + _ZN10QtMobility21QContactManagerEngine9addSortedEP5QListINS_8QContactEERKS2_RKS1_INS_17QContactSortOrderEE @ 426 NONAME + _ZN10QtMobility21QContactOnlineAccount10SubTypeSipE @ 427 NONAME DATA 4 + _ZN10QtMobility21QContactOnlineAccount11SubTypeImppE @ 428 NONAME DATA 5 + _ZN10QtMobility21QContactOnlineAccount12PresenceAwayE @ 429 NONAME DATA 5 + _ZN10QtMobility21QContactOnlineAccount12PresenceBusyE @ 430 NONAME DATA 5 + _ZN10QtMobility21QContactOnlineAccount13FieldNicknameE @ 431 NONAME DATA 9 + _ZN10QtMobility21QContactOnlineAccount13FieldPresenceE @ 432 NONAME DATA 9 + _ZN10QtMobility21QContactOnlineAccount13FieldSubTypesE @ 433 NONAME DATA 9 + _ZN10QtMobility21QContactOnlineAccount14DefinitionNameE @ 434 NONAME DATA 14 + _ZN10QtMobility21QContactOnlineAccount14PresenceHiddenE @ 435 NONAME DATA 7 + _ZN10QtMobility21QContactOnlineAccount14SubTypeSipVoipE @ 436 NONAME DATA 8 + _ZN10QtMobility21QContactOnlineAccount15FieldAccountUriE @ 437 NONAME DATA 11 + _ZN10QtMobility21QContactOnlineAccount15PresenceOfflineE @ 438 NONAME DATA 8 + _ZN10QtMobility21QContactOnlineAccount15PresenceUnknownE @ 439 NONAME DATA 8 + _ZN10QtMobility21QContactOnlineAccount17FieldCapabilitiesE @ 440 NONAME DATA 13 + _ZN10QtMobility21QContactOnlineAccount17PresenceAvailableE @ 441 NONAME DATA 10 + _ZN10QtMobility21QContactOnlineAccount17SubTypeVideoShareE @ 442 NONAME DATA 11 + _ZN10QtMobility21QContactOnlineAccount18FieldStatusMessageE @ 443 NONAME DATA 14 + _ZN10QtMobility21QContactOnlineAccount20FieldServiceProviderE @ 444 NONAME DATA 16 + _ZN10QtMobility21QContactOnlineAccount20PresenceExtendedAwayE @ 445 NONAME DATA 13 + _ZN10QtMobility21QContactRemoveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 446 NONAME + _ZN10QtMobility21QContactRemoveRequest11qt_metacastEPKc @ 447 NONAME + _ZN10QtMobility21QContactRemoveRequest13setContactIdsERK5QListIjE @ 448 NONAME + _ZN10QtMobility21QContactRemoveRequest16staticMetaObjectE @ 449 NONAME DATA 16 + _ZN10QtMobility21QContactRemoveRequest19getStaticMetaObjectEv @ 450 NONAME + _ZN10QtMobility21QContactRemoveRequest8progressEPS0_ @ 451 NONAME + _ZN10QtMobility21QContactRemoveRequest9setFilterERKNS_14QContactFilterE @ 452 NONAME + _ZN10QtMobility21QContactRemoveRequestC1Ev @ 453 NONAME + _ZN10QtMobility21QContactRemoveRequestC2Ev @ 454 NONAME + _ZN10QtMobility21QContactRemoveRequestD0Ev @ 455 NONAME + _ZN10QtMobility21QContactRemoveRequestD1Ev @ 456 NONAME + _ZN10QtMobility21QContactRemoveRequestD2Ev @ 457 NONAME + _ZN10QtMobility23QContactAbstractRequest10setManagerEPNS_15QContactManagerE @ 458 NONAME + _ZN10QtMobility23QContactAbstractRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 459 NONAME + _ZN10QtMobility23QContactAbstractRequest11qt_metacastEPKc @ 460 NONAME + _ZN10QtMobility23QContactAbstractRequest12stateChangedENS0_5StateE @ 461 NONAME + _ZN10QtMobility23QContactAbstractRequest15waitForFinishedEi @ 462 NONAME + _ZN10QtMobility23QContactAbstractRequest15waitForProgressEi @ 463 NONAME + _ZN10QtMobility23QContactAbstractRequest16resultsAvailableEv @ 464 NONAME + _ZN10QtMobility23QContactAbstractRequest16staticMetaObjectE @ 465 NONAME DATA 16 + _ZN10QtMobility23QContactAbstractRequest19getStaticMetaObjectEv @ 466 NONAME + _ZN10QtMobility23QContactAbstractRequest5startEv @ 467 NONAME + _ZN10QtMobility23QContactAbstractRequest6cancelEv @ 468 NONAME + _ZN10QtMobility23QContactAbstractRequestC1EPNS_30QContactAbstractRequestPrivateE @ 469 NONAME + _ZN10QtMobility23QContactAbstractRequestC2EPNS_30QContactAbstractRequestPrivateE @ 470 NONAME + _ZN10QtMobility23QContactAbstractRequestD0Ev @ 471 NONAME + _ZN10QtMobility23QContactAbstractRequestD1Ev @ 472 NONAME + _ZN10QtMobility23QContactAbstractRequestD2Ev @ 473 NONAME + _ZN10QtMobility23QContactChangeLogFilter12setEventTypeENS0_9EventTypeE @ 474 NONAME + _ZN10QtMobility23QContactChangeLogFilter8setSinceERK9QDateTime @ 475 NONAME + _ZN10QtMobility23QContactChangeLogFilterC1ENS0_9EventTypeE @ 476 NONAME + _ZN10QtMobility23QContactChangeLogFilterC1ERKNS_14QContactFilterE @ 477 NONAME + _ZN10QtMobility23QContactChangeLogFilterC2ENS0_9EventTypeE @ 478 NONAME + _ZN10QtMobility23QContactChangeLogFilterC2ERKNS_14QContactFilterE @ 479 NONAME + _ZN10QtMobility24QContactActionDescriptor13setActionNameERK7QString @ 480 NONAME + _ZN10QtMobility24QContactActionDescriptor13setVendorNameERK7QString @ 481 NONAME + _ZN10QtMobility24QContactActionDescriptor24setImplementationVersionEi @ 482 NONAME + _ZN10QtMobility24QContactActionDescriptorC1ERK7QStringS3_i @ 483 NONAME + _ZN10QtMobility24QContactActionDescriptorC1ERKS0_ @ 484 NONAME + _ZN10QtMobility24QContactActionDescriptorC2ERK7QStringS3_i @ 485 NONAME + _ZN10QtMobility24QContactActionDescriptorC2ERKS0_ @ 486 NONAME + _ZN10QtMobility24QContactActionDescriptorD1Ev @ 487 NONAME + _ZN10QtMobility24QContactActionDescriptorD2Ev @ 488 NONAME + _ZN10QtMobility24QContactActionDescriptoraSERKS0_ @ 489 NONAME + _ZN10QtMobility24QContactDetailDefinition11insertFieldERK7QStringRKNS_29QContactDetailFieldDefinitionE @ 490 NONAME + _ZN10QtMobility24QContactDetailDefinition11removeFieldERK7QString @ 491 NONAME + _ZN10QtMobility24QContactDetailDefinition19setAccessConstraintERKNS0_16AccessConstraintE @ 492 NONAME + _ZN10QtMobility24QContactDetailDefinition6fieldsEv @ 493 NONAME + _ZN10QtMobility24QContactDetailDefinition7setNameERK7QString @ 494 NONAME + _ZN10QtMobility24QContactDetailDefinition9setFieldsERK4QMapI7QStringNS_29QContactDetailFieldDefinitionEE @ 495 NONAME + _ZN10QtMobility24QContactDetailDefinition9setUniqueEb @ 496 NONAME + _ZN10QtMobility24QContactDetailDefinitionC1ERKS0_ @ 497 NONAME + _ZN10QtMobility24QContactDetailDefinitionC1Ev @ 498 NONAME + _ZN10QtMobility24QContactDetailDefinitionC2ERKS0_ @ 499 NONAME + _ZN10QtMobility24QContactDetailDefinitionC2Ev @ 500 NONAME + _ZN10QtMobility24QContactDetailDefinitionD1Ev @ 501 NONAME + _ZN10QtMobility24QContactDetailDefinitionD2Ev @ 502 NONAME + _ZN10QtMobility24QContactDetailDefinitionaSERKS0_ @ 503 NONAME + _ZN10QtMobility25QContactDetailRangeFilter13setMatchFlagsE6QFlagsINS_14QContactFilter9MatchFlagEE @ 504 NONAME + _ZN10QtMobility25QContactDetailRangeFilter23setDetailDefinitionNameERK7QStringS3_ @ 505 NONAME + _ZN10QtMobility25QContactDetailRangeFilter8setRangeERK8QVariantS3_6QFlagsINS0_9RangeFlagEE @ 506 NONAME + _ZN10QtMobility25QContactDetailRangeFilterC1ERKNS_14QContactFilterE @ 507 NONAME + _ZN10QtMobility25QContactDetailRangeFilterC1Ev @ 508 NONAME + _ZN10QtMobility25QContactDetailRangeFilterC2ERKNS_14QContactFilterE @ 509 NONAME + _ZN10QtMobility25QContactDetailRangeFilterC2Ev @ 510 NONAME + _ZN10QtMobility26QContactIntersectionFilter10setFiltersERK5QListINS_14QContactFilterEE @ 511 NONAME + _ZN10QtMobility26QContactIntersectionFilter6appendERKNS_14QContactFilterE @ 512 NONAME + _ZN10QtMobility26QContactIntersectionFilter6removeERKNS_14QContactFilterE @ 513 NONAME + _ZN10QtMobility26QContactIntersectionFilter7prependERKNS_14QContactFilterE @ 514 NONAME + _ZN10QtMobility26QContactIntersectionFilterC1ERKNS_14QContactFilterE @ 515 NONAME + _ZN10QtMobility26QContactIntersectionFilterC1Ev @ 516 NONAME + _ZN10QtMobility26QContactIntersectionFilterC2ERKNS_14QContactFilterE @ 517 NONAME + _ZN10QtMobility26QContactIntersectionFilterC2Ev @ 518 NONAME + _ZN10QtMobility26QContactIntersectionFilterlsERKNS_14QContactFilterE @ 519 NONAME + _ZN10QtMobility26QContactRelationshipFilter19setRelatedContactIdERKNS_10QContactIdE @ 520 NONAME + _ZN10QtMobility26QContactRelationshipFilter19setRelationshipTypeERK7QString @ 521 NONAME + _ZN10QtMobility26QContactRelationshipFilter21setOtherParticipantIdERKNS_10QContactIdE @ 522 NONAME + _ZN10QtMobility26QContactRelationshipFilter21setRelatedContactRoleENS0_4RoleE @ 523 NONAME + _ZN10QtMobility26QContactRelationshipFilter7setRoleENS0_4RoleE @ 524 NONAME + _ZN10QtMobility26QContactRelationshipFilterC1ERKNS_14QContactFilterE @ 525 NONAME + _ZN10QtMobility26QContactRelationshipFilterC1Ev @ 526 NONAME + _ZN10QtMobility26QContactRelationshipFilterC2ERKNS_14QContactFilterE @ 527 NONAME + _ZN10QtMobility26QContactRelationshipFilterC2Ev @ 528 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequest10setSortingERK5QListINS_17QContactSortOrderEE @ 529 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 530 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequest11qt_metacastEPKc @ 531 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequest16staticMetaObjectE @ 532 NONAME DATA 16 + _ZN10QtMobility27QContactLocalIdFetchRequest19getStaticMetaObjectEv @ 533 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequest8progressEPS0_b @ 534 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequest9setFilterERKNS_14QContactFilterE @ 535 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequestC1Ev @ 536 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequestC2Ev @ 537 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequestD0Ev @ 538 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequestD1Ev @ 539 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequestD2Ev @ 540 NONAME + _ZN10QtMobility28QContactManagerEngineFactoryD0Ev @ 541 NONAME + _ZN10QtMobility28QContactManagerEngineFactoryD1Ev @ 542 NONAME + _ZN10QtMobility28QContactManagerEngineFactoryD2Ev @ 543 NONAME + _ZN10QtMobility29QContactDetailFieldDefinition11setDataTypeEN8QVariant4TypeE @ 544 NONAME + _ZN10QtMobility29QContactDetailFieldDefinition18setAllowableValuesE5QListI8QVariantE @ 545 NONAME + _ZN10QtMobility29QContactDetailFieldDefinition19setAccessConstraintENS0_16AccessConstraintE @ 546 NONAME + _ZN10QtMobility29QContactDetailFieldDefinitionC1ERKS0_ @ 547 NONAME + _ZN10QtMobility29QContactDetailFieldDefinitionC1Ev @ 548 NONAME + _ZN10QtMobility29QContactDetailFieldDefinitionC2ERKS0_ @ 549 NONAME + _ZN10QtMobility29QContactDetailFieldDefinitionC2Ev @ 550 NONAME + _ZN10QtMobility29QContactDetailFieldDefinitionD1Ev @ 551 NONAME + _ZN10QtMobility29QContactDetailFieldDefinitionD2Ev @ 552 NONAME + _ZN10QtMobility29QContactDetailFieldDefinitionaSERKS0_ @ 553 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 554 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequest11qt_metacastEPKc @ 555 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequest16setRelationshipsERK5QListINS_20QContactRelationshipEE @ 556 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequest16staticMetaObjectE @ 557 NONAME DATA 16 + _ZN10QtMobility31QContactRelationshipSaveRequest19getStaticMetaObjectEv @ 558 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequest8progressEPS0_ @ 559 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequestC1Ev @ 560 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequestC2Ev @ 561 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequestD0Ev @ 562 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequestD1Ev @ 563 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequestD2Ev @ 564 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 565 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequest11qt_metacastEPKc @ 566 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequest14setParticipantERKNS_10QContactIdENS_26QContactRelationshipFilter4RoleE @ 567 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequest16staticMetaObjectE @ 568 NONAME DATA 16 + _ZN10QtMobility32QContactRelationshipFetchRequest19getStaticMetaObjectEv @ 569 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequest19setRelationshipTypeERK7QString @ 570 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequest8progressEPS0_b @ 571 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequest8setFirstERKNS_10QContactIdE @ 572 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequest9setSecondERKNS_10QContactIdE @ 573 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequestC1Ev @ 574 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequestC2Ev @ 575 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequestD0Ev @ 576 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequestD1Ev @ 577 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequestD2Ev @ 578 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 579 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequest11qt_metacastEPKc @ 580 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequest16setRelationshipsERK5QListINS_20QContactRelationshipEE @ 581 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequest16staticMetaObjectE @ 582 NONAME DATA 16 + _ZN10QtMobility33QContactRelationshipRemoveRequest19getStaticMetaObjectEv @ 583 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequest19setRelationshipTypeERK7QString @ 584 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequest8progressEPS0_ @ 585 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequest8setFirstERKNS_10QContactIdE @ 586 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequest9setSecondERKNS_10QContactIdE @ 587 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequestC1Ev @ 588 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequestC2Ev @ 589 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequestD0Ev @ 590 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequestD1Ev @ 591 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequestD2Ev @ 592 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 593 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequest11qt_metacastEPKc @ 594 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequest14setContactTypeERK7QString @ 595 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequest14setDefinitionsERK5QListINS_24QContactDetailDefinitionEE @ 596 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequest16staticMetaObjectE @ 597 NONAME DATA 16 + _ZN10QtMobility35QContactDetailDefinitionSaveRequest19getStaticMetaObjectEv @ 598 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequest8progressEPS0_ @ 599 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequestC1Ev @ 600 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequestC2Ev @ 601 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequestD0Ev @ 602 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequestD1Ev @ 603 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequestD2Ev @ 604 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 605 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequest11qt_metacastEPKc @ 606 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequest14setContactTypeERK7QString @ 607 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequest16staticMetaObjectE @ 608 NONAME DATA 16 + _ZN10QtMobility36QContactDetailDefinitionFetchRequest18setDefinitionNamesERK11QStringList @ 609 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequest19getStaticMetaObjectEv @ 610 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequest8progressEPS0_b @ 611 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequest8setNamesERK11QStringList @ 612 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequestC1Ev @ 613 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequestC2Ev @ 614 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequestD0Ev @ 615 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequestD1Ev @ 616 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequestD2Ev @ 617 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 618 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequest11qt_metacastEPKc @ 619 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequest14setContactTypeERK7QString @ 620 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequest16staticMetaObjectE @ 621 NONAME DATA 16 + _ZN10QtMobility37QContactDetailDefinitionRemoveRequest18setDefinitionNamesERK7QStringRK11QStringList @ 622 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequest19getStaticMetaObjectEv @ 623 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequest8progressEPS0_ @ 624 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequest8setNamesERK11QStringList @ 625 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequestC1Ev @ 626 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequestC2Ev @ 627 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequestD0Ev @ 628 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequestD1Ev @ 629 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequestD2Ev @ 630 NONAME + _ZN10QtMobility8QContact10saveDetailEPNS_14QContactDetailE @ 631 NONAME + _ZN10QtMobility8QContact12clearDetailsEv @ 632 NONAME + _ZN10QtMobility8QContact12removeDetailEPNS_14QContactDetailE @ 633 NONAME + _ZN10QtMobility8QContact18setPreferredDetailERK7QStringRKNS_14QContactDetailE @ 634 NONAME + _ZN10QtMobility8QContact20setRelationshipOrderERK5QListINS_20QContactRelationshipEE @ 635 NONAME + _ZN10QtMobility8QContact5setIdERKNS_10QContactIdE @ 636 NONAME + _ZN10QtMobility8QContact7setTypeERK7QString @ 637 NONAME + _ZN10QtMobility8QContact7setTypeERKNS_12QContactTypeE @ 638 NONAME + _ZN10QtMobility8QContactC1ERKS0_ @ 639 NONAME + _ZN10QtMobility8QContactC1Ev @ 640 NONAME + _ZN10QtMobility8QContactC2ERKS0_ @ 641 NONAME + _ZN10QtMobility8QContactC2Ev @ 642 NONAME + _ZN10QtMobility8QContactD1Ev @ 643 NONAME + _ZN10QtMobility8QContactD2Ev @ 644 NONAME + _ZN10QtMobility8QContactaSERKS0_ @ 645 NONAME + _ZN10QtMobilityanERKNS_14QContactFilterES2_ @ 646 NONAME + _ZN10QtMobilityorERKNS_14QContactFilterES2_ @ 647 NONAME + _ZNK10QtMobility10QContactId10managerUriEv @ 648 NONAME + _ZNK10QtMobility10QContactId7localIdEv @ 649 NONAME + _ZNK10QtMobility10QContactIdeqERKS0_ @ 650 NONAME + _ZNK10QtMobility10QContactIdneERKS0_ @ 651 NONAME + _ZNK10QtMobility12QContactName4lastEv @ 652 NONAME + _ZNK10QtMobility12QContactName5firstEv @ 653 NONAME + _ZNK10QtMobility12QContactName6middleEv @ 654 NONAME + _ZNK10QtMobility14QContactAction10metaObjectEv @ 655 NONAME + _ZNK10QtMobility14QContactAction16supportedDetailsERKNS_8QContactE @ 656 NONAME + _ZNK10QtMobility14QContactDetail12variantValueERK7QString @ 657 NONAME + _ZNK10QtMobility14QContactDetail13variantValuesEv @ 658 NONAME + _ZNK10QtMobility14QContactDetail14definitionNameEv @ 659 NONAME + _ZNK10QtMobility14QContactDetail16preferredActionsEv @ 660 NONAME + _ZNK10QtMobility14QContactDetail17accessConstraintsEv @ 661 NONAME + _ZNK10QtMobility14QContactDetail3keyEv @ 662 NONAME + _ZNK10QtMobility14QContactDetail5valueERK7QString @ 663 NONAME + _ZNK10QtMobility14QContactDetail6valuesEv @ 664 NONAME + _ZNK10QtMobility14QContactDetail7isEmptyEv @ 665 NONAME + _ZNK10QtMobility14QContactDetail8hasValueERK7QString @ 666 NONAME + _ZNK10QtMobility14QContactDetaileqERKS0_ @ 667 NONAME + _ZNK10QtMobility14QContactFilter4typeEv @ 668 NONAME + _ZNK10QtMobility14QContactFiltereqERKS0_ @ 669 NONAME + _ZNK10QtMobility15QContactManager10contactIdsERK5QListINS_17QContactSortOrderEE @ 670 NONAME + _ZNK10QtMobility15QContactManager10contactIdsERKNS_14QContactFilterERK5QListINS_17QContactSortOrderEE @ 671 NONAME + _ZNK10QtMobility15QContactManager10hasFeatureENS0_14ManagerFeatureERK7QString @ 672 NONAME + _ZNK10QtMobility15QContactManager10managerUriEv @ 673 NONAME + _ZNK10QtMobility15QContactManager10metaObjectEv @ 674 NONAME + _ZNK10QtMobility15QContactManager11managerNameEv @ 675 NONAME + _ZNK10QtMobility15QContactManager13relationshipsERK7QStringRKNS_10QContactIdENS_26QContactRelationshipFilter4RoleE @ 676 NONAME + _ZNK10QtMobility15QContactManager13relationshipsERKNS_10QContactIdENS_26QContactRelationshipFilter4RoleE @ 677 NONAME + _ZNK10QtMobility15QContactManager13selfContactIdEv @ 678 NONAME + _ZNK10QtMobility15QContactManager14managerVersionEv @ 679 NONAME + _ZNK10QtMobility15QContactManager15filterSupportedERKNS_14QContactFilterE @ 680 NONAME + _ZNK10QtMobility15QContactManager16detailDefinitionERK7QStringS3_ @ 681 NONAME + _ZNK10QtMobility15QContactManager17detailDefinitionsERK7QString @ 682 NONAME + _ZNK10QtMobility15QContactManager17isFilterSupportedERKNS_14QContactFilterE @ 683 NONAME + _ZNK10QtMobility15QContactManager17managerParametersEv @ 684 NONAME + _ZNK10QtMobility15QContactManager18supportedDataTypesEv @ 685 NONAME + _ZNK10QtMobility15QContactManager21implementationVersionEv @ 686 NONAME + _ZNK10QtMobility15QContactManager21supportedContactTypesEv @ 687 NONAME + _ZNK10QtMobility15QContactManager22synthesizeDisplayLabelERKNS_8QContactE @ 688 NONAME + _ZNK10QtMobility15QContactManager23synthesizedDisplayLabelERKNS_8QContactE @ 689 NONAME + _ZNK10QtMobility15QContactManager26supportedRelationshipTypesERK7QString @ 690 NONAME + _ZNK10QtMobility15QContactManager5errorEv @ 691 NONAME + _ZNK10QtMobility15QContactManager7contactERKjRK11QStringList @ 692 NONAME + _ZNK10QtMobility15QContactManager8contactsERK5QListINS_17QContactSortOrderEE @ 693 NONAME + _ZNK10QtMobility15QContactManager8contactsERK5QListINS_17QContactSortOrderEERK11QStringList @ 694 NONAME + _ZNK10QtMobility15QContactManager8contactsERKNS_14QContactFilterERK5QListINS_17QContactSortOrderEE @ 695 NONAME + _ZNK10QtMobility15QContactManager8contactsERKNS_14QContactFilterERK5QListINS_17QContactSortOrderEERK11QStringList @ 696 NONAME + _ZNK10QtMobility17QContactSortOrder11blankPolicyEv @ 697 NONAME + _ZNK10QtMobility17QContactSortOrder15caseSensitivityEv @ 698 NONAME + _ZNK10QtMobility17QContactSortOrder15detailFieldNameEv @ 699 NONAME + _ZNK10QtMobility17QContactSortOrder20detailDefinitionNameEv @ 700 NONAME + _ZNK10QtMobility17QContactSortOrder7isValidEv @ 701 NONAME + _ZNK10QtMobility17QContactSortOrder9directionEv @ 702 NONAME + _ZNK10QtMobility17QContactSortOrdereqERKS0_ @ 703 NONAME + _ZNK10QtMobility19QContactGeolocation16altitudeAccuracyEv @ 704 NONAME + _ZNK10QtMobility19QContactGeolocation5labelEv @ 705 NONAME + _ZNK10QtMobility19QContactGeolocation5speedEv @ 706 NONAME + _ZNK10QtMobility19QContactGeolocation7headingEv @ 707 NONAME + _ZNK10QtMobility19QContactGeolocation8accuracyEv @ 708 NONAME + _ZNK10QtMobility19QContactGeolocation8altitudeEv @ 709 NONAME + _ZNK10QtMobility19QContactGeolocation8latitudeEv @ 710 NONAME + _ZNK10QtMobility19QContactGeolocation9longitudeEv @ 711 NONAME + _ZNK10QtMobility19QContactGeolocation9timestampEv @ 712 NONAME + _ZNK10QtMobility19QContactSaveRequest10metaObjectEv @ 713 NONAME + _ZNK10QtMobility19QContactSaveRequest8contactsEv @ 714 NONAME + _ZNK10QtMobility19QContactSaveRequest8errorMapEv @ 715 NONAME + _ZNK10QtMobility19QContactUnionFilter7filtersEv @ 716 NONAME + _ZNK10QtMobility20QContactActionFilter10actionNameEv @ 717 NONAME + _ZNK10QtMobility20QContactActionFilter10vendorNameEv @ 718 NONAME + _ZNK10QtMobility20QContactActionFilter21implementationVersionEv @ 719 NONAME + _ZNK10QtMobility20QContactActionFilter5valueEv @ 720 NONAME + _ZNK10QtMobility20QContactDetailFilter10matchFlagsEv @ 721 NONAME + _ZNK10QtMobility20QContactDetailFilter15detailFieldNameEv @ 722 NONAME + _ZNK10QtMobility20QContactDetailFilter20detailDefinitionNameEv @ 723 NONAME + _ZNK10QtMobility20QContactDetailFilter5valueEv @ 724 NONAME + _ZNK10QtMobility20QContactFetchRequest10metaObjectEv @ 725 NONAME + _ZNK10QtMobility20QContactFetchRequest22definitionRestrictionsEv @ 726 NONAME + _ZNK10QtMobility20QContactFetchRequest6filterEv @ 727 NONAME + _ZNK10QtMobility20QContactFetchRequest7sortingEv @ 728 NONAME + _ZNK10QtMobility20QContactFetchRequest8contactsEv @ 729 NONAME + _ZNK10QtMobility20QContactMemoryEngine10contactIdsERK5QListINS_17QContactSortOrderEERNS_15QContactManager5ErrorE @ 730 NONAME + _ZNK10QtMobility20QContactMemoryEngine10hasFeatureENS_15QContactManager14ManagerFeatureERK7QString @ 731 NONAME + _ZNK10QtMobility20QContactMemoryEngine10metaObjectEv @ 732 NONAME + _ZNK10QtMobility20QContactMemoryEngine11managerNameEv @ 733 NONAME + _ZNK10QtMobility20QContactMemoryEngine13relationshipsERK7QStringRKNS_10QContactIdENS_26QContactRelationshipFilter4RoleERNS_15QContactManager5ErrorE @ 734 NONAME + _ZNK10QtMobility20QContactMemoryEngine13selfContactIdERNS_15QContactManager5ErrorE @ 735 NONAME + _ZNK10QtMobility20QContactMemoryEngine15filterSupportedERKNS_14QContactFilterE @ 736 NONAME + _ZNK10QtMobility20QContactMemoryEngine17detailDefinitionsERK7QStringRNS_15QContactManager5ErrorE @ 737 NONAME + _ZNK10QtMobility20QContactMemoryEngine17managerParametersEv @ 738 NONAME + _ZNK10QtMobility20QContactMemoryEngine18supportedDataTypesEv @ 739 NONAME + _ZNK10QtMobility20QContactMemoryEngine21implementationVersionEv @ 740 NONAME + _ZNK10QtMobility20QContactMemoryEngine26supportedRelationshipTypesERK7QString @ 741 NONAME + _ZNK10QtMobility20QContactMemoryEngine7contactERKjRK11QStringListRNS_15QContactManager5ErrorE @ 742 NONAME + _ZNK10QtMobility20QContactMemoryEngine7contactERKjRNS_15QContactManager5ErrorE @ 743 NONAME + _ZNK10QtMobility20QContactMemoryEngine8contactsERK5QListINS_17QContactSortOrderEERK11QStringListRNS_15QContactManager5ErrorE @ 744 NONAME + _ZNK10QtMobility20QContactMemoryEngine8contactsERK5QListINS_17QContactSortOrderEERNS_15QContactManager5ErrorE @ 745 NONAME + _ZNK10QtMobility20QContactRelationship16relationshipTypeEv @ 746 NONAME + _ZNK10QtMobility20QContactRelationship5firstEv @ 747 NONAME + _ZNK10QtMobility20QContactRelationship6secondEv @ 748 NONAME + _ZNK10QtMobility20QContactRelationshipeqERKS0_ @ 749 NONAME + _ZNK10QtMobility21QContactActionFactory10metaObjectEv @ 750 NONAME + _ZNK10QtMobility21QContactLocalIdFilter3idsEv @ 751 NONAME + _ZNK10QtMobility21QContactManagerEngine10contactIdsERK5QListINS_17QContactSortOrderEERNS_15QContactManager5ErrorE @ 752 NONAME + _ZNK10QtMobility21QContactManagerEngine10contactIdsERKNS_14QContactFilterERK5QListINS_17QContactSortOrderEERNS_15QContactManager5ErrorE @ 753 NONAME + _ZNK10QtMobility21QContactManagerEngine10hasFeatureENS_15QContactManager14ManagerFeatureERK7QString @ 754 NONAME + _ZNK10QtMobility21QContactManagerEngine10managerUriEv @ 755 NONAME + _ZNK10QtMobility21QContactManagerEngine10metaObjectEv @ 756 NONAME + _ZNK10QtMobility21QContactManagerEngine11managerNameEv @ 757 NONAME + _ZNK10QtMobility21QContactManagerEngine13relationshipsERK7QStringRKNS_10QContactIdENS_26QContactRelationshipFilter4RoleERNS_15QContactManager5ErrorE @ 758 NONAME + _ZNK10QtMobility21QContactManagerEngine13selfContactIdERNS_15QContactManager5ErrorE @ 759 NONAME + _ZNK10QtMobility21QContactManagerEngine14managerVersionEv @ 760 NONAME + _ZNK10QtMobility21QContactManagerEngine15filterSupportedERKNS_14QContactFilterE @ 761 NONAME + _ZNK10QtMobility21QContactManagerEngine15validateContactERKNS_8QContactERNS_15QContactManager5ErrorE @ 762 NONAME + _ZNK10QtMobility21QContactManagerEngine16detailDefinitionERK7QStringS3_RNS_15QContactManager5ErrorE @ 763 NONAME + _ZNK10QtMobility21QContactManagerEngine17detailDefinitionsERK7QStringRNS_15QContactManager5ErrorE @ 764 NONAME + _ZNK10QtMobility21QContactManagerEngine17isFilterSupportedERKNS_14QContactFilterE @ 765 NONAME + _ZNK10QtMobility21QContactManagerEngine17managerParametersEv @ 766 NONAME + _ZNK10QtMobility21QContactManagerEngine18supportedDataTypesEv @ 767 NONAME + _ZNK10QtMobility21QContactManagerEngine18validateDefinitionERKNS_24QContactDetailDefinitionERNS_15QContactManager5ErrorE @ 768 NONAME + _ZNK10QtMobility21QContactManagerEngine21implementationVersionEv @ 769 NONAME + _ZNK10QtMobility21QContactManagerEngine21supportedContactTypesEv @ 770 NONAME + _ZNK10QtMobility21QContactManagerEngine22setContactDisplayLabelERK7QStringRKNS_8QContactE @ 771 NONAME + _ZNK10QtMobility21QContactManagerEngine22synthesizeDisplayLabelERKNS_8QContactERNS_15QContactManager5ErrorE @ 772 NONAME + _ZNK10QtMobility21QContactManagerEngine23synthesizedDisplayLabelERKNS_8QContactERNS_15QContactManager5ErrorE @ 773 NONAME + _ZNK10QtMobility21QContactManagerEngine26setDetailAccessConstraintsEPNS_14QContactDetailE6QFlagsINS1_16AccessConstraintEE @ 774 NONAME + _ZNK10QtMobility21QContactManagerEngine26supportedRelationshipTypesERK7QString @ 775 NONAME + _ZNK10QtMobility21QContactManagerEngine7contactERKjRK11QStringListRNS_15QContactManager5ErrorE @ 776 NONAME + _ZNK10QtMobility21QContactManagerEngine7contactERKjRNS_15QContactManager5ErrorE @ 777 NONAME + _ZNK10QtMobility21QContactManagerEngine8contactsERK5QListINS_17QContactSortOrderEERK11QStringListRNS_15QContactManager5ErrorE @ 778 NONAME + _ZNK10QtMobility21QContactManagerEngine8contactsERK5QListINS_17QContactSortOrderEERNS_15QContactManager5ErrorE @ 779 NONAME + _ZNK10QtMobility21QContactManagerEngine8contactsERKNS_14QContactFilterERK5QListINS_17QContactSortOrderEERK11QStringListRNS_15QContactManager5ErrorE @ 780 NONAME + _ZNK10QtMobility21QContactManagerEngine8contactsERKNS_14QContactFilterERK5QListINS_17QContactSortOrderEERNS_15QContactManager5ErrorE @ 781 NONAME + _ZNK10QtMobility21QContactRemoveRequest10contactIdsEv @ 782 NONAME + _ZNK10QtMobility21QContactRemoveRequest10metaObjectEv @ 783 NONAME + _ZNK10QtMobility21QContactRemoveRequest6filterEv @ 784 NONAME + _ZNK10QtMobility21QContactRemoveRequest8errorMapEv @ 785 NONAME + _ZNK10QtMobility23QContactAbstractRequest10isCanceledEv @ 786 NONAME + _ZNK10QtMobility23QContactAbstractRequest10isFinishedEv @ 787 NONAME + _ZNK10QtMobility23QContactAbstractRequest10isInactiveEv @ 788 NONAME + _ZNK10QtMobility23QContactAbstractRequest10metaObjectEv @ 789 NONAME + _ZNK10QtMobility23QContactAbstractRequest4typeEv @ 790 NONAME + _ZNK10QtMobility23QContactAbstractRequest5errorEv @ 791 NONAME + _ZNK10QtMobility23QContactAbstractRequest5stateEv @ 792 NONAME + _ZNK10QtMobility23QContactAbstractRequest6errorsEv @ 793 NONAME + _ZNK10QtMobility23QContactAbstractRequest6statusEv @ 794 NONAME + _ZNK10QtMobility23QContactAbstractRequest7managerEv @ 795 NONAME + _ZNK10QtMobility23QContactAbstractRequest8isActiveEv @ 796 NONAME + _ZNK10QtMobility23QContactChangeLogFilter5sinceEv @ 797 NONAME + _ZNK10QtMobility23QContactChangeLogFilter9eventTypeEv @ 798 NONAME + _ZNK10QtMobility24QContactActionDescriptor10actionNameEv @ 799 NONAME + _ZNK10QtMobility24QContactActionDescriptor10vendorNameEv @ 800 NONAME + _ZNK10QtMobility24QContactActionDescriptor21implementationVersionEv @ 801 NONAME + _ZNK10QtMobility24QContactActionDescriptor7isEmptyEv @ 802 NONAME + _ZNK10QtMobility24QContactActionDescriptoreqERKS0_ @ 803 NONAME + _ZNK10QtMobility24QContactActionDescriptorneERKS0_ @ 804 NONAME + _ZNK10QtMobility24QContactDetailDefinition16accessConstraintEv @ 805 NONAME + _ZNK10QtMobility24QContactDetailDefinition4nameEv @ 806 NONAME + _ZNK10QtMobility24QContactDetailDefinition6fieldsEv @ 807 NONAME + _ZNK10QtMobility24QContactDetailDefinition7isEmptyEv @ 808 NONAME + _ZNK10QtMobility24QContactDetailDefinition8isUniqueEv @ 809 NONAME + _ZNK10QtMobility24QContactDetailDefinitioneqERKS0_ @ 810 NONAME + _ZNK10QtMobility25QContactDetailRangeFilter10matchFlagsEv @ 811 NONAME + _ZNK10QtMobility25QContactDetailRangeFilter10rangeFlagsEv @ 812 NONAME + _ZNK10QtMobility25QContactDetailRangeFilter15detailFieldNameEv @ 813 NONAME + _ZNK10QtMobility25QContactDetailRangeFilter20detailDefinitionNameEv @ 814 NONAME + _ZNK10QtMobility25QContactDetailRangeFilter8maxValueEv @ 815 NONAME + _ZNK10QtMobility25QContactDetailRangeFilter8minValueEv @ 816 NONAME + _ZNK10QtMobility26QContactIntersectionFilter7filtersEv @ 817 NONAME + _ZNK10QtMobility26QContactRelationshipFilter16relatedContactIdEv @ 818 NONAME + _ZNK10QtMobility26QContactRelationshipFilter16relationshipTypeEv @ 819 NONAME + _ZNK10QtMobility26QContactRelationshipFilter18otherParticipantIdEv @ 820 NONAME + _ZNK10QtMobility26QContactRelationshipFilter18relatedContactRoleEv @ 821 NONAME + _ZNK10QtMobility26QContactRelationshipFilter4roleEv @ 822 NONAME + _ZNK10QtMobility27QContactLocalIdFetchRequest10metaObjectEv @ 823 NONAME + _ZNK10QtMobility27QContactLocalIdFetchRequest3idsEv @ 824 NONAME + _ZNK10QtMobility27QContactLocalIdFetchRequest6filterEv @ 825 NONAME + _ZNK10QtMobility27QContactLocalIdFetchRequest7sortingEv @ 826 NONAME + _ZNK10QtMobility28QContactManagerEngineFactory31supportedImplementationVersionsEv @ 827 NONAME + _ZNK10QtMobility28QContactManagerEngineFactory7versionEv @ 828 NONAME + _ZNK10QtMobility29QContactDetailFieldDefinition15allowableValuesEv @ 829 NONAME + _ZNK10QtMobility29QContactDetailFieldDefinition16accessConstraintEv @ 830 NONAME + _ZNK10QtMobility29QContactDetailFieldDefinition8dataTypeEv @ 831 NONAME + _ZNK10QtMobility29QContactDetailFieldDefinitioneqERKS0_ @ 832 NONAME + _ZNK10QtMobility29QContactDetailFieldDefinitionneERKS0_ @ 833 NONAME + _ZNK10QtMobility31QContactRelationshipSaveRequest10metaObjectEv @ 834 NONAME + _ZNK10QtMobility31QContactRelationshipSaveRequest13relationshipsEv @ 835 NONAME + _ZNK10QtMobility31QContactRelationshipSaveRequest8errorMapEv @ 836 NONAME + _ZNK10QtMobility32QContactRelationshipFetchRequest10metaObjectEv @ 837 NONAME + _ZNK10QtMobility32QContactRelationshipFetchRequest11participantEv @ 838 NONAME + _ZNK10QtMobility32QContactRelationshipFetchRequest13relationshipsEv @ 839 NONAME + _ZNK10QtMobility32QContactRelationshipFetchRequest15participantRoleEv @ 840 NONAME + _ZNK10QtMobility32QContactRelationshipFetchRequest16relationshipTypeEv @ 841 NONAME + _ZNK10QtMobility32QContactRelationshipFetchRequest5firstEv @ 842 NONAME + _ZNK10QtMobility32QContactRelationshipFetchRequest6secondEv @ 843 NONAME + _ZNK10QtMobility33QContactRelationshipRemoveRequest10metaObjectEv @ 844 NONAME + _ZNK10QtMobility33QContactRelationshipRemoveRequest13relationshipsEv @ 845 NONAME + _ZNK10QtMobility33QContactRelationshipRemoveRequest16relationshipTypeEv @ 846 NONAME + _ZNK10QtMobility33QContactRelationshipRemoveRequest5firstEv @ 847 NONAME + _ZNK10QtMobility33QContactRelationshipRemoveRequest6secondEv @ 848 NONAME + _ZNK10QtMobility33QContactRelationshipRemoveRequest8errorMapEv @ 849 NONAME + _ZNK10QtMobility35QContactDetailDefinitionSaveRequest10metaObjectEv @ 850 NONAME + _ZNK10QtMobility35QContactDetailDefinitionSaveRequest11contactTypeEv @ 851 NONAME + _ZNK10QtMobility35QContactDetailDefinitionSaveRequest11definitionsEv @ 852 NONAME + _ZNK10QtMobility35QContactDetailDefinitionSaveRequest8errorMapEv @ 853 NONAME + _ZNK10QtMobility36QContactDetailDefinitionFetchRequest10metaObjectEv @ 854 NONAME + _ZNK10QtMobility36QContactDetailDefinitionFetchRequest11contactTypeEv @ 855 NONAME + _ZNK10QtMobility36QContactDetailDefinitionFetchRequest11definitionsEv @ 856 NONAME + _ZNK10QtMobility36QContactDetailDefinitionFetchRequest15definitionNamesEv @ 857 NONAME + _ZNK10QtMobility36QContactDetailDefinitionFetchRequest5namesEv @ 858 NONAME + _ZNK10QtMobility36QContactDetailDefinitionFetchRequest8errorMapEv @ 859 NONAME + _ZNK10QtMobility37QContactDetailDefinitionRemoveRequest10metaObjectEv @ 860 NONAME + _ZNK10QtMobility37QContactDetailDefinitionRemoveRequest11contactTypeEv @ 861 NONAME + _ZNK10QtMobility37QContactDetailDefinitionRemoveRequest15definitionNamesEv @ 862 NONAME + _ZNK10QtMobility37QContactDetailDefinitionRemoveRequest5namesEv @ 863 NONAME + _ZNK10QtMobility37QContactDetailDefinitionRemoveRequest8errorMapEv @ 864 NONAME + _ZNK10QtMobility8QContact12displayLabelEv @ 865 NONAME + _ZNK10QtMobility8QContact13relationshipsERK7QString @ 866 NONAME + _ZNK10QtMobility8QContact15preferredDetailERK7QString @ 867 NONAME + _ZNK10QtMobility8QContact15relatedContactsERK7QStringNS_26QContactRelationshipFilter4RoleE @ 868 NONAME + _ZNK10QtMobility8QContact16availableActionsERK7QStringi @ 869 NONAME + _ZNK10QtMobility8QContact16detailWithActionERK7QString @ 870 NONAME + _ZNK10QtMobility8QContact17detailsWithActionERK7QString @ 871 NONAME + _ZNK10QtMobility8QContact17isPreferredDetailERK7QStringRKNS_14QContactDetailE @ 872 NONAME + _ZNK10QtMobility8QContact17relationshipOrderEv @ 873 NONAME + _ZNK10QtMobility8QContact2idEv @ 874 NONAME + _ZNK10QtMobility8QContact4typeEv @ 875 NONAME + _ZNK10QtMobility8QContact6detailERK7QString @ 876 NONAME + _ZNK10QtMobility8QContact7detailsERK7QString @ 877 NONAME + _ZNK10QtMobility8QContact7detailsERK7QStringS3_S3_ @ 878 NONAME + _ZNK10QtMobility8QContact7isEmptyEv @ 879 NONAME + _ZNK10QtMobility8QContact7localIdEv @ 880 NONAME + _ZNK10QtMobility8QContacteqERKS0_ @ 881 NONAME + _ZTIN10QtMobility12QContactNameE @ 882 NONAME + _ZTIN10QtMobility12QContactTypeE @ 883 NONAME + _ZTIN10QtMobility14QContactActionE @ 884 NONAME + _ZTIN10QtMobility14QContactDetailE @ 885 NONAME + _ZTIN10QtMobility14QContactFilterE @ 886 NONAME + _ZTIN10QtMobility15QContactManagerE @ 887 NONAME + _ZTIN10QtMobility17QContactTimestampE @ 888 NONAME + _ZTIN10QtMobility19QContactSaveRequestE @ 889 NONAME + _ZTIN10QtMobility19QContactUnionFilterE @ 890 NONAME + _ZTIN10QtMobility20QContactActionFilterE @ 891 NONAME + _ZTIN10QtMobility20QContactDetailFilterE @ 892 NONAME + _ZTIN10QtMobility20QContactDisplayLabelE @ 893 NONAME + _ZTIN10QtMobility20QContactFetchRequestE @ 894 NONAME + _ZTIN10QtMobility20QContactMemoryEngineE @ 895 NONAME + _ZTIN10QtMobility20QContactOrganizationE @ 896 NONAME + _ZTIN10QtMobility21QContactActionFactoryE @ 897 NONAME + _ZTIN10QtMobility21QContactInvalidFilterE @ 898 NONAME + _ZTIN10QtMobility21QContactLocalIdFilterE @ 899 NONAME + _ZTIN10QtMobility21QContactManagerEngineE @ 900 NONAME + _ZTIN10QtMobility21QContactRemoveRequestE @ 901 NONAME + _ZTIN10QtMobility23QContactAbstractRequestE @ 902 NONAME + _ZTIN10QtMobility23QContactChangeLogFilterE @ 903 NONAME + _ZTIN10QtMobility25QContactDetailRangeFilterE @ 904 NONAME + _ZTIN10QtMobility26QContactIntersectionFilterE @ 905 NONAME + _ZTIN10QtMobility26QContactRelationshipFilterE @ 906 NONAME + _ZTIN10QtMobility27QContactLocalIdFetchRequestE @ 907 NONAME + _ZTIN10QtMobility28QContactManagerEngineFactoryE @ 908 NONAME + _ZTIN10QtMobility31QContactRelationshipSaveRequestE @ 909 NONAME + _ZTIN10QtMobility32QContactRelationshipFetchRequestE @ 910 NONAME + _ZTIN10QtMobility33QContactRelationshipRemoveRequestE @ 911 NONAME + _ZTIN10QtMobility35QContactDetailDefinitionSaveRequestE @ 912 NONAME + _ZTIN10QtMobility36QContactDetailDefinitionFetchRequestE @ 913 NONAME + _ZTIN10QtMobility37QContactDetailDefinitionRemoveRequestE @ 914 NONAME + _ZTVN10QtMobility12QContactNameE @ 915 NONAME + _ZTVN10QtMobility12QContactTypeE @ 916 NONAME + _ZTVN10QtMobility14QContactActionE @ 917 NONAME + _ZTVN10QtMobility14QContactDetailE @ 918 NONAME + _ZTVN10QtMobility14QContactFilterE @ 919 NONAME + _ZTVN10QtMobility15QContactManagerE @ 920 NONAME + _ZTVN10QtMobility17QContactTimestampE @ 921 NONAME + _ZTVN10QtMobility19QContactSaveRequestE @ 922 NONAME + _ZTVN10QtMobility19QContactUnionFilterE @ 923 NONAME + _ZTVN10QtMobility20QContactActionFilterE @ 924 NONAME + _ZTVN10QtMobility20QContactDetailFilterE @ 925 NONAME + _ZTVN10QtMobility20QContactDisplayLabelE @ 926 NONAME + _ZTVN10QtMobility20QContactFetchRequestE @ 927 NONAME + _ZTVN10QtMobility20QContactMemoryEngineE @ 928 NONAME + _ZTVN10QtMobility20QContactOrganizationE @ 929 NONAME + _ZTVN10QtMobility21QContactActionFactoryE @ 930 NONAME + _ZTVN10QtMobility21QContactInvalidFilterE @ 931 NONAME + _ZTVN10QtMobility21QContactLocalIdFilterE @ 932 NONAME + _ZTVN10QtMobility21QContactManagerEngineE @ 933 NONAME + _ZTVN10QtMobility21QContactRemoveRequestE @ 934 NONAME + _ZTVN10QtMobility23QContactAbstractRequestE @ 935 NONAME + _ZTVN10QtMobility23QContactChangeLogFilterE @ 936 NONAME + _ZTVN10QtMobility25QContactDetailRangeFilterE @ 937 NONAME + _ZTVN10QtMobility26QContactIntersectionFilterE @ 938 NONAME + _ZTVN10QtMobility26QContactRelationshipFilterE @ 939 NONAME + _ZTVN10QtMobility27QContactLocalIdFetchRequestE @ 940 NONAME + _ZTVN10QtMobility28QContactManagerEngineFactoryE @ 941 NONAME + _ZTVN10QtMobility31QContactRelationshipSaveRequestE @ 942 NONAME + _ZTVN10QtMobility32QContactRelationshipFetchRequestE @ 943 NONAME + _ZTVN10QtMobility33QContactRelationshipRemoveRequestE @ 944 NONAME + _ZTVN10QtMobility35QContactDetailDefinitionSaveRequestE @ 945 NONAME + _ZTVN10QtMobility36QContactDetailDefinitionFetchRequestE @ 946 NONAME + _ZTVN10QtMobility37QContactDetailDefinitionRemoveRequestE @ 947 NONAME diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/engines/qcontactinvalidbackend.cpp --- a/qtcontactsmobility/src/contacts/engines/qcontactinvalidbackend.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/engines/qcontactinvalidbackend.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -71,7 +71,7 @@ } /*! \reimp */ -QString QContactInvalidEngine::synthesizeDisplayLabel(const QContact& contact, QContactManager::Error& error) const +QString QContactInvalidEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const { Q_UNUSED(contact); error = QContactManager::NotSupportedError; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/engines/qcontactinvalidbackend_p.h --- a/qtcontactsmobility/src/contacts/engines/qcontactinvalidbackend_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/engines/qcontactinvalidbackend_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -68,7 +68,7 @@ QContactInvalidEngine(); void deref(); QString managerName() const; - QString synthesizeDisplayLabel(const QContact& contact, QContactManager::Error& error) const; + QString synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const; }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/engines/qcontactmemorybackend.cpp --- a/qtcontactsmobility/src/contacts/engines/qcontactmemorybackend.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/engines/qcontactmemorybackend.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -53,7 +53,6 @@ #include #include #include - QTM_BEGIN_NAMESPACE /*! @@ -138,7 +137,7 @@ return d->m_engineName; } -/*! \reimp */ +/*! This function is deprecated and should not be used. Use QContactMemoryEngine::managerVersion() instead! */ int QContactMemoryEngine::implementationVersion() const { return d->m_engineVersion; @@ -182,6 +181,12 @@ /*! \reimp */ QList QContactMemoryEngine::contacts(const QList& sortOrders, QContactManager::Error& error) const { + return contactIds(sortOrders, error); +} + +/*! \reimp */ +QList QContactMemoryEngine::contactIds(const QList &sortOrders, QContactManager::Error &error) const +{ // TODO: this needs to be done properly... error = QContactManager::NoError; QList sortedIds; @@ -194,6 +199,20 @@ } /*! \reimp */ +QList QContactMemoryEngine::contacts(const QList &sortOrders, const QStringList& definitionRestrictions, QContactManager::Error &error) const +{ + Q_UNUSED(definitionRestrictions); + error = QContactManager::NoError; + QList sortedContacts; + for (int i = 0; i < d->m_contacts.size(); i++) + QContactManagerEngine::addSorted(&sortedContacts, contact(d->m_contacts.at(i).localId(), QStringList(), error), sortOrders); + // we ignore the restrictions - we don't want to do extra work to remove them. + // note that the restriction is "optional" - it defines the minimum set of detail types which _must_ be returned + // but doesn't require that they are the _only_ detail types which are returned. + return sortedContacts; +} + +/*! \reimp */ QContact QContactMemoryEngine::contact(const QContactLocalId& contactId, QContactManager::Error& error) const { int index = d->m_contactIds.indexOf(contactId); @@ -206,7 +225,36 @@ QContactDisplayLabel dl = retn.detail(QContactDisplayLabel::DefinitionName); if (dl.label().isEmpty()) { QContactManager::Error synthError; - retn = setContactDisplayLabel(synthesizeDisplayLabel(retn, synthError), retn); + retn = setContactDisplayLabel(synthesizedDisplayLabel(retn, synthError), retn); + } + + // also, retrieve the current relationships the contact is involved with. + QList relationshipCache = d->m_orderedRelationships.value(contactId); + QContactManagerEngine::setContactRelationships(&retn, relationshipCache); + + // and return the contact + return retn; + } + + error = QContactManager::DoesNotExistError; + return QContact(); +} + +/*! \reimp */ +QContact QContactMemoryEngine::contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions, QContactManager::Error& error) const +{ + Q_UNUSED(definitionRestrictions); // return the entire contact (meets contract, no optimisations possible for memory engine). + int index = d->m_contactIds.indexOf(contactId); + if (index != -1) { + // found the contact successfully. + error = QContactManager::NoError; + QContact retn = d->m_contacts.at(index); + + // synthesize the display label if we need to. + QContactDisplayLabel dl = retn.detail(QContactDisplayLabel::DefinitionName); + if (dl.label().isEmpty()) { + QContactManager::Error synthError; + retn = setContactDisplayLabel(synthesizedDisplayLabel(retn, synthError), retn); } // also, retrieve the current relationships the contact is involved with. @@ -239,29 +287,9 @@ return false; } - QSetIterator it(d->m_createOnlyIds.value(theContact->type())); - while (it.hasNext()) { - const QString& id = it.next(); - QList details = oldContact.details(id); - QList newDetails = theContact->details(id); - - /* Any entries in old should still be in new */ - if (newDetails.count() < details.count()) { - error = QContactManager::DetailAccessError; - return false; - } - - /* Now do a more detailed check */ - for (int i=0; i < details.count(); i++) { - if (!newDetails.contains(details.at(i))) { - error = QContactManager::DetailAccessError; - return false; - } - } - } - QContactTimestamp ts = theContact->detail(QContactTimestamp::DefinitionName); ts.setLastModified(QDateTime::currentDateTime()); + QContactManagerEngine::setDetailAccessConstraints(&ts, QContactDetail::ReadOnly | QContactDetail::Irremovable); theContact->saveDetail(&ts); /* And we need to check that the relationships are up-to-date or not modified */ @@ -290,7 +318,7 @@ } // synthesize the display label for the contact. - QContact saveContact = setContactDisplayLabel(synthesizeDisplayLabel(*theContact, error), *theContact); + QContact saveContact = setContactDisplayLabel(synthesizedDisplayLabel(*theContact, error), *theContact); *theContact = saveContact; // Looks ok, so continue @@ -310,6 +338,7 @@ QContactTimestamp ts = theContact->detail(QContactTimestamp::DefinitionName); ts.setLastModified(QDateTime::currentDateTime()); ts.setCreated(ts.lastModified()); + setDetailAccessConstraints(&ts, QContactDetail::ReadOnly | QContactDetail::Irremovable); theContact->saveDetail(&ts); // update the contact item - set its ID @@ -317,7 +346,7 @@ theContact->setId(newId); // synthesize the display label for the contact. - QContact saveContact = setContactDisplayLabel(synthesizeDisplayLabel(*theContact, error), *theContact); + QContact saveContact = setContactDisplayLabel(synthesizedDisplayLabel(*theContact, error), *theContact); *theContact = saveContact; // finally, add the contact to our internal lists and return @@ -368,6 +397,37 @@ } } +/*! \reimp */ +bool QContactMemoryEngine::saveContacts(QList* contacts, QMap* errorMap, QContactManager::Error& error) +{ + if(errorMap) { + errorMap->clear(); + } + + if (!contacts) { + error = QContactManager::BadArgumentError; + return false; + } + + QContactChangeSet changeSet; + QContact current; + QContactManager::Error operationError = QContactManager::NoError; + for (int i = 0; i < contacts->count(); i++) { + current = contacts->at(i); + if (!saveContact(¤t, changeSet, error)) { + operationError = error; + errorMap->insert(i, operationError); + } else { + (*contacts)[i] = current; + } + } + + error = operationError; + changeSet.emitSignals(this); + // return false if some error occurred + return error == QContactManager::NoError; +} + bool QContactMemoryEngine::removeContact(const QContactLocalId& contactId, QContactChangeSet& changeSet, QContactManager::Error& error) { int index = d->m_contactIds.indexOf(contactId); @@ -447,6 +507,33 @@ } /*! \reimp */ +bool QContactMemoryEngine::removeContacts(QList* contactIds, QMap* errorMap, QContactManager::Error& error) +{ + if (!contactIds) { + error = QContactManager::BadArgumentError; + return false; + } + + QContactChangeSet changeSet; + QContactLocalId current; + QContactManager::Error operationError = QContactManager::NoError; + for (int i = 0; i < contactIds->count(); i++) { + current = contactIds->at(i); + if (!removeContact(current, changeSet, error)) { + operationError = error; + errorMap->insert(i, operationError); + } else { + (*contactIds)[i] = 0; + } + } + + error = operationError; + changeSet.emitSignals(this); + // return false if some errors occurred + return error == QContactManager::NoError; +} + +/*! \reimp */ QList QContactMemoryEngine::relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationshipFilter::Role role, QContactManager::Error& error) const { QContactId defaultId; @@ -628,20 +715,6 @@ // lazy initialisation of schema definitions. if (d->m_definitions.isEmpty()) { d->m_definitions = QContactManagerEngine::schemaDefinitions(); - - // Extract create only definitions - QMap defMapForThisType(d->m_definitions.value(contactType)); - QStringList defMapKeys = defMapForThisType.keys(); - QSet createOnlyDefs; - for (int i = 0; i < defMapKeys.size(); i++) { - if (defMapForThisType.value(defMapKeys.at(i)).accessConstraint() == QContactDetailDefinition::CreateOnly) { - createOnlyDefs.insert(defMapKeys.at(i)); - } - } - - if (!createOnlyDefs.isEmpty()) { - d->m_createOnlyIds.insert(contactType, createOnlyDefs); - } } error = QContactManager::NoError; @@ -661,11 +734,6 @@ QMap defsForThisType = d->m_definitions.value(contactType); defsForThisType.insert(def.name(), def); d->m_definitions.insert(contactType, defsForThisType); - if (def.accessConstraint() == QContactDetailDefinition::CreateOnly) { - QSet createOnlyDefs = d->m_createOnlyIds.value(contactType); - createOnlyDefs.insert(def.name()); - d->m_createOnlyIds.insert(contactType, createOnlyDefs); - } error = QContactManager::NoError; return true; @@ -696,9 +764,6 @@ QMap defsForThisType = d->m_definitions.value(contactType); bool success = defsForThisType.remove(definitionId); d->m_definitions.insert(contactType, defsForThisType); - QSet createOnlyDefsForThisType = d->m_createOnlyIds.value(contactType); - createOnlyDefsForThisType.remove(definitionId); - d->m_createOnlyIds.insert(contactType, createOnlyDefsForThisType); if (success) error = QContactManager::NoError; else @@ -724,9 +789,9 @@ /*! \reimp */ bool QContactMemoryEngine::startRequest(QContactAbstractRequest* req) { - d->m_asynchronousOperations.enqueue(req); - QList dummy; - updateRequestStatus(req, QContactManager::NoError, dummy, QContactAbstractRequest::Active); + if (!d->m_asynchronousOperations.contains(req)) + d->m_asynchronousOperations.enqueue(req); + updateRequestState(req, QContactAbstractRequest::ActiveState); QTimer::singleShot(0, this, SLOT(performAsynchronousOperation())); return true; } @@ -734,12 +799,14 @@ /*! \reimp */ bool QContactMemoryEngine::cancelRequest(QContactAbstractRequest* req) { - QList dummy; - updateRequestStatus(req, QContactManager::NoError, dummy, QContactAbstractRequest::Cancelling); + updateRequestState(req, QContactAbstractRequest::CanceledState); return true; } -/*! \reimp */ +/*! This function is deprecated! Use QContactMemoryEngine::waitForRequestFinished() instead! + Waits up to \a msecs milliseconds for the request \a req to emit the progress() signal. + Returns true if the progress() signal was emitted during the period, otherwise false. +*/ bool QContactMemoryEngine::waitForRequestProgress(QContactAbstractRequest* req, int msecs) { Q_UNUSED(msecs); @@ -777,10 +844,8 @@ return; currentRequest = d->m_asynchronousOperations.dequeue(); - // check to see if it is cancelling; if so, cancel it and perform update. - if (currentRequest->status() == QContactAbstractRequest::Cancelling) { - QList dummy; - updateRequestStatus(currentRequest, QContactManager::NoError, dummy, QContactAbstractRequest::Cancelled); + // check to see if it is cancelling; if so, remove it from the queue and return. + if (currentRequest->state() == QContactAbstractRequest::CanceledState) { return; } @@ -788,7 +853,7 @@ QContactChangeSet changeSet; // Now perform the active request and emit required signals. - Q_ASSERT(currentRequest->status() == QContactAbstractRequest::Active); + Q_ASSERT(currentRequest->state() == QContactAbstractRequest::ActiveState); switch (currentRequest->type()) { case QContactAbstractRequest::ContactFetchRequest: { @@ -798,37 +863,12 @@ QStringList defs = r->definitionRestrictions(); QContactManager::Error operationError; - QList operationErrors; - QList requestedContacts; - QList requestedContactIds = contacts(filter, sorting, operationError); - - QContactManager::Error tempError; - for (int i = 0; i < requestedContactIds.size(); i++) { - QContact current = contact(requestedContactIds.at(i), tempError); - operationErrors.append(tempError); - - // check for single error; update total operation error if required - if (tempError != QContactManager::NoError) - operationError = tempError; - - // apply the required detail definition restrictions - if (!defs.isEmpty()) { - QList allDetails = current.details(); - for (int j = 0; j < allDetails.size(); j++) { - QContactDetail d = allDetails.at(j); - if (!defs.contains(d.definitionName())) { - // this detail is not required. - current.removeDetail(&d); - } - } - } - - // add the contact to the result list. - requestedContacts.append(current); - } + QList requestedContacts = QContactManagerEngine::contacts(filter, sorting, defs, operationError); // update the request with the results. - updateRequest(currentRequest, requestedContacts, operationError, operationErrors, QContactAbstractRequest::Finished); + if (!requestedContacts.isEmpty() || operationError != QContactManager::NoError) + updateContactFetchRequest(r, requestedContacts, operationError); // emit resultsAvailable() + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -839,9 +879,11 @@ QList sorting = r->sorting(); QContactManager::Error operationError = QContactManager::NoError; - QList requestedContactIds = contacts(filter, sorting, operationError); + QList requestedContactIds = QContactManagerEngine::contactIds(filter, sorting, operationError); - updateRequest(currentRequest, requestedContactIds, operationError, QList(), QContactAbstractRequest::Finished); + if (!requestedContactIds.isEmpty() || operationError != QContactManager::NoError) + updateContactLocalIdFetchRequest(r, requestedContactIds, operationError); // emit resultsAvailable() + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -851,16 +893,11 @@ QList contacts = r->contacts(); QContactManager::Error operationError = QContactManager::NoError; - QList operationErrors = saveContacts(&contacts, operationError); + QMap errorMap; + saveContacts(&contacts, &errorMap, operationError); - for (int i = 0; i < operationErrors.size(); i++) { - if (operationErrors.at(i) != QContactManager::NoError) { - operationError = operationErrors.at(i); - break; - } - } - - updateRequest(currentRequest, contacts, operationError, operationErrors, QContactAbstractRequest::Finished); + updateContactSaveRequest(r, contacts, operationError, errorMap); // there will always be results of some form. emit resultsAvailable(). + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -872,22 +909,23 @@ // if a failure occurred, the request error will be set to the most recent // error that occurred during the remove operation. QContactRemoveRequest* r = static_cast(currentRequest); - QContactFilter filter = r->filter(); - QContactManager::Error operationError = QContactManager::NoError; - QList contactsToRemove = contacts(filter, QList(), operationError); + QList contactsToRemove = r->contactIds(); + QMap errorMap; for (int i = 0; i < contactsToRemove.size(); i++) { QContactManager::Error tempError; removeContact(contactsToRemove.at(i), changeSet, tempError); - if (tempError != QContactManager::NoError) + if (tempError != QContactManager::NoError) { + errorMap.insert(i, tempError); operationError = tempError; + } } - // there are no results, so just update the status with the error. - QList dummy; - updateRequestStatus(currentRequest, operationError, dummy, QContactAbstractRequest::Finished); + if (!errorMap.isEmpty() || operationError != QContactManager::NoError) + updateContactRemoveRequest(r, operationError, errorMap); // emit resultsAvailable() + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -895,24 +933,26 @@ { QContactDetailDefinitionFetchRequest* r = static_cast(currentRequest); QContactManager::Error operationError = QContactManager::NoError; - QList operationErrors; + QMap errorMap; QMap requestedDefinitions; - QStringList names = r->names(); + QStringList names = r->definitionNames(); if (names.isEmpty()) names = detailDefinitions(r->contactType(), operationError).keys(); // all definitions. QContactManager::Error tempError; for (int i = 0; i < names.size(); i++) { QContactDetailDefinition current = detailDefinition(names.at(i), r->contactType(), tempError); - operationErrors.append(tempError); requestedDefinitions.insert(names.at(i), current); - if (tempError != QContactManager::NoError) + if (tempError != QContactManager::NoError) { + errorMap.insert(i, tempError); operationError = tempError; + } } - // update the request with the results. - updateRequest(currentRequest, requestedDefinitions, operationError, operationErrors, QContactAbstractRequest::Finished); + if (!errorMap.isEmpty() || !requestedDefinitions.isEmpty() || operationError != QContactManager::NoError) + updateDefinitionFetchRequest(r, requestedDefinitions, operationError, errorMap); // emit resultsAvailable() + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -920,7 +960,7 @@ { QContactDetailDefinitionSaveRequest* r = static_cast(currentRequest); QContactManager::Error operationError = QContactManager::NoError; - QList operationErrors; + QMap errorMap; QList definitions = r->definitions(); QList savedDefinitions; @@ -929,36 +969,40 @@ QContactDetailDefinition current = definitions.at(i); saveDetailDefinition(current, r->contactType(), changeSet, tempError); savedDefinitions.append(current); - operationErrors.append(tempError); - if (tempError != QContactManager::NoError) + if (tempError != QContactManager::NoError) { + errorMap.insert(i, tempError); operationError = tempError; + } } // update the request with the results. - updateRequest(currentRequest, savedDefinitions, operationError, operationErrors, QContactAbstractRequest::Finished); + updateDefinitionSaveRequest(r, savedDefinitions, operationError, errorMap); // there will always be results of some form. emit resultsAvailable(). + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; case QContactAbstractRequest::DetailDefinitionRemoveRequest: { QContactDetailDefinitionRemoveRequest* r = static_cast(currentRequest); - QStringList names = r->names(); + QStringList names = r->definitionNames(); QContactManager::Error operationError = QContactManager::NoError; - QList operationErrors; + QMap errorMap; for (int i = 0; i < names.size(); i++) { QContactManager::Error tempError; removeDetailDefinition(names.at(i), r->contactType(), changeSet, tempError); - operationErrors.append(tempError); - if (tempError != QContactManager::NoError) + if (tempError != QContactManager::NoError) { + errorMap.insert(i, tempError); operationError = tempError; + } } // there are no results, so just update the status with the error. - updateRequestStatus(currentRequest, operationError, operationErrors, QContactAbstractRequest::Finished); + updateDefinitionRemoveRequest(r, operationError, errorMap); // emit resultsAvailable() + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -970,53 +1014,22 @@ QList allRelationships = relationships(QString(), QContactId(), QContactRelationshipFilter::Either, operationError); QList requestedRelationships; - // first criteria: source contact id must be empty or must match - if (r->first() == QContactId()) { - // all relationships match this criteria (zero id denotes "any") - requestedRelationships = allRelationships; - } else { - for (int i = 0; i < allRelationships.size(); i++) { - QContactRelationship currRelationship = allRelationships.at(i); - if (r->first() == currRelationship.first()) { - requestedRelationships.append(currRelationship); - } - } - } - - // second criteria: relationship type must be empty or must match - if (!r->relationshipType().isEmpty()) { - allRelationships = requestedRelationships; - requestedRelationships.clear(); - for (int i = 0; i < allRelationships.size(); i++) { - QContactRelationship currRelationship = allRelationships.at(i); - if (r->relationshipType() == currRelationship.relationshipType()) { - requestedRelationships.append(currRelationship); - } - } - } - - // third criteria: participant must be empty or must match (including role in relationship) - QString myUri = managerUri(); - QContactId anonymousParticipant; - anonymousParticipant.setLocalId(QContactLocalId(0)); - anonymousParticipant.setManagerUri(QString()); - if (r->participant() != anonymousParticipant) { - allRelationships = requestedRelationships; - requestedRelationships.clear(); - for (int i = 0; i < allRelationships.size(); i++) { - QContactRelationship currRelationship = allRelationships.at(i); - if ((r->participantRole() == QContactRelationshipFilter::Either || r->participantRole() == QContactRelationshipFilter::Second) - && currRelationship.second() == r->participant()) { - requestedRelationships.append(currRelationship); - } else if ((r->participantRole() == QContactRelationshipFilter::Either || r->participantRole() == QContactRelationshipFilter::First) - && currRelationship.first() == r->participant()) { - requestedRelationships.append(currRelationship); - } - } + // select the requested relationships. + for (int i = 0; i < allRelationships.size(); i++) { + QContactRelationship currRel = allRelationships.at(i); + if (r->first() != QContactId() && r->first() != currRel.first()) + continue; + if (r->second() != QContactId() && r->second() != currRel.second()) + continue; + if (!r->relationshipType().isEmpty() && r->relationshipType() != currRel.relationshipType()) + continue; + requestedRelationships.append(currRel); } // update the request with the results. - updateRequest(currentRequest, requestedRelationships, operationError, operationErrors, QContactAbstractRequest::Finished); + if (!requestedRelationships.isEmpty() || operationError != QContactManager::NoError) + updateRelationshipFetchRequest(r, requestedRelationships, operationError); // emit resultsAvailable() + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -1024,30 +1037,26 @@ { QContactRelationshipRemoveRequest* r = static_cast(currentRequest); QContactManager::Error operationError = QContactManager::NoError; - QList operationErrors; - QList matchingRelationships = relationships(r->relationshipType(), r->first(), QContactRelationshipFilter::First, operationError); + QList relationshipsToRemove = r->relationships(); + QMap errorMap; bool foundMatch = false; - for (int i = 0; i < matchingRelationships.size(); i++) { + for (int i = 0; i < relationshipsToRemove.size(); i++) { QContactManager::Error tempError; - QContactRelationship possibleMatch = matchingRelationships.at(i); + removeRelationship(relationshipsToRemove.at(i), tempError); - // if the second criteria matches, or is default constructed id, then we have a match and should remove it. - if (r->second() == QContactId() || possibleMatch.second() == r->second()) { - foundMatch = true; - removeRelationship(matchingRelationships.at(i), tempError); - operationErrors.append(tempError); - - if (tempError != QContactManager::NoError) - operationError = tempError; + if (tempError != QContactManager::NoError) { + errorMap.insert(i, tempError); + operationError = tempError; } } if (foundMatch == false && operationError == QContactManager::NoError) operationError = QContactManager::DoesNotExistError; - // there are no results, so just update the status with the error. - updateRequestStatus(currentRequest, operationError, operationErrors, QContactAbstractRequest::Finished); + if (!errorMap.isEmpty() || operationError != QContactManager::NoError) + updateRelationshipRemoveRequest(r, operationError, errorMap); // emit resultsAvailable() + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -1055,7 +1064,7 @@ { QContactRelationshipSaveRequest* r = static_cast(currentRequest); QContactManager::Error operationError = QContactManager::NoError; - QList operationErrors; + QMap errorMap; QList requestRelationships = r->relationships(); QList savedRelationships; @@ -1064,14 +1073,16 @@ QContactRelationship current = requestRelationships.at(i); saveRelationship(¤t, tempError); savedRelationships.append(current); - operationErrors.append(tempError); - if (tempError != QContactManager::NoError) + if (tempError != QContactManager::NoError) { + errorMap.insert(i, tempError); operationError = tempError; + } } // update the request with the results. - updateRequest(currentRequest, savedRelationships, operationError, operationErrors, QContactAbstractRequest::Finished); + updateRelationshipSaveRequest(r, savedRelationships, operationError, errorMap); // there will always be results of some form. emit resultsAvailable(). + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -1112,6 +1123,21 @@ /*! * \reimp */ +QStringList QContactMemoryEngine::supportedRelationshipTypes(const QString& contactType) const +{ + Q_UNUSED(contactType); + return QStringList() + << QContactRelationship::HasMember + << QContactRelationship::Aggregates + << QContactRelationship::IsSameAs + << QContactRelationship::HasAssistant + << QContactRelationship::HasManager + << QContactRelationship::HasSpouse; +} + +/*! + * \reimp + */ QList QContactMemoryEngine::supportedDataTypes() const { QList st; @@ -1131,7 +1157,8 @@ } /*! - * \reimp + * This function is deprecated. Use QContactManagerEngine::isFilterSupported() instead! + * The function returns true if the backend natively supports the given filter \a filter, otherwise false. */ bool QContactMemoryEngine::filterSupported(const QContactFilter& filter) const { diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/engines/qcontactmemorybackend_p.h --- a/qtcontactsmobility/src/contacts/engines/qcontactmemorybackend_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/engines/qcontactmemorybackend_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -112,7 +112,6 @@ QMap > m_orderedRelationships; // map of ordered lists of contact relationships QList m_definitionIds; // list of definition types (id's) mutable QMap > m_definitions; // map of contact type to map of definition name to definitions. - mutable QMap > m_createOnlyIds; // a list of create only definitions for each contact type QContactLocalId m_nextContactId; bool m_anonymous; // Is this backend ever shared? QString m_engineName; // name of this engine as supplied by factory (memory) @@ -140,11 +139,17 @@ QContactLocalId selfContactId(QContactManager::Error& error) const; /* Contacts - Accessors and Mutators */ - QList contacts(const QList& sortOrders, QContactManager::Error& error) const; - QContact contact(const QContactLocalId& contactId, QContactManager::Error& error) const; - QList saveContacts(QList* contacts, QContactManager::Error& error); + QList Q_DECL_DEPRECATED contacts(const QList& sortOrders, QContactManager::Error& error) const; + QList Q_DECL_DEPRECATED saveContacts(QList* contacts, QContactManager::Error& error); + QList Q_DECL_DEPRECATED removeContacts(QList* contactIds, QContactManager::Error& error); + QContact Q_DECL_DEPRECATED contact(const QContactLocalId& contactId, QContactManager::Error& error) const; + + QList contactIds(const QList &sortOrders, QContactManager::Error &error) const; + QList contacts(const QList &sortOrders, const QStringList& definitionRestrictions, QContactManager::Error &error) const; + QContact contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions, QContactManager::Error& error) const; + bool saveContacts(QList* contacts, QMap* errorMap, QContactManager::Error& error); bool saveContact(QContact* contact, QContactManager::Error& error); - QList removeContacts(QList* contactIds, QContactManager::Error& error); + bool removeContacts(QList* contactIds, QMap* errorMap, QContactManager::Error& error); bool removeContact(const QContactLocalId& contactId, QContactManager::Error& error); /* Relationships - Accessors and Mutators */ @@ -168,6 +173,7 @@ /* Capabilities reporting */ bool hasFeature(QContactManager::ManagerFeature feature, const QString& contactType) const; + QStringList supportedRelationshipTypes(const QString& contactType) const; bool filterSupported(const QContactFilter& filter) const; QList supportedDataTypes() const; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter.cpp --- a/qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -59,43 +59,41 @@ This use-case may be met with the following filter: \code - QContactRelationshipFilter groupFilter; // select all contacts - groupFilter.setRole(QContactRelationshipFilter::Second); // which are the second participant - groupFilter.setRelationshipType(QContactRelationship::HasMember); // in a group relationship - groupFilter.setOtherParticipantId(groupContact.id()); // with the group contact + QContactRelationshipFilter groupFilter; // select all contacts which are involved + groupFilter.setRelationshipType(QContactRelationship::HasMember); // in a group relationship + groupFilter.setRelatedContactId(groupContact.id()); // with the group contact + groupFilter.setRelatedContactRole(QContactRelationshipFilter::First); // where the group contact is the first participant \endcode Another common use-case might be to select the groups which a particular contact is a member of. This use-case may be met with the following filter: \code - QContactRelationshipFilter whichGroupsFilter; // select all contacts - whichGroupsFilter.setRole(QContactRelationshipFilter::First); // which are the first participant + QContactRelationshipFilter whichGroupsFilter; // select all contacts which are involved whichGroupsFilter.setRelationshipType(QContactRelationshipFilter::HasMember); // in a group relationship - whichGroupsFilter.setOtherParticipantId(particularContact.id()); // with the particular contact + whichGroupsFilter.setRelatedContactId(particularContact.id()); // with the particular contact + whichGroupsFilter.setRelatedContactRole(QContactRelationshipFilter::Second); // where the particular contact is the second participant \endcode - It is important to note that the setRole() and role() functions relate to the role - that a contact must play in a relationship in order to meet the role criteria of this filter. */ Q_IMPLEMENT_CONTACTFILTER_PRIVATE(QContactRelationshipFilter) /*! - * \enum QContactRelationshipFilter::Role - * Describes the roles that a contact may take in a relationship - * \value First The contact is the first contact in the relationship - * \value Second The contact is the second contact in the relationship - * \value Either The contact is either the first or second contact in the relationship + \enum QContactRelationshipFilter::Role + Describes the roles that a contact may take in a relationship + \value First The contact is the first contact in the relationship + \value Second The contact is the second contact in the relationship + \value Either The contact is either the first or second contact in the relationship */ /*! - * \fn QContactRelationshipFilter::QContactRelationshipFilter(const QContactFilter& other) - * Constructs a copy of \a other if possible, else constructs a new QContactRelationshipFilter. + \fn QContactRelationshipFilter::QContactRelationshipFilter(const QContactFilter& other) + Constructs a copy of \a other if possible, else constructs a new QContactRelationshipFilter. */ /*! - * Constructs a new relationship filter + Constructs a new relationship filter */ QContactRelationshipFilter::QContactRelationshipFilter() : QContactFilter(new QContactRelationshipFilterPrivate) @@ -103,16 +101,7 @@ } /*! - * Sets the role in the relationship that a contact must be in order to match this filter to \a roleInRelationship - */ -void QContactRelationshipFilter::setRole(QContactRelationshipFilter::Role roleInRelationship) -{ - Q_D(QContactRelationshipFilter); - d->m_roleInRelationship = roleInRelationship; -} - -/*! - * Sets the type of relationship which a contact must have in order to match this filter to \a relationshipType + Sets the type of relationship which a contact must have in order to match this filter to \a relationshipType */ void QContactRelationshipFilter::setRelationshipType(const QString& relationshipType) { @@ -121,26 +110,7 @@ } /*! - * Sets the contact id of the other participant which must be present in the relationship with the contact - * in order for the contact to match the filter to be \a id - */ -void QContactRelationshipFilter::setOtherParticipantId(const QContactId& id) -{ - Q_D(QContactRelationshipFilter); - d->m_otherParticipantId = id; -} - -/*! - * Returns the role that a contact must have in a relationship in order to match the filter - */ -QContactRelationshipFilter::Role QContactRelationshipFilter::role() const -{ - Q_D(const QContactRelationshipFilter); - return d->m_roleInRelationship; -} - -/*! - * Returns the type of relationship that a contact must have in order to match the filter + Returns the type of relationship that a contact must have in order to match the filter */ QString QContactRelationshipFilter::relationshipType() const { @@ -149,12 +119,102 @@ } /*! - * Returns the id of another contact with whom a contact must have a relationship in order to match the filter + Sets the id of the contact with whom the tested contact must have a relationship in order for the tested contact to match this filter to be \a relatedContactId + */ +void QContactRelationshipFilter::setRelatedContactId(const QContactId &relatedContactId) +{ + Q_D(QContactRelationshipFilter); + d->m_relatedContactId = relatedContactId; +} + +/*! + Returns the id of the contact with whom the tested contact must have a relationship in order for the tested contact to match this filter + */ +QContactId QContactRelationshipFilter::relatedContactId() const +{ + Q_D(const QContactRelationshipFilter); + return d->m_relatedContactId; +} + +/*! + Sets the role in the relationship with the tested contact that the related contact must play in order for the tested contact to match this filter to be \a relatedContactRole + */ +void QContactRelationshipFilter::setRelatedContactRole(QContactRelationshipFilter::Role relatedContactRole) +{ + Q_D(QContactRelationshipFilter); + d->m_relatedContactRole = relatedContactRole; +} + +/*! + Returns the role in the relationship with the tested contact that the related contact must play in order for the tested contact to match this filter + */ +QContactRelationshipFilter::Role QContactRelationshipFilter::relatedContactRole() const +{ + Q_D(const QContactRelationshipFilter); + return d->m_relatedContactRole; +} + +/*! + \internal + Sets the role in the relationship that a contact must be in order to match this filter to \a roleInRelationship + + This function has been deprecated - you should pass the opposite value (e.g. First instead of Second, Second + instead of First) to \c setRelatedContactRole(). + \sa setRelatedContactRole() + */ +void QContactRelationshipFilter::setRole(QContactRelationshipFilter::Role roleInRelationship) +{ + Q_D(QContactRelationshipFilter); + switch(roleInRelationship) { + case QContactRelationshipFilter::Either: + d->m_relatedContactRole = QContactRelationshipFilter::Either; + break; + case QContactRelationshipFilter::First: + d->m_relatedContactRole = QContactRelationshipFilter::Second; + break; + case QContactRelationshipFilter::Second: + d->m_relatedContactRole = QContactRelationshipFilter::First; + break; + } +} + +/*! + \internal + Sets the contact id of the other participant which must be present in the relationship with the contact + in order for the contact to match the filter to be \a id + */ +void QContactRelationshipFilter::setOtherParticipantId(const QContactId& id) +{ + Q_D(QContactRelationshipFilter); + d->m_relatedContactId = id; +} + +/*! + \internal + Returns the role that a contact must have in a relationship in order to match the filter + */ +QContactRelationshipFilter::Role QContactRelationshipFilter::role() const +{ + Q_D(const QContactRelationshipFilter); + switch(d->m_relatedContactRole) { + case QContactRelationshipFilter::First: + return QContactRelationshipFilter::Second; + case QContactRelationshipFilter::Second: + return QContactRelationshipFilter::First; + case QContactRelationshipFilter::Either: + default: + return QContactRelationshipFilter::Either; + } +} + +/*! + \internal + Returns the id of another contact with whom a contact must have a relationship in order to match the filter */ QContactId QContactRelationshipFilter::otherParticipantId() const { Q_D(const QContactRelationshipFilter); - return d->m_otherParticipantId; + return d->m_relatedContactId; } QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter.h --- a/qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter.h Fri Apr 16 14:53:18 2010 +0300 @@ -66,13 +66,19 @@ Either }; - void setRole(QContactRelationshipFilter::Role roleInRelationship); void setRelationshipType(const QString& relationshipType); - void setOtherParticipantId(const QContactId& contactId); + void setRelatedContactId(const QContactId& relatedContactId); + void setRelatedContactRole(QContactRelationshipFilter::Role relatedContactRole); - QContactRelationshipFilter::Role role() const; QString relationshipType() const; - QContactId otherParticipantId() const; + QContactId relatedContactId() const; + QContactRelationshipFilter::Role relatedContactRole() const; + + // deprecated and will be removed after transition period has elapsed. replaced by setRelatedContactRole / setRelatedContactId. + void Q_DECL_DEPRECATED setRole(QContactRelationshipFilter::Role roleInRelationship); + void Q_DECL_DEPRECATED setOtherParticipantId(const QContactId& contactId); + QContactRelationshipFilter::Role Q_DECL_DEPRECATED role() const; + QContactId Q_DECL_DEPRECATED otherParticipantId() const; private: Q_DECLARE_CONTACTFILTER_PRIVATE(QContactRelationshipFilter) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter_p.h --- a/qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -70,24 +70,24 @@ public: QContactRelationshipFilterPrivate() : QContactFilterPrivate(), - m_roleInRelationship(QContactRelationshipFilter::Either) + m_relatedContactRole(QContactRelationshipFilter::Either) { } QContactRelationshipFilterPrivate(const QContactRelationshipFilterPrivate& other) : QContactFilterPrivate(other), - m_roleInRelationship(other.m_roleInRelationship), - m_otherParticipantId(other.m_otherParticipantId), - m_relationshipType(other.m_relationshipType) + m_relationshipType(other.m_relationshipType), + m_relatedContactId(other.m_relatedContactId), + m_relatedContactRole(other.m_relatedContactRole) { } virtual bool compare(const QContactFilterPrivate* other) const { const QContactRelationshipFilterPrivate *od = static_cast(other); - if (m_roleInRelationship != od->m_roleInRelationship) + if (m_relatedContactRole != od->m_relatedContactRole) return false; - if (m_otherParticipantId != od->m_otherParticipantId) + if (m_relatedContactId != od->m_relatedContactId) return false; if (m_relationshipType != od->m_relationshipType) return false; @@ -96,9 +96,9 @@ Q_IMPLEMENT_CONTACTFILTER_VIRTUALCTORS(QContactRelationshipFilter, QContactFilter::RelationshipFilter) - QContactRelationshipFilter::Role m_roleInRelationship; - QContactId m_otherParticipantId; QString m_relationshipType; + QContactId m_relatedContactId; + QContactRelationshipFilter::Role m_relatedContactRole; }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontact.cpp --- a/qtcontactsmobility/src/contacts/qcontact.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontact.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -90,17 +90,7 @@ QContact::QContact() : d(new QContactData) { - // insert the contact's display label detail. - QContactDisplayLabel contactLabel; - contactLabel.setValue(QContactDisplayLabel::FieldLabel, QString()); - contactLabel.d->m_id = 1; - d->m_details.insert(0, contactLabel); - - // and the contact type detail. - QContactType contactType; - contactType.setType(QContactType::TypeContact); - contactType.d->m_id = 2; - d->m_details.insert(1, contactType); + clearDetails(); } /*! Initializes this QContact from \a other */ @@ -117,8 +107,6 @@ */ bool QContact::isEmpty() const { - //stopcompilation; - /* Every contact has a display label field.. */ if (d->m_details.count() > 2) return false; @@ -135,15 +123,21 @@ */ void QContact::clearDetails() { - QContactDisplayLabel dl = d->m_details.at(0); - dl.setValue(QContactDisplayLabel::FieldLabel, QString()); - dl.d->m_id = 1; - QContactType typeDet = d->m_details.at(1); - typeDet.d->m_id = 2; + d->m_details.clear(); - d->m_details.clear(); - d->m_details.insert(0, dl); - d->m_details.insert(1, typeDet); + // insert the contact's display label detail. + QContactDisplayLabel contactLabel; + contactLabel.setValue(QContactDisplayLabel::FieldLabel, QString()); + contactLabel.d->m_id = 1; + contactLabel.d->m_access = QContactDetail::Irremovable | QContactDetail::ReadOnly; + d->m_details.insert(0, contactLabel); + + // and the contact type detail. + QContactType contactType; + contactType.setType(QContactType::TypeContact); + contactType.d->m_id = 2; + contactType.d->m_access = QContactDetail::Irremovable; + d->m_details.insert(1, contactType); } /*! Replace the contents of this QContact with \a other */ @@ -172,7 +166,7 @@ /*! * Returns the type of the contact. Every contact has exactly one type which - * is either set manually (by saving a modified copy of the QCotnactType + * is either set manually (by saving a modified copy of the QContactType * in the contact, or by calling \l setType()) or synthesized automatically. * * \sa setType() @@ -194,6 +188,8 @@ // type is detail 1 QContactType newType; newType.setType(type); + newType.d->m_access = QContactDetail::Irremovable; + d->m_details[1] = newType; } @@ -204,6 +200,7 @@ { // type is detail 1 d->m_details[1] = type; + d->m_details[1].d->m_access = QContactDetail::Irremovable; } /*! @@ -295,37 +292,50 @@ * this contact, that detail is overwritten. Otherwise, a new Id is generated * and set in the detail, and the detail is added to the list. * + * If the detail's access constraint includes \c QContactDetail::ReadOnly, + * this function will return false. + * * If \a detail is a contact type, the existing contact type will * be overwritten with \a detail. There is never more than one contact type - * in a contact. + * in a contact. The supplied \a detail will have its accessConstraint set to + * QContactDetail::Irremovable. * - * If \a detail is a display label, the operation will fail. - * The display label can never be updated manually and must be synthesized by the backend. + * If \a detail is a display label, the supplied \a detail will have its + * accessConstraint set to QContactDetail::Irremovable | QContactDetail::ReadOnly, + * and the function will return false. * - * Returns true if the detail was saved successfully, otherwise returns false + * Returns true if the detail was saved successfully, otherwise returns false. + * + * Note that the caller retains ownership of the detail. */ bool QContact::saveDetail(QContactDetail* detail) { if (!detail) return false; - /* Handle display labels specially - cannot save them! */ - if (detail->definitionName() == QContactDisplayLabel::DefinitionName) { + if (detail->accessConstraints() & QContactDetail::ReadOnly) return false; - } /* Also handle contact type specially - only one of them. */ if (detail->definitionName() == QContactType::DefinitionName) { + detail->d->m_access = QContactDetail::Irremovable; d->m_details[1] = *detail; - detail->d->m_id = 2; return true; } + /* And display label.. */ + if (detail->definitionName() == QContactDisplayLabel::DefinitionName) { + detail->d->m_access = QContactDetail::Irremovable | QContactDetail::ReadOnly; + return false; + } + // try to find the "old version" of this field // ie, the one with the same type and id, but different value or attributes. for (int i = 0; i < d->m_details.size(); i++) { const QContactDetail& curr = d->m_details.at(i); if (detail->d->m_definitionName == curr.d->m_definitionName && detail->d->m_id == curr.d->m_id) { + // update the detail constraints of the supplied detail + detail->d->m_access = d->m_details[i].accessConstraints(); // Found the old version. Replace it with this one. d->m_details[i] = *detail; return true; @@ -333,7 +343,6 @@ } // this is a new detail! add it to the contact. - detail->d->m_id = ++d->m_nextDetailId; d->m_details.append(*detail); return true; } @@ -341,34 +350,37 @@ /*! * Removes the \a detail from the contact. * + * The detail in the contact which has the same key as that of the given \a detail + * will be removed if it exists. That is, the information in the detail may be different. * Any preference for the given field is also removed. - * The Id of the \a detail is removed, to signify that it is no longer - * part of the contact. * - * If the detail is the contact type for this contact, the type - * will be reset to \c QContactType::TypeContact, and the function will return success. + * If the detail's access constraint includes \c QContactDetail::Irremovable, + * this function will return false. * - * If the detail is a display label, the operation will fail and return false. + * Returns true if the detail was removed successfully, false if an error occurred. * - * Returns true if the detail was removed successfully, false if an error occurred + * Note that the caller retains ownership of the detail. */ bool QContact::removeDetail(QContactDetail* detail) { if (!detail) return false; - // Check if this a display label - if (detail->d->m_definitionName == QContactDisplayLabel::DefinitionName) { - return false; + // find the detail stored in the contact which has the same key as the detail argument + int removeIndex = -1; + for (int i = 0; i < d->m_details.size(); i++) { + if (d->m_details.at(i).key() == detail->key()) { + removeIndex = i; + break; + } } - // Check if this a type - if (detail->d->m_definitionName == QContactType::DefinitionName) { - QContactType type = d->m_details[1]; - type.setType(QContactType::TypeContact); - d->m_details[1] = type; - return true; - } + // make sure the detail exists (in some form) in the contact. + if (removeIndex < 0) + return false; + + if (detail->accessConstraints() & QContactDetail::Irremovable) + return false; if (!d->m_details.contains(*detail)) return false; @@ -382,9 +394,8 @@ } } - // then remove the detail. - d->m_details.removeOne(*detail); - detail->d->m_id = 0; + // then remove the detail. // OLD BEHAVIOUR (24/12/2009): d->m_details.removeOne(*detail); + d->m_details.removeAt(removeIndex); return true; } @@ -436,7 +447,10 @@ return retn; } -/*! Returns a list of relationships of the given \a relationshipType in which the contact was a participant at the time that it was retrieved from the manager */ +/*! + * \preliminary + * Returns a list of relationships of the given \a relationshipType in which the contact was a participant at the time that it was retrieved from the manager + */ QList QContact::relationships(const QString& relationshipType) const { // if empty, then they want all relationships @@ -455,7 +469,12 @@ return retn; } -/*! Returns a list of ids of contacts which are related to this contact in a relationship of the given \a relationshipType, where those other contacts participate in the relationship in the given \a role */ +/*! + * \preliminary + * Returns a list of ids of contacts which are related to this contact in a relationship of the + * given \a relationshipType, where those other contacts participate in the relationship in the + * given \a role + */ QList QContact::relatedContacts(const QString& relationshipType, QContactRelationshipFilter::Role role) const { QList retn; @@ -493,6 +512,7 @@ } /*! + * \preliminary * Sets the order of importance of the relationships for this contact by saving a \a reordered list of relationships which involve the contact. * The list must include all of the relationships in which the contact is involved, and must not include any relationships which do * not involve the contact. In order for the ordering preference to be persisted, the contact must be saved in its manager. @@ -510,6 +530,7 @@ } /*! + * \preliminary * Returns the ordered list of relationships in which the contact is involved. By default, this list is equal to the cached * list of relationships which is available by calling relationships(). * @@ -549,7 +570,12 @@ return retn.toList(); } -/*! Set a particular detail as the \a preferredDetail for a given \a actionName. Returns true if the detail was successfully set as the preferred detail for the action identified by \a actionName, otherwise returns false */ +/*! + * \preliminary + * Set a particular detail as the \a preferredDetail for a given \a actionName. Returns + * true if the detail was successfully set as the preferred detail for the action + * identified by \a actionName, otherwise returns false + */ bool QContact::setPreferredDetail(const QString& actionName, const QContactDetail& preferredDetail) { // if the given action name is empty, bad argument. @@ -565,7 +591,11 @@ return true; } -/*! Returns true if the given \a detail is a preferred detail for the given \a actionName, or for any action if the \a actionName is empty */ +/*! + * \preliminary + * + * Returns true if the given \a detail is a preferred detail for the given \a actionName, or for any action if the \a actionName is empty + */ bool QContact::isPreferredDetail(const QString& actionName, const QContactDetail& detail) const { if (!d->m_details.contains(detail)) @@ -574,14 +604,17 @@ if (actionName.isEmpty()) return d->m_preferences.values().contains(detail.d->m_id); - QMap::const_iterator it = d->m_preferences.find(actionName); + QMap::const_iterator it = d->m_preferences.find(actionName); if (it != d->m_preferences.end() && it.value() == detail.d->m_id) return true; return false; } -/*! Returns the preferred detail for a given \a actionName */ +/*! + * \preliminary + * Returns the preferred detail for a given \a actionName + */ QContactDetail QContact::preferredDetail(const QString& actionName) const { // if the given action name is empty, bad argument. @@ -592,7 +625,7 @@ return QContactDetail(); QContactDetail retn; - quint32 detId = d->m_preferences.value(actionName); + int detId = d->m_preferences.value(actionName); for (int i = 0; i < d->m_details.size(); i++) { QContactDetail det = d->m_details.at(i); if (det.d->m_id == detId) { diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontact.h --- a/qtcontactsmobility/src/contacts/qcontact.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontact.h Fri Apr 16 14:53:18 2010 +0300 @@ -142,7 +142,7 @@ /* Actions available to be performed on this contact */ QList availableActions(const QString& vendorName = QString(), int implementationVersion = -1) const; - /* Preferences (eg, set a particular detail preferred for the SMS action) */ + /* Preferences (eg, set a particular detail preferred for the SMS action) - subject to change! */ bool setPreferredDetail(const QString& actionName, const QContactDetail& preferredDetail); bool isPreferredDetail(const QString& actionName, const QContactDetail& detail) const; QContactDetail preferredDetail(const QString& actionName) const; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontact_p.h --- a/qtcontactsmobility/src/contacts/qcontact_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontact_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -67,8 +67,7 @@ { public: QContactData() - : QSharedData(), - m_nextDetailId(3) // already two "must have" details: DisplayLabel and Type + : QSharedData() { } @@ -78,8 +77,7 @@ m_details(other.m_details), m_relationshipsCache(other.m_relationshipsCache), m_reorderedRelationshipsCache(other.m_reorderedRelationshipsCache), - m_preferences(other.m_preferences), - m_nextDetailId(other.m_nextDetailId) + m_preferences(other.m_preferences) { } @@ -89,8 +87,7 @@ QList m_details; QList m_relationshipsCache; QList m_reorderedRelationshipsCache; - QMap m_preferences; - quint32 m_nextDetailId; + QMap m_preferences; }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactabstractrequest.cpp --- a/qtcontactsmobility/src/contacts/qcontactabstractrequest.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactabstractrequest.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -60,34 +60,60 @@ */ /*! - * \enum QContactAbstractRequest::RequestType - * Enumerates the various possible types of asynchronous requests - * \value InvalidRequest An invalid request - * \value ContactFetchRequest A request to fetch a list of contacts - * \value ContactLocalIdFetchRequest A request to fetch a list of local contact ids - * \value ContactRemoveRequest A request to remove a list of contacts - * \value ContactSaveRequest A request to save a list of contacts - * \value DetailDefinitionFetchRequest A request to fetch a collection of detail definitions - * \value DetailDefinitionRemoveRequest A request to remove a list of detail definitions - * \value DetailDefinitionSaveRequest A request to save a list of detail definitions - * \value RelationshipFetchRequest A request to fetch relationships between contacts - * \value RelationshipRemoveRequest A request to remove any relationships which match the request criteria - * \value RelationshipSaveRequest A request to save a list of relationships + \fn QContactAbstractRequest::stateChanged(QContactAbstractRequest::State newState) + This signal is emitted when the state of the request is changed. The new state of + the request will be contained in \a newState. + */ + + +/*! + \fn QContactAbstractRequest::resultsAvailable() + This signal is emitted when new results are available. Results can include + the operation error which may be accessed via error(), or derived-class-specific + results which are accessible through the derived class API. + + \sa error() */ /*! - * \enum QContactAbstractRequest::Status - * Enumerates the various states that a request may be in at any given time - * \value Inactive Operation not yet started - * \value Active Operation started, not yet finished - * \value Cancelling Operation started then cancelled, not yet finished - * \value Cancelled Operation is finished due to cancellation - * \value Finished Operation successfully completed + \enum QContactAbstractRequest::RequestType + Enumerates the various possible types of asynchronous requests + \value InvalidRequest An invalid request + \value ContactFetchRequest A request to fetch a list of contacts + \value ContactLocalIdFetchRequest A request to fetch a list of local contact ids + \value ContactRemoveRequest A request to remove a list of contacts + \value ContactSaveRequest A request to save a list of contacts + \value DetailDefinitionFetchRequest A request to fetch a collection of detail definitions + \value DetailDefinitionRemoveRequest A request to remove a list of detail definitions + \value DetailDefinitionSaveRequest A request to save a list of detail definitions + \value RelationshipFetchRequest A request to fetch relationships between contacts + \value RelationshipRemoveRequest A request to remove any relationships which match the request criteria + \value RelationshipSaveRequest A request to save a list of relationships */ /*! - * \fn QContactAbstractRequest::QContactAbstractRequest() - * Constructs a new, invalid asynchronous request + \enum QContactAbstractRequest::Status + \internal + Enumerates the various states that a request may be in at any given time. Deprecated - use QContactAbstractRequest::State instead! + \value Inactive Operation not yet started + \value Active Operation started, not yet finished + \value Cancelling Operation started then cancelled, not yet finished + \value Cancelled Operation is finished due to cancellation + \value Finished Operation successfully completed + */ + +/*! + \enum QContactAbstractRequest::State + Enumerates the various states that a request may be in at any given time + \value InactiveState Operation not yet started + \value ActiveState Operation started, not yet finished + \value CanceledState Operation is finished due to cancellation + \value FinishedState Operation successfully completed + */ + +/*! + \fn QContactAbstractRequest::QContactAbstractRequest() + Constructs a new, invalid asynchronous request */ /*! Constructs a new request from the given request data \a otherd */ @@ -110,25 +136,43 @@ } /*! - * Returns true if the request is pending, processing or cancelling; otherwise, returns false. - * - * \sa status() + Returns true if the request is in the \c QContactAbstractRequest::InactiveState state; otherwise, returns false + + \sa state() + */ +bool QContactAbstractRequest::isInactive() const +{ + return (d_ptr->m_state == QContactAbstractRequest::InactiveState); +} + +/*! + Returns true if the request is in the \c QContactAbstractRequest::ActiveState state; otherwise, returns false + + \sa state() */ bool QContactAbstractRequest::isActive() const { - return (d_ptr->m_status == QContactAbstractRequest::Active - || d_ptr->m_status == QContactAbstractRequest::Cancelling); + return (d_ptr->m_state == QContactAbstractRequest::ActiveState); } /*! - * Returns true if the request is finished or cancelled; otherwise, returns false. - * - * \sa status() + Returns true if the request is in the \c QContactAbstractRequest::FinishedState; otherwise, returns false + + \sa state() */ bool QContactAbstractRequest::isFinished() const { - return (d_ptr->m_status == QContactAbstractRequest::Finished - || d_ptr->m_status == QContactAbstractRequest::Cancelled); + return (d_ptr->m_state == QContactAbstractRequest::FinishedState); +} + +/*! + Returns true if the request is in the \c QContactAbstractRequest::CanceledState; otherwise, returns false + + \sa state() + */ +bool QContactAbstractRequest::isCanceled() const +{ + return (d_ptr->m_state == QContactAbstractRequest::CanceledState); } /*! Returns the overall error of the most recent asynchronous operation */ @@ -137,14 +181,17 @@ return d_ptr->m_error; } -/*! Returns the list of errors which occurred during the most recent asynchronous operation. Each individual error in the list corresponds to a result in the result list. */ +/*! + \internal + Returns the list of errors which occurred during the most recent asynchronous operation. Each individual error in the list corresponds to a result in the result list. + */ QList QContactAbstractRequest::errors() const { - return d_ptr->m_errors; + return QList(); } /*! - * Returns the type of this asynchronous request + Returns the type of this asynchronous request */ QContactAbstractRequest::RequestType QContactAbstractRequest::type() const { @@ -152,13 +199,20 @@ } /*! - * Returns the current status of the request. - * - * \sa isFinished(), isActive() + \internal + Returns the current status of the request. */ QContactAbstractRequest::Status QContactAbstractRequest::status() const { - return d_ptr->m_status; + return static_cast(d_ptr->m_state); +} + +/*! + Returns the current state of the request. + */ +QContactAbstractRequest::State QContactAbstractRequest::state() const +{ + return d_ptr->m_state; } /*! Returns a pointer to the manager of which this request instance requests operations */ @@ -178,7 +232,9 @@ bool QContactAbstractRequest::start() { QContactManagerEngine *engine = QContactManagerData::engine(d_ptr->m_manager); - if (engine && !isActive()) { + if (engine && (d_ptr->m_state == QContactAbstractRequest::CanceledState + || d_ptr->m_state == QContactAbstractRequest::FinishedState + || d_ptr->m_state == QContactAbstractRequest::InactiveState)) { return engine->startRequest(this); } @@ -190,7 +246,7 @@ bool QContactAbstractRequest::cancel() { QContactManagerEngine *engine = QContactManagerData::engine(d_ptr->m_manager); - if (engine && status() == QContactAbstractRequest::Active) { + if (engine && state() == QContactAbstractRequest::ActiveState) { return engine->cancelRequest(this); } @@ -199,25 +255,44 @@ /*! Blocks until the request has been completed by the manager engine, or until \a msecs milliseconds has elapsed. If \a msecs is zero, this function will block indefinitely. - Returns true if the request was cancelled or completed successfully within the given period, otherwise false. */ + Returns true if the request was cancelled or completed successfully within the given period, otherwise false. + Some backends are unable to support this operation safely, and will return false immediately. + */ bool QContactAbstractRequest::waitForFinished(int msecs) { QContactManagerEngine *engine = QContactManagerData::engine(d_ptr->m_manager); - if (engine && isActive()) { - return engine->waitForRequestFinished(this, msecs); + if (engine) { + switch (d_ptr->m_state) { + case QContactAbstractRequest::ActiveState: + return engine->waitForRequestFinished(this, msecs); + case QContactAbstractRequest::CanceledState: + case QContactAbstractRequest::FinishedState: + return true; + default: + return false; + } } return false; // unable to wait for operation; not in progress or no engine. } -/*! Blocks until the manager engine signals that more partial results are available for the request, or until \a msecs milliseconds has elapsed. +/*! \internal + Blocks until the manager engine signals that more partial results are available for the request, or until \a msecs milliseconds has elapsed. If \a msecs is zero, this function will block indefinitely. Returns true if the request was cancelled or more partial results were made available within the given period, otherwise false. */ bool QContactAbstractRequest::waitForProgress(int msecs) { QContactManagerEngine *engine = QContactManagerData::engine(d_ptr->m_manager); - if (engine && isActive()) { - return engine->waitForRequestProgress(this, msecs); + if (engine) { + switch (d_ptr->m_state) { + case QContactAbstractRequest::ActiveState: + return engine->waitForRequestProgress(this, msecs); + case QContactAbstractRequest::CanceledState: + case QContactAbstractRequest::FinishedState: + return true; + default: + return false; + } } return false; // unable to wait for operation; not in progress or no engine. diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactabstractrequest.h --- a/qtcontactsmobility/src/contacts/qcontactabstractrequest.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactabstractrequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -57,18 +57,29 @@ QContactAbstractRequest() {} virtual ~QContactAbstractRequest(); - enum Status { + enum Status { // replaced by the state enum. Inactive = 0, // operation not yet started Active, // operation started, not yet finished - Cancelling, // operation started then cancelled, not yet finished Cancelled, // operation is finished due to cancellation - Finished // operation successfully completed + Finished, // operation successfully completed + Cancelling // operation started then cancelled, not yet finished // moved to end so that (deprecated) status() impl is simple. }; - Status status() const; + QList Q_DECL_DEPRECATED errors() const; // deprecated, removed in week 3. see leaf classes for detailed error reporting. + Status Q_DECL_DEPRECATED status() const; // deprecated in week 1, removed after transition period, replaced by state() + + enum State { // replaces the status enum. + InactiveState = 0, // operation not yet started + ActiveState, // operation started, not yet finished + CanceledState, // operation is finished due to cancellation + FinishedState // operation either completed successfully or failed. No further results will become available. + }; + + State state() const; // replaces status() + bool isInactive() const; bool isActive() const; bool isFinished() const; - QList errors() const; + bool isCanceled() const; QContactManager::Error error() const; enum RequestType { @@ -98,7 +109,15 @@ /* waiting for stuff */ bool waitForFinished(int msecs = 0); - bool waitForProgress(int msecs = 0); +#ifdef Q_MOC_RUN + bool waitForProgress(int msecs = 0); // deprecated, removed entirely week 1 // moc can't handle deprc. +#else + bool Q_DECL_DEPRECATED waitForProgress(int msecs = 0); // deprecated, removed entirely week 1 +#endif + +signals: + void stateChanged(QContactAbstractRequest::State newState); + void resultsAvailable(); protected: QContactAbstractRequest(QContactAbstractRequestPrivate* otherd); diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactabstractrequest_p.h --- a/qtcontactsmobility/src/contacts/qcontactabstractrequest_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactabstractrequest_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -66,7 +66,7 @@ public: QContactAbstractRequestPrivate() : m_error(QContactManager::NoError), - m_status(QContactAbstractRequest::Inactive), + m_state(QContactAbstractRequest::InactiveState), m_manager(0) { } @@ -81,9 +81,8 @@ } QContactManager::Error m_error; - QContactAbstractRequest::Status m_status; + QContactAbstractRequest::State m_state; QPointer m_manager; - QList m_errors; }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactaction.cpp --- a/qtcontactsmobility/src/contacts/qcontactaction.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactaction.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -75,47 +75,53 @@ */ /*! - * \fn QContactAction::~QContactAction() - * Clears any memory in use by this instance of the action implementation + \fn QContactAction::~QContactAction() + Clears any memory in use by this instance of the action implementation */ /*! - * \fn QContactAction::actionDescriptor() const - * Returns the descriptor which uniquely identifies this action implementation. A descriptor - * consists of an action name, a vendor name and an implementation version. - * The name of the action identifies the action provided; different implementations of an action - * with the same name must provide the same functionality, but may differ in implementation semantics. - * Hence, the action name includes the major version of the interface definition implemented. - * The vendor name is the identification string of the vendor which has provided this implementation. - * The implementation version is the (minor) version of the implementation, and is vendor-specific. - * - * \sa QContactActionDescriptor + \fn QContactAction::actionDescriptor() const + Returns the descriptor which uniquely identifies this action implementation. A descriptor + consists of an action name, a vendor name and an implementation version. + The name of the action identifies the action provided; different implementations of an action + with the same name must provide the same functionality, but may differ in implementation semantics. + Hence, the action name includes the major version of the interface definition implemented. + The vendor name is the identification string of the vendor which has provided this implementation. + The implementation version is the (minor) version of the implementation, and is vendor-specific. + + \sa QContactActionDescriptor + */ + +/*! + \fn QContactAction::metadata() const + \internal + Returns the metadata associated with this action, such as icons, labels or sound cues */ /*! - * \fn QContactAction::metadata() const - * Returns the metadata associated with this action, such as icons, labels or sound cues + \fn QContactAction::metaData() const + Returns the meta-data associated with this action, such as icons, labels or sound cues */ /*! - * \fn QContactAction::contactFilter(const QVariant& value) const - * Returns a filter which may be used to filter contacts by the availability of this action implementation for them. - * If \a value is valid, only contacts which have a detail with the given value and for which the action is available are returned + \fn QContactAction::contactFilter(const QVariant& value) const + Returns a filter which may be used to filter contacts by the availability of this action implementation for them. + If \a value is valid, only contacts which have a detail with the given value and for which the action is available are returned */ /*! - * \fn QContactAction::supportsDetail(const QContactDetail& detail) const - * Returns true if the provided \a detail contains the fields required for this action to be - * performed on it; otherwise, returns false + \fn QContactAction::supportsDetail(const QContactDetail& detail) const + Returns true if the provided \a detail contains the fields required for this action to be + performed on it; otherwise, returns false */ /*! - * \fn QContactAction::supportedDetails(const QContact& contact) const - * Returns a list of the details saved in the given \a contact which contain the fields required - * for this action to be performed on them. - * - * The default implementation of this function simply tests all the details in the contact - * using \l supportsDetail() + \fn QContactAction::supportedDetails(const QContact& contact) const + Returns a list of the details saved in the given \a contact which contain the fields required + for this action to be performed on them. + + The default implementation of this function simply tests all the details in the contact + using \l supportsDetail() */ QList QContactAction::supportedDetails(const QContact& contact) const { @@ -129,46 +135,70 @@ } /*! - * \fn QContactAction::invokeAction(const QContact& contact, const QContactDetail& detail = QContactDetail()) - * Initiates the implemented action on the specified \a detail of the given \a contact, or on the first - * eligible detail saved in the contact if the given \a detail is empty. - * At some point after invocation, one or more \l progress() signals will be emitted by the action instance. - * The results of the action (if any) may be retrieved by calling \l result(). - * - * \sa result(), progress() + \fn QContactAction::invokeAction(const QContact& contact, const QContactDetail& detail = QContactDetail()) + Initiates the implemented action on the specified \a detail of the given \a contact, or on the first + eligible detail saved in the contact if the given \a detail is empty. + At some point after invocation, one or more \l progress() signals will be emitted by the action instance. + The results of the action (if any) may be retrieved by calling \l result(). + + \sa result(), progress() */ /*! - * \fn QContactAction::result() const - * Returns the result of the action, if any exists. Calling this function prior to receiving the \l progress() - * signal will not return a meaningful result. + \fn QContactAction::result() const + Returns the result of the action, if any exists. Calling this function prior to receiving the \l progress() + signal will not return a meaningful result. + */ + +/*! + \enum QContactAction::Status + \internal This enum has been deprecated and will be replaced by the State enum. + Describes the current status of the asynchronous action operation + \value Inactive The operation has not yet been initiated + \value Autonomous The operation was initiated but no further information is or will be available + \value Active The operation was initiated and is not yet finished + \value Finished The operation successfully completed + \value FinishedWithError The operation has finished, but an error occurred */ /*! - * \enum QContactAction::Status - * Describes the current status of the asynchronous action operation - * \value Inactive The operation has not yet been initiated - * \value Autonomous The operation was initiated but no further information is or will be available - * \value Active The operation was initiated and is not yet finished - * \value Finished The operation successfully completed - * \value FinishedWithError The operation has finished, but an error occurred + \enum QContactAction::State + Describes the current status of the asynchronous action operation + \value InactiveState The operation has not yet been initiated + \value AutonomousState The operation was initiated but no further information is or will be available + \value ActiveState The operation was initiated and is not yet finished + \value FinishedState The operation successfully completed + \value FinishedWithErrorState The operation has finished, but an error occurred */ /*! - * \fn QContactAction::progress(QContactAction::Status status, const QVariantMap& result) - * This signal is emitted by an action instance whose functionality has been initiated with \l invokeAction(). - * It provides clients with the current \a status of the action, and any \a result associated with the action. - * This signal must be emitted at least once by every action instance after \l invokeAction() is called. - * - * If the action implementation is incapable of reporting the status of the operation (for example, the - * action is implemented via a one-way IPC call) it should emit the progress signal with \a status - * set to \c QContactAction::Autonomous. + \fn QContactAction::progress(QContactAction::Status status, const QVariantMap& result) + \internal This function was deprecated in week 1 and will be replaced by the progress signal which includes a State after the transition period has elapsed. + This signal is emitted by an action instance whose functionality has been initiated with \l invokeAction(). + It provides clients with the current \a status of the action, and any \a result associated with the action. + This signal must be emitted at least once by every action instance after \l invokeAction() is called. + + If the action implementation is incapable of reporting the status of the operation (for example, the + action is implemented via a one-way IPC call) it should emit the progress signal with \a status + set to \c QContactAction::Autonomous. + */ + + +/*! + \fn QContactAction::progress(QContactAction::State state, const QVariantMap& result) + This signal is emitted by an action instance whose functionality has been initiated with \l invokeAction(). + It provides clients with the current \a state of the action, and any \a result associated with the action. + This signal must be emitted at least once by every action instance after \l invokeAction() is called. + + If the action implementation is incapable of reporting the status of the operation (for example, the + action is implemented via a one-way IPC call) it should emit the progress signal with \a state + set to \c QContactAction::AutonomousState. */ /*! - * Returns a list of identifiers of the available actions which are provided by the given \a vendor and of the given \a implementationVersion. - * If \a vendor is empty, actions from all vendors and of any implementation version are returned; if \a implementationVersion is empty, - * any actions from the given \a vendor (regardless of implementation version) are returned. + Returns a list of identifiers of the available actions which are provided by the given \a vendor and of the given \a implementationVersion. + If \a vendor is empty, actions from all vendors and of any implementation version are returned; if \a implementationVersion is empty, + any actions from the given \a vendor (regardless of implementation version) are returned. */ QStringList QContactAction::availableActions(const QString& vendor, int implementationVersion) { @@ -185,11 +215,11 @@ } /*! - * Returns a list of QContactActionDescriptor instances which identified implementations of the given \a actionName which are provided by the - * given \a vendorName and are of the given \a implementationVersion. If \a actionName is empty, descriptors for - * implementations of all actions are returned; if \a vendorName is empty, descriptors for implementations provided by any vendor and - * of any implementation version are returned; if \a implementationVersion is empty, descriptors for any implementations provided by the - * given \a vendorName of the given \a actionName are returned. + Returns a list of QContactActionDescriptor instances which identified implementations of the given \a actionName which are provided by the + given \a vendorName and are of the given \a implementationVersion. If \a actionName is empty, descriptors for + implementations of all actions are returned; if \a vendorName is empty, descriptors for implementations provided by any vendor and + of any implementation version are returned; if \a implementationVersion is empty, descriptors for any implementations provided by the + given \a vendorName of the given \a actionName are returned. */ QList QContactAction::actionDescriptors(const QString& actionName, const QString& vendorName, int implementationVersion) { @@ -198,8 +228,8 @@ } /*! - * Returns a pointer to a new instance of the action implementation identified by the given \a descriptor. - * The caller takes ownership of the action implementation and must delete it to avoid leaking memory. + Returns a pointer to a new instance of the action implementation identified by the given \a descriptor. + The caller takes ownership of the action implementation and must delete it to avoid leaking memory. */ QContactAction* QContactAction::action(const QContactActionDescriptor& descriptor) { diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactaction.h --- a/qtcontactsmobility/src/contacts/qcontactaction.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactaction.h Fri Apr 16 14:53:18 2010 +0300 @@ -73,7 +73,8 @@ virtual ~QContactAction() = 0; virtual QContactActionDescriptor actionDescriptor() const = 0; // the descriptor which uniquely identifies this action - virtual QVariantMap metadata() const = 0; // label, icon etc - under discussion! + virtual QVariantMap Q_DECL_DEPRECATED metadata() const = 0; // label, icon etc - under discussion! - deprecated + virtual QVariantMap metaData() const = 0; // label, icon etc - under discussion! - replaces the above virtual QContactFilter contactFilter(const QVariant& value = QVariant()) const = 0; // use for matching virtual bool supportsDetail(const QContactDetail& detail) const = 0; // whether this implementation supports the given detail @@ -83,19 +84,29 @@ virtual void invokeAction(const QContact& contact, const QContactDetail& detail = QContactDetail()) = 0; /* The possible states of an action */ + enum State { + InactiveState = 0, // operation not yet started + AutonomousState, // operation started, no further information available - name under discussion. + ActiveState, // operation started, not yet finished + FinishedState, // operation successfully completed + FinishedWithErrorState // operation finished, but error occurred + }; + + /* The possible statuses of an action - DEPRECATED to be replaced by State */ enum Status { - Inactive = 0, // operation not yet started - Autonomous, // operation started, no further information available - name under discussion. - Active, // operation started, not yet finished - Finished, // operation successfully completed - FinishedWithError // operation finished, but error occurred + Inactive = InactiveState, // operation not yet started + Autonomous = AutonomousState, // operation started, no further information available - name under discussion. + Active = ActiveState, // operation started, not yet finished + Finished = FinishedState, // operation successfully completed + FinishedWithError = FinishedWithErrorState // operation finished, but error occurred }; /* Returns the most recently received result, or an invalid QVariantMap if no results received */ virtual QVariantMap result() const = 0; signals: - void progress(QContactAction::Status status, const QVariantMap& result); + void progress(QContactAction::Status status, const QVariantMap& result); // deprecated by the following signal + void progress(QContactAction::State state, const QVariantMap& result); // replaces the above }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactdetail.cpp --- a/qtcontactsmobility/src/contacts/qcontactdetail.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactdetail.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -45,7 +45,12 @@ QTM_BEGIN_NAMESPACE +/* Initialise our static private data member */ +QAtomicInt QContactDetailPrivate::lastDetailKey(1); + /* Definitions of predefined string constants */ +Q_DEFINE_LATIN1_LITERAL(QContactDetail::FieldDetailUri, "DetailUri"); +Q_DEFINE_LATIN1_LITERAL(QContactDetail::FieldLinkedDetailUris, "LinkedDetailUris"); Q_DEFINE_LATIN1_LITERAL(QContactDetail::FieldContext, "Context"); Q_DEFINE_LATIN1_LITERAL(QContactDetail::ContextOther, "Other"); Q_DEFINE_LATIN1_LITERAL(QContactDetail::ContextHome, "Home"); @@ -65,9 +70,18 @@ restrictions on their values, and any restrictions on creating or updating details of that definition. - A field which is common to all details is the context field. This field is intended to store the - context that this detail is associated with. Commonly this will be something like - "Home" or "Work", although no limitations are placed on which values may be stored in this field. + One field which is common to all details is the context field. This field is intended to store the + context or contexts that this detail is associated with. Commonly this will be something like + "Home" and/or "Work", although no limitations are placed on which values may be stored in this field + in the default schema. + + There are two other, related fields which are common to all details. The first is + \a QContactDetail::FieldDetailUri, which stores the unique URI of the detail if one exists. + The field is not mandatory, and backends are not required to verify that the given URI is indeed + unique within the contact. The second field is \a QContactDetail::LinkedDetailUris, which stores + a list of detail URIs to which this detail is linked. The link is one-way, and intended mainly + for use by read-only details which are populated by the backend (for example, a presence detail + which is linked to a particular online account detail of the contact). It is possible to inherit from QContactDetail to provide convenience or standardized access to values. For example, \l QContactPhoneNumber provides @@ -114,37 +128,30 @@ */ /*! - * \macro Q_DECLARE_CUSTOM_CONTACT_DETAIL - * \relates QContactDetail - * - * Macro for simplifying declaring custom (leaf) detail classes. - * - * If you are creating a convenience class for a type of QContactDetail, - * you should use this macro when declaring your class to ensure that - * it interoperates with other contact functionality. - * - * Here is an example of a class (\l QContactPhoneNumber) using this macro. - * Note that the class provides some predefined constants - * and some convenience methods that return values associated with schema - * fields. - * - * \snippet ../../src/contacts/details/qcontactphonenumber.h 0 - * + \macro Q_DECLARE_CUSTOM_CONTACT_DETAIL + \relates QContactDetail + + Macro for simplifying declaring custom (leaf) detail classes. + + If you are creating a convenience class for a type of QContactDetail, + you should use this macro when declaring your class to ensure that + it interoperates with other contact functionality. + + Here is an example of a class (\l QContactPhoneNumber) using this macro. + Note that the class provides some predefined constants + and some convenience methods that return values associated with schema + fields. + + \snippet ../../src/contacts/details/qcontactphonenumber.h 0 */ /*! - * \fn QContactDetail::operator!=(const QContactDetail& other) const - * Returns true if the values or id of this detail is different to those of the \a other detail + \fn QContactDetail::operator!=(const QContactDetail& other) const + Returns true if the values or id of this detail is different to those of the \a other detail */ /*! - * \fn T QContactDetail::value(const QString& key) const - * \overload - * Returns the value of the template type associated with the given \a key - */ - -/*! - * Constructs a new, empty detail + Constructs a new, empty detail */ QContactDetail::QContactDetail() : d(new QContactDetailPrivate) @@ -208,12 +215,17 @@ return d.constData()->m_definitionName; } -/*! Compares this detail to \a other. Returns true if the definition and values of \a other are equal to those of this detail */ +/*! Compares this detail to \a other. Returns true if the definition and values of \a other are equal to those of this detail. + The keys of each detail are not considered during the comparison, in order to allow details from different contacts to + be compared according to their values. */ bool QContactDetail::operator==(const QContactDetail& other) const { if (d.constData()->m_definitionName != other.d.constData()->m_definitionName) return false; + if (d.constData()->m_access != other.d.constData()->m_access) + return false; + if (d.constData()->m_values != other.d.constData()->m_values) return false; @@ -240,7 +252,23 @@ return true; } -/*! Returns the value stored in this detail for the given \a key as a QString, or an empty QString if no value for the given \a key exists */ +/*! Returns the key of this detail. */ +int QContactDetail::key() const +{ + return d->m_id; +} + +/*! Causes the implicitly-shared detail to be detached from any other copies, and generates a new key for it. + This ensures that calling QContact::saveDetail() will result in a new detail being saved, rather than + another detail being updated. */ +void QContactDetail::resetKey() +{ + d->m_id = QContactDetailPrivate::lastDetailKey.fetchAndAddOrdered(1); +} + +/*! \overload + Returns the value stored in this detail for the given \a key as a QString, or an empty QString if + no value for the given \a key exists */ QString QContactDetail::value(const QString& key) const { if (d.constData()->m_values.contains(key)) @@ -248,6 +276,12 @@ return QString(); } +// A bug in qdoc means this comment needs to appear below the comment for the other value(). +/*! + \fn T QContactDetail::value(const QString& key) const + Returns the value of the template type associated with the given \a key + */ + /*! Returns the value stored in this detail for the given \a key as a QVariant, or an invalid QVariant if no value for the given \a key exists */ QVariant QContactDetail::variantValue(const QString& key) const { @@ -257,7 +291,7 @@ } /*! - * Returns true if this detail has a field with the given \a key, or false otherwise. + Returns true if this detail has a field with the given \a key, or false otherwise. */ bool QContactDetail::hasValue(const QString& key) const { @@ -287,50 +321,155 @@ return false; } -/*! Returns the values stored in this detail */ +/*! + \internal + Returns the values stored in this detail + */ QVariantMap QContactDetail::values() const { return d.constData()->m_values; } /*! - * \fn void QContactDetail::setContexts(const QStringList& contexts) - * - * This is a convenience function that sets the \c Context field of this detail to the given \a contexts. - * - * It is equivalent to the following code: - * \code - * setValue(QContactDetail::FieldContext, contexts); - * \endcode - * - * \sa setValue() + Returns the values stored in this detail as a map from value key to value + */ +QVariantMap QContactDetail::variantValues() const +{ + return d.constData()->m_values; +} + +/*! + \enum QContactDetail::AccessConstraint + + This enum defines the access constraints for a detail. This information is typically provided by + the manager when a contact is retrieved. + + \value NoConstraint Users can read, write, and otherwise modify this detail in any manner. + \value ReadOnly Users cannot write or modify values in this detail. + \value Irremovable Users cannot remove this detail from a contact. + */ + + +/*! + Returns the access constraints associated with the detail. + + Some details may not be written to, while other details may + not be removed from a contact. + + \sa QContactDetail::AccessConstraints + */ +QContactDetail::AccessConstraints QContactDetail::accessConstraints() const +{ + return d.constData()->m_access; +} + +/*! + \fn void QContactDetail::setContexts(const QStringList& contexts) + + This is a convenience function that sets the \c Context field of this detail to the given \a contexts. + + It is equivalent to the following code: + \code + setValue(QContactDetail::FieldContext, contexts); + \endcode + + \sa setValue() + */ + +/*! + \fn void QContactDetail::setContexts(const QString& context) + + This is a convenience function that sets the \c Context field of this detail to the given \a context. + It is useful if the detail is only valid in a single context. + + It is equivalent to the following code: + \code + setValue(FieldContext, QStringList(context)); + \endcode + + \sa setValue() */ /*! - * \fn void QContactDetail::setContexts(const QString& context) - * - * This is a convenience function that sets the \c Context field of this detail to the given \a context. - * It is useful if the detail is only valid in a single context. - * - * It is equivalent to the following code: - * \code - * setValue(FieldContext, QStringList(context)); - * \endcode - * - * \sa setValue() + \fn QStringList QContactDetail::contexts() const + + This is a convenience function to return the \c Context field of this detail. + + It is equivalent to the following code: + \code + value(QContactDetail::FieldContext); + \endcode + + \sa value() + */ + + +/*! + \fn void QContactDetail::setDetailUri(const QString& detailUri) + + This is a convenience function that sets the \c DetailUri field of this detail to the given \a detailUri. + In order to be linked to, a detail must have a specific and (per-contact) unique detail URI set. + + It is equivalent to the following code: + \code + setValue(FieldDetailUri, detailUri); + \endcode + + \sa setValue() */ /*! - * \fn QStringList QContactDetail::contexts() const - * - * This is a convenience function to return the \c Context field of this detail. - * - * It is equivalent to the following code: - * \code - * value(QContactDetail::FieldContext); - * \endcode - * - * \sa value() + \fn QString QContactDetail::detailUri() const + + This is a convenience function to return the \c DetailUri field of this detail. + + It is equivalent to the following code: + \code + value(QContactDetail::FieldDetailUri); + \endcode + + \sa value() + */ + + +/*! + \fn void QContactDetail::setLinkedDetailUris(const QStringList& linkedDetailUris) + + This is a convenience function that sets the \c LinkedDetailUris field of this detail to the given \a linkedDetailUris. + + It is equivalent to the following code: + \code + setValue(QContactDetail::FieldLinkedDetailUris, linkedDetailUris); + \endcode + + \sa setValue() + */ + +/*! + \fn void QContactDetail::setLinkedDetailUris(const QString& linkedDetailUri) + + This is a convenience function that sets the \c LinkedDetailUris field of this detail to the given \a linkedDetailUri. + It is useful if the detail is linked to a single other detail in the contact. + + It is equivalent to the following code: + \code + setValue(FieldLinkedDetailUris, QStringList(linkedDetailUri)); + \endcode + + \sa setValue() + */ + +/*! + \fn QStringList QContactDetail::linkedDetailUris() const + + This is a convenience function to return the \c Context field of this detail. + + It is equivalent to the following code: + \code + value(QContactDetail::FieldLinkedDetailUris); + \endcode + + \sa value() */ QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactdetail.h --- a/qtcontactsmobility/src/contacts/qcontactdetail.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactdetail.h Fri Apr 16 14:53:18 2010 +0300 @@ -63,6 +63,14 @@ QContactDetail(const QContactDetail& other); QContactDetail& operator=(const QContactDetail& other); + enum AccessConstraint { + NoConstraint = 0, + ReadOnly = 0x01, + Irremovable = 0x02 + }; + Q_DECLARE_FLAGS(AccessConstraints, AccessConstraint) + + AccessConstraints accessConstraints() const; // Predefined attribute names and values #ifdef Q_QDOC @@ -70,11 +78,15 @@ const char* ContextHome; const char* ContextWork; const char* ContextOther; + const char* FieldDetailUri; + const char* FieldLinkedDetailUris; #else Q_DECLARE_LATIN1_LITERAL(FieldContext, "Context"); Q_DECLARE_LATIN1_LITERAL(ContextHome, "Home"); Q_DECLARE_LATIN1_LITERAL(ContextWork, "Work"); Q_DECLARE_LATIN1_LITERAL(ContextOther, "Other"); + Q_DECLARE_LATIN1_LITERAL(FieldDetailUri, "DetailUri"); + Q_DECLARE_LATIN1_LITERAL(FieldLinkedDetailUris, "LinkedDetailUris"); #endif bool operator==(const QContactDetail& other) const; @@ -83,21 +95,27 @@ QString definitionName() const; bool isEmpty() const; + int key() const; + void resetKey(); + void setPreferredActions(const QList& preferredActions); QList preferredActions() const; - QVariantMap values() const; + QVariantMap Q_DECL_DEPRECATED values() const; // deprecated QString value(const QString& key) const; bool setValue(const QString& key, const QVariant& value); bool removeValue(const QString& key); bool hasValue(const QString& key) const; + QVariantMap variantValues() const; // replaces deprecated values() fn. QVariant variantValue(const QString& key) const; template T value(const QString& key) const { return variantValue(key).value(); } + + void setContexts(const QStringList& contexts) { setValue(FieldContext, contexts); @@ -113,15 +131,43 @@ return value(FieldContext); } + void setDetailUri(const QString& detailUri) + { + setValue(FieldDetailUri, detailUri); + } + + QString detailUri() const + { + return value(FieldDetailUri); + } + + void setLinkedDetailUris(const QStringList& linkedDetailUris) + { + setValue(FieldLinkedDetailUris, linkedDetailUris); + } + + void setLinkedDetailUris(const QString& linkedDetailUri) + { + setValue(FieldLinkedDetailUris, QStringList(linkedDetailUri)); + } + + QStringList linkedDetailUris() const + { + return value(FieldLinkedDetailUris); + } + protected: QContactDetail(const QContactDetail& other, const QString& expectedDefinitionId); QContactDetail& assign(const QContactDetail& other, const QString& expectedDefinitionId); private: friend class QContact; + friend class QContactDetailPrivate; QSharedDataPointer d; }; +Q_DECLARE_OPERATORS_FOR_FLAGS(QContactDetail::AccessConstraints); + #define Q_DECLARE_CUSTOM_CONTACT_DETAIL(className, definitionNameString) \ className() : QContactDetail(DefinitionName) {} \ className(const QContactDetail& field) : QContactDetail(field, DefinitionName) {} \ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactdetail_p.h --- a/qtcontactsmobility/src/contacts/qcontactdetail_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactdetail_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -67,7 +67,8 @@ public: QContactDetailPrivate() : QSharedData(), - m_id(0) + m_id(lastDetailKey.fetchAndAddOrdered(1)), + m_access(QContactDetail::NoConstraint) { } @@ -76,16 +77,25 @@ m_id(other.m_id), m_definitionName(other.m_definitionName), m_values(other.m_values), - m_preferredActions(other.m_preferredActions) + m_preferredActions(other.m_preferredActions), + m_access(other.m_access) { } ~QContactDetailPrivate() {} - quint32 m_id; // internal, unique id. + int m_id; // internal, unique id. QString m_definitionName; QVariantMap m_values; // the value(s) stored in this field. QList m_preferredActions; + + static QAtomicInt lastDetailKey; + QContactDetail::AccessConstraints m_access; + + static void setAccessConstraints(QContactDetail *d, QContactDetail::AccessConstraints constraint) + { + d->d->m_access = constraint; + } }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactdetaildefinition.cpp --- a/qtcontactsmobility/src/contacts/qcontactdetaildefinition.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactdetaildefinition.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -45,28 +45,30 @@ QTM_BEGIN_NAMESPACE /*! - * \class QContactDetailDefinition - * - * The QContactDetailDefinition class provides the specification for - * a detail that can be included in any particular QContact. - * The definition does not include any data, but defines - * the semantics of the representation and use of data - * details that are stored in a QContact. + \class QContactDetailDefinition + + The QContactDetailDefinition class provides the specification for + a detail that can be included in any particular QContact. + The definition does not include any data, but defines + the semantics of the representation and use of data + details that are stored in a QContact. */ /*! - * \fn QContactDetailDefinition::operator!=(const QContactDetailDefinition& other) const - * Returns true if this detail definition has different allowable field types, access constraints or uniqueness to the \a other definition + \fn QContactDetailDefinition::operator!=(const QContactDetailDefinition& other) const + Returns true if this detail definition has different allowable field types or uniqueness to the \a other definition */ /*! - * \enum QContactDetailDefinition::AccessConstraint - * - * This enum defines the access constraints which may be set on all details of this definition in the store for which the definition is valid. - * - * \value NoConstraint Details of definitions with this access constraint set have no special access semantics associated with them. Users can read, write, and otherwise modify such details in any manner. - * \value ReadOnly Details of definitions with this access constraint set are dynamically modified by the backend. Users cannot write values to details of definitions with this access constraint set. - * \value CreateOnly Details of definitions with this access constraint set are static once created. Their value cannot be changed dynamically, nor can they be written or read by users. + \enum QContactDetailDefinition::AccessConstraint + + \obsolete + + This enum defines the access constraints which may be set on all details of this definition in the store for which the definition is valid. + + \value NoConstraint Details of definitions with this access constraint set have no special access semantics associated with them. Users can read, write, and otherwise modify such details in any manner. + \value ReadOnly Details of definitions with this access constraint set are dynamically modified by the backend. Users cannot write values to details of definitions with this access constraint set. + \value CreateOnly Details of definitions with this access constraint set are static once created. Their value cannot be changed dynamically, nor can they be written or read by users. */ /*! Construct a new, invalid QContactDetailDefinition */ @@ -93,15 +95,13 @@ { } -/*! Returns true if the definition has the same type, uniqueness, access constraint and allowable value datatypes as \a other */ +/*! Returns true if the definition has the same type, uniqueness and allowable value datatypes as \a other */ bool QContactDetailDefinition::operator==(const QContactDetailDefinition& other) const { if (d->m_name != other.d->m_name) return false; if (d->m_unique != other.d->m_unique) return false; - if (d->m_constraint != other.d->m_constraint) - return false; if (d->m_fields != other.d->m_fields) return false; return true; @@ -124,9 +124,9 @@ } /*! - * Sets whether a contact can have more than one detail of this type. - * If \a unique is true, only one detail of this type can be added. - * Otherwise, any number can be added. + Sets whether a contact can have more than one detail of this type. + If \a unique is true, only one detail of this type can be added. + Otherwise, any number can be added. */ void QContactDetailDefinition::setUnique(bool unique) { @@ -146,40 +146,63 @@ } /*! Sets the fields which constitute the data of details of this this definition to \a fields */ -void QContactDetailDefinition::setFields(const QMap& fields) +void QContactDetailDefinition::setFields(const QMap& fields) { d->m_fields = fields; } /*! Returns the map of keys to fields which are present in details of this definition */ -QMap QContactDetailDefinition::fields() const +QMap QContactDetailDefinition::fields() const +{ + return d->m_fields; +} + +/*! Inserts the field \a field into the map of fields which constitute the data of details of this definition for the given field key \a key. + If another field for that key already exists in the definition, it will be overwritten. */ +void QContactDetailDefinition::insertField(const QString& key, const QContactDetailFieldDefinition& field) +{ + d->m_fields.insert(key, field); +} + +/*! Removes the field associated with the given field key \a key from the map of fields which constitute the data of details of this definition. */ +void QContactDetailDefinition::removeField(const QString& key) +{ + d->m_fields.remove(key); +} + +/*! + \internal + Returns a reference to the map of keys to fields which are present in details of this definition. + + You can make changes to the returned map. + */ +QMap& QContactDetailDefinition::fields() { return d->m_fields; } /*! - * Returns a reference to the map of keys to fields which are present in details of this definition. - * - * You can make changes to the returned map. + Returns the access constraint that is applied to details of this definition + + \obsolete + + This function is obsolete - use \l QContactDetail::accessConstraints() */ -QMap& QContactDetailDefinition::fields() -{ - return d->m_fields; -} - -/*! Returns the access constraint that is applied to details of this definition */ QContactDetailDefinition::AccessConstraint QContactDetailDefinition::accessConstraint() const { - return d->m_constraint; + return QContactDetailDefinition::NoConstraint; } /*! - * \fn QContactDetailDefinition::setAccessConstraint(const QContactDetailDefinition::AccessConstraint& constraint) - * Sets the access constraint that is applied to details of this definition to \a constraint + Sets the access constraint that is applied to details of this definition to \a constraint + + \obsolete + + This function is obsolete. */ void QContactDetailDefinition::setAccessConstraint(const QContactDetailDefinition::AccessConstraint& constraint) { - d->m_constraint = constraint; + Q_UNUSED(constraint); } QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactdetaildefinition.h --- a/qtcontactsmobility/src/contacts/qcontactdetaildefinition.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactdetaildefinition.h Fri Apr 16 14:53:18 2010 +0300 @@ -49,7 +49,7 @@ #include #include "qtcontactsglobal.h" -#include "qcontactdetaildefinitionfield.h" +#include "qcontactdetailfielddefinition.h" QTM_BEGIN_NAMESPACE @@ -83,11 +83,13 @@ bool isUnique() const; /* Mapping of field key to fields allowed in details of this definition */ - void setFields(const QMap& fields); - QMap fields() const; - QMap& fields(); + void setFields(const QMap& fields); + QMap fields() const; + QMap Q_DECL_DEPRECATED &fields(); // deprecated, removed. unnecessary API. + void insertField(const QString& key, const QContactDetailFieldDefinition& field); + void removeField(const QString& key); - /* Access constraints which may apply to details of a definition */ + /* Access constraints which may apply to details of a definition - to be removed week 3 */ enum AccessConstraint { NoConstraint = 0, ReadOnly, @@ -95,8 +97,8 @@ }; /* Accessor and mutator for access constraints on details of this definition */ - QContactDetailDefinition::AccessConstraint accessConstraint() const; - void setAccessConstraint(const QContactDetailDefinition::AccessConstraint& constraint); + QContactDetailDefinition::AccessConstraint Q_DECL_DEPRECATED accessConstraint() const; + void Q_DECL_DEPRECATED setAccessConstraint(const QContactDetailDefinition::AccessConstraint& constraint); private: QSharedDataPointer d; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactdetaildefinition_p.h --- a/qtcontactsmobility/src/contacts/qcontactdetaildefinition_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactdetaildefinition_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -67,14 +67,12 @@ { public: QContactDetailDefinitionData() - : m_constraint(QContactDetailDefinition::NoConstraint), - m_unique(false) + : m_unique(false) { } QContactDetailDefinitionData(const QContactDetailDefinitionData& other) : QSharedData(other), - m_constraint(other.m_constraint), m_name(other.m_name), m_unique(other.m_unique), m_fields(other.m_fields) @@ -83,10 +81,9 @@ ~QContactDetailDefinitionData() {} - QContactDetailDefinition::AccessConstraint m_constraint; QString m_name; bool m_unique; - QMap m_fields; + QMap m_fields; }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactdetaildefinitionfield.cpp --- a/qtcontactsmobility/src/contacts/qcontactdetaildefinitionfield.cpp Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,169 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qcontactdetaildefinitionfield.h" -#include "qcontactdetaildefinitionfield_p.h" - -QTM_BEGIN_NAMESPACE - -/*! - \class QContactDetailDefinitionField - \brief The QContactDetailDefinitionField class provides a field in a QContactDetail. - - Encapsulates information about a particular datum which may be part of a - QContactDetail, including the type, allowable values and access constraints. - */ - -/*! - * \enum QContactDetailDefinitionField::AccessConstraint - * - * This enum defines the access constraints which may be set on fields of a detail definition in the store for which the definition is valid. - * The constraint which applies to the definition takes precedence over a constraint which applies to a field of that definition. - * For example, if a field has the \c QContactDetailDefinitionField::NoConstraint constraint, but the detail definition from which the field came has - * either the \c QContactDetailDefinition::ReadOnly or \c QContactDetailDefinition::CreateOnly constraint, then the field will be a read-only field. - * - * \value NoConstraint Fields with this access constraint set have no special access semantics associated with them. Users can read, write, and otherwise modify such fields in any manner. - * \value ReadOnly Fields with this access constraint set are dynamically modified by the backend. Users cannot write values to fields of details of definitions with this access constraint set. - */ - -/*! - * Constructs a new field with no constraints and an invalid data type. - */ -QContactDetailDefinitionField::QContactDetailDefinitionField() - : d(new QContactDetailDefinitionFieldPrivate) -{ -} - -/*! - * Cleans up the memory in use by the field - */ -QContactDetailDefinitionField::~QContactDetailDefinitionField() -{ -} - -/*! - * Constructs a copy of the \a other field - */ -QContactDetailDefinitionField::QContactDetailDefinitionField(const QContactDetailDefinitionField& other) - : d(other.d) -{ -} - -/*! - * Assigns the field to be equal to the \a other field - */ -QContactDetailDefinitionField& QContactDetailDefinitionField::operator=(const QContactDetailDefinitionField& other) -{ - d = other.d; - return *this; -} - -/*! - * Returns the data type of the field - */ -QVariant::Type QContactDetailDefinitionField::dataType() const -{ - return d->m_dataType; -} - -/*! - * Sets the data type of the field to \a type - */ -void QContactDetailDefinitionField::setDataType(QVariant::Type type) -{ - d->m_dataType = type; -} - -/*! - * Returns the list of allowable values which this field may store - */ -QVariantList QContactDetailDefinitionField::allowableValues() const -{ - return d->m_allowableValues; -} - -/*! - * Sets the list of allowable values which this field may store to \a values - */ -void QContactDetailDefinitionField::setAllowableValues(const QVariantList values) -{ - d->m_allowableValues = values; -} - -/*! - * Returns the access constraints which apply to this field - */ -QContactDetailDefinitionField::AccessConstraint QContactDetailDefinitionField::accessConstraint() const -{ - return d->m_accessConstraint; -} - -/*! - * Sets the access constraints which apply to this field to \a constraint - */ -void QContactDetailDefinitionField::setAccessConstraint(QContactDetailDefinitionField::AccessConstraint constraint) -{ - d->m_accessConstraint = constraint; -} - -/*! - * Returns true if the access constraint, allowable values and data type of the \a other field are equal to those of this field - */ -bool QContactDetailDefinitionField::operator==(const QContactDetailDefinitionField& other) const -{ - if (d->m_accessConstraint != other.d->m_accessConstraint) - return false; - if (d->m_allowableValues != other.d->m_allowableValues) - return false; - if (d->m_dataType != other.d->m_dataType) - return false; - return true; -} - -/*! - * Returns true if the access constraint, allowable values or data type of the \a other field differ from those of this field - */ -bool QContactDetailDefinitionField::operator!=(const QContactDetailDefinitionField& other) const -{ - return !(*this == other); -} - -QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactdetaildefinitionfield.h --- a/qtcontactsmobility/src/contacts/qcontactdetaildefinitionfield.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactdetaildefinitionfield.h Fri Apr 16 14:53:18 2010 +0300 @@ -42,47 +42,11 @@ #ifndef QCONTACTDETAILDEFINITIONFIELD_H #define QCONTACTDETAILDEFINITIONFIELD_H -#include -#include -#include - -#include "qtcontactsglobal.h" - -QTM_BEGIN_NAMESPACE - -class QContactDetailDefinitionFieldPrivate; -class Q_CONTACTS_EXPORT QContactDetailDefinitionField -{ -public: - QContactDetailDefinitionField(); - ~QContactDetailDefinitionField(); - - QContactDetailDefinitionField(const QContactDetailDefinitionField& other); - QContactDetailDefinitionField& operator=(const QContactDetailDefinitionField& other); +#include "qcontactdetailfielddefinition.h" - QVariant::Type dataType() const; - void setDataType(QVariant::Type type); - - QVariantList allowableValues() const; - void setAllowableValues(const QVariantList values); - - enum AccessConstraint { - NoConstraint = 0, - ReadOnly - }; - - QContactDetailDefinitionField::AccessConstraint accessConstraint() const; - void setAccessConstraint(QContactDetailDefinitionField::AccessConstraint constraint); - - bool operator==(const QContactDetailDefinitionField& other) const; - bool operator!=(const QContactDetailDefinitionField& other) const; - -private: - QSharedDataPointer d; -}; - +// Typedef the old type to the new type +QTM_BEGIN_NAMESPACE +typedef QContactDetailFieldDefinition QContactDetailDefinitionField; QTM_END_NAMESPACE -Q_DECLARE_TYPEINFO(QTM_PREPEND_NAMESPACE(QContactDetailDefinitionField), Q_MOVABLE_TYPE); - #endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactdetaildefinitionfield_p.h --- a/qtcontactsmobility/src/contacts/qcontactdetaildefinitionfield_p.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,95 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QCONTACTDETAILDEFINITIONFIELD_P_H -#define QCONTACTDETAILDEFINITIONFIELD_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "qcontactdetaildefinitionfield.h" - -#include -#include -#include -#include -#include - -QTM_BEGIN_NAMESPACE - -class QContactDetailDefinitionFieldPrivate : public QSharedData -{ -public: - QContactDetailDefinitionFieldPrivate() - : QSharedData(), - m_dataType(QVariant::Invalid), - m_accessConstraint(QContactDetailDefinitionField::NoConstraint) - { - } - - QContactDetailDefinitionFieldPrivate(const QContactDetailDefinitionFieldPrivate& other) - : QSharedData(other), - m_allowableValues(other.m_allowableValues), - m_dataType(other.m_dataType), - m_accessConstraint(other.m_accessConstraint) - { - } - - ~QContactDetailDefinitionFieldPrivate() - { - } - - QVariantList m_allowableValues; - QVariant::Type m_dataType; - QContactDetailDefinitionField::AccessConstraint m_accessConstraint; -}; - -QTM_END_NAMESPACE - -#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactdetailfielddefinition.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/contacts/qcontactdetailfielddefinition.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,176 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qcontactdetailfielddefinition.h" +#include "qcontactdetailfielddefinition_p.h" + +QTM_BEGIN_NAMESPACE + +/*! + \class QContactDetailFieldDefinition + \brief The QContactDetailFieldDefinition class provides a field in a QContactDetail. + + Encapsulates information about a particular datum which may be part of a + QContactDetail, including the type, allowable values and access constraints. + */ + +/*! + * \enum QContactDetailFieldDefinition::AccessConstraint + * + * \obsolete + * + * This enum defines the access constraints which may be set on fields of a detail definition in the store for which the definition is valid. + * The constraint which applies to the definition takes precedence over a constraint which applies to a field of that definition. + * For example, if a field has the \c QContactDetailFieldDefinition::NoConstraint constraint, but the detail definition from which the field came has + * either the \c QContactDetailDefinition::ReadOnly or \c QContactDetailDefinition::CreateOnly constraint, then the field will be a read-only field. + * + * \value NoConstraint Fields with this access constraint set have no special access semantics associated with them. Users can read, write, and otherwise modify such fields in any manner. + * \value ReadOnly Fields with this access constraint set are dynamically modified by the backend. Users cannot write values to fields of details of definitions with this access constraint set. + */ + +/*! + * Constructs a new field with no constraints and an invalid data type. + */ +QContactDetailFieldDefinition::QContactDetailFieldDefinition() + : d(new QContactDetailFieldDefinitionPrivate) +{ +} + +/*! + * Cleans up the memory in use by the field + */ +QContactDetailFieldDefinition::~QContactDetailFieldDefinition() +{ +} + +/*! + * Constructs a copy of the \a other field + */ +QContactDetailFieldDefinition::QContactDetailFieldDefinition(const QContactDetailFieldDefinition& other) + : d(other.d) +{ +} + +/*! + * Assigns the field to be equal to the \a other field + */ +QContactDetailFieldDefinition& QContactDetailFieldDefinition::operator=(const QContactDetailFieldDefinition& other) +{ + d = other.d; + return *this; +} + +/*! + * Returns the data type of the field + */ +QVariant::Type QContactDetailFieldDefinition::dataType() const +{ + return d->m_dataType; +} + +/*! + * Sets the data type of the field to \a type + */ +void QContactDetailFieldDefinition::setDataType(QVariant::Type type) +{ + d->m_dataType = type; +} + +/*! + * Returns the list of allowable values which this field may store + */ +QVariantList QContactDetailFieldDefinition::allowableValues() const +{ + return d->m_allowableValues; +} + +/*! + * Sets the list of allowable values which this field may store to \a values + */ +void QContactDetailFieldDefinition::setAllowableValues(const QVariantList values) +{ + d->m_allowableValues = values; +} + +/*! + * Returns the access constraints which apply to this field + * + * \obsolete + * Obsolete - use \l QContactDetail::accessConstraints() instead. + */ +QContactDetailFieldDefinition::AccessConstraint QContactDetailFieldDefinition::accessConstraint() const +{ + return QContactDetailFieldDefinition::NoConstraint; +} + +/*! + * Sets the access constraints which apply to this field to \a constraint + * + * \obsolete + * + * This is no longer used. + */ +void QContactDetailFieldDefinition::setAccessConstraint(QContactDetailFieldDefinition::AccessConstraint constraint) +{ + Q_UNUSED(constraint); +} + +/*! + * Returns true if the allowable values and data type of the \a other field are equal to those of this field + */ +bool QContactDetailFieldDefinition::operator==(const QContactDetailFieldDefinition& other) const +{ + if (d->m_allowableValues != other.d->m_allowableValues) + return false; + if (d->m_dataType != other.d->m_dataType) + return false; + return true; +} + +/*! + * Returns true if the allowable values or data type of the \a other field differ from those of this field + */ +bool QContactDetailFieldDefinition::operator!=(const QContactDetailFieldDefinition& other) const +{ + return !(*this == other); +} + +QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactdetailfielddefinition.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/contacts/qcontactdetailfielddefinition.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCONTACTDETAILFIELDDEFINITION_H +#define QCONTACTDETAILFIELDDEFINITION_H + +#include +#include +#include + +#include "qtcontactsglobal.h" + +QTM_BEGIN_NAMESPACE + +class QContactDetailFieldDefinitionPrivate; +class Q_CONTACTS_EXPORT QContactDetailFieldDefinition +{ +public: + QContactDetailFieldDefinition(); + ~QContactDetailFieldDefinition(); + + QContactDetailFieldDefinition(const QContactDetailFieldDefinition& other); + QContactDetailFieldDefinition& operator=(const QContactDetailFieldDefinition& other); + + QVariant::Type dataType() const; + void setDataType(QVariant::Type type); + + QVariantList allowableValues() const; + void setAllowableValues(const QVariantList values); + + /* Access constraint stuff to be removed wk 3 */ + enum AccessConstraint { + NoConstraint = 0, + ReadOnly + }; + + QContactDetailFieldDefinition::AccessConstraint Q_DECL_DEPRECATED accessConstraint() const; + void Q_DECL_DEPRECATED setAccessConstraint(QContactDetailFieldDefinition::AccessConstraint constraint); + + bool operator==(const QContactDetailFieldDefinition& other) const; + bool operator!=(const QContactDetailFieldDefinition& other) const; + +private: + QSharedDataPointer d; +}; + +QTM_END_NAMESPACE + +Q_DECLARE_TYPEINFO(QTM_PREPEND_NAMESPACE(QContactDetailFieldDefinition), Q_MOVABLE_TYPE); + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactdetailfielddefinition_p.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/contacts/qcontactdetailfielddefinition_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCONTACTDETAILDEFINITIONFIELD_P_H +#define QCONTACTDETAILDEFINITIONFIELD_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qcontactdetailfielddefinition.h" + +#include +#include +#include +#include +#include + +QTM_BEGIN_NAMESPACE + +class QContactDetailFieldDefinitionPrivate : public QSharedData +{ +public: + QContactDetailFieldDefinitionPrivate() + : QSharedData(), + m_dataType(QVariant::Invalid) + { + } + + QContactDetailFieldDefinitionPrivate(const QContactDetailFieldDefinitionPrivate& other) + : QSharedData(other), + m_allowableValues(other.m_allowableValues), + m_dataType(other.m_dataType) + { + } + + ~QContactDetailFieldDefinitionPrivate() + { + } + + QVariantList m_allowableValues; + QVariant::Type m_dataType; +}; + +QTM_END_NAMESPACE + +#endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactmanager.cpp --- a/qtcontactsmobility/src/contacts/qcontactmanager.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactmanager.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -61,47 +61,47 @@ */ /*! - * \fn QContactManager::dataChanged() - * This signal is emitted by the manager if its internal state changes, and it is unable to determine the changes - * which occurred, or if the manager considers the changes to be radical enough to require clients to reload all data. - * If this signal is emitted, no other signals will be emitted for the associated changes. + \fn QContactManager::dataChanged() + This signal is emitted by the manager if its internal state changes, and it is unable to determine the changes + which occurred, or if the manager considers the changes to be radical enough to require clients to reload all data. + If this signal is emitted, no other signals will be emitted for the associated changes. */ /*! - * \fn QContactManager::contactsAdded(const QList& contactIds) - * This signal is emitted at some point once the contacts identified by \a contactIds have been added to a datastore managed by this manager. - * This signal must not be emitted if the dataChanged() signal was previously emitted for these changes. + \fn QContactManager::contactsAdded(const QList& contactIds) + This signal is emitted at some point once the contacts identified by \a contactIds have been added to a datastore managed by this manager. + This signal must not be emitted if the dataChanged() signal was previously emitted for these changes. */ /*! - * \fn QContactManager::contactsChanged(const QList& contactIds) - * This signal is emitted at some point once the contacts identified by \a contactIds have been modified in a datastore managed by this manager. - * This signal must not be emitted if the dataChanged() signal was previously emitted for these changes. + \fn QContactManager::contactsChanged(const QList& contactIds) + This signal is emitted at some point once the contacts identified by \a contactIds have been modified in a datastore managed by this manager. + This signal must not be emitted if the dataChanged() signal was previously emitted for these changes. */ /*! - * \fn QContactManager::contactsRemoved(const QList& contactIds) - * This signal is emitted at some point once the contacts identified by \a contactIds have been removed from a datastore managed by this manager. - * This signal must not be emitted if the dataChanged() signal was previously emitted for these changes. + \fn QContactManager::contactsRemoved(const QList& contactIds) + This signal is emitted at some point once the contacts identified by \a contactIds have been removed from a datastore managed by this manager. + This signal must not be emitted if the dataChanged() signal was previously emitted for these changes. */ /*! - * \fn QContactManager::relationshipsAdded(const QList& affectedContactIds) - * This signal is emitted at some point after relationships have been added to the manager which involve the contacts identified by \a affectedContactIds. - * This signal must not be emitted if the dataChanged() signal was previously emitted for these changes. + \fn QContactManager::relationshipsAdded(const QList& affectedContactIds) + This signal is emitted at some point after relationships have been added to the manager which involve the contacts identified by \a affectedContactIds. + This signal must not be emitted if the dataChanged() signal was previously emitted for these changes. */ /*! - * \fn QContactManager::relationshipsRemoved(const QList& affectedContactIds) - * This signal is emitted at some point after relationships have eben removed from the manager which involve the contacts identified by \a affectedContactIds. - * This signal must not be emitted if the dataChanged() signal was previously emitted for these changes. + \fn QContactManager::relationshipsRemoved(const QList& affectedContactIds) + This signal is emitted at some point after relationships have eben removed from the manager which involve the contacts identified by \a affectedContactIds. + This signal must not be emitted if the dataChanged() signal was previously emitted for these changes. */ /*! - * \fn QContactManager::selfContactIdChanged(const QContactLocalId& oldId, const QContactLocalId& newId) - * This signal is emitted at some point after the id of the self-contact is changed from \a oldId to \a newId in the manager. - * If the \a newId is the invalid, zero id, then the self contact was deleted or no self contact exists. - * This signal must not be emitted if the dataChanged() signal was previously emitted for this change. + \fn QContactManager::selfContactIdChanged(const QContactLocalId& oldId, const QContactLocalId& newId) + This signal is emitted at some point after the id of the self-contact is changed from \a oldId to \a newId in the manager. + If the \a newId is the invalid, zero id, then the self contact was deleted or no self contact exists. + This signal must not be emitted if the dataChanged() signal was previously emitted for this change. */ @@ -131,9 +131,21 @@ return ret; } -/*! Splits the given \a uri into the manager, store, and parameters that it describes, and places the information into the memory addressed by \a pManagerId and \a pParams respectively. Returns true if \a uri could be split successfully, otherwise returns false */ +/*! + \internal + Splits the given \a uri into the manager, store, and parameters that it describes, and places the information into the memory addressed by \a pManagerId and \a pParams respectively. Returns true if \a uri could be split successfully, otherwise returns false. + This function is obsolete; use parseUri() instead. + */ bool QContactManager::splitUri(const QString& uri, QString* pManagerId, QMap* pParams) { + return parseUri(uri, pManagerId, pParams); +} + +/*! + Splits the given \a uri into the manager, store, and parameters that it describes, and places the information into the memory addressed by \a pManagerId and \a pParams respectively. Returns true if \a uri could be split successfully, otherwise returns false + */ +bool QContactManager::parseUri(const QString& uri, QString* pManagerId, QMap* pParams) +{ // Format: qtcontacts::=&= // 1) parameters are currently a qstringlist.. should they be a map? // 2) is the uri going to be escaped? my guess would be "probably not" @@ -205,13 +217,8 @@ escapedParams.append(key); } - QString versionString = QString(QLatin1String(QTCONTACTS_VERSION_NAME)); - versionString += QString::fromAscii("="); - versionString += QString::number(version()); - escapedParams.append(versionString); - if (implementationVersion != -1) { - versionString = QString(QLatin1String(QTCONTACTS_IMPLEMENTATION_VERSION_NAME)); + QString versionString = QString(QLatin1String(QTCONTACTS_IMPLEMENTATION_VERSION_NAME)); versionString += QString::fromAscii("="); versionString += QString::number(implementationVersion); escapedParams.append(versionString); @@ -221,8 +228,8 @@ } /*! - * Constructs a QContactManager whose implementation, store and parameters are specified in the given \a storeUri, - * and whose parent object is \a parent. + Constructs a QContactManager whose implementation, store and parameters are specified in the given \a storeUri, + and whose parent object is \a parent. */ QContactManager* QContactManager::fromUri(const QString& storeUri, QObject* parent) { @@ -231,7 +238,7 @@ } else { QString id; QMap parameters; - if (splitUri(storeUri, &id, ¶meters)) { + if (parseUri(storeUri, &id, ¶meters)) { return new QContactManager(id, parameters, parent); } else { // invalid @@ -241,12 +248,22 @@ } /*! - * Constructs a QContactManager whose implementation is identified by \a managerName with the given \a parameters. - * - * The \a parent QObject will be used as the parent of this QContactManager. - * - * If an empty \a managerName is specified, the default implementation for the platform will - * be used. + Constructs a QContactManager whose parent QObject is \a parent. + The default implementation for the platform will be created. + */ +QContactManager::QContactManager(QObject* parent) + : QObject(parent) +{ + createEngine(QString(), QMap()); +} + +/*! + Constructs a QContactManager whose implementation is identified by \a managerName with the given \a parameters. + + The \a parent QObject will be used as the parent of this QContactManager. + + If an empty \a managerName is specified, the default implementation for the platform will + be used. */ QContactManager::QContactManager(const QString& managerName, const QMap& parameters, QObject* parent) : QObject(parent), @@ -268,13 +285,13 @@ } /*! - * Constructs a QContactManager whose backend has the name \a managerName and version \a implementationVersion, where the manager - * is constructed with the provided \a parameters. - * - * The \a parent QObject will be used as the parent of this QContactManager. - * - * If an empty \a managerName is specified, the default implementation for the platform will be instantiated. - * If the specified implementation version is not available, the manager with the name \a managerName with the default implementation version is instantiated. + Constructs a QContactManager whose backend has the name \a managerName and version \a implementationVersion, where the manager + is constructed with the provided \a parameters. + + The \a parent QObject will be used as the parent of this QContactManager. + + If an empty \a managerName is specified, the default implementation for the platform will be instantiated. + If the specified implementation version is not available, the manager with the name \a managerName with the default implementation version is instantiated. */ QContactManager::QContactManager(const QString& managerName, int implementationVersion, const QMap& parameters, QObject* parent) : QObject(parent), @@ -292,25 +309,25 @@ } /*! - * \enum QContactManager::Error - * - * This enum specifies an error that occurred during the most recent operation: - * - * \value NoError The most recent operation was successful - * \value DoesNotExistError The most recent operation failed because the requested contact or detail definition does not exist - * \value AlreadyExistsError The most recent operation failed because the specified contact or detail definition already exists - * \value InvalidDetailError The most recent operation failed because the specified contact contains details which do not conform to their definition - * \value InvalidRelationshipError The most recent operation failed because the specified relationship is circular or references an invalid local contact - * \value InvalidContactTypeError The most recent operation failed because the contact type specified was not valid for the operation - * \value LockedError The most recent operation failed because the datastore specified is currently locked - * \value DetailAccessError The most recent operation failed because a detail was modified or removed and its access method does not allow that - * \value PermissionsError The most recent operation failed because the caller does not have permission to perform the operation - * \value OutOfMemoryError The most recent operation failed due to running out of memory - * \value VersionMismatchError The most recent operation failed because the backend of the manager is not of the required version - * \value LimitReachedError The most recent operation failed because the limit for that type of object has been reached - * \value NotSupportedError The most recent operation failed because the requested operation is not supported in the specified store - * \value BadArgumentError The most recent operation failed because one or more of the parameters to the operation were invalid - * \value UnspecifiedError The most recent operation failed for an undocumented reason + \enum QContactManager::Error + + This enum specifies an error that occurred during the most recent operation: + + \value NoError The most recent operation was successful + \value DoesNotExistError The most recent operation failed because the requested contact or detail definition does not exist + \value AlreadyExistsError The most recent operation failed because the specified contact or detail definition already exists + \value InvalidDetailError The most recent operation failed because the specified contact contains details which do not conform to their definition + \value InvalidRelationshipError The most recent operation failed because the specified relationship is circular or references an invalid local contact + \value InvalidContactTypeError The most recent operation failed because the contact type specified was not valid for the operation + \value LockedError The most recent operation failed because the datastore specified is currently locked + \value DetailAccessError The most recent operation failed because a detail was modified or removed and its access method does not allow that + \value PermissionsError The most recent operation failed because the caller does not have permission to perform the operation + \value OutOfMemoryError The most recent operation failed due to running out of memory + \value VersionMismatchError The most recent operation failed because the backend of the manager is not of the required version + \value LimitReachedError The most recent operation failed because the limit for that type of object has been reached + \value NotSupportedError The most recent operation failed because the requested operation is not supported in the specified store + \value BadArgumentError The most recent operation failed because one or more of the parameters to the operation were invalid + \value UnspecifiedError The most recent operation failed for an undocumented reason */ /*! Return the error code of the most recent operation */ @@ -319,60 +336,116 @@ return d->m_error; } -/*! Return the list of added contact ids, sorted according to the given list of \a sortOrders */ +/*! + \internal + Return the list of added contact ids, sorted according to the given list of \a sortOrders. + This function is obsolete; use contactIds() instead. + */ QList QContactManager::contacts(const QList& sortOrders) const { return d->m_engine->contacts(sortOrders, d->m_error); } /*! - * Returns a list of contact ids that match the given \a filter, sorted according to the given list of \a sortOrders. - * Depending on the backend, this filtering operation may involve retrieving all the contacts. + \internal + Returns a list of contact ids that match the given \a filter, sorted according to the given list of \a sortOrders. + Depending on the backend, this filtering operation may involve retrieving all the contacts. + This function is obsolete; use contactIds() instead. */ QList QContactManager::contacts(const QContactFilter &filter, const QList& sortOrders) const { return d->m_engine->contacts(filter, sortOrders, d->m_error); } -/*! Returns the contact in the database identified by \a contactId */ -QContact QContactManager::contact(const QContactLocalId& contactId) const +/*! + Return the list of added contact ids, sorted according to the given list of \a sortOrders + */ +QList QContactManager::contactIds(const QList& sortOrders) const +{ + return d->m_engine->contactIds(sortOrders, d->m_error); +} + +/*! + Returns a list of contact ids that match the given \a filter, sorted according to the given list of \a sortOrders. + Depending on the backend, this filtering operation may involve retrieving all the contacts. + */ +QList QContactManager::contactIds(const QContactFilter& filter, const QList& sortOrders) const { - return d->m_engine->contact(contactId, d->m_error); + return d->m_engine->contactIds(filter, sortOrders, d->m_error); +} + +/*! + Returns the list of contacts stored in the manager sorted according to the given list of \a sortOrders. + If the given list of detail definition names \a definitionRestrictions is empty, each contact returned will include + all of the details which are stored in it, otherwise only those details which are of a definition whose name is included + in the \a definitionRestrictions list will be included. + */ +QList QContactManager::contacts(const QList& sortOrders, const QStringList& definitionRestrictions) const +{ + return d->m_engine->contacts(sortOrders, definitionRestrictions, d->m_error); +} + +/*! + Returns a list of contacs that match the given \a filter, sorted according to the given list of \a sortOrders. + Depending on the backend, this filtering operation may involve retrieving all the contacts. + If the given list of detail definition names \a definitionRestrictions is empty, each contact returned will include + all of the details which are stored in it, otherwise only those details which are of a definition whose name is included + in the \a definitionRestrictions list will be included. + */ +QList QContactManager::contacts(const QContactFilter& filter, const QList& sortOrders, const QStringList& definitionRestrictions) const +{ + return d->m_engine->contacts(filter, sortOrders, definitionRestrictions, d->m_error); } /*! - * Adds the given \a contact to the database if \a contact has a - * default-constructed id, or an id with the manager URI set to the URI of - * this manager and a local id of zero. - * - * If the manager URI of the id of the \a contact is neither empty nor equal to the URI of - * this manager, or local id of the \a contact is non-zero but does not exist in the - * manager, the operation will fail and calling error() will return - * \c QContactManager::DoesNotExistError. - * - * Alternatively, the function will update the existing contact in the database if \a contact - * has a non-zero id and currently exists in the database. - * - * If the \a contact contains one or more details whose definitions have - * not yet been saved with the manager, the operation will fail and calling - * error() will return \c QContactManager::UnsupportedError. - * - * If the \a contact has had its relationships reordered, the manager - * will check to make sure that every relationship that the contact is currently - * involved in is included in the reordered list, and that no relationships which - * either do not involve the contact, or have not been saved in the manager are - * included in the list. If these conditions are not met, the function will - * return \c false and calling error() will return - * \c QContactManager::InvalidRelationshipError. - * - * The manager will automatically synthesize the display label of the contact when it is saved. - * - * Returns false on failure, or true on - * success. On successful save of a contact with an id of zero, its - * id will be set to a new, valid id with the manager URI set to the URI of - * this manager, and the local id set to a new, valid local id. - * - * \sa managerUri() + Returns the contact in the database identified by \a contactId. + If the list of detail definition names \a definitionRestrictions given is non-empty, + the contact returned will contain at least those details which are of a definition whose name is + contained in the \a definitionRestrictions list. + Note that the returned contact may also contain other details, but this function guarantees that + all details whose definition name is included in the given list of definition names \a definitionRestrictions + will be included in the returned contact. + */ +QContact QContactManager::contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions) const +{ + return d->m_engine->contact(contactId, definitionRestrictions, d->m_error); +} + +/*! + Adds the given \a contact to the database if \a contact has a + default-constructed id, or an id with the manager URI set to the URI of + this manager and a local id of zero. + + If the manager URI of the id of the \a contact is neither empty nor equal to the URI of + this manager, or local id of the \a contact is non-zero but does not exist in the + manager, the operation will fail and calling error() will return + \c QContactManager::DoesNotExistError. + + Alternatively, the function will update the existing contact in the database if \a contact + has a non-zero id and currently exists in the database. + + If the \a contact contains one or more details whose definitions have + not yet been saved with the manager, the operation will fail and calling + error() will return \c QContactManager::UnsupportedError. + + If the \a contact has had its relationships reordered, the manager + will check to make sure that every relationship that the contact is currently + involved in is included in the reordered list, and that no relationships which + either do not involve the contact, or have not been saved in the manager are + included in the list. If these conditions are not met, the function will + return \c false and calling error() will return + \c QContactManager::InvalidRelationshipError. + + Returns false on failure, or true on + success. On successful save of a contact with an id of zero, its + id will be set to a new, valid id with the manager URI set to the URI of + this manager, and the local id set to a new, valid local id. + The manager will automatically synthesize the display label of the contact when it is saved. + The manager is not required to fetch updated details of the contact on save, + and as such, clients should fetch a contact if they want the most up-to-date information + by calling \l QContactManager::contact(). + + \sa managerUri() */ bool QContactManager::saveContact(QContact* contact) { @@ -380,10 +453,10 @@ } /*! - * Remove the contact identified by \a contactId from the database, - * and also removes any relationships in which the contact was involved. - * Returns true if the contact was removed successfully, otherwise - * returns false. + Remove the contact identified by \a contactId from the database, + and also removes any relationships in which the contact was involved. + Returns true if the contact was removed successfully, otherwise + returns false. */ bool QContactManager::removeContact(const QContactLocalId& contactId) { @@ -391,18 +464,21 @@ } /*! - * Adds the list of contacts given by \a contactList to the database. - * Returns a list of the error codes corresponding to the contacts in - * the \a contactList. The \l QContactManager::error() function will - * only return \c QContactManager::NoError if all contacts were saved - * successfully. - * - * For each newly saved contact that was successful, the uid of the contact - * in the list will be updated with the new value. If a failure occurs - * when saving a new contact, the id will be cleared. If a failure occurs - * when updating a contact that already exists, then TODO. - * - * \sa QContactManager::saveContact() + \internal + Adds the list of contacts given by \a contactList to the database. + Returns a list of the error codes corresponding to the contacts in + the \a contactList. The \l QContactManager::error() function will + only return \c QContactManager::NoError if all contacts were saved + successfully. + + For each newly saved contact that was successful, the uid of the contact + in the list will be updated with the new value. If a failure occurs + when saving a new contact, the id will be cleared. If a failure occurs + when updating a contact that already exists, then TODO. + + This function was deprecated in week 1 and will be removed after the transition period has elapsed. + + \sa QContactManager::saveContact() */ QList QContactManager::saveContacts(QList* contactList) { @@ -410,42 +486,103 @@ } /*! - * Remove the list of contacts identified in \a idList. - * Returns a list of the error codes corresponding to the contact ids in - * the \a idList. The \l QContactManager::error() function will - * only return \c QContactManager::NoError if all contacts were removed - * successfully. - * - * For each contact that was removed succesfully, the corresponding - * id in the list will be retained but set to zero. The id of contacts - * that were not successfully removed will be left alone. - * - * Any contact that was removed successfully will have the relationships - * in which it was involved removed also. - * - * \sa QContactManager::removeContact() + Adds the list of contacts given by \a contacts list to the database. + Returns true if the contacts were saved successfully, otherwise false. + + The manager might populate \a errorMap (the map of indices of the \a contacts list to + the error which occurred when saving the contact at that index) for + every index for which the contact could not be saved, if it is able. + The \l QContactManager::error() function will only return \c QContactManager::NoError + if all contacts were saved successfully. + + For each newly saved contact that was successful, the id of the contact + in the \a contacts list will be updated with the new value. If a failure occurs + when saving a new contact, the id will be cleared. + + \sa QContactManager::saveContact() + */ +bool QContactManager::saveContacts(QList* contacts, QMap* errorMap) +{ + return d->m_engine->saveContacts(contacts, errorMap, d->m_error); +} + +/*! + Remove every contact whose id is contained in the list of contacts ids + \a contactIds. Returns true if all contacts were removed successfully, + otherwise false. + + The manager might populate \a errorMap (the map of indices of the \a contactIds list to + the error which occurred when saving the contact at that index) for every + index for which the contact could not be removed, if it is able. + The \l QContactManager::error() function will + only return \c QContactManager::NoError if all contacts were removed + successfully. + + For each contact that was removed succesfully, the corresponding + id in the \a contactIds list will be retained but set to zero. The id of contacts + that were not successfully removed will be left alone. + + Any contact that was removed successfully will have the relationships + in which it was involved removed also. + + \sa QContactManager::removeContact() + */ +bool QContactManager::removeContacts(QList* contactIds, QMap* errorMap) +{ + return d->m_engine->removeContacts(contactIds, errorMap, d->m_error); +} + +/*! + \internal + Remove the list of contacts identified in \a idList. + Returns a list of the error codes corresponding to the contact ids in + the \a idList. The \l QContactManager::error() function will + only return \c QContactManager::NoError if all contacts were removed + successfully. + + For each contact that was removed succesfully, the corresponding + id in the list will be retained but set to zero. The id of contacts + that were not successfully removed will be left alone. + + Any contact that was removed successfully will have the relationships + in which it was involved removed also. + + This function was deprecated in week 1 and will be removed after the transition period has elapsed. + + \sa QContactManager::removeContact() */ QList QContactManager::removeContacts(QList* idList) { return d->m_engine->removeContacts(idList, d->m_error); } -/*! Returns a display label for a \a contact which is synthesized from its details in a platform-specific manner */ +/*! + \internal + Returns a display label for a \a contact which is synthesized from its details in a platform-specific manner + */ QString QContactManager::synthesizeDisplayLabel(const QContact& contact) const { - return d->m_engine->synthesizeDisplayLabel(contact, d->m_error); + return d->m_engine->synthesizedDisplayLabel(contact, d->m_error); } /*! - * Sets the id of the "self" contact to the given \a contactId. - * Returns true if the "self" contact id was set successfully. - * If the given \a contactId does not identify a contact - * stored in this manager, the error will be set to - * \c QContactManager::DoesNotExistError and the function will - * return false; if the backend does not support the - * concept of a "self" contact then the error will be set to - * \c QContactManager::NotSupportedError and the function will - * return false. + Returns a display label for a \a contact which is synthesized from its details in a platform-specific manner + */ +QString QContactManager::synthesizedDisplayLabel(const QContact& contact) const +{ + return d->m_engine->synthesizedDisplayLabel(contact, d->m_error); +} + +/*! + Sets the id of the "self" contact to the given \a contactId. + Returns true if the "self" contact id was set successfully. + If the given \a contactId does not identify a contact + stored in this manager, the error will be set to + \c QContactManager::DoesNotExistError and the function will + return false; if the backend does not support the + concept of a "self" contact then the error will be set to + \c QContactManager::NotSupportedError and the function will + return false. */ bool QContactManager::setSelfContactId(const QContactLocalId& contactId) { @@ -453,11 +590,11 @@ } /*! - * Returns the id of the "self" contact which has previously been set. - * If no "self" contact has been set, or if the self contact was removed - * from the manager after being set, or if the backend does not support - * the concept of a "self" contact, an invalid id will be returned - * and the error will be set to \c QContactManager::DoesNotExistError. + Returns the id of the "self" contact which has previously been set. + If no "self" contact has been set, or if the self contact was removed + from the manager after being set, or if the backend does not support + the concept of a "self" contact, an invalid id will be returned + and the error will be set to \c QContactManager::DoesNotExistError. */ QContactLocalId QContactManager::selfContactId() const { @@ -465,8 +602,8 @@ } /*! - * Returns a list of relationships in which the contact identified by the given \a participantId participates in the given \a role. - * If \a participantId is the default-constructed id, \a role is ignored and all relationships are returned. + Returns a list of relationships in which the contact identified by the given \a participantId participates in the given \a role. + If \a participantId is the default-constructed id, \a role is ignored and all relationships are returned. */ QList QContactManager::relationships(const QContactId& participantId, QContactRelationshipFilter::Role role) const { @@ -474,9 +611,9 @@ } /*! - * Returns a list of relationships of the given \a relationshipType in which the contact identified by the given \a participantId participates in the given \a role. - * If \a participantId is the default-constructed id, \a role is ignored and all relationships of the given \a relationshipType are returned. - * If \a relationshipType is empty, relationships of any type are returned. + Returns a list of relationships of the given \a relationshipType in which the contact identified by the given \a participantId participates in the given \a role. + If \a participantId is the default-constructed id, \a role is ignored and all relationships of the given \a relationshipType are returned. + If \a relationshipType is empty, relationships of any type are returned. */ QList QContactManager::relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationshipFilter::Role role) const { @@ -484,20 +621,20 @@ } /*! - * Saves the given \a relationship in the database. If the relationship already exists in the database, this function will - * return \c false and the error will be set to \c QContactManager::AlreadyExistsError. - * If the relationship is saved successfully, this function will return \c true and error will be set - * to \c QContactManager::NoError. Note that relationships cannot be updated directly using this function; in order - * to update a relationship, you must remove the old relationship, make the required modifications, and then save it. - * - * The given relationship is invalid if it is circular (one of the destination contacts is also the source contact), or - * if it references a non-existent local contact (either source or destination). If the given \a relationship is invalid, - * the function will return \c false and the error will be set to \c QContactManager::InvalidRelationshipError. - * If the given \a relationship could not be saved in the database (due to backend limitations) - * the function will return \c false and error will be set to \c QContactManager::NotSupportedError. - * - * If any destination contact manager URI is not set in the \a relationship, these will be - * automatically set to the URI of this manager, before the relationship is saved. + Saves the given \a relationship in the database. If the relationship already exists in the database, this function will + return \c false and the error will be set to \c QContactManager::AlreadyExistsError. + If the relationship is saved successfully, this function will return \c true and error will be set + to \c QContactManager::NoError. Note that relationships cannot be updated directly using this function; in order + to update a relationship, you must remove the old relationship, make the required modifications, and then save it. + + The given relationship is invalid if it is circular (one of the destination contacts is also the source contact), or + if it references a non-existent local contact (either source or destination). If the given \a relationship is invalid, + the function will return \c false and the error will be set to \c QContactManager::InvalidRelationshipError. + If the given \a relationship could not be saved in the database (due to backend limitations) + the function will return \c false and error will be set to \c QContactManager::NotSupportedError. + + If any destination contact manager URI is not set in the \a relationship, these will be + automatically set to the URI of this manager, before the relationship is saved. */ bool QContactManager::saveRelationship(QContactRelationship* relationship) { @@ -505,7 +642,7 @@ } /*! - * Saves the given \a relationships in the database and returns a list of error codes. + Saves the given \a relationships in the database and returns a list of error codes. */ QList QContactManager::saveRelationships(QList* relationships) { @@ -513,12 +650,12 @@ } /*! - * Removes the given \a relationship from the manager. If the relationship exists in the manager, the relationship - * will be removed, the error will be set to \c QContactManager::NoError and this function will return true. If no such - * relationship exists in the manager, the error will be set to \c QContactManager::DoesNotExistError and this function - * will return false. - * - * The priority of the relationship is ignored when determining existence of the relationship. + Removes the given \a relationship from the manager. If the relationship exists in the manager, the relationship + will be removed, the error will be set to \c QContactManager::NoError and this function will return true. If no such + relationship exists in the manager, the error will be set to \c QContactManager::DoesNotExistError and this function + will return false. + + The priority of the relationship is ignored when determining existence of the relationship. */ bool QContactManager::removeRelationship(const QContactRelationship& relationship) { @@ -526,7 +663,7 @@ } /*! - * Removes the given \a relationships from the database and returns a list of error codes. + Removes the given \a relationships from the database and returns a list of error codes. */ QList QContactManager::removeRelationships(const QList& relationships) { @@ -534,8 +671,8 @@ } /*! - * Returns a map of identifier to detail definition for the registered detail definitions which are valid for contacts whose type is the given \a contactType - * which are valid for the contacts in this store + Returns a map of identifier to detail definition for the registered detail definitions which are valid for contacts whose type is the given \a contactType + which are valid for the contacts in this store */ QMap QContactManager::detailDefinitions(const QString& contactType) const { @@ -581,21 +718,22 @@ } /*! - * \enum QContactManager::ManagerFeature - * This enum describes the possible features that a particular manager may support - * \value Groups The manager supports all QContactGroup related operations, and emits the appropriate signals - * \value ActionPreferences The manager supports saving preferred details per action per contact - * \value Relationships The manager supports at least some types of relationships between contacts - * \value ArbitraryRelationshipTypes The manager supports relationships of arbitrary types between contacts - * \value RelationshipOrdering The manager supports relationships (re)ordering - * \value MutableDefinitions The manager supports saving, updating or removing detail definitions. Some built-in definitions may still be immutable - * \value SelfContact The manager supports the concept of saving a contact which represents the current user - * \value ChangeLogs The manager supports reporting of timestamps of changes, and filtering and sorting by those timestamps - * \value Anonymous The manager is isolated from other managers + \enum QContactManager::ManagerFeature + This enum describes the possible features that a particular manager may support + \value Groups The manager supports all QContactGroup related operations, and emits the appropriate signals + \value ActionPreferences The manager supports saving preferred details per action per contact + \value DetailOrdering When a contact is retrieved, the manager will return the details in the same order in which they were saved + \value Relationships The manager supports at least some types of relationships between contacts + \value ArbitraryRelationshipTypes The manager supports relationships of arbitrary types between contacts + \value RelationshipOrdering The manager supports relationships (re)ordering + \value MutableDefinitions The manager supports saving, updating or removing detail definitions. Some built-in definitions may still be immutable + \value SelfContact The manager supports the concept of saving a contact which represents the current user + \value ChangeLogs The manager supports reporting of timestamps of changes, and filtering and sorting by those timestamps + \value Anonymous The manager is isolated from other managers */ /*! - * Returns true if the given feature \a feature is supported by the manager, for the specified type of contact \a contactType + Returns true if the given feature \a feature is supported by the manager, for the specified type of contact \a contactType */ bool QContactManager::hasFeature(QContactManager::ManagerFeature feature, const QString& contactType) const { @@ -603,7 +741,7 @@ } /*! - * Returns the list of data types supported by the manager + Returns the list of data types supported by the manager */ QList QContactManager::supportedDataTypes() const { @@ -611,27 +749,42 @@ } /*! - * Returns true if the given \a filter is supported natively by the - * manager, and false if the filter behaviour would be emulated. - * - * Note: In some cases, the behaviour of an unsupported filter - * cannot be emulated. For example, a filter that requests contacts - * that have changed since a given time depends on having that information - * available. In these cases, the filter will fail. + \internal + Returns true if the given \a filter is supported natively by the + manager, and false if the filter behaviour would be emulated. + + Note: In some cases, the behaviour of an unsupported filter + cannot be emulated. For example, a filter that requests contacts + that have changed since a given time depends on having that information + available. In these cases, the filter will fail. */ bool QContactManager::filterSupported(const QContactFilter& filter) const { - return d->m_engine->filterSupported(filter); + return d->m_engine->isFilterSupported(filter); } /*! - * Returns the list of relationship types which are supported by this manager for contacts of - * the given \a contactType. - * If the backend does not support the \c QContactManager::Relationships feature, this list should - * be empty. If the backend supports the \c QContactManager::Relationships feature and also - * supports the \c QContactManager::ArbitraryRelationshipTypes feature, the list will - * contain the natively supported (well-known) relationship types contained in the list, but clients - * are able to add relationships of any custom type also. + Returns true if the given \a filter is supported natively by the + manager, and false if the filter behaviour would be emulated. + + Note: In some cases, the behaviour of an unsupported filter + cannot be emulated. For example, a filter that requests contacts + that have changed since a given time depends on having that information + available. In these cases, the filter will fail. + */ +bool QContactManager::isFilterSupported(const QContactFilter& filter) const +{ + return d->m_engine->isFilterSupported(filter); +} + +/*! + Returns the list of relationship types which are supported by this manager for contacts of + the given \a contactType. + If the backend does not support the \c QContactManager::Relationships feature, this list should + be empty. If the backend supports the \c QContactManager::Relationships feature and also + supports the \c QContactManager::ArbitraryRelationshipTypes feature, the list will + contain the natively supported (well-known) relationship types contained in the list, but clients + are able to add relationships of any custom type also. */ QStringList QContactManager::supportedRelationshipTypes(const QString& contactType) const { @@ -639,27 +792,42 @@ } /*! - * Returns the list of contact types which are supported by this manager. - * This is a convenience function, equivalent to retrieving the allowable values - * for the \c QContactType::FieldType field of the QContactType definition - * which is valid in this manager. + Returns the list of contact types which are supported by this manager. + This is a convenience function, equivalent to retrieving the allowable values + for the \c QContactType::FieldType field of the QContactType definition + which is valid in this manager. */ QStringList QContactManager::supportedContactTypes() const { return d->m_engine->supportedContactTypes(); } -/*! Returns the version number of the Qt Mobility Contacts API */ -int QContactManager::version() -{ +/*! + \internal + Returns the version number of the Qt Mobility Contacts API + */ +int QContactManager::version() +{ return QTCONTACTS_VERSION; -} +} -/*! Returns the engine backend implementation version number */ -int QContactManager::implementationVersion() const -{ - return d->m_engine->implementationVersion(); -} +/*! + \internal + Returns the engine backend implementation version number. + This function is obsolete; use managerVersion() instead. + */ +int QContactManager::implementationVersion() const +{ + return d->m_engine->managerVersion(); +} + +/*! + Returns the engine backend implementation version number + */ +int QContactManager::managerVersion() const +{ + return d->m_engine->managerVersion(); +} /*! Returns the manager name for this QContactManager */ QString QContactManager::managerName() const @@ -678,7 +846,7 @@ } /*! - * Return the uri describing this QContactManager, consisting of the manager name and any parameters. + Return the uri describing this QContactManager, consisting of the manager name and any parameters. */ QString QContactManager::managerUri() const { diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactmanager.h --- a/qtcontactsmobility/src/contacts/qcontactmanager.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactmanager.h Fri Apr 16 14:53:18 2010 +0300 @@ -75,6 +75,7 @@ QContactManager(const QString& managerName = QString(), const QMap& parameters = (QMap()), QObject* parent = 0); QContactManager(const QString& managerName, int implementationVersion, const QMap& parameters = (QMap()), QObject* parent = 0); #endif + QContactManager(QObject* parent); static QContactManager* fromUri(const QString& uri, QObject* parent = 0); ~QContactManager(); // dtor @@ -82,8 +83,11 @@ QString managerName() const; // e.g. "Symbian" QMap managerParameters() const; // e.g. "filename=private.db" QString managerUri() const; // managerName + managerParameters + int Q_DECL_DEPRECATED implementationVersion() const; // deprecated + int managerVersion() const; // replaces the above - static bool splitUri(const QString& uri, QString* managerName, QMap* params); + static bool Q_DECL_DEPRECATED splitUri(const QString& uri, QString* managerName, QMap* params); // deprecated + static bool parseUri(const QString& uri, QString* managerName, QMap* params); // replaces the above. static QString buildUri(const QString& managerName, const QMap& params, int implementationVersion = -1); /* The values of the Error enum are still to be decided! */ @@ -109,18 +113,27 @@ QContactManager::Error error() const; /* Contacts - Accessors and Mutators */ - QList contacts(const QList& sortOrders = QList()) const; // retrieve contact ids - QList contacts(const QContactFilter& filter, const QList& sortOrders = QList()) const; // retrieve ids of contacts matching the filter + QList Q_DECL_DEPRECATED contacts(const QList& sortOrders = QList()) const; // retrieve contact ids + QList Q_DECL_DEPRECATED contacts(const QContactFilter& filter, const QList& sortOrders = QList()) const; // retrieve ids of contacts matching the filter - QContact contact(const QContactLocalId& contactId) const; // retrieve a contact + QList contactIds(const QList& sortOrders = QList()) const; + QList contactIds(const QContactFilter& filter, const QList& sortOrders = QList()) const; + QList contacts(const QList& sortOrders, const QStringList& definitionRestrictions) const; + QList contacts(const QContactFilter& filter, const QList& sortOrders, const QStringList& definitionRestrictions) const; + + QContact contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions = QStringList()) const; // retrieve a contact bool saveContact(QContact* contact); // note: MODIFIES contact (sets the contactId) bool removeContact(const QContactLocalId& contactId); // remove the contact from the persistent store - QList saveContacts(QList* contacts); // batch API - save - QList removeContacts(QList* contactIds); // batch API - remove + + QList Q_DECL_DEPRECATED saveContacts(QList* contacts); // deprecated batch API - save + QList Q_DECL_DEPRECATED removeContacts(QList* contactIds); // deprecated batch API - remove + bool saveContacts(QList* contacts, QMap* errorMap); // batch API - save. + bool removeContacts(QList* contactIds, QMap* errorMap); // batch API - remove. /* Synthesize the display label of a contact */ - QString synthesizeDisplayLabel(const QContact& contact) const; + QString Q_DECL_DEPRECATED synthesizeDisplayLabel(const QContact& contact) const; // deprecated + QString synthesizedDisplayLabel(const QContact& contact) const; // replaces the above /* "Self" contact id (MyCard) */ bool setSelfContactId(const QContactLocalId& contactId); @@ -148,6 +161,7 @@ Relationships, ArbitraryRelationshipTypes, RelationshipOrdering, + DetailOrdering, SelfContact, Anonymous, ChangeLogs @@ -155,12 +169,12 @@ bool hasFeature(QContactManager::ManagerFeature feature, const QString& contactType = QContactType::TypeContact) const; QStringList supportedRelationshipTypes(const QString& contactType = QContactType::TypeContact) const; QList supportedDataTypes() const; - bool filterSupported(const QContactFilter& filter) const; + bool Q_DECL_DEPRECATED filterSupported(const QContactFilter& filter) const; // DEPRECATED + bool isFilterSupported(const QContactFilter& filter) const;// replaces the above. QStringList supportedContactTypes() const; /* Versions */ - static int version(); - int implementationVersion() const; + static int Q_DECL_DEPRECATED version(); // deprecated, removed entirely in wk1, no replacement. /* return a list of available backends for which a QContactManager can be constructed. */ static QStringList availableManagers(); diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactmanager_p.cpp --- a/qtcontactsmobility/src/contacts/qcontactmanager_p.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactmanager_p.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -57,9 +57,14 @@ #include #include +#include #include +#if defined(Q_OS_SYMBIAN) +# include +#endif + #include "qcontactmemorybackend_p.h" #include "qcontactinvalidbackend_p.h" @@ -112,15 +117,8 @@ void QContactManagerData::createEngine(const QString& managerName, const QMap& parameters) { - int apiVersion = parameterValue(parameters, QTCONTACTS_VERSION_NAME, QContactManager::version()); m_engine = 0; - if (apiVersion != QContactManager::version()) { - m_error = QContactManager::VersionMismatchError; - m_engine = new QContactInvalidEngine(); // XXX share - return; - } - QString builtManagerName = managerName.isEmpty() ? QContactManager::availableManagers().value(0) : managerName; if (builtManagerName == QLatin1String("memory")) { m_engine = QContactMemoryEngine::createMemoryEngine(parameters); @@ -140,19 +138,17 @@ while(!found) { foreach (QContactManagerEngineFactory* f, factories) { QList versions = f->supportedImplementationVersions(); - if (f && f->version() == apiVersion) { - if (implementationVersion == -1 //no given implementation version required - || versions.isEmpty() //the manager engine factory does not report any version - || versions.contains(implementationVersion)) { - m_engine = f->engine(parameters, m_error); - found = true; - break; - } + if (implementationVersion == -1 ||//no given implementation version required + versions.isEmpty() || //the manager engine factory does not report any version + versions.contains(implementationVersion)) { + m_engine = f->engine(parameters, m_error); + found = true; + break; } } - - // If this is the second time through, break - if (loadedDynamic) + + // Break if found or if this is the second time through + if (loadedDynamic || found) break; // otherwise load dynamic factories and reloop @@ -163,7 +159,7 @@ // XXX remove this // the engine factory could lie to us, so check the real implementation version - if (m_engine && (m_engine->version() != apiVersion || (implementationVersion != -1 && m_engine->implementationVersion() != implementationVersion))) { + if (m_engine && (implementationVersion != -1 && m_engine->managerVersion() != implementationVersion)) { m_error = QContactManager::VersionMismatchError; m_engine = 0; } @@ -190,7 +186,7 @@ for (int i=0; i < staticPlugins.count(); i++ ){ QContactManagerEngineFactory *f = qobject_cast(staticPlugins.at(i)); QContactActionFactory *g = qobject_cast(staticPlugins.at(i)); - if (f && f->version() == QContactManager::version()) { + if (f) { QString name = f->managerName(); qDebug() << "Static: found an engine plugin" << f << "with name" << name; if (name != QLatin1String("memory") && name != QLatin1String("invalid") && !name.isEmpty()) { @@ -254,21 +250,51 @@ continue; processed.insert(paths.at(i)); QDir pluginsDir(paths.at(i)); + if (!pluginsDir.exists()) + continue; + #if defined(Q_OS_WIN) - if (pluginsDir.dirName().toLower() == QLatin1String("debug") || pluginsDir.dirName().toLower() == QLatin1String("release")) - pluginsDir.cdUp(); + if (pluginsDir.dirName().toLower() == QLatin1String("debug") || pluginsDir.dirName().toLower() == QLatin1String("release")) + pluginsDir.cdUp(); #elif defined(Q_OS_MAC) - if (pluginsDir.dirName() == QLatin1String("MacOS")) { - pluginsDir.cdUp(); - pluginsDir.cdUp(); - pluginsDir.cdUp(); - } + if (pluginsDir.dirName() == QLatin1String("MacOS")) { + pluginsDir.cdUp(); + pluginsDir.cdUp(); + pluginsDir.cdUp(); + } #endif - // In Symbian, going cdUp() in a c:/private// will result in *platsec* error at fileserver (requires AllFiles capability) - // Also, trying to cd() to a nonexistent directory causes *platsec* error. This does not cause functional harm, but should - // nevertheless be changed to use native Symbian methods to avoid unnecessary platsec warnings. See for example: qpluginloader.cpp::setFileName() for solution ideas. - // Alternatively, this whole changing directory thing should be altered (see for example Qtmultimedia's plugin loading) - if (pluginsDir.cd(QLatin1String("plugins/contacts")) || pluginsDir.cd(QLatin1String("contacts")) || (pluginsDir.cdUp() && pluginsDir.cd(QLatin1String("plugins/contacts")))) { + +#if defined(Q_OS_SYMBIAN) + // In Symbian, going cdUp() in a c:/private// will result in *platsec* error at fileserver (requires AllFiles capability) + // Also, trying to cd() to a nonexistent directory causes *platsec* error. This does not cause functional harm, but should + // nevertheless be changed to use native Symbian methods to avoid unnecessary platsec warnings (as per qpluginloader.cpp). + RFs rfs; + qt_symbian_throwIfError(rfs.Connect()); + bool pluginPathFound = false; + QStringList directories; + directories << QString("plugins/contacts") << QString("contacts") << QString("../plugins/contacts"); + foreach (const QString& dirName, directories) { + QString testDirPath = pluginsDir.path() + "/" + dirName; + testDirPath = QDir::cleanPath(testDirPath); + // Use native Symbian code to check for directory existence, because checking + // for files from under non-existent protected dir like E:/private/ using + // QDir::exists causes platform security violations on most apps. + QString nativePath = QDir::toNativeSeparators(testDirPath); + TPtrC ptr = TPtrC16(static_cast(nativePath.utf16()), nativePath.length()); + TUint attributes; + TInt err = rfs.Att(ptr, attributes); + if (err == KErrNone) { + // yes, the directory exists. + pluginsDir.cd(testDirPath); + pluginPathFound = true; + break; + } + } + rfs.Close(); + if (pluginPathFound) { +#else + if (pluginsDir.cd(QLatin1String("plugins/contacts")) || pluginsDir.cd(QLatin1String("contacts")) || (pluginsDir.cdUp() && pluginsDir.cd(QLatin1String("plugins/contacts")))) { +#endif const QStringList& files = pluginsDir.entryList(QDir::Files); qDebug() << "Looking for plugins in" << pluginsDir.path() << files; for (int j=0; j < files.count(); j++) { @@ -334,7 +360,7 @@ foreach (QContactManagerEngineFactory* f, m_engines.values()) { QStringList versions; foreach (int v, f->supportedImplementationVersions()) { - versions << QString::fromAscii("%1.%2").arg(f->version()).arg(v); + versions << QString::fromAscii("%1").arg(v); } engineNames << QString::fromAscii("%1[%2]").arg(f->managerName()).arg(versions.join(QString::fromAscii(","))); } diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactmanagerengine.cpp --- a/qtcontactsmobility/src/contacts/qcontactmanagerengine.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactmanagerengine.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -39,12 +39,10 @@ ** ****************************************************************************/ -#include - #include "qcontactmanagerengine.h" #include "qcontactdetaildefinition.h" -#include "qcontactdetaildefinitionfield.h" +#include "qcontactdetailfielddefinition.h" #include "qcontactdetails.h" #include "qcontactsortorder.h" #include "qcontactfilters.h" @@ -56,7 +54,7 @@ #include "qcontactrequests_p.h" #include "qcontact_p.h" - +#include "qcontactdetail_p.h" QTM_BEGIN_NAMESPACE /*! @@ -79,119 +77,119 @@ */ /*! - * \fn QContactManagerEngine::QContactManagerEngine() - * - * A default, empty constructor. + \fn QContactManagerEngine::QContactManagerEngine() + + A default, empty constructor. */ /*! - * \fn QContactManagerEngine::deref() - * - * Notifies the engine that it is no longer required. If this - * engine can not be shared between managers, it is safe for the - * engine to delete itself in this function. - * - * If the engine implementation can be shared, this function can use a - * reference count and track lifetime that way. The factory that - * returns an instance of this engine should increment the reference - * count in this case. + \fn QContactManagerEngine::deref() + + Notifies the engine that it is no longer required. If this + engine can not be shared between managers, it is safe for the + engine to delete itself in this function. + + If the engine implementation can be shared, this function can use a + reference count and track lifetime that way. The factory that + returns an instance of this engine should increment the reference + count in this case. */ /*! - * \fn QContactManagerEngine::dataChanged() - * - * This signal is emitted some time after changes occur to the data managed by this - * engine, and the engine is unable to determine which changes occurred, or if the - * engine considers the changes to be radical enough to require clients to reload all data. - * - * If this signal is emitted, no other signals may be emitted for the associated changes. - * - * As it is possible that other processes (or other devices) may have caused the - * changes, the timing can not be determined. - * - * \sa contactsAdded(), contactsChanged(), contactsRemoved() + \fn QContactManagerEngine::dataChanged() + + This signal is emitted some time after changes occur to the data managed by this + engine, and the engine is unable to determine which changes occurred, or if the + engine considers the changes to be radical enough to require clients to reload all data. + + If this signal is emitted, no other signals may be emitted for the associated changes. + + As it is possible that other processes (or other devices) may have caused the + changes, the timing can not be determined. + + \sa contactsAdded(), contactsChanged(), contactsRemoved() */ /*! - * \fn QContactManagerEngine::contactsAdded(const QList& contactIds); - * - * This signal is emitted some time after a set of contacts has been added to - * this engine where the \l dataChanged() signal was not emitted for those changes. - * As it is possible that other processes (or other devices) may - * have added the contacts, the timing cannot be determined. - * - * The list of ids of contacts added is given by \a contactIds. There may be one or more - * ids in the list. - * - * \sa dataChanged() + \fn QContactManagerEngine::contactsAdded(const QList& contactIds); + + This signal is emitted some time after a set of contacts has been added to + this engine where the \l dataChanged() signal was not emitted for those changes. + As it is possible that other processes (or other devices) may + have added the contacts, the timing cannot be determined. + + The list of ids of contacts added is given by \a contactIds. There may be one or more + ids in the list. + + \sa dataChanged() */ /*! - * \fn QContactManagerEngine::contactsChanged(const QList& contactIds); - * - * This signal is emitted some time after a set of contacts has been modified in - * this engine where the \l dataChanged() signal was not emitted for those changes. - * As it is possible that other processes (or other devices) may - * have modified the contacts, the timing cannot be determined. - * - * The list of ids of changed contacts is given by \a contactIds. There may be one or more - * ids in the list. - * - * \sa dataChanged() + \fn QContactManagerEngine::contactsChanged(const QList& contactIds); + + This signal is emitted some time after a set of contacts has been modified in + this engine where the \l dataChanged() signal was not emitted for those changes. + As it is possible that other processes (or other devices) may + have modified the contacts, the timing cannot be determined. + + The list of ids of changed contacts is given by \a contactIds. There may be one or more + ids in the list. + + \sa dataChanged() */ /*! - * \fn QContactManagerEngine::contactsRemoved(const QList& contactIds); - * - * This signal is emitted some time after a set of contacts has been removed from - * this engine where the \l dataChanged() signal was not emitted for those changes. - * As it is possible that other processes (or other devices) may - * have removed the contacts, the timing cannot be determined. - * - * The list of ids of removed contacts is given by \a contactIds. There may be one or more - * ids in the list. - * - * \sa dataChanged() + \fn QContactManagerEngine::contactsRemoved(const QList& contactIds); + + This signal is emitted some time after a set of contacts has been removed from + this engine where the \l dataChanged() signal was not emitted for those changes. + As it is possible that other processes (or other devices) may + have removed the contacts, the timing cannot be determined. + + The list of ids of removed contacts is given by \a contactIds. There may be one or more + ids in the list. + + \sa dataChanged() */ /*! - * \fn QContactManagerEngine::relationshipsAdded(const QList& affectedContactIds); - * - * This signal is emitted some time after a set of contacts has been added to - * this engine where the \l dataChanged() signal was not emitted for those changes. - * As it is possible that other processes (or other devices) may - * have added the contacts, the timing cannot be determined. - * - * The list of ids of affected contacts is given by \a affectedContactIds. There may be one or more - * ids in the list. - * - * \sa dataChanged() + \fn QContactManagerEngine::relationshipsAdded(const QList& affectedContactIds); + + This signal is emitted some time after a set of contacts has been added to + this engine where the \l dataChanged() signal was not emitted for those changes. + As it is possible that other processes (or other devices) may + have added the contacts, the timing cannot be determined. + + The list of ids of affected contacts is given by \a affectedContactIds. There may be one or more + ids in the list. + + \sa dataChanged() */ /*! - * \fn QContactManagerEngine::relationshipsRemoved(const QList& affectedContactIds); - * - * This signal is emitted some time after a set of relationships has been removed from - * this engine where the \l dataChanged() signal was not emitted for those changes. - * As it is possible that other processes (or other devices) may - * have removed the relationships, the timing cannot be determined. - * - * The list of ids of affected contacts is given by \a affectedContactIds. There may be one or more - * ids in the list. - * - * \sa dataChanged() + \fn QContactManagerEngine::relationshipsRemoved(const QList& affectedContactIds); + + This signal is emitted some time after a set of relationships has been removed from + this engine where the \l dataChanged() signal was not emitted for those changes. + As it is possible that other processes (or other devices) may + have removed the relationships, the timing cannot be determined. + + The list of ids of affected contacts is given by \a affectedContactIds. There may be one or more + ids in the list. + + \sa dataChanged() */ /*! - * \fn QContactManagerEngine::selfContactIdChanged(const QContactLocalId& oldId, const QContactLocalId& newId) - * - * This signal is emitted at some point after the id of the self-contact is changed from \a oldId to \a newId in the manager. - * If the \a newId is the invalid, zero id, then the self contact was deleted or no self contact exists. - * This signal must not be emitted if the dataChanged() signal was previously emitted for this change. - * As it is possible that other processes (or other devices) may - * have removed or changed the self contact, the timing cannot be determined. - * - * \sa dataChanged() + \fn QContactManagerEngine::selfContactIdChanged(const QContactLocalId& oldId, const QContactLocalId& newId) + + This signal is emitted at some point after the id of the self-contact is changed from \a oldId to \a newId in the manager. + If the \a newId is the invalid, zero id, then the self contact was deleted or no self contact exists. + This signal must not be emitted if the dataChanged() signal was previously emitted for this change. + As it is possible that other processes (or other devices) may + have removed or changed the self contact, the timing cannot be determined. + + \sa dataChanged() */ /*! Returns the manager name for this QContactManagerEngine */ @@ -201,9 +199,9 @@ } /*! - * Returns the parameters with which this engine was constructed. Note that - * the engine may have discarded unused or invalid parameters at the time of - * construction, and these will not be returned. + Returns the parameters with which this engine was constructed. Note that + the engine may have discarded unused or invalid parameters at the time of + construction, and these will not be returned. */ QMap QContactManagerEngine::managerParameters() const { @@ -211,8 +209,8 @@ } /*! - * Returns the unique URI of this manager, which is built from the manager name and the parameters - * used to construct it. + Returns the unique URI of this manager, which is built from the manager name and the parameters + used to construct it. */ QString QContactManagerEngine::managerUri() const { @@ -220,9 +218,13 @@ } /*! - * Return the list of contact ids present in this engine, sorted according to the given \a sortOrders. - * - * Any errors encountered should be stored to \a error. + \internal + + Return the list of contact ids present in this engine, sorted according to the given \a sortOrders. + + Any errors encountered should be stored to \a error. + + This function is obsolete; use contactIds() instead. */ QList QContactManagerEngine::contacts(const QList& sortOrders, QContactManager::Error& error) const { @@ -232,10 +234,13 @@ } /*! - * Returns a list of the ids of contacts that match the supplied \a filter, sorted according to the given \a sortOrders. - * Any error that occurs will be stored in \a error. - * - * The default implementation will retrieve all contacts and test them with testFilter. + \internal + Returns a list of the ids of contacts that match the supplied \a filter, sorted according to the given \a sortOrders. + Any error that occurs will be stored in \a error. + + The default implementation will retrieve all contacts and test them with testFilter. + + This function is obsolete; use contactIds() instead. */ QList QContactManagerEngine::contacts(const QContactFilter& filter, const QList& sortOrders, QContactManager::Error& error) const { @@ -243,7 +248,7 @@ QList ret; /* Retrieve each contact.. . . */ - const QList& all = contacts(sortOrders, error); + const QList& all = contactIds(sortOrders, error); if (error != QContactManager::NoError) return ret; @@ -251,7 +256,7 @@ return all; for (int j = 0; j < all.count(); j++) { - if (testFilter(filter, contact(all.at(j), error))) + if (testFilter(filter, contact(all.at(j), QStringList(), error))) ret << all.at(j); } @@ -259,9 +264,13 @@ } /*! - * Returns the contact in the database identified by \a contactId - * - * Any errors encountered should be stored to \a error. + \internal + + Returns the contact in the database identified by \a contactId + + Any errors encountered should be stored to \a error. + + This function is obsolete; use the contact() function which takes an optional set of details to restrict the returned contact to, instead. */ QContact QContactManagerEngine::contact(const QContactLocalId& contactId, QContactManager::Error& error) const { @@ -271,15 +280,125 @@ } /*! - * Sets the id of the "self" contact to the given \a contactId. - * Returns true if the "self" contact id was set successfully. - * If the given \a contactId does not identify a contact - * stored in this manager, the \a error will be set to - * \c QContactManager::DoesNotExistError and the function will - * return false; if the backend does not support the - * concept of a "self" contact, the \a error will be set to - * \c QContactManager::NotSupportedError and the function will - * return false. + Returns a list of contact ids sorted according to the given list of \a sortOrders. + Depending on the backend, this operation may involve retrieving all the contacts. + Any error which occurs will be saved in \a error. + */ +QList QContactManagerEngine::contactIds(const QList& sortOrders, QContactManager::Error& error) const +{ + Q_UNUSED(sortOrders); + error = QContactManager::NotSupportedError; + return QList(); +} + +/*! + Returns a list of contact ids that match the given \a filter, sorted according to the given list of \a sortOrders. + Depending on the backend, this filtering operation may involve retrieving all the contacts. + Any error which occurs will be saved in \a error. + */ +QList QContactManagerEngine::contactIds(const QContactFilter& filter, const QList& sortOrders, QContactManager::Error& error) const +{ + /* Slow way */ + QList ret; + + /* If the filter matches all ids, then return the list of all ids */ + if (filter.type() == QContactFilter::DefaultFilter) { + const QList& allIds = contactIds(sortOrders, error); + if (error != QContactManager::NoError) + return ret; + return allIds; + } + + /* Otherwise, retrieve all contacts, test and return matching */ + const QList& all = contacts(sortOrders, QStringList(), error); + + if (error != QContactManager::NoError) + return ret; + + for (int j = 0; j < all.count(); j++) { + if (testFilter(filter, all.at(j))) + ret << all.at(j).localId(); + } + + return ret; +} + +/*! + Returns the list of contacts stored in the manager sorted according to the given list of \a sortOrders. + If the given list of detail definition names \a definitionRestrictions is empty, each contact returned will include + all of the details which are stored in it, otherwise only those details which are of a definition whose name is included + in the \a definitionRestrictions list will be included. + Any error which occurs will be saved in \a error. + */ +QList QContactManagerEngine::contacts(const QList& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const +{ + Q_UNUSED(sortOrders); + Q_UNUSED(definitionRestrictions); + error = QContactManager::NotSupportedError; + return QList(); +} + +/*! + Returns a list of contacs that match the given \a filter, sorted according to the given list of \a sortOrders. + Depending on the backend, this filtering operation may involve retrieving all the contacts. + If the given list of detail definition names \a definitionRestrictions is empty, each contact returned will include + all of the details which are stored in it, otherwise only those details which are of a definition whose name is included + in the \a definitionRestrictions list will be included. + Any error which occurs will be saved in \a error. + */ +QList QContactManagerEngine::contacts(const QContactFilter& filter, const QList& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const +{ + /* Slow way */ + QList ret; + + /* Retrieve each contact.. . . */ + const QList& all = contacts(sortOrders, definitionRestrictions, error); + if (error != QContactManager::NoError) + return ret; + + if (filter.type() == QContactFilter::DefaultFilter) + return all; + + for (int j = 0; j < all.count(); j++) { + if (testFilter(filter, all.at(j))) { + ret << all.at(j); + } + } + + return ret; +} + +/*! + Returns the contact in the database identified by \a contactId. + If the list of detail definition names \a definitionRestrictions given is non-empty, + the contact returned will contain at least those details which are of a definition whose name is + contained in the \a definitionRestrictions list. + Note that the returned contact may also contain other details, but this function guarantees that + all details whose definition name is included in the given list of definition names \a definitionRestrictions + will be included in the returned contact. + + The default implementation returns the entire contact. + + Any errors encountered should be stored to \a error. + */ +QContact QContactManagerEngine::contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions, QContactManager::Error& error) const +{ + Q_UNUSED(contactId); + Q_UNUSED(definitionRestrictions); + error = QContactManager::NotSupportedError; + return QContact(); +} + +/*! + Sets the id of the "self" contact to the given \a contactId. + Returns true if the "self" contact id was set successfully. + If the given \a contactId does not identify a contact + stored in this manager, the \a error will be set to + \c QContactManager::DoesNotExistError and the function will + return false; if the backend does not support the + concept of a "self" contact, the \a error will be set to + \c QContactManager::NotSupportedError and the function will + return false. */ bool QContactManagerEngine::setSelfContactId(const QContactLocalId& contactId, QContactManager::Error& error) { @@ -289,11 +408,11 @@ } /*! - * Returns the id of the "self" contact which has previously been set. - * If no "self" contact has been set, or if the self contact was removed - * from the manager after being set, or if the backend does not support - * the concept of a "self" contact, an invalid id will be returned - * and the \a error will be set to \c QContactManager::DoesNotExistError. + Returns the id of the "self" contact which has previously been set. + If no "self" contact has been set, or if the self contact was removed + from the manager after being set, or if the backend does not support + the concept of a "self" contact, an invalid id will be returned + and the \a error will be set to \c QContactManager::DoesNotExistError. */ QContactLocalId QContactManagerEngine::selfContactId(QContactManager::Error& error) const { @@ -302,11 +421,11 @@ } /*! - * Returns a list of relationships of the given \a relationshipType in which the contact identified by the given \a participantId participates in the given \a role. - * If \a participantId is the default-constructed id, \a role is ignored and all relationships of the given \a relationshipType are returned. - * If \a relationshipType is empty, relationships of any type are returned. - * If no relationships of the given \a relationshipType in which the contact identified by the given \a participantId is involved in the given \a role exists, - * \a error is set to QContactManager::DoesNotExistError. + Returns a list of relationships of the given \a relationshipType in which the contact identified by the given \a participantId participates in the given \a role. + If \a participantId is the default-constructed id, \a role is ignored and all relationships of the given \a relationshipType are returned. + If \a relationshipType is empty, relationships of any type are returned. + If no relationships of the given \a relationshipType in which the contact identified by the given \a participantId is involved in the given \a role exists, + \a error is set to QContactManager::DoesNotExistError. */ QList QContactManagerEngine::relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationshipFilter::Role role, QContactManager::Error& error) const { @@ -318,20 +437,20 @@ } /*! - * Saves the given \a relationship in the database. If the relationship already exists in the database, this function will - * return \c false and the \a error will be set to \c QContactManager::AlreadyExistsError. - * If the relationship is saved successfully, this function will return \c true and \a error will be set - * to \c QContactManager::NoError. Note that relationships cannot be updated directly using this function; in order - * to update a relationship, you must remove the old relationship, make the required modifications, and then save it. - * - * The given relationship is invalid if it is circular (one of the destination contacts is also the source contact), or - * if it references a non-existent local contact (either source or destination). If the given \a relationship is invalid, - * the function will return \c false and the \a error will be set to \c QContactManager::InvalidRelationshipError. - * If the given \a relationship could not be saved in the database (due to backend limitations) - * the function will return \c false and \a error will be set to \c QContactManager::NotSupportedError. - * - * If any destination contact manager URI is not set in the \a relationship, these will be - * automatically set to the URI of this manager, before the relationship is saved. + Saves the given \a relationship in the database. If the relationship already exists in the database, this function will + return \c false and the \a error will be set to \c QContactManager::AlreadyExistsError. + If the relationship is saved successfully, this function will return \c true and \a error will be set + to \c QContactManager::NoError. Note that relationships cannot be updated directly using this function; in order + to update a relationship, you must remove the old relationship, make the required modifications, and then save it. + + The given relationship is invalid if it is circular (one of the destination contacts is also the source contact), or + if it references a non-existent local contact (either source or destination). If the given \a relationship is invalid, + the function will return \c false and the \a error will be set to \c QContactManager::InvalidRelationshipError. + If the given \a relationship could not be saved in the database (due to backend limitations) + the function will return \c false and \a error will be set to \c QContactManager::NotSupportedError. + + If any destination contact manager URI is not set in the \a relationship, these will be + automatically set to the URI of this manager, before the relationship is saved. */ bool QContactManagerEngine::saveRelationship(QContactRelationship* relationship, QContactManager::Error& error) { @@ -341,7 +460,7 @@ } /*! - * Saves the given \a relationships in the database and returns a list of error codes. Any error which occurs will be saved in \a error. + Saves the given \a relationships in the database and returns a list of error codes. Any error which occurs will be saved in \a error. */ QList QContactManagerEngine::saveRelationships(QList* relationships, QContactManager::Error& error) { @@ -351,12 +470,12 @@ } /*! - * Removes the given \a relationship from the manager. If the relationship exists in the manager, the relationship - * will be removed, the \a error will be set to \c QContactManager::NoError and this function will return true. If no such - * relationship exists in the manager, the \a error will be set to \c QContactManager::DoesNotExistError and this function - * will return false. - * - * The priority of the relationship is ignored when determining existence of the relationship. + Removes the given \a relationship from the manager. If the relationship exists in the manager, the relationship + will be removed, the \a error will be set to \c QContactManager::NoError and this function will return true. If no such + relationship exists in the manager, the \a error will be set to \c QContactManager::DoesNotExistError and this function + will return false. + + The priority of the relationship is ignored when determining existence of the relationship. */ bool QContactManagerEngine::removeRelationship(const QContactRelationship& relationship, QContactManager::Error& error) { @@ -366,7 +485,7 @@ } /*! - * Removes the given \a relationships from the database and returns a list of error codes. Any error which occurs will be saved in \a error. + Removes the given \a relationships from the database and returns a list of error codes. Any error which occurs will be saved in \a error. */ QList QContactManagerEngine::removeRelationships(const QList& relationships, QContactManager::Error& error) { @@ -376,12 +495,23 @@ } /*! - * Synthesizes the display label of the given \a contact in a platform specific manner. - * Any error that occurs will be stored in \a error. - * Returns the synthesized display label. + \internal + Synthesizes the display label of the given \a contact in a platform specific manner. + Any error that occurs will be stored in \a error. + Returns the synthesized display label. */ QString QContactManagerEngine::synthesizeDisplayLabel(const QContact& contact, QContactManager::Error& error) const { + return synthesizedDisplayLabel(contact, error); +} + +/*! + Synthesizes the display label of the given \a contact in a platform specific manner. + Any error that occurs will be stored in \a error. + Returns the synthesized display label. + */ +QString QContactManagerEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const +{ // synthesize the display name from the name of the contact, or, failing that, the organisation of the contact. error = QContactManager::NoError; QList allNames = contact.details(QContactName::DefinitionName); @@ -402,22 +532,22 @@ result += name.value(QContactName::FieldPrefix); } - if (!name.value(QContactName::FieldFirst).trimmed().isEmpty()) { + if (!name.value(QContactName::FieldFirstName).trimmed().isEmpty()) { if (!result.isEmpty()) result += space; - result += name.value(QContactName::FieldFirst); + result += name.value(QContactName::FieldFirstName); } - if (!name.value(QContactName::FieldMiddle).trimmed().isEmpty()) { + if (!name.value(QContactName::FieldMiddleName).trimmed().isEmpty()) { if (!result.isEmpty()) result += space; - result += name.value(QContactName::FieldMiddle); + result += name.value(QContactName::FieldMiddleName); } - if (!name.value(QContactName::FieldLast).trimmed().isEmpty()) { + if (!name.value(QContactName::FieldLastName).trimmed().isEmpty()) { if (!result.isEmpty()) result += space; - result += name.value(QContactName::FieldLast); + result += name.value(QContactName::FieldLastName); } if (!name.value(QContactName::FieldSuffix).trimmed().isEmpty()) { @@ -445,20 +575,21 @@ } /*! - * Returns a copy of the given contact \a contact with its display label set to \a displayLabel. - * This function does not touch the database in any way, and is purely a convenience to allow engine implementations to set the display label. + Returns a copy of the given contact \a contact with its display label set to \a displayLabel. + This function does not touch the database in any way, and is purely a convenience to allow engine implementations to set the display label. */ QContact QContactManagerEngine::setContactDisplayLabel(const QString& displayLabel, const QContact& contact) const { QContact retn = contact; QContactDisplayLabel dl; dl.setValue(QContactDisplayLabel::FieldLabel, displayLabel); + setDetailAccessConstraints(&dl, QContactDetail::Irremovable); retn.d->m_details.replace(0, dl); return retn; } /*! - * Returns true if the given \a feature is supported by this engine for contacts of the given \a contactType + Returns true if the given \a feature is supported by this engine for contacts of the given \a contactType */ bool QContactManagerEngine::hasFeature(QContactManager::ManagerFeature feature, const QString& contactType) const { @@ -468,9 +599,10 @@ } /*! - * Returns a whether the supplied \a filter can be implemented - * natively by this engine. If not, the base class implementation - * will emulate the functionality. + \internal + Returns a whether the supplied \a filter can be implemented + natively by this engine. If not, the base class implementation + will emulate the functionality. */ bool QContactManagerEngine::filterSupported(const QContactFilter& filter) const { @@ -479,7 +611,18 @@ } /*! - * Returns the list of data types supported by this engine. + Returns a whether the supplied \a filter can be implemented + natively by this engine. If not, the base class implementation + will emulate the functionality. + */ +bool QContactManagerEngine::isFilterSupported(const QContactFilter& filter) const +{ + Q_UNUSED(filter); + return false; +} + +/*! + Returns the list of data types supported by this engine. */ QList QContactManagerEngine::supportedDataTypes() const { @@ -487,7 +630,7 @@ } /*! - * Returns the list of relationship types supported by this engine for contacts whose type is the given \a contactType. + Returns the list of relationship types supported by this engine for contacts whose type is the given \a contactType. */ QStringList QContactManagerEngine::supportedRelationshipTypes(const QString& contactType) const { @@ -496,10 +639,10 @@ } /*! - * Returns the list of contact types which are supported by this engine. - * This is a convenience function, equivalent to retrieving the allowable values - * for the \c QContactType::FieldType field of the QContactType definition - * which is valid in this engine. + Returns the list of contact types which are supported by this engine. + This is a convenience function, equivalent to retrieving the allowable values + for the \c QContactType::FieldType field of the QContactType definition + which is valid in this engine. */ QStringList QContactManagerEngine::supportedContactTypes() const { @@ -511,21 +654,31 @@ return retn; } -/*! - * Returns the version number of the QTContacts API +/*! + \internal + Returns the version number of the QtContacts API */ -int QContactManagerEngine::version() +int QContactManagerEngine::version() { return QTCONTACTS_VERSION; } -/*! - * Returns the engine backend implementation version number +/*! + \internal + Returns the engine backend implementation version number */ -int QContactManagerEngine::implementationVersion() const -{ +int QContactManagerEngine::implementationVersion() const +{ return 0; } + +/*! + Returns the engine backend implementation version number + */ +int QContactManagerEngine::managerVersion() const +{ + return 0; +} /*! Returns the base schema definitions */ @@ -539,8 +692,8 @@ QMap retn; // local variables for reuse - QMap fields; - QContactDetailDefinitionField f; + QMap fields; + QContactDetailFieldDefinition f; QContactDetailDefinition d; QVariantList contexts; contexts << QString(QLatin1String(QContactDetail::ContextHome)) << QString(QLatin1String(QContactDetail::ContextWork)) << QString(QLatin1String(QContactDetail::ContextOther)); @@ -557,7 +710,6 @@ fields.insert(QContactDetail::FieldContext, f); d.setFields(fields); d.setUnique(true); - d.setAccessConstraint(QContactDetailDefinition::CreateOnly); retn.insert(d.name(), d); // timestamp @@ -572,7 +724,6 @@ fields.insert(QContactDetail::FieldContext, f); d.setFields(fields); d.setUnique(true); - d.setAccessConstraint(QContactDetailDefinition::ReadOnly); retn.insert(d.name(), d); // type @@ -585,7 +736,6 @@ fields.insert(QContactType::FieldType, f); // note: NO CONTEXT!! d.setFields(fields); d.setUnique(true); - d.setAccessConstraint(QContactDetailDefinition::CreateOnly); retn.insert(d.name(), d); // guid @@ -599,7 +749,6 @@ fields.insert(QContactDetail::FieldContext, f); d.setFields(fields); d.setUnique(false); - d.setAccessConstraint(QContactDetailDefinition::CreateOnly); retn.insert(d.name(), d); // display label @@ -610,7 +759,6 @@ fields.insert(QContactDisplayLabel::FieldLabel, f); d.setFields(fields); d.setUnique(true); - d.setAccessConstraint(QContactDetailDefinition::ReadOnly); retn.insert(d.name(), d); // email address @@ -624,7 +772,6 @@ fields.insert(QContactDetail::FieldContext, f); d.setFields(fields); d.setUnique(false); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); // organisation @@ -642,7 +789,6 @@ fields.insert(QContactDetail::FieldContext, f); d.setFields(fields); d.setUnique(false); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); // phone number @@ -672,7 +818,6 @@ fields.insert(QContactDetail::FieldContext, f); d.setFields(fields); d.setUnique(false); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); // anniversary @@ -701,7 +846,6 @@ fields.insert(QContactDetail::FieldContext, f); d.setFields(fields); d.setUnique(false); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); // birthday @@ -715,7 +859,6 @@ fields.insert(QContactDetail::FieldContext, f); d.setFields(fields); d.setUnique(true); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); // nickname @@ -729,7 +872,6 @@ fields.insert(QContactDetail::FieldContext, f); d.setFields(fields); d.setUnique(false); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); // note @@ -743,7 +885,6 @@ fields.insert(QContactDetail::FieldContext, f); d.setFields(fields); d.setUnique(false); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); // url @@ -763,7 +904,6 @@ fields.insert(QContactDetail::FieldContext, f); d.setFields(fields); d.setUnique(false); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); // gender @@ -777,7 +917,6 @@ fields.insert(QContactDetail::FieldContext, f); d.setFields(fields); d.setUnique(false); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); // online account @@ -786,8 +925,11 @@ f.setAllowableValues(QVariantList()); f.setDataType(QVariant::String); fields.insert(QContactOnlineAccount::FieldAccountUri, f); + f.setDataType(QVariant::StringList); + fields.insert(QContactOnlineAccount::FieldCapabilities, f); + f.setDataType(QVariant::String); + fields.insert(QContactOnlineAccount::FieldAccountUri, f); fields.insert(QContactOnlineAccount::FieldServiceProvider, f); - f.setAccessConstraint(QContactDetailDefinitionField::ReadOnly); fields.insert(QContactOnlineAccount::FieldNickname, f); fields.insert(QContactOnlineAccount::FieldStatusMessage, f); QVariantList presenceValues; @@ -801,14 +943,12 @@ f.setAllowableValues(presenceValues); fields.insert(QContactOnlineAccount::FieldPresence, f); f.setDataType(QVariant::StringList); - f.setAccessConstraint(QContactDetailDefinitionField::NoConstraint); f.setAllowableValues(contexts); fields.insert(QContactDetail::FieldContext, f); f.setAllowableValues(QVariantList()); // allow any subtypes! fields.insert(QContactOnlineAccount::FieldSubTypes, f); d.setFields(fields); d.setUnique(false); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); // avatar @@ -834,7 +974,6 @@ fields.insert(QContactDetail::FieldContext, f); d.setFields(fields); d.setUnique(false); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); // geolocation @@ -858,7 +997,6 @@ fields.insert(QContactDetail::FieldContext, f); d.setFields(fields); d.setUnique(false); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); // street address @@ -885,7 +1023,6 @@ fields.insert(QContactDetail::FieldContext, f); d.setFields(fields); d.setUnique(false); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); // name @@ -894,9 +1031,9 @@ f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); fields.insert(QContactName::FieldPrefix, f); - fields.insert(QContactName::FieldFirst, f); - fields.insert(QContactName::FieldMiddle, f); - fields.insert(QContactName::FieldLast, f); + fields.insert(QContactName::FieldFirstName, f); + fields.insert(QContactName::FieldMiddleName, f); + fields.insert(QContactName::FieldLastName, f); fields.insert(QContactName::FieldSuffix, f); fields.insert(QContactName::FieldCustomLabel, f); f.setDataType(QVariant::StringList); @@ -904,7 +1041,6 @@ fields.insert(QContactDetail::FieldContext, f); d.setFields(fields); d.setUnique(false); - d.setAccessConstraint(QContactDetailDefinition::NoConstraint); retn.insert(d.name(), d); // in the default schema, we have two contact types: TypeContact, TypeGroup. @@ -918,47 +1054,47 @@ /*! - * Adds the given \a contact to the database if \a contact has a - * default-constructed id, or an id with the manager URI set to the URI of - * this manager and a local id of zero. - * - * If the manager URI of the id of the \a contact is neither empty nor equal to the URI of - * this manager, or local id of the \a contact is non-zero but does not exist in the - * manager, the operation will fail and \a error will be set to - * \c QContactManager::DoesNotExistError. - * - * Alternatively, the function will update the existing contact in the database if \a contact - * has a non-zero id and currently exists in the database. - * - * If the \a contact contains one or more details whose definitions have - * not yet been saved with the manager, the operation will fail and \a error will be - * set to \c QContactManager::UnsupportedError. - * - * If the \a contact has had its relationships reordered, the manager - * will check to make sure that every relationship that the contact is currently - * involved in is included in the reordered list, and that no relationships which - * either do not involve the contact, or have not been saved in the manager are - * included in the list. If these conditions are not met, the function will - * return \c false and \a error will be set to \c QContactManager::InvalidRelationshipError. - * - * The engine must automatically synthesize the display label of the contact when it is saved, - * by either using the built in \l synthesizeDisplayLabel() function or overriding it, and - * then calling \l setContactDisplayLabel(). - * - * Returns false on failure, or true on - * success. On successful save of a contact with an id of zero, its - * id will be set to a new, valid id with the manager URI set to the URI of - * this manager, and the local id set to a new, valid local id. - * - * This function is called by the contacts framework in both the - * single contact save and batch contact save, if the saveContacts - * function is not overridden. - * - * The backend must emit the appropriate signals to inform clients of changes - * to the database resulting from this operation. - * - * Any errors encountered during this operation should be stored to - * \a error. + Adds the given \a contact to the database if \a contact has a + default-constructed id, or an id with the manager URI set to the URI of + this manager and a local id of zero. + + If the manager URI of the id of the \a contact is neither empty nor equal to the URI of + this manager, or local id of the \a contact is non-zero but does not exist in the + manager, the operation will fail and \a error will be set to + \c QContactManager::DoesNotExistError. + + Alternatively, the function will update the existing contact in the database if \a contact + has a non-zero id and currently exists in the database. + + If the \a contact contains one or more details whose definitions have + not yet been saved with the manager, the operation will fail and \a error will be + set to \c QContactManager::UnsupportedError. + + If the \a contact has had its relationships reordered, the manager + will check to make sure that every relationship that the contact is currently + involved in is included in the reordered list, and that no relationships which + either do not involve the contact, or have not been saved in the manager are + included in the list. If these conditions are not met, the function will + return \c false and \a error will be set to \c QContactManager::InvalidRelationshipError. + + The engine must automatically synthesize the display label of the contact when it is saved, + by either using the built in \l synthesizedDisplayLabel() function or overriding it, and + then calling \l setContactDisplayLabel(). + + Returns false on failure, or true on + success. On successful save of a contact with an id of zero, its + id will be set to a new, valid id with the manager URI set to the URI of + this manager, and the local id set to a new, valid local id. + + This function is called by the contacts framework in both the + single contact save and batch contact save, if the saveContacts + function is not overridden. + + The backend must emit the appropriate signals to inform clients of changes + to the database resulting from this operation. + + Any errors encountered during this operation should be stored to + \a error. */ bool QContactManagerEngine::saveContact(QContact* contact, QContactManager::Error& error) { @@ -968,20 +1104,20 @@ } /*! - * Checks that the given contact \a contact does not have details which - * don't conform to a valid definition, violate uniqueness constraints, - * or contain values for nonexistent fields, and that the values contained are - * of the correct type for each field, and are allowable values for that field. - * - * Note that this function is unable to ensure that the access constraints - * (such as CreateOnly and ReadOnly) are observed; backend specific code - * must be written if you wish to enforce these constraints. - * - * Returns true if the \a contact is valid according to the definitions for - * its details, otherwise returns false. - * - * Any errors encountered during this operation should be stored to - * \a error. + Checks that the given contact \a contact does not have details which + don't conform to a valid definition, violate uniqueness constraints, + or contain values for nonexistent fields, and that the values contained are + of the correct type for each field, and are allowable values for that field. + + Note that this function is unable to ensure that the access constraints + (such as CreateOnly and ReadOnly) are observed; backend specific code + must be written if you wish to enforce these constraints. + + Returns true if the \a contact is valid according to the definitions for + its details, otherwise returns false. + + Any errors encountered during this operation should be stored to + \a error. */ bool QContactManagerEngine::validateContact(const QContact& contact, QContactManager::Error& error) const { @@ -990,7 +1126,7 @@ // check that each detail conforms to its definition as supported by this manager. for (int i=0; i < contact.details().count(); i++) { const QContactDetail& d = contact.details().at(i); - QVariantMap values = d.values(); + QVariantMap values = d.variantValues(); QContactDetailDefinition def = detailDefinition(d.definitionName(), contact.type(), error); // check that the definition is supported if (error != QContactManager::NoError) { @@ -1016,18 +1152,13 @@ return false; // value for nonexistent field. } - QContactDetailDefinitionField field = def.fields().value(key); + QContactDetailFieldDefinition field = def.fields().value(key); // check that the type of each value corresponds to the allowable field type - if (field.dataType() != values.value(key).type()) { + if (static_cast(field.dataType()) != values.value(key).userType()) { error = QContactManager::InvalidDetailError; return false; // type doesn't match. } - // check that the field is not read only - if (field.accessConstraint() == QContactDetailDefinitionField::ReadOnly) { - error = QContactManager::InvalidDetailError; - return false; // attempting to write to a read-only field of a detail. - } // check that the value is allowable // if the allowable values is an empty list, any are allowed. if (!field.allowableValues().isEmpty()) { @@ -1054,19 +1185,16 @@ /*! - * Checks that the given detail definition \a definition seems valid, - * with a correct id, defined fields, and any specified value types - * are supported by this engine. This function is called before - * trying to save a definition. - * - * Note that a ReadOnly definition will fail validation, since - * they are intended to be provided by an engine directly. - * - * Returns true if the \a definition seems valid, otherwise returns - * false. - * - * Any errors encountered during this operation should be stored to - * \a error. + Checks that the given detail definition \a definition seems valid, + with a correct id, defined fields, and any specified value types + are supported by this engine. This function is called before + trying to save a definition. + + Returns true if the \a definition seems valid, otherwise returns + false. + + Any errors encountered during this operation should be stored to + \a error. */ bool QContactManagerEngine::validateDefinition(const QContactDetailDefinition& definition, QContactManager::Error& error) const { @@ -1080,14 +1208,9 @@ return false; } - if (definition.accessConstraint() == QContactDetailDefinition::ReadOnly) { - error = QContactManager::BadArgumentError; - return false; - } - // Check each field now QList types = supportedDataTypes(); - QMapIterator it(definition.fields()); + QMapIterator it(definition.fields()); while(it.hasNext()) { it.next(); if (it.key().isEmpty()) { @@ -1113,16 +1236,16 @@ } /*! - * Remove the contact identified by \a contactId from the database, - * and removes the contact from any relationships in which it was involved. - * Returns true if the contact was removed successfully, otherwise - * returns false. - * - * The backend must emit the appropriate signals to inform clients of changes - * to the database resulting from this operation. - * - * Any errors encountered during this operation should be stored to - * \a error. + Remove the contact identified by \a contactId from the database, + and removes the contact from any relationships in which it was involved. + Returns true if the contact was removed successfully, otherwise + returns false. + + The backend must emit the appropriate signals to inform clients of changes + to the database resulting from this operation. + + Any errors encountered during this operation should be stored to + \a error. */ bool QContactManagerEngine::removeContact(const QContactLocalId& contactId, QContactManager::Error& error) { @@ -1132,10 +1255,10 @@ } /*! - * Returns the registered detail definitions which are valid for contacts whose type is of the given \a contactType in this engine. - * - * Any errors encountered during this operation should be stored to - * \a error. + Returns the registered detail definitions which are valid for contacts whose type is of the given \a contactType in this engine. + + Any errors encountered during this operation should be stored to + \a error. */ QMap QContactManagerEngine::detailDefinitions(const QString& contactType, QContactManager::Error& error) const { @@ -1145,12 +1268,12 @@ } /*! - * Returns the definition identified by the given \a definitionName that - * is valid for contacts whose type is of the given \a contactType in this store, or a default-constructed QContactDetailDefinition - * if no such definition exists - * - * Any errors encountered during this operation should be stored to - * \a error. + Returns the definition identified by the given \a definitionName that + is valid for contacts whose type is of the given \a contactType in this store, or a default-constructed QContactDetailDefinition + if no such definition exists + + Any errors encountered during this operation should be stored to + \a error. */ QContactDetailDefinition QContactManagerEngine::detailDefinition(const QString& definitionName, const QString& contactType, QContactManager::Error& error) const { @@ -1167,15 +1290,15 @@ } /*! - * Persists the given definition \a def in the database, which is valid for contacts whose type is the given \a contactType. - * - * Returns true if the definition was saved successfully, and otherwise returns false. - * - * The backend must emit the appropriate signals to inform clients of changes - * to the database resulting from this operation. - * - * Any errors encountered during this operation should be stored to - * \a error. + Persists the given definition \a def in the database, which is valid for contacts whose type is the given \a contactType. + + Returns true if the definition was saved successfully, and otherwise returns false. + + The backend must emit the appropriate signals to inform clients of changes + to the database resulting from this operation. + + Any errors encountered during this operation should be stored to + \a error. */ bool QContactManagerEngine::saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactManager::Error& error) { @@ -1186,15 +1309,15 @@ } /*! - * Removes the definition identified by the given \a definitionName from the database, where it was valid for contacts whose type was the given \a contactType. - * - * Returns true if the definition was removed successfully, otherwise returns false. - * - * The backend must emit the appropriate signals to inform clients of changes - * to the database resulting from this operation. - * - * Any errors encountered during this operation should be stored to - * \a error. + Removes the definition identified by the given \a definitionName from the database, where it was valid for contacts whose type was the given \a contactType. + + Returns true if the definition was removed successfully, otherwise returns false. + + The backend must emit the appropriate signals to inform clients of changes + to the database resulting from this operation. + + Any errors encountered during this operation should be stored to + \a error. */ bool QContactManagerEngine::removeDetailDefinition(const QString& definitionName, const QString& contactType, QContactManager::Error& error) { @@ -1205,24 +1328,45 @@ } /*! - * Adds the list of contacts given by \a contacts to the database. - * Returns a list of the error codes corresponding to the contacts in - * the \a contacts. The \l QContactManager::error() function will - * only return \c QContactManager::NoError if all contacts were saved - * successfully. - * - * For each newly saved contact that was successful, the uid of the contact - * in the list will be updated with the new value. If a failure occurs - * when saving a new contact, the id will be cleared. If a failure occurs - * when updating a contact that already exists, then TODO. - * - * The backend must emit the appropriate signals to inform clients of changes - * to the database resulting from this operation. - * - * Any errors encountered during this operation should be stored to - * \a error. - * - * \sa QContactManager::saveContact() + Sets the access constraints of \a detail to the supplied \a constraints. + + This function is provided to allow engine implementations to report the + access constraints of retrieved details, without generally allowing the + access constraints to be modified after retrieval. + + Application code should not call this function, since validation of the + detail will happen in the engine in any case. + */ +void QContactManagerEngine::setDetailAccessConstraints(QContactDetail *detail, QContactDetail::AccessConstraints constraints) const +{ + if (detail) { + QContactDetailPrivate::setAccessConstraints(detail, constraints); + } +} + +/*! + \internal + + Adds the list of contacts given by \a contacts to the database. + Returns a list of the error codes corresponding to the contacts in + the \a contacts. The \l QContactManager::error() function will + only return \c QContactManager::NoError if all contacts were saved + successfully. + + For each newly saved contact that was successful, the uid of the contact + in the list will be updated with the new value. If a failure occurs + when saving a new contact, the id will be cleared. If a failure occurs + when updating a contact that already exists, then TODO. + + The backend must emit the appropriate signals to inform clients of changes + to the database resulting from this operation. + + Any errors encountered during this operation should be stored to + \a error. + + This function was deprecated in week 1 and will be removed after the transition period has elapsed. + + \sa QContactManager::saveContact() */ QList QContactManagerEngine::saveContacts(QList* contacts, QContactManager::Error& error) { @@ -1249,26 +1393,76 @@ } /*! - * Remove the list of contacts identified in \a contactIds. - * Returns a list of the error codes corresponding to the contact ids in - * the \a contactIds. The \l QContactManager::error() function will - * only return \c QContactManager::NoError if all contacts were removed - * successfully. - * - * For each contact that was removed succesfully, the corresponding - * id in the list will be retained but set to zero. The id of contacts - * that were not successfully removed will be left alone. - * - * Any contact that was removed successfully will have been removed from - * any relationships in which it was involved. - * - * The backend must emit the appropriate signals to inform clients of changes - * to the database resulting from this operation. - * - * Any errors encountered during this operation should be stored to - * \a error. - * - * \sa QContactManager::removeContact() + Adds the list of contacts given by \a contacts list to the database. + Returns true if the contacts were saved successfully, otherwise false. + + The manager might populate \a errorMap (the map of indices of the \a contacts list to + the error which occurred when saving the contact at that index) for + every index for which the contact could not be saved, if it is able. + The \l QContactManager::error() function will only return \c QContactManager::NoError + if all contacts were saved successfully. + + For each newly saved contact that was successful, the id of the contact + in the \a contacts list will be updated with the new value. If a failure occurs + when saving a new contact, the id will be cleared. + + Any errors encountered during this operation should be stored to + \a error. + + \sa QContactManager::saveContact() + */ +bool QContactManagerEngine::saveContacts(QList* contacts, QMap* errorMap, QContactManager::Error& error) +{ + if(errorMap) { + errorMap->clear(); + } + + if (!contacts) { + error = QContactManager::BadArgumentError; + return false; + } + + QContactManager::Error functionError = QContactManager::NoError; + for (int i = 0; i < contacts->count(); i++) { + QContact current = contacts->at(i); + if (!saveContact(¤t, error)) { + functionError = error; + if (errorMap) { + errorMap->insert(i, functionError); + } + } else { + (*contacts)[i] = current; + } + } + + error = functionError; + return (functionError == QContactManager::NoError); +} + +/*! + \internal + Remove the list of contacts identified in \a contactIds. + Returns a list of the error codes corresponding to the contact ids in + the \a contactIds. The \l QContactManager::error() function will + only return \c QContactManager::NoError if all contacts were removed + successfully. + + For each contact that was removed succesfully, the corresponding + id in the list will be retained but set to zero. The id of contacts + that were not successfully removed will be left alone. + + Any contact that was removed successfully will have been removed from + any relationships in which it was involved. + + The backend must emit the appropriate signals to inform clients of changes + to the database resulting from this operation. + + Any errors encountered during this operation should be stored to + \a error. + + This function was deprecated in week 1 and will be removed after the transition period has elapsed. + + \sa QContactManager::removeContact() */ QList QContactManagerEngine::removeContacts(QList* contactIds, QContactManager::Error& error) { @@ -1296,17 +1490,69 @@ } /*! - * Compares \a first against \a second. If the types are - * strings (QVariant::String), the \a sensitivity argument controls - * case sensitivity when comparing. - * - * Returns: - * <0 if \a first is less than \a second - * 0 if \a first is equal to \a second - * >0 if \a first is greater than \a second. - * - * The results are undefined if the variants are different types, or - * cannot be compared. + Remove every contact whose id is contained in the list of contacts ids + \a contactIds. Returns true if all contacts were removed successfully, + otherwise false. + + The manager might populate \a errorMap (the map of indices of the \a contactIds list to + the error which occurred when saving the contact at that index) for every + index for which the contact could not be removed, if it is able. + The \l QContactManager::error() function will + only return \c QContactManager::NoError if all contacts were removed + successfully. + + For each contact that was removed succesfully, the corresponding + id in the \a contactIds list will be retained but set to zero. The id of contacts + that were not successfully removed will be left alone. + + Any contact that was removed successfully will have the relationships + in which it was involved removed also. + + Any errors encountered during this operation should be stored to + \a error. + + \sa QContactManager::removeContact() + */ +bool QContactManagerEngine::removeContacts(QList* contactIds, QMap* errorMap, QContactManager::Error& error) +{ + if(errorMap) { + errorMap->clear(); + } + + if (!contactIds) { + error = QContactManager::BadArgumentError; + return false; + } + + QContactManager::Error functionError = QContactManager::NoError; + for (int i = 0; i < contactIds->count(); i++) { + QContactLocalId current = contactIds->at(i); + if (!removeContact(current, error)) { + functionError = error; + if (errorMap) { + errorMap->insert(i, functionError); + } + } else { + (*contactIds)[i] = 0; + } + } + + error = functionError; + return (functionError == QContactManager::NoError); +} + +/*! + Compares \a first against \a second. If the types are + strings (QVariant::String), the \a sensitivity argument controls + case sensitivity when comparing. + + Returns: + <0 if \a first is less than \a second + 0 if \a first is equal to \a second + >0 if \a first is greater than \a second. + + The results are undefined if the variants are different types, or + cannot be compared. */ int QContactManagerEngine::compareVariant(const QVariant& first, const QVariant& second, Qt::CaseSensitivity sensitivity) { @@ -1358,9 +1604,9 @@ } /*! - * Returns true if the supplied contact \a contact matches the supplied filter \a filter. - * - * This function will test each condition in the filter, possibly recursing. + Returns true if the supplied contact \a contact matches the supplied filter \a filter. + + This function will test each condition in the filter, possibly recursing. */ bool QContactManagerEngine::testFilter(const QContactFilter &filter, const QContact &contact) { @@ -1406,7 +1652,7 @@ const QContactDetail& detail = details.at(j); /* Check that the field is present and has a non-empty value */ - if (detail.values().contains(cdf.detailFieldName()) && !detail.value(cdf.detailFieldName()).isEmpty()) + if (detail.variantValues().contains(cdf.detailFieldName()) && !detail.value(cdf.detailFieldName()).isEmpty()) return true; } return false; @@ -1440,7 +1686,7 @@ } else { /* Nope, testing the values as a variant */ /* Value equality test */ - for(int j=0; j < details.count(); j++) { + for(int j = 0; j < details.count(); j++) { const QContactDetail& detail = details.at(j); const QVariant& var = detail.variantValue(cdf.detailFieldName()); if (!var.isNull() && compareVariant(var, cdf.value(), cs) == 0) @@ -1470,7 +1716,7 @@ if (!cdf.minValue().isValid() && !cdf.maxValue().isValid()) { for(int j=0; j < details.count(); j++) { const QContactDetail& detail = details.at(j); - if (detail.values().contains(cdf.detailFieldName())) + if (detail.variantValues().contains(cdf.detailFieldName())) return true; } return false; @@ -1549,7 +1795,7 @@ // first, retrieve contact uris QContactId contactUri = contact.id(); - QContactId participant = rf.otherParticipantId(); + QContactId relatedContactId = rf.relatedContactId(); // get the relationships in which this contact is involved. QList allRelationships; @@ -1565,19 +1811,19 @@ // now check to see if we have a match. foreach (const QContactRelationship& rel, allRelationships) { // perform the matching. - if (rf.role() == QContactRelationshipFilter::First) { + if (rf.relatedContactRole() == QContactRelationshipFilter::Second) { // this is the role of the related contact; ie, to match, contact.id() must be the first in the relationship. if ((rf.relationshipType().isEmpty() || rel.relationshipType() == rf.relationshipType()) - && CONTACT_IDS_MATCH(rel.first(), contact.id()) && CONTACT_IDS_MATCH(participant, rel.second())) { + && CONTACT_IDS_MATCH(rel.first(), contact.id()) && CONTACT_IDS_MATCH(relatedContactId, rel.second())) { return true; } - } else if (rf.role() == QContactRelationshipFilter::Second) { + } else if (rf.relatedContactRole() == QContactRelationshipFilter::First) { // this is the role of the related contact; ie, to match, contact.id() must be the second in the relationship. if ((rf.relationshipType().isEmpty() || rel.relationshipType() == rf.relationshipType()) - && CONTACT_IDS_MATCH(rel.second(), contact.id()) && CONTACT_IDS_MATCH(participant, rel.first())) { + && CONTACT_IDS_MATCH(rel.second(), contact.id()) && CONTACT_IDS_MATCH(relatedContactId, rel.first())) { return true; } } else { // QContactRelationshipFilter::Either if ((rf.relationshipType().isEmpty() || rel.relationshipType() == rf.relationshipType()) - && ((CONTACT_IDS_MATCH(participant, rel.first()) && !CONTACT_IDS_MATCH(contactUri, participant)) || (CONTACT_IDS_MATCH(participant, rel.second()) && !CONTACT_IDS_MATCH(contactUri, participant)))) { + && ((CONTACT_IDS_MATCH(relatedContactId, rel.first()) && !CONTACT_IDS_MATCH(contactUri, relatedContactId)) || (CONTACT_IDS_MATCH(relatedContactId, rel.second()) && !CONTACT_IDS_MATCH(contactUri, relatedContactId)))) { return true; } } @@ -1674,13 +1920,13 @@ } /*! - * Given a QContactFilter \a filter retrieved from a QContactAction, - * check that it is valid and cannot cause infinite recursion. - * - * In particular, a filter from a QContactAction cannot contain - * any instances of a QContactActionFilter. - * - * Returns true if \a filter seems ok, or false otherwise. + Given a QContactFilter \a filter retrieved from a QContactAction, + check that it is valid and cannot cause infinite recursion. + + In particular, a filter from a QContactAction cannot contain + any instances of a QContactActionFilter. + + Returns true if \a filter seems ok, or false otherwise. */ bool QContactManagerEngine::validateActionFilter(const QContactFilter& filter) @@ -1702,7 +1948,7 @@ } /*! - * Sets the cached relationships in the given \a contact to \a relationships + Sets the cached relationships in the given \a contact to \a relationships */ void QContactManagerEngine::setContactRelationships(QContact* contact, const QList& relationships) { @@ -1712,9 +1958,9 @@ /*! - * Compares two contacts (\a a and \a b) using the given list of \a sortOrders. Returns a negative number if \a a should appear - * before \a b according to the sort order, a positive number if \a a should appear after \a b according to the sort order, - * and zero if the two are unable to be sorted. + Compares two contacts (\a a and \a b) using the given list of \a sortOrders. Returns a negative number if \a a should appear + before \a b according to the sort order, a positive number if \a a should appear after \a b according to the sort order, + and zero if the two are unable to be sorted. */ int QContactManagerEngine::compareContact(const QContact& a, const QContact& b, const QList& sortOrders) { @@ -1747,10 +1993,10 @@ /*! - * Performs insertion sort of the contact \a toAdd into the \a sorted list, according to the provided \a sortOrders list. - * The first QContactSortOrder in the list has the highest priority; if the contact \a toAdd is deemed equal to another - * in the \a sorted list, the second QContactSortOrder in the list is used (and so on until either the contact is inserted - * or there are no more sort order objects in the list). + Performs insertion sort of the contact \a toAdd into the \a sorted list, according to the provided \a sortOrders list. + The first QContactSortOrder in the list has the highest priority; if the contact \a toAdd is deemed equal to another + in the \a sorted list, the second QContactSortOrder in the list is used (and so on until either the contact is inserted + or there are no more sort order objects in the list). */ void QContactManagerEngine::addSorted(QList* sorted, const QContact& toAdd, const QList& sortOrders) { @@ -1789,7 +2035,7 @@ } /*! - * Notifies the manager engine that the given request \a req has been destroyed + Notifies the manager engine that the given request \a req has been destroyed */ void QContactManagerEngine::requestDestroyed(QContactAbstractRequest* req) { @@ -1797,11 +2043,11 @@ } /*! - * Asks the manager engine to begin the given request \a req which - * is currently in a (re)startable state. - * Returns true if the request was started successfully, else returns false. - * - * \sa QContactAbstractRequest::start() + Asks the manager engine to begin the given request \a req which + is currently in a (re)startable state. + Returns true if the request was started successfully, else returns false. + + \sa QContactAbstractRequest::start() */ bool QContactManagerEngine::startRequest(QContactAbstractRequest* req) { @@ -1810,12 +2056,12 @@ } /*! - * Asks the manager engine to cancel the given request \a req which was - * previously started and is currently in a cancellable state. - * Returns true if cancellation of the request was started successfully, - * otherwise returns false. - * - * \sa startRequest(), QContactAbstractRequest::cancel() + Asks the manager engine to cancel the given request \a req which was + previously started and is currently in a cancellable state. + Returns true if cancellation of the request was started successfully, + otherwise returns false. + + \sa startRequest(), QContactAbstractRequest::cancel() */ bool QContactManagerEngine::cancelRequest(QContactAbstractRequest* req) { @@ -1824,12 +2070,13 @@ } /*! - * Blocks until the manager engine has completed some part (or all) of the given request \a req - * which was previously started, or until \a msecs milliseconds have passed. - * Returns true if some progress was reported, and false if the request was not in the - * \c QContactAbstractRequest::Active state or no progress could be reported. - * - * \sa startRequest() + \internal + Blocks until the manager engine has completed some part (or all) of the given request \a req + which was previously started, or until \a msecs milliseconds have passed. + Returns true if some progress was reported, and false if the request was not in the + \c QContactAbstractRequest::Active state or no progress could be reported. + + \sa startRequest() */ bool QContactManagerEngine::waitForRequestProgress(QContactAbstractRequest* req, int msecs) { @@ -1839,12 +2086,12 @@ } /*! - * Blocks until the manager engine has completed the given request \a req - * which was previously started, or until \a msecs milliseconds have passed. - * Returns true if the request was completed, and false if the request was not in the - * \c QContactAbstractRequest::Active state or no progress could be reported. - * - * \sa startRequest() + Blocks until the manager engine has completed the given request \a req + which was previously started, or until \a msecs milliseconds have passed. + Returns true if the request was completed, and false if the request was not in the + \c QContactAbstractRequest::Active state or no progress could be reported. + + \sa startRequest() */ bool QContactManagerEngine::waitForRequestFinished(QContactAbstractRequest* req, int msecs) { @@ -1854,27 +2101,158 @@ } /*! - * Updates the given asynchronous request \a req by setting the overall operation \a error, any individual \a errors that occurred during the operation, and the new \a status of the request. It then causes the progress signal to be emitted by the request, with the \a appendOnly flag set (if required) to indicate result ordering stability. + \internal + This function takes a QContactAbstractRequest::Status parameter and hence has been deprecated. + Use the related function of similar signature which takes a QContactAbstractRequest::State parameter instead. + + Updates the request \a req with the error information \a error and \a errors. + The request state will be updated to \a status. If the sorting of the results remains unchanged, \a appendOnly will be set to true. */ void QContactManagerEngine::updateRequestStatus(QContactAbstractRequest* req, QContactManager::Error error, QList& errors, QContactAbstractRequest::Status status, bool appendOnly) { - // convenience function that simply sets the operation error and status - req->d_ptr->m_error = error; - req->d_ptr->m_errors = errors; - req->d_ptr->m_status = status; + Q_UNUSED(error); + Q_UNUSED(errors); + Q_UNUSED(appendOnly); + updateRequestState(req, static_cast(status)); +} + + +/*! + \internal + This function takes a QContactAbstractRequest::Status parameter and hence has been deprecated. + Use the related function of similar signature which takes a QContactAbstractRequest::State parameter instead. + + Updates the request \a req with the result \a result and error information \a error and \a errors. + The request state will be updated to \a status. If the sorting of the results remains unchanged, \a appendOnly will be set to true. + */ +void QContactManagerEngine::updateRequest(QContactAbstractRequest* req, const QList& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status, bool appendOnly) +{ + Q_UNUSED(errors); + Q_UNUSED(appendOnly); + updateContactLocalIdFetchRequest(qobject_cast(req), result, error); + updateRequestState(req, static_cast(status)); +} + + +/*! + \internal + This function takes a QContactAbstractRequest::Status parameter and hence has been deprecated. + Use the related function of similar signature which takes a QContactAbstractRequest::State parameter instead. + + Updates the request \a req with the result \a result and error information \a error and \a errors. + The request state will be updated to \a status. If the sorting of the results remains unchanged, \a appendOnly will be set to true. + */ +void QContactManagerEngine::updateRequest(QContactAbstractRequest* req, const QList& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status, bool appendOnly) +{ + Q_UNUSED(errors); + Q_UNUSED(appendOnly); + if (req->type() == QContactAbstractRequest::ContactFetchRequest) { + updateContactFetchRequest(qobject_cast(req), result, error); + updateRequestState(req, static_cast(status)); + } else { // contact save request + QMap errorMap; + for (int i = 0; i < errors.size(); i++) { + if (errors.at(i) != QContactManager::NoError) { + errorMap.insert(i, errors.at(i)); + } + } + updateContactSaveRequest(qobject_cast(req), result, error, errorMap); + updateRequestState(req, static_cast(status)); + } +} + + +/*! + \internal + This function takes a QContactAbstractRequest::Status parameter and hence has been deprecated. + Use the related function of similar signature which takes a QContactAbstractRequest::State parameter instead. + Updates the request \a req with the result \a result and error information \a error and \a errors. + The request state will be updated to \a status. + */ +void QContactManagerEngine::updateRequest(QContactAbstractRequest* req, const QList& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status) +{ + QMap errorMap; + for (int i = 0; i < errors.size(); i++) { + if (errors.at(i) != QContactManager::NoError) { + errorMap.insert(i, errors.at(i)); + } + } + updateDefinitionSaveRequest(qobject_cast(req), result, error, errorMap); + updateRequestState(req, static_cast(status)); +} + + +/*! + \internal + This function takes a QContactAbstractRequest::Status parameter and hence has been deprecated. + Use the related function of similar signature which takes a QContactAbstractRequest::State parameter instead. + + Updates the request \a req with the result \a result and error information \a error and \a errors. + The request state will be updated to \a status. If the sorting of the results remains unchanged, \a appendOnly will be set to true. + */ +void QContactManagerEngine::updateRequest(QContactAbstractRequest* req, const QMap& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status, bool appendOnly) +{ + Q_UNUSED(appendOnly); + QMap errorMap; + for (int i = 0; i < errors.size(); i++) { + if (errors.at(i) != QContactManager::NoError) { + errorMap.insert(i, errors.at(i)); + } + } + updateDefinitionFetchRequest(qobject_cast(req), result, error, errorMap); + updateRequestState(req, static_cast(status)); +} + + +/*! + \internal + This function has been entirely deprecated and has no effect. It was deprecated in week 1 and will be removed once the transition period has elapsed. + + Updates the request \a req with the result \a result and error information \a error and \a errors. + The request state will be updated to \a status. If the sorting of the results remains unchanged, \a appendOnly will be set to true. + */ +void QContactManagerEngine::updateRequest(QContactAbstractRequest* req, const QList& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status, bool appendOnly) +{ + Q_UNUSED(errors); + Q_UNUSED(appendOnly); + if (req->type() == QContactAbstractRequest::RelationshipFetchRequest) { + updateRelationshipFetchRequest(qobject_cast(req), result, error); + updateRequestState(req, static_cast(status)); + } else { // relationship save request + QMap errorMap; + for (int i = 0; i < errors.size(); i++) { + if (errors.at(i) != QContactManager::NoError) { + errorMap.insert(i, errors.at(i)); + } + } + updateRelationshipSaveRequest(qobject_cast(req), result, error, errorMap); + updateRequestState(req, static_cast(status)); + } +} + +/*! + Updates the given asynchronous request \a req by setting the new \a state + of the request. It then causes the stateChanged() signal to be emitted by the request. + */ +void QContactManagerEngine::updateRequestState(QContactAbstractRequest* req, QContactAbstractRequest::State state) +{ + req->d_ptr->m_state = state; + emit req->stateChanged(state); + + /* XXX TODO - remove this entire block once deprecation period has elapsed. */ switch (req->type()) { case QContactAbstractRequest::ContactFetchRequest: { QContactFetchRequest* r = static_cast(req); - emit r->progress(r, appendOnly); + emit r->progress(r, false); } break; case QContactAbstractRequest::ContactLocalIdFetchRequest: { QContactLocalIdFetchRequest* r = static_cast(req); - emit r->progress(r, appendOnly); + emit r->progress(r, false); } break; @@ -1895,7 +2273,7 @@ case QContactAbstractRequest::DetailDefinitionFetchRequest: { QContactDetailDefinitionFetchRequest* r = static_cast(req); - emit r->progress(r, appendOnly); + emit r->progress(r, false); } break; @@ -1916,7 +2294,7 @@ case QContactAbstractRequest::RelationshipFetchRequest: { QContactRelationshipFetchRequest* r = static_cast(req); - emit r->progress(r, appendOnly); + emit r->progress(r, false); } break; @@ -1940,115 +2318,157 @@ } /*! - * Updates the given asynchronous request \a req by setting its \a result, the overall operation \a error, any individual \a errors that occurred during the operation, and the new \a status of the request. It then causes the progress signal to be emitted by the request, with the \a appendOnly flag set (if required) to indicate result ordering stability. If the request is of a type which does not return a list of unique ids as a result, this function will return without doing anything. + Updates the given QContactLocalIdFetchRequest \a req with the latest results \a result, and operation error \a error. + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. */ -void QContactManagerEngine::updateRequest(QContactAbstractRequest* req, const QList& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status, bool appendOnly) +void QContactManagerEngine::updateContactLocalIdFetchRequest(QContactLocalIdFetchRequest* req, const QList& result, QContactManager::Error error) { - if (req->type() == QContactAbstractRequest::ContactLocalIdFetchRequest) { - req->d_ptr->m_error = error; - req->d_ptr->m_errors = errors; - req->d_ptr->m_status = status; - QContactLocalIdFetchRequestPrivate* rd = static_cast(req->d_ptr); - rd->m_ids = result; - QContactLocalIdFetchRequest* r = static_cast(req); - emit r->progress(r, appendOnly); - } + QContactLocalIdFetchRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_ids = result; + emit req->resultsAvailable(); + + // deprecated signal - to be removed after the transition period has elapsed: + emit req->progress(req, false); +} + +/*! + Updates the given QContactFetchRequest \a req with the latest results \a result, and operation error \a error. + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. + */ +void QContactManagerEngine::updateContactFetchRequest(QContactFetchRequest* req, const QList& result, QContactManager::Error error) +{ + QContactFetchRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_contacts = result; + emit req->resultsAvailable(); + + // deprecated signal - to be removed after the transition period has elapsed: + emit req->progress(req, false); } /*! - * Updates the given asynchronous request \a req by setting its \a result, the overall operation \a error, any individual \a errors that occurred during the operation, and the new \a status of the request. It then causes the progress signal to be emitted by the request, with the \a appendOnly flag set (if required) to indicate result ordering stability. If the request is of a type which does not return a list of contacts as a result, this function will return without doing anything. + Updates the given QContactRemoveRequest \a req with the operation error \a error, and map of input index to individual error \a errorMap. + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. */ -void QContactManagerEngine::updateRequest(QContactAbstractRequest* req, const QList& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status, bool appendOnly) +void QContactManagerEngine::updateContactRemoveRequest(QContactRemoveRequest* req, QContactManager::Error error, const QMap& errorMap) { - switch (req->type()) { - case QContactAbstractRequest::ContactFetchRequest: - { - req->d_ptr->m_error = error; - req->d_ptr->m_errors = errors; - req->d_ptr->m_status = status; - QContactFetchRequestPrivate* rd = static_cast(req->d_ptr); - rd->m_contacts = result; - QContactFetchRequest* r = static_cast(req); - emit r->progress(r, appendOnly); - } - break; + QContactRemoveRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_errors = errorMap; + emit req->resultsAvailable(); +} - case QContactAbstractRequest::ContactSaveRequest: - { - req->d_ptr->m_error = error; - req->d_ptr->m_errors = errors; - req->d_ptr->m_status = status; - QContactSaveRequestPrivate* rd = static_cast(req->d_ptr); - rd->m_contacts = result; - QContactSaveRequest* r = static_cast(req); - emit r->progress(r); - } - break; +/*! + Updates the given QContactSaveRequest \a req with the latest results \a result, operation error \a error, and map of input index to individual error \a errorMap. + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. + */ +void QContactManagerEngine::updateContactSaveRequest(QContactSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap) +{ + QContactSaveRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_errors = errorMap; + rd->m_contacts = result; + emit req->resultsAvailable(); - default: - { - // this request type does not have a list of contacts to update... - return; - } - } + // deprecated signal - to be removed after the transition period has elapsed: + emit req->progress(req); +} + +/*! + Updates the given QContactDetailDefinitionSaveRequest \a req with the latest results \a result, operation error \a error, and map of input index to individual error \a errorMap. + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. + */ +void QContactManagerEngine::updateDefinitionSaveRequest(QContactDetailDefinitionSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap) +{ + QContactDetailDefinitionSaveRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_errors = errorMap; + rd->m_definitions = result; + emit req->resultsAvailable(); + + // deprecated signal - to be removed after the transition period has elapsed: + emit req->progress(req); } /*! - * Updates the given asynchronous request \a req by setting its \a result, the overall operation \a error, any individual \a errors that occurred during the operation, and the new \a status of the request. It then causes the progress signal to be emitted by the request. If the request is of a type which does not return a list of detail definition as a result, this function will return without doing anything. + Updates the given QContactDetailDefinitionRemoveRequest \a req with the operation error \a error, and map of input index to individual error \a errorMap. + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. */ -void QContactManagerEngine::updateRequest(QContactAbstractRequest* req, const QList& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status) +void QContactManagerEngine::updateDefinitionRemoveRequest(QContactDetailDefinitionRemoveRequest* req, QContactManager::Error error, const QMap& errorMap) { - if (req->type() == QContactAbstractRequest::DetailDefinitionSaveRequest) { - req->d_ptr->m_error = error; - req->d_ptr->m_errors = errors; - req->d_ptr->m_status = status; - QContactDetailDefinitionSaveRequestPrivate* rd = static_cast(req->d_ptr); - rd->m_definitions = result; - QContactDetailDefinitionSaveRequest* r = static_cast(req); - emit r->progress(r); - } + QContactDetailDefinitionRemoveRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_errors = errorMap; + emit req->resultsAvailable(); + + // deprecated signal - to be removed after the transition period has elapsed: + emit req->progress(req); +} + +/*! + Updates the given QContactDetailDefinitionFetchRequest \a req with the latest results \a result, operation error \a error, and map of input index to individual error \a errorMap. + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. + */ +void QContactManagerEngine::updateDefinitionFetchRequest(QContactDetailDefinitionFetchRequest* req, const QMap& result, QContactManager::Error error, const QMap& errorMap) +{ + QContactDetailDefinitionFetchRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_errors = errorMap; + rd->m_definitions = result; + emit req->resultsAvailable(); + + // deprecated signal - to be removed after the transition period has elapsed: + emit req->progress(req, false); } /*! - * Updates the given asynchronous request \a req by setting its \a result, the overall operation \a error, any individual \a errors that occurred during the operation, and the new \a status of the request. It then causes the progress signal to be emitted by the request, with the \a appendOnly flag set (if required) to indicate result ordering stability. If the request is of a type which does not return a map of string to detail definition as a result, this function will return without doing anything. + Updates the given QContactRelationshipSaveRequest \a req with the latest results \a result, operation error \a error, and map of input index to individual error \a errorMap. + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. */ -void QContactManagerEngine::updateRequest(QContactAbstractRequest* req, const QMap& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status, bool appendOnly) +void QContactManagerEngine::updateRelationshipSaveRequest(QContactRelationshipSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap) { - if (req->type() == QContactAbstractRequest::DetailDefinitionFetchRequest) { - req->d_ptr->m_error = error; - req->d_ptr->m_errors = errors; - req->d_ptr->m_status = status; - QContactDetailDefinitionFetchRequestPrivate* rd = static_cast(req->d_ptr); - rd->m_definitions = result; - QContactDetailDefinitionFetchRequest* r = static_cast(req); - emit r->progress(r, appendOnly); - } + QContactRelationshipSaveRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_errors = errorMap; + rd->m_relationships = result; + emit req->resultsAvailable(); + + // deprecated signal - to be removed after the transition period has elapsed: + emit req->progress(req); } /*! - * Updates the given asynchronous request \a req by setting its \a result, the overall operation \a error, any individual \a errors that occurred during the operation, and the new \a status of the request. It then causes the progress signal to be emitted by the request, with the \a appendOnly flag set (if required) to indicate result ordering stability. If the request is of a type which does not return a list of contact relationships as a result, this function will return without doing anything. + Updates the given QContactRelationshipRemoveRequest \a req with the operation error \a error, and map of input index to individual error \a errorMap. + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. */ -void QContactManagerEngine::updateRequest(QContactAbstractRequest* req, const QList& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status, bool appendOnly) +void QContactManagerEngine::updateRelationshipRemoveRequest(QContactRelationshipRemoveRequest* req, QContactManager::Error error, const QMap& errorMap) { - if (req->type() == QContactAbstractRequest::RelationshipSaveRequest) { - req->d_ptr->m_error = error; - req->d_ptr->m_errors = errors; - req->d_ptr->m_status = status; - QContactRelationshipSaveRequestPrivate* rd = static_cast(req->d_ptr); - rd->m_relationships = result; - QContactRelationshipSaveRequest* r = static_cast(req); - emit r->progress(r); - } else if (req->type() == QContactAbstractRequest::RelationshipFetchRequest) { - req->d_ptr->m_error = error; - req->d_ptr->m_errors = errors; - req->d_ptr->m_status = status; - QContactRelationshipFetchRequestPrivate* rd = static_cast(req->d_ptr); - rd->m_relationships = result; - QContactRelationshipFetchRequest* r = static_cast(req); - emit r->progress(r, appendOnly); - } + QContactRelationshipRemoveRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_errors = errorMap; + emit req->resultsAvailable(); + + // deprecated signal - to be removed after the transition period has elapsed: + emit req->progress(req); } +/*! + Updates the given QContactRelationshipFetchRequest \a req with the latest results \a result, and operation error \a error. + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. + */ +void QContactManagerEngine::updateRelationshipFetchRequest(QContactRelationshipFetchRequest* req, const QList& result, QContactManager::Error error) +{ + QContactRelationshipFetchRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_relationships = result; + emit req->resultsAvailable(); + + // deprecated signal - to be removed after the transition period has elapsed: + emit req->progress(req, false); +} + + #include "moc_qcontactmanagerengine.cpp" QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactmanagerengine.h --- a/qtcontactsmobility/src/contacts/qcontactmanagerengine.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactmanagerengine.h Fri Apr 16 14:53:18 2010 +0300 @@ -55,6 +55,7 @@ #include "qcontactdetaildefinition.h" #include "qcontactmanager.h" #include "qcontactabstractrequest.h" +#include "qcontactrequests.h" QTM_BEGIN_NAMESPACE @@ -73,22 +74,32 @@ virtual QString managerName() const; // e.g. "Symbian" virtual QMap managerParameters() const; // e.g. "filename=private.db" QString managerUri() const; + virtual int Q_DECL_DEPRECATED implementationVersion() const; // deprecated + virtual int managerVersion() const; // replaces the above /* Filtering */ - virtual QList contacts(const QContactFilter& filter, const QList& sortOrders, QContactManager::Error& error) const; + virtual QList Q_DECL_DEPRECATED contacts(const QContactFilter& filter, const QList& sortOrders, QContactManager::Error& error) const; /* Contacts - Accessors and Mutators */ - virtual QList contacts(const QList& sortOrders, QContactManager::Error& error) const; - virtual QContact contact(const QContactLocalId& contactId, QContactManager::Error& error) const; + virtual QList Q_DECL_DEPRECATED contacts(const QList& sortOrders, QContactManager::Error& error) const; + virtual QContact Q_DECL_DEPRECATED contact(const QContactLocalId& contactId, QContactManager::Error& error) const; + virtual QList Q_DECL_DEPRECATED saveContacts(QList* contacts, QContactManager::Error& error); // deprecated - removed week 3 + virtual QList Q_DECL_DEPRECATED removeContacts(QList* contactIds, QContactManager::Error& error); // deprecated - removed week 3 + + virtual QList contactIds(const QList& sortOrders, QContactManager::Error& error) const; + virtual QList contactIds(const QContactFilter& filter, const QList& sortOrders, QContactManager::Error& error) const; + virtual QList contacts(const QList& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const; + virtual QList contacts(const QContactFilter& filter, const QList& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const; + virtual QContact contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions, QContactManager::Error& error) const; virtual bool saveContact(QContact* contact, QContactManager::Error& error); - virtual QList saveContacts(QList* contacts, QContactManager::Error& error); - + virtual bool saveContacts(QList* contacts, QMap* errorMap, QContactManager::Error& error); virtual bool removeContact(const QContactLocalId& contactId, QContactManager::Error& error); - virtual QList removeContacts(QList* contactIds, QContactManager::Error& error); + virtual bool removeContacts(QList* contactIds, QMap* errorMap, QContactManager::Error& error); /* Synthesize the display label of a contact */ - virtual QString synthesizeDisplayLabel(const QContact& contact, QContactManager::Error& error) const; + virtual QString Q_DECL_DEPRECATED synthesizeDisplayLabel(const QContact& contact, QContactManager::Error& error) const; // deprecated + virtual QString synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const; // replaces the above QContact setContactDisplayLabel(const QString& displayLabel, const QContact& contact) const; /* "Self" contact id (MyCard) */ @@ -116,25 +127,41 @@ virtual void requestDestroyed(QContactAbstractRequest* req); virtual bool startRequest(QContactAbstractRequest* req); virtual bool cancelRequest(QContactAbstractRequest* req); - virtual bool waitForRequestProgress(QContactAbstractRequest* req, int msecs); + virtual bool Q_DECL_DEPRECATED waitForRequestProgress(QContactAbstractRequest* req, int msecs); virtual bool waitForRequestFinished(QContactAbstractRequest* req, int msecs); - static void updateRequestStatus(QContactAbstractRequest* req, QContactManager::Error error, QList& errors, QContactAbstractRequest::Status status, bool appendOnly = false); - static void updateRequest(QContactAbstractRequest* req, const QList& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status, bool appendOnly = false); - static void updateRequest(QContactAbstractRequest* req, const QList& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status, bool appendOnly = false); - static void updateRequest(QContactAbstractRequest* req, const QList& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status); - static void updateRequest(QContactAbstractRequest* req, const QMap& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status, bool appendOnly = false); - static void updateRequest(QContactAbstractRequest* req, const QList& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status, bool appendOnly = false); + + // the following helper functions are all deprecated and will be removed in week 3. + static void Q_DECL_DEPRECATED updateRequestStatus(QContactAbstractRequest* req, QContactManager::Error error, QList& errors, QContactAbstractRequest::Status status, bool appendOnly = false); + static void Q_DECL_DEPRECATED updateRequest(QContactAbstractRequest* req, const QList& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status, bool appendOnly = false); + static void Q_DECL_DEPRECATED updateRequest(QContactAbstractRequest* req, const QList& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status, bool appendOnly = false); + static void Q_DECL_DEPRECATED updateRequest(QContactAbstractRequest* req, const QList& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status); + static void Q_DECL_DEPRECATED updateRequest(QContactAbstractRequest* req, const QMap& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status, bool appendOnly = false); + static void Q_DECL_DEPRECATED updateRequest(QContactAbstractRequest* req, const QList& result, QContactManager::Error error, const QList& errors, QContactAbstractRequest::Status status, bool appendOnly = false); + + // they are replaced by the following functions: + static void updateRequestState(QContactAbstractRequest* req, QContactAbstractRequest::State state); + static void updateContactLocalIdFetchRequest(QContactLocalIdFetchRequest* req, const QList& result, QContactManager::Error error); + static void updateContactFetchRequest(QContactFetchRequest* req, const QList& result, QContactManager::Error error); + static void updateContactRemoveRequest(QContactRemoveRequest* req, QContactManager::Error error, const QMap& errorMap); + static void updateContactSaveRequest(QContactSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap); + static void updateDefinitionSaveRequest(QContactDetailDefinitionSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap); + static void updateDefinitionRemoveRequest(QContactDetailDefinitionRemoveRequest* req, QContactManager::Error error, const QMap& errorMap); + static void updateDefinitionFetchRequest(QContactDetailDefinitionFetchRequest* req, const QMap& result, QContactManager::Error error, const QMap& errorMap); + static void updateRelationshipSaveRequest(QContactRelationshipSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap); + static void updateRelationshipRemoveRequest(QContactRelationshipRemoveRequest* req, QContactManager::Error error, const QMap& errorMap); + static void updateRelationshipFetchRequest(QContactRelationshipFetchRequest* req, const QList& result, QContactManager::Error error); + /* Capabilities reporting */ virtual bool hasFeature(QContactManager::ManagerFeature feature, const QString& contactType) const; virtual QStringList supportedRelationshipTypes(const QString& contactType) const; - virtual bool filterSupported(const QContactFilter& filter) const; + virtual bool Q_DECL_DEPRECATED filterSupported(const QContactFilter& filter) const; // deprecated + virtual bool isFilterSupported(const QContactFilter& filter) const; // replaces the above virtual QList supportedDataTypes() const; virtual QStringList supportedContactTypes() const; /* Versions */ - static int version(); - virtual int implementationVersion() const; + static Q_DECL_DEPRECATED int version(); // deprecated, remove in wk1, no replacement. /* Reports the built-in definitions from the schema */ static QMap > schemaDefinitions(); @@ -158,6 +185,9 @@ static QList sortContacts(const QList& contacts, const QList& sortOrders); static void setContactRelationships(QContact* contact, const QList& relationships); +protected: + void setDetailAccessConstraints(QContactDetail* detail, QContactDetail::AccessConstraints constraints) const; + private: /* QContactChangeSet is a utility class used to emit the appropriate signals */ friend class QContactChangeSet; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactmanagerenginefactory.cpp --- a/qtcontactsmobility/src/contacts/qcontactmanagerenginefactory.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactmanagerenginefactory.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -42,6 +42,8 @@ #include "qcontactmanagerenginefactory.h" +QTM_BEGIN_NAMESPACE + /*! \class QContactManagerEngineFactory \preliminary @@ -59,43 +61,56 @@ */ /*! - * \fn QContactManagerEngineFactory::~QContactManagerEngineFactory() - * - * A default, empty destructor. + A default, empty destructor. */ +QContactManagerEngineFactory::~QContactManagerEngineFactory() +{ +} /*! - * \fn QContactManagerEngineFactory::engine(const QMap& parameters, QContactManager::Error &error) - * - * This function is called by the QContactManager implementation to - * create an instance of the engine provided by this factory. - * - * The \a parameters supplied can be ignored or interpreted as desired. - * - * If a supplied parameter results in an unfulfillable request, or some other error - * occurs, this function may return a null pointer, and the client developer will get an - * invalid QContactManager in return. Any error should be stored in the supplied \a error - * reference. + \fn QContactManagerEngineFactory::engine(const QMap& parameters, QContactManager::Error &error) + + This function is called by the QContactManager implementation to + create an instance of the engine provided by this factory. + + The \a parameters supplied can be ignored or interpreted as desired. + + If a supplied parameter results in an unfulfillable request, or some other error + occurs, this function may return a null pointer, and the client developer will get an + invalid QContactManager in return. Any error should be stored in the supplied \a error + reference. */ /*! - * \fn QContactManagerEngineFactory::managerName() const - * - * This function should return a unique string that identifies - * the engines provided by this factory. - * - * Typically this would be of the form "com.nokia.qt.contacts.engines.memory", with - * the appropriate domain and engine name substituted. + \fn QContactManagerEngineFactory::managerName() const + + This function should return a unique string that identifies + the engines provided by this factory. + + Typically this would be of the form "com.nokia.qt.contacts.engines.memory", with + the appropriate domain and engine name substituted. */ /*! - * \fn QContactManagerEngineFactory::supportedImplementationVersions() const - * - * This function should return a list of versions of the engine which this factory can instantiate. + \fn QContactManagerEngineFactory::supportedImplementationVersions() const + + This function should return a list of versions of the engine which this factory can instantiate. */ +QList QContactManagerEngineFactory::supportedImplementationVersions() const +{ + return QList(); +} /*! - * \fn QContactManagerEngineFactory::version() const - * - * Returns the version of the Qt Mobility Contacts API which is implemented by engines instantiated by this factory. + \internal + + Returns the version of the Qt Mobility Contacts API which is implemented by engines instantiated by this factory. + This function is deprecated and will be removed after the transition period has elapsed. */ +int QContactManagerEngineFactory::version() const +{ + return -1; + //return QContactManager::version(); +} + +QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactmanagerenginefactory.h --- a/qtcontactsmobility/src/contacts/qcontactmanagerenginefactory.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactmanagerenginefactory.h Fri Apr 16 14:53:18 2010 +0300 @@ -56,16 +56,12 @@ { public: - int version() const - { - return QContactManager::version(); - } + // deprecated - removed entirely week 1. + int Q_DECL_DEPRECATED version() const; - virtual QList supportedImplementationVersions() const - { - return QList(); - } - virtual ~QContactManagerEngineFactory() {} + // engine factory functions + virtual QList supportedImplementationVersions() const; + virtual ~QContactManagerEngineFactory(); virtual QContactManagerEngine* engine(const QMap& parameters, QContactManager::Error& error) = 0; virtual QString managerName() const = 0; }; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactrelationship.cpp --- a/qtcontactsmobility/src/contacts/qcontactrelationship.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactrelationship.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -86,9 +86,16 @@ /*! * \variable QContactRelationship::Is + * \obsolete + * Deprecated - use QContactRelationship::IsSameAs instead. + */ +Q_DEFINE_LATIN1_LITERAL(QContactRelationship::Is, "IsSameAs"); + +/*! + * \variable QContactRelationship::IsSameAs * The relationship type which identifies the first contact as being the same contact as the second contact */ -Q_DEFINE_LATIN1_LITERAL(QContactRelationship::Is, "Is"); +Q_DEFINE_LATIN1_LITERAL(QContactRelationship::IsSameAs, "IsSameAs"); /*! * \variable QContactRelationship::HasAssistant diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qcontactrelationship.h --- a/qtcontactsmobility/src/contacts/qcontactrelationship.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qcontactrelationship.h Fri Apr 16 14:53:18 2010 +0300 @@ -62,13 +62,15 @@ const char* HasMember; const char* Aggregates; const char* Is; + const char* IsSameAs; const char* HasAssistant; const char* HasManager; const char* HasSpouse; #else Q_DECLARE_LATIN1_LITERAL(HasMember, "HasMember"); Q_DECLARE_LATIN1_LITERAL(Aggregates, "Aggregates"); - Q_DECLARE_LATIN1_LITERAL(Is, "Is"); + Q_DECLARE_LATIN1_LITERAL(Is, "IsSameAs"); // deprecated + Q_DECLARE_LATIN1_LITERAL(IsSameAs, "IsSameAs"); Q_DECLARE_LATIN1_LITERAL(HasAssistant, "HasAssistant"); Q_DECLARE_LATIN1_LITERAL(HasManager, "HasManager"); Q_DECLARE_LATIN1_LITERAL(HasSpouse, "HasSpouse"); diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/qtcontacts.h --- a/qtcontactsmobility/src/contacts/qtcontacts.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/qtcontacts.h Fri Apr 16 14:53:18 2010 +0300 @@ -52,7 +52,8 @@ #include "qcontact.h" // contact #include "qcontactid.h" // contact identifier #include "qcontactdetaildefinition.h" // detail definition -#include "qcontactdetaildefinitionfield.h" // field in a detail definition +#include "qcontactdetaildefinitionfield.h" // field in a detail definition (obsolete) +#include "qcontactdetailfielddefinition.h" // field in a detail definition #include "qcontactdetail.h" // contact detail #include "qcontactdetails.h" // leaf detail classes #include "qcontactfilter.h" // contact filter diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionfetchrequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionfetchrequest.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionfetchrequest.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -48,15 +48,24 @@ \class QContactDetailDefinitionFetchRequest \brief The QContactDetailDefinitionFetchRequest class allows a client to asynchronously request detail definitions from a contacts store manager. - \ingroup contacts-requests + + For a QContactDetailDefinitionFetchRequest, the resultsAvailable() signal will be emitted when + either the individual item errors (which may be retrieved by calling errorMap()), or the resultant + detail definitions (which may be retrieved by calling definitions()), are updated, as well as if + the overall operation error (which may be retrieved by calling error()) is updated. + + \ingroup contacts-requests */ /*! - * \fn QContactDetailDefinitionFetchRequest::progress(QContactDetailDefinitionFetchRequest* self, bool appendOnly) - * This signal is emitted when some progress has been made on the request, causing either a change of - * status or an update of results, or both. It identifies which request the signal originated from - * by including a pointer to \a self, and contains an \a appendOnly flag which signifies whether or not the total - * ordering of the results have been maintained since the last progress signal was emitted. + \fn QContactDetailDefinitionFetchRequest::progress(QContactDetailDefinitionFetchRequest* self, bool appendOnly) + \internal + This signal is emitted when some progress has been made on the request, causing either a change of + status or an update of results, or both. It identifies which request the signal originated from + by including a pointer to \a self, and contains an \a appendOnly flag which signifies whether or not the total + ordering of the results have been maintained since the last progress signal was emitted. + This signal is deprecated and will be removed once the transition period has elapsed. + Use the signals emitted by the base class, combined with \l QObject::sender(), instead. */ /*! Constructs a new detail definition fetch request */ @@ -70,15 +79,35 @@ { } -/*! Sets the names of the detail definitions to retrieve to \a names */ +/*! + \internal + Sets the names of the detail definitions to retrieve to \a names + */ void QContactDetailDefinitionFetchRequest::setNames(const QStringList& names) { Q_D(QContactDetailDefinitionFetchRequest); d->m_names = names; } +/*! + \internal + Returns the list of names of the detail definitions that will be retrieved + */ +QStringList QContactDetailDefinitionFetchRequest::names() const +{ + Q_D(const QContactDetailDefinitionFetchRequest); + return d->m_names; +} + +/*! Sets the names of the detail definitions to retrieve to \a names */ +void QContactDetailDefinitionFetchRequest::setDefinitionNames(const QStringList& names) +{ + Q_D(QContactDetailDefinitionFetchRequest); + d->m_names = names; +} + /*! Returns the list of names of the detail definitions that will be retrieved */ -QStringList QContactDetailDefinitionFetchRequest::names() const +QStringList QContactDetailDefinitionFetchRequest::definitionNames() const { Q_D(const QContactDetailDefinitionFetchRequest); return d->m_names; @@ -98,13 +127,22 @@ return d->m_contactType; } -/*! Returns the map of detail definition names to detail definitions that was the result of the request */ +/*! + Returns the map of detail definition names to detail definitions that was the result of the request + */ QMap QContactDetailDefinitionFetchRequest::definitions() const { Q_D(const QContactDetailDefinitionFetchRequest); return d->m_definitions; } +/*! Returns the map of input name list indices to errors which occurred */ +QMap QContactDetailDefinitionFetchRequest::errorMap() const +{ + Q_D(const QContactDetailDefinitionFetchRequest); + return d->m_errors; +} + #include "moc_qcontactdetaildefinitionfetchrequest.cpp" QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionfetchrequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionfetchrequest.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionfetchrequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -61,16 +61,19 @@ ~QContactDetailDefinitionFetchRequest(); /* Selection */ - void setNames(const QStringList& names); - QStringList names() const; + void Q_DECL_DEPRECATED setNames(const QStringList& names); // deprecated + QStringList Q_DECL_DEPRECATED names() const; // deprecated + void setDefinitionNames(const QStringList& names); // replaces ^^ + QStringList definitionNames() const; // replaces ^^ void setContactType(const QString& contactType); QString contactType() const; /* Results */ QMap definitions() const; + QMap errorMap() const; signals: - void progress(QContactDetailDefinitionFetchRequest* self, bool appendOnly); + void progress(QContactDetailDefinitionFetchRequest* self, bool appendOnly); // DEPRECATED private: Q_DISABLE_COPY(QContactDetailDefinitionFetchRequest) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionremoverequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionremoverequest.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionremoverequest.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -49,15 +49,22 @@ \brief The QContactDetailDefinitionRemoveRequest class allows a client to asynchronously request that certain detail definitions be removed from a contacts store. + + For a QContactDetailDefinitionRemoveRequest, the resultsUpdated() signal will be emitted when + the individual item errors (which may be retrieved by calling errorMap()) are updated, or if the overall + operation error (which may be retrieved by calling error()) is updated. \ingroup contacts-requests */ /*! - * \fn QContactDetailDefinitionRemoveRequest::progress(QContactDetailDefinitionRemoveRequest* self) - * This signal is emitted when some progress has been made on the request, causing either a change of - * status or an update of results, or both. It identifies which request the signal originated from - * by including a pointer to \a self. + \fn QContactDetailDefinitionRemoveRequest::progress(QContactDetailDefinitionRemoveRequest* self) + \internal + This signal is emitted when some progress has been made on the request, causing either a change of + status or an update of results, or both. It identifies which request the signal originated from + by including a pointer to \a self. + This signal is deprecated and will be removed once the transition period has elapsed. + Use the signals emitted by the base class, combined with \l QObject::sender(), instead. */ /*! Constructs a new detail definition remove request */ @@ -71,27 +78,57 @@ { } -/*! Sets the names of the detail definitions to remove from the manager to be \a names */ +/*! + \internal + Sets the names of the detail definitions to remove from the manager to be \a names + */ void QContactDetailDefinitionRemoveRequest::setNames(const QStringList& names) { Q_D(QContactDetailDefinitionRemoveRequest); d->m_names = names; } -/*! Returns the list of names of the detail definitions that will be removed from the manager */ +/*! + \internal + Returns the list of names of the detail definitions that will be removed from the manager + */ QStringList QContactDetailDefinitionRemoveRequest::names() const { Q_D(const QContactDetailDefinitionRemoveRequest); return d->m_names; } -/*! Sets the type of contact for which detail definitions should be removed to \a contactType */ +/*! + \internal + Sets the type of detail defintions to remove to \a contactType, + + Do not use this. Use \l setDefinitionNames() instead. +*/ void QContactDetailDefinitionRemoveRequest::setContactType(const QString& contactType) { Q_D(QContactDetailDefinitionRemoveRequest); d->m_contactType = contactType; } +/*! + Sets the type of contact for which detail definitions should be removed to \a contactType, and the names of the detail definitions to remove from the manager to \a names. + Managers may store different definitions which are valid for different contact types, and so attempting to remove definitions with certain names may fail if no such + definitions exist for contacts of the given contact type, or if \a contactType is empty. + */ +void QContactDetailDefinitionRemoveRequest::setDefinitionNames(const QString& contactType, const QStringList& names) +{ + Q_D(QContactDetailDefinitionRemoveRequest); + d->m_contactType = contactType; + d->m_names = names; +} + +/*! Returns the list of names of the detail definitions that will be removed from the manager */ +QStringList QContactDetailDefinitionRemoveRequest::definitionNames() const +{ + Q_D(const QContactDetailDefinitionRemoveRequest); + return d->m_names; +} + /*! Returns the type of contact for which detail definitions will be removed */ QString QContactDetailDefinitionRemoveRequest::contactType() const { @@ -99,6 +136,13 @@ return d->m_contactType; } +/*! Returns the map of input name list indices to errors which occurred */ +QMap QContactDetailDefinitionRemoveRequest::errorMap() const +{ + Q_D(const QContactDetailDefinitionRemoveRequest); + return d->m_errors; +} + #include "moc_qcontactdetaildefinitionremoverequest.cpp" QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionremoverequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionremoverequest.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionremoverequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -59,13 +59,18 @@ ~QContactDetailDefinitionRemoveRequest(); /* Selection */ - void setNames(const QStringList& names); - QStringList names() const; - void setContactType(const QString& contactType); + void Q_DECL_DEPRECATED setNames(const QStringList& names); // deprecated + QStringList Q_DECL_DEPRECATED names() const; // deprecated + void Q_DECL_DEPRECATED setContactType(const QString& type); // deprecated + void setDefinitionNames(const QString& contactType, const QStringList& names); + QStringList definitionNames() const; // replaces ^^ QString contactType() const; + /* Results */ + QMap errorMap() const; + signals: - void progress(QContactDetailDefinitionRemoveRequest* self); + void progress(QContactDetailDefinitionRemoveRequest* self); // deprecated private: Q_DISABLE_COPY(QContactDetailDefinitionRemoveRequest) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionsaverequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionsaverequest.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionsaverequest.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -49,15 +49,23 @@ \brief The QContactDetailDefinitionSaveRequest class allows a client to asynchronously request that certain detail definitions be saved in a contacts store. + + For a QContactDetailDefinitionSaveRequest, the resultsAvailable() signal will be emitted when + either the individual item errors (which may be retrieved by calling errorMap()), or the resultant + detail definitions (which may be retrieved by calling definitions()), are updated, as well as if + the overall operation error (which may be retrieved by calling error()) is updated. \ingroup contacts-requests */ /*! - * \fn QContactDetailDefinitionSaveRequest::progress(QContactDetailDefinitionSaveRequest* self) - * This signal is emitted when some progress has been made on the request, causing either a change of - * status or an update of results, or both. It identifies which request the signal originated from - * by including a pointer to \a self. + \fn QContactDetailDefinitionSaveRequest::progress(QContactDetailDefinitionSaveRequest* self) + \internal + This signal is emitted when some progress has been made on the request, causing either a change of + status or an update of results, or both. It identifies which request the signal originated from + by including a pointer to \a self. + This signal is deprecated and will be removed once the transition period has elapsed. + Use the signals emitted by the base class, combined with \l QObject::sender(), instead. */ /*! Constructs a new detail definition save request */ @@ -100,6 +108,13 @@ return d->m_contactType; } +/*! Returns the map of input definition list indices to errors which occurred */ +QMap QContactDetailDefinitionSaveRequest::errorMap() const +{ + Q_D(const QContactDetailDefinitionSaveRequest); + return d->m_errors; +} + #include "moc_qcontactdetaildefinitionsaverequest.cpp" QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionsaverequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionsaverequest.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionsaverequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -67,9 +67,10 @@ /* Results */ QList definitions() const; + QMap errorMap() const; signals: - void progress(QContactDetailDefinitionSaveRequest* self); + void progress(QContactDetailDefinitionSaveRequest* self); // deprecated private: Q_DISABLE_COPY(QContactDetailDefinitionSaveRequest) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactfetchrequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactfetchrequest.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactfetchrequest.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -48,15 +48,24 @@ \class QContactFetchRequest \brief The QContactFetchRequest class allows a client to asynchronously request contacts from a contacts store manager. - \ingroup contacts-requests + + + For a QContactFetchRequest, the resultsAvailable() signal will be emitted when the resultant + contacts (which may be retrieved by calling contacts()), are updated, as well as if + the overall operation error (which may be retrieved by calling error()) is updated. + + \ingroup contacts-requests */ /*! - * \fn QContactFetchRequest::progress(QContactFetchRequest* self, bool appendOnly) - * This signal is emitted when some progress has been made on the request, causing either a change of - * status or an update of results, or both. It identifies which request the signal originated from - * by including a pointer to \a self, and contains an \a appendOnly flag which signifies whether or not the total - * ordering of the results have been maintained since the last progress signal was emitted. + \fn QContactFetchRequest::progress(QContactFetchRequest* self, bool appendOnly) + \internal + This signal is emitted when some progress has been made on the request, causing either a change of + status or an update of results, or both. It identifies which request the signal originated from + by including a pointer to \a self, and contains an \a appendOnly flag which signifies whether or not the total + ordering of the results have been maintained since the last progress signal was emitted. + This signal is deprecated and will be removed once the transition period has elapsed. + Use the signals emitted by the base class, combined with \l QObject::sender(), instead. */ /*! Constructs a new contact fetch request */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactfetchrequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactfetchrequest.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactfetchrequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -74,7 +74,7 @@ QList contacts() const; signals: - void progress(QContactFetchRequest* self, bool appendOnly); + void progress(QContactFetchRequest* self, bool appendOnly); // deprecated private: Q_DISABLE_COPY(QContactFetchRequest) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactlocalidfetchrequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactlocalidfetchrequest.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactlocalidfetchrequest.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -48,15 +48,24 @@ \class QContactLocalIdFetchRequest \brief The QContactLocalIdFetchRequest class allows a client to asynchronously request a list of contact ids from a contacts store manager. - \ingroup contacts-requests + + + For a QContactLocalIdFetchRequest, the resultsAvailable() signal will be emitted when the resultant + manager-local contact ids (which may be retrieved by calling ids()), are updated, as well as if + the overall operation error (which may be retrieved by calling error()) is updated. + + \ingroup contacts-requests */ /*! - * \fn QContactLocalIdFetchRequest::progress(QContactLocalIdFetchRequest* self, bool appendOnly) - * This signal is emitted when some progress has been made on the request, causing either a change of - * status or an update of results, or both. It identifies which request the signal originated from - * by including a pointer to \a self, and contains an \a appendOnly flag which signifies whether or not the total - * ordering of the results have been maintained since the last progress signal was emitted. + \fn QContactLocalIdFetchRequest::progress(QContactLocalIdFetchRequest* self, bool appendOnly) + \internal + This signal is emitted when some progress has been made on the request, causing either a change of + status or an update of results, or both. It identifies which request the signal originated from + by including a pointer to \a self, and contains an \a appendOnly flag which signifies whether or not the total + ordering of the results have been maintained since the last progress signal was emitted. + This signal is deprecated and will be removed once the transition period has elapsed. + Use the signals emitted by the base class, combined with \l QObject::sender(), instead. */ /*! Constructs a new contact id fetch request */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactlocalidfetchrequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactlocalidfetchrequest.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactlocalidfetchrequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -71,7 +71,7 @@ QList ids() const; signals: - void progress(QContactLocalIdFetchRequest* self, bool appendOnly); + void progress(QContactLocalIdFetchRequest* self, bool appendOnly); // deprecated private: Q_DISABLE_COPY(QContactLocalIdFetchRequest) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactrelationshipfetchrequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactrelationshipfetchrequest.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactrelationshipfetchrequest.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -52,12 +52,17 @@ \brief The QContactRelationshipFetchRequest class allows a client to asynchronously request relationships from a contacts store manager. + For a QContactRelationshipFetchRequest, the resultsAvailable() signal will be emitted when the resultant + relationships (which may be retrieved by calling relationships()), are updated, as well as if + the overall operation error (which may be retrieved by calling error()) is updated. + \ingroup contacts-requests */ /*! \fn QContactRelationshipFetchRequest::progress(QContactRelationshipFetchRequest* self, bool appendOnly) + \internal This signal is emitted when some progress has been made on the request, causing either a change of status or an update of results, @@ -65,6 +70,8 @@ including a pointer to \a self, and contains an \a appendOnly flag which signifies whether or not the total ordering of the results have been maintained since the last progress signal was emitted. + This signal is deprecated and will be removed once the transition period has elapsed. + Use the signals emitted by the base class, combined with \l QObject::sender(), instead. */ /*! Constructs a new relationship fetch request @@ -80,14 +87,14 @@ { } -/*! Sets the source contact criterion of the fetch request to \a contactId. - If \a contactId is the default-constructed id, or the first contact is not set, +/*! Sets the source contact criterion of the fetch request to \a firstId. + If \a firstId is the default-constructed id, or the first contact id is not set, the request will fetch relationships involving any first contact. */ -void QContactRelationshipFetchRequest::setFirst(const QContactId& contactId) +void QContactRelationshipFetchRequest::setFirst(const QContactId& firstId) { Q_D(QContactRelationshipFetchRequest); - d->m_first = contactId; + d->m_first = firstId; } /*! Returns the source contact criterion of the fetch request @@ -116,8 +123,26 @@ return d->m_relationshipType; } +/*! Sets the destination contact criterion of the fetch request to \a secondId. + If \a secondId is the default-constructed id, or the second contact id is not set, + the request will fetch relationships involving any second contact. +*/ +void QContactRelationshipFetchRequest::setSecond(const QContactId& secondId) +{ + Q_D(QContactRelationshipFetchRequest); + d->m_second = secondId; +} + +/*! Returns the destination contact criterion of the fetch request + */ +QContactId QContactRelationshipFetchRequest::second() const +{ + Q_D(const QContactRelationshipFetchRequest); + return d->m_second; +} + /*! - + \internal Sets the participant criterion of the fetch request to \a participantUri. If the \a participantUri references a contact in the manager from which the relationships are being fetched and the @@ -145,7 +170,9 @@ d->m_role = role; } -/*! Returns the participant criterion of the fetch request +/*! + \internal + Returns the participant criterion of the fetch request */ QContactId QContactRelationshipFetchRequest::participant() const { @@ -153,7 +180,9 @@ return d->m_participantUri; } -/*! Returns the role of the participant criterion of the fetch request +/*! + \internal + Returns the role of the participant criterion of the fetch request */ QContactRelationshipFilter::Role QContactRelationshipFetchRequest::participantRole() const { diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactrelationshipfetchrequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactrelationshipfetchrequest.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactrelationshipfetchrequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -69,15 +69,20 @@ void setRelationshipType(const QString& relationshipType); QString relationshipType() const; - void setParticipant(const QContactId& participant, QContactRelationshipFilter::Role role = QContactRelationshipFilter::Either); - QContactId participant() const; - QContactRelationshipFilter::Role participantRole() const; + // we no longer use "participant" or "participant role" -- deprecated and will be removed after transition period has elapsed. + void Q_DECL_DEPRECATED setParticipant(const QContactId& participant, QContactRelationshipFilter::Role role = QContactRelationshipFilter::Either); // deprecated + QContactId Q_DECL_DEPRECATED participant() const; // deprecated + QContactRelationshipFilter::Role Q_DECL_DEPRECATED participantRole() const; // deprecated + + // replaces the above functions. + void setSecond(const QContactId& secondId); + QContactId second() const; /* Results */ QList relationships() const; signals: - void progress(QContactRelationshipFetchRequest* self, bool appendOnly); + void progress(QContactRelationshipFetchRequest* self, bool appendOnly); // deprecated private: Q_DISABLE_COPY(QContactRelationshipFetchRequest) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactrelationshipremoverequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactrelationshipremoverequest.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactrelationshipremoverequest.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -51,14 +51,21 @@ to asynchronously request that certain relationships be removed from a contacts store. + For a QContactRelationshipRemoveRequest, the resultsUpdated() signal will be emitted when + the individual item errors (which may be retrieved by calling errorMap()) are updated, or if the overall + operation error (which may be retrieved by calling error()) is updated. + \ingroup contacts-requests */ /*! - * \fn QContactRelationshipRemoveRequest::progress(QContactRelationshipRemoveRequest* self) - * This signal is emitted when some progress has been made on the request, causing either a change of - * status or an update of results, or both. It identifies which request the signal originated from - * by including a pointer to \a self. + \fn QContactRelationshipRemoveRequest::progress(QContactRelationshipRemoveRequest* self) + \internal + This signal is emitted when some progress has been made on the request, causing either a change of + status or an update of results, or both. It identifies which request the signal originated from + by including a pointer to \a self. + This signal is deprecated and will be removed once the transition period has elapsed. + Use the signals emitted by the base class, combined with \l QObject::sender(), instead. */ /*! Constructs a new relationship remove request */ @@ -72,54 +79,102 @@ { } -/*! Sets the first contact criterion of the remove request to \a firstId. - * If \a firstId is the default-constructed id, or the first contact is not set, - * the request will remove relationships involving any first contact. */ +/*! + \internal + Sets the first contact criterion of the remove request to \a firstId. + If \a firstId is the default-constructed id, or the first contact is not set, + the request will remove relationships involving any first contact. + + This function is obsolete; set the list of relationships to remove by calling setRelationships() instead. + */ void QContactRelationshipRemoveRequest::setFirst(const QContactId& firstId) { Q_D(QContactRelationshipRemoveRequest); d->m_first = firstId; } -/*! Returns the first contact criterion of the remove request */ +/*! + \internal + Returns the first contact criterion of the remove request. + This function is obsolete; retrieve the lists of relationships that will be removed by calling relationships() instead. + */ QContactId QContactRelationshipRemoveRequest::first() const { Q_D(const QContactRelationshipRemoveRequest); return d->m_first; } -/*! Sets the relationship type criterion of the remove request to \a relationshipType. - * If \a relationshipType is empty, or the relationship type is not set, - * the request will remove relationships of any type. */ +/*! + \internal + Sets the relationship type criterion of the remove request to \a relationshipType. + If \a relationshipType is empty, or the relationship type is not set, + the request will remove relationships of any type. + + This function is obsolete; set the list of relationships to remove by calling setRelationships() instead. + */ void QContactRelationshipRemoveRequest::setRelationshipType(const QString& relationshipType) { Q_D(QContactRelationshipRemoveRequest); d->m_relationshipType = relationshipType; } -/*! Returns the relationship type criterion of the fetch request */ +/*! + \internal + Returns the relationship type criterion of the fetch request. + This function is obsolete; retrieve the lists of relationships that will be removed by calling relationships() instead. + */ QString QContactRelationshipRemoveRequest::relationshipType() const { Q_D(const QContactRelationshipRemoveRequest); return d->m_relationshipType; } -/*! Sets the second contact criterion of the remove request to \a secondId. - * If \a secondId is the default-constructed id, or the second contact is not set, - * the request will remove relationships involving any second contact. */ +/*! + \internal + Sets the second contact criterion of the remove request to \a secondId. + If \a secondId is the default-constructed id, or the second contact is not set, + the request will remove relationships involving any second contact. + + This function is obsolete; set the list of relationships to remove by calling setRelationships() instead. + */ void QContactRelationshipRemoveRequest::setSecond(const QContactId& secondId) { Q_D(QContactRelationshipRemoveRequest); d->m_second = secondId; } -/*! Returns the second contact criterion of the remove request */ +/*! + \internal + Returns the second contact criterion of the remove request. + This function is obsolete; retrieve the lists of relationships that will be removed by calling relationships() instead. + */ QContactId QContactRelationshipRemoveRequest::second() const { Q_D(const QContactRelationshipRemoveRequest); return d->m_second; } +/*! Sets the list of relationships which will be removed to \a relationships */ +void QContactRelationshipRemoveRequest::setRelationships(const QList& relationships) +{ + Q_D(QContactRelationshipRemoveRequest); + d->m_relationships = relationships; +} + +/*! Returns the list of relationships which will be removed */ +QList QContactRelationshipRemoveRequest::relationships() const +{ + Q_D(const QContactRelationshipRemoveRequest); + return d->m_relationships; +} + +/*! Returns the map of input contact list indices to errors which occurred */ +QMap QContactRelationshipRemoveRequest::errorMap() const +{ + Q_D(const QContactRelationshipRemoveRequest); + return d->m_errors; +} + #include "moc_qcontactrelationshipremoverequest.cpp" QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactrelationshipremoverequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactrelationshipremoverequest.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactrelationshipremoverequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -59,17 +59,24 @@ ~QContactRelationshipRemoveRequest(); /* Selection */ - void setFirst(const QContactId& firstId); - QContactId first() const; + void Q_DECL_DEPRECATED setFirst(const QContactId& firstId); // deprecated, replaced by explicitly defined relationship list + QContactId Q_DECL_DEPRECATED first() const; // deprecated, replaced by explicitly defined relationship list + + void Q_DECL_DEPRECATED setRelationshipType(const QString& relationshipType); // deprecated, replaced by explicitly defined relationship list + QString Q_DECL_DEPRECATED relationshipType() const; // deprecated, replaced by explicitly defined relationship list - void setRelationshipType(const QString& relationshipType); - QString relationshipType() const; + void Q_DECL_DEPRECATED setSecond(const QContactId& secondId); // deprecated, replaced by explicitly defined relationship list + QContactId Q_DECL_DEPRECATED second() const; // deprecated, replaced by explicitly defined relationship list - void setSecond(const QContactId& secondId); - QContactId second() const; + void setRelationships(const QList& relationships); // replaces the above functions. + QList relationships() const; + + /* Results */ + QMap errorMap() const; + signals: - void progress(QContactRelationshipRemoveRequest* self); + void progress(QContactRelationshipRemoveRequest* self); // deprecated private: Q_DISABLE_COPY(QContactRelationshipRemoveRequest) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactrelationshipsaverequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactrelationshipsaverequest.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactrelationshipsaverequest.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -48,14 +48,23 @@ \class QContactRelationshipSaveRequest \brief The QContactRelationshipSaveRequest class allows a client to asynchronously request that certain groups be saved to a contacts store. - \ingroup contacts-requests + + For a QContactRelationshipSaveRequest, the resultsAvailable() signal will be emitted when + either the individual item errors (which may be retrieved by calling errorMap()), or the resultant + relationships (which may be retrieved by calling relationships()), are updated, as well as if + the overall operation error (which may be retrieved by calling error()) is updated. + + \ingroup contacts-requests */ /*! - * \fn QContactRelationshipSaveRequest::progress(QContactRelationshipSaveRequest* self) - * This signal is emitted when some progress has been made on the request, causing either a change of - * status or an update of results, or both. It identifies which request the signal originated from - * by including a pointer to \a self. + \fn QContactRelationshipSaveRequest::progress(QContactRelationshipSaveRequest* self) + \internal + This signal is emitted when some progress has been made on the request, causing either a change of + status or an update of results, or both. It identifies which request the signal originated from + by including a pointer to \a self. + This signal is deprecated and will be removed once the transition period has elapsed. + Use the signals emitted by the base class, combined with \l QObject::sender(), instead. */ /*! Constructs a new relationship save request */ @@ -84,6 +93,13 @@ return d->m_relationships; } +/*! Returns the map of input relationship list indices to errors which occurred */ +QMap QContactRelationshipSaveRequest::errorMap() const +{ + Q_D(const QContactRelationshipSaveRequest); + return d->m_errors; +} + #include "moc_qcontactrelationshipsaverequest.cpp" QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactrelationshipsaverequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactrelationshipsaverequest.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactrelationshipsaverequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -65,9 +65,10 @@ /* Results */ QList relationships() const; + QMap errorMap() const; signals: - void progress(QContactRelationshipSaveRequest* self); + void progress(QContactRelationshipSaveRequest* self); // deprecated private: Q_DISABLE_COPY(QContactRelationshipSaveRequest) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactremoverequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactremoverequest.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactremoverequest.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -48,14 +48,22 @@ \class QContactRemoveRequest \brief The QContactRemoveRequest class allows a client to asynchronously request that certain contacts be removed from a contacts store. - \ingroup contacts-requests + + For a QContactRemoveRequest, the resultsUpdated() signal will be emitted when + the individual item errors (which may be retrieved by calling errorMap()) are updated, or if the overall + operation error (which may be retrieved by calling error()) is updated. + + \ingroup contacts-requests */ /*! - * \fn QContactRemoveRequest::progress(QContactRemoveRequest* self) - * This signal is emitted when some progress has been made on the request, causing either a change of - * status or an update of results, or both. It identifies which request the signal originated from - * by including a pointer to \a self. + \fn QContactRemoveRequest::progress(QContactRemoveRequest* self) + \internal + This signal is emitted when some progress has been made on the request, causing either a change of + status or an update of results, or both. It identifies which request the signal originated from + by including a pointer to \a self. + This signal is deprecated and will be removed once the transition period has elapsed. + Use the signals emitted by the base class, combined with \l QObject::sender(), instead. */ /*! Constructs a new contact remove request */ @@ -69,20 +77,50 @@ { } -/*! Sets the filter which will be used to select the contacts to remove to \a filter */ +/*! + \internal + Sets the filter which will be used to select the contacts to remove to \a filter. + This function is obsolete; set the list of contacts that will be removed by calling setContactIds(). + */ void QContactRemoveRequest::setFilter(const QContactFilter& filter) { Q_D(QContactRemoveRequest); d->m_filter = filter; } -/*! Returns the filter which will be used to select the contacts to remove */ +/*! + \internal + Returns the filter which will be used to select the contacts to remove. + This function is obsolete; retrieve the list of contacts that will be removed by calling contactIds(). + */ QContactFilter QContactRemoveRequest::filter() const { Q_D(const QContactRemoveRequest); return d->m_filter; } + +/*! Sets the list of ids of contacts which will be removed to \a contactIds */ +void QContactRemoveRequest::setContactIds(const QList& contactIds) +{ + Q_D(QContactRemoveRequest); + d->m_contactIds = contactIds; +} + +/*! Returns the list of ids of contacts which will be removed */ +QList QContactRemoveRequest::contactIds() const +{ + Q_D(const QContactRemoveRequest); + return d->m_contactIds; +} + +/*! Returns the map of input contact list indices to errors which occurred */ +QMap QContactRemoveRequest::errorMap() const +{ + Q_D(const QContactRemoveRequest); + return d->m_errors; +} + #include "moc_qcontactremoverequest.cpp" QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactremoverequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactremoverequest.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactremoverequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -60,11 +60,17 @@ ~QContactRemoveRequest(); /* Selection */ - void setFilter(const QContactFilter& filter); - QContactFilter filter() const; + void Q_DECL_DEPRECATED setFilter(const QContactFilter& filter); // deprecated, replaced by explicit list of contacts to remove + QContactFilter Q_DECL_DEPRECATED filter() const; // deprecated, replaced by explicit list of contacts to remove + + void setContactIds(const QList& contactIds); // replaces the above + QList contactIds() const; + + /* Results */ + QMap errorMap() const; signals: - void progress(QContactRemoveRequest* self); + void progress(QContactRemoveRequest* self); // deprecated in week 2, removed after transition period has elapsed. private: Q_DISABLE_COPY(QContactRemoveRequest) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactrequests_p.h --- a/qtcontactsmobility/src/contacts/requests/qcontactrequests_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactrequests_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -83,6 +83,7 @@ } QList m_contacts; + QMap m_errors; }; class QContactFetchRequestPrivate : public QContactAbstractRequestPrivate @@ -126,7 +127,10 @@ return QContactAbstractRequest::ContactRemoveRequest; } - QContactFilter m_filter; + QContactFilter m_filter; // deprecated, to be removed + + QList m_contactIds; + QMap m_errors; }; class QContactLocalIdFetchRequestPrivate : public QContactAbstractRequestPrivate @@ -172,6 +176,7 @@ QString m_contactType; QStringList m_names; QMap m_definitions; + QMap m_errors; }; class QContactDetailDefinitionSaveRequestPrivate : public QContactAbstractRequestPrivate @@ -193,6 +198,7 @@ QString m_contactType; QList m_definitions; + QMap m_errors; }; class QContactDetailDefinitionRemoveRequestPrivate : public QContactAbstractRequestPrivate @@ -214,6 +220,7 @@ QString m_contactType; QStringList m_names; + QMap m_errors; }; class QContactRelationshipFetchRequestPrivate : public QContactAbstractRequestPrivate @@ -221,7 +228,7 @@ public: QContactRelationshipFetchRequestPrivate() : QContactAbstractRequestPrivate(), - m_role(QContactRelationshipFilter::Either) + m_role(QContactRelationshipFilter::Either) // deprecated { } @@ -234,11 +241,16 @@ return QContactAbstractRequest::RelationshipFetchRequest; } + // selection criteria QContactId m_first; + QContactId m_second; QString m_relationshipType; - QContactId m_participantUri; - QContactRelationshipFilter::Role m_role; + + // results QList m_relationships; + + QContactId m_participantUri; // deprecated + QContactRelationshipFilter::Role m_role; // deprecated }; class QContactRelationshipSaveRequestPrivate : public QContactAbstractRequestPrivate @@ -259,6 +271,7 @@ } QList m_relationships; + QMap m_errors; }; class QContactRelationshipRemoveRequestPrivate : public QContactAbstractRequestPrivate @@ -278,9 +291,12 @@ return QContactAbstractRequest::RelationshipRemoveRequest; } - QContactId m_first; - QContactId m_second; - QString m_relationshipType; + QContactId m_first; // deprecated, to be removed + QContactId m_second; // deprecated, to be removed + QString m_relationshipType; // deprecated, to be removed + + QList m_relationships; + QMap m_errors; }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactsaverequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactsaverequest.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactsaverequest.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -48,7 +48,13 @@ \class QContactSaveRequest \brief The QContactSaveRequest class allows a client to asynchronously request that certain contacts be saved to a contacts store. - \ingroup contacts-requests + + For a QContactSaveRequest, the resultsAvailable() signal will be emitted when + either the individual item errors (which may be retrieved by calling errorMap()), or the resultant + contacts (which may be retrieved by calling contacts()), are updated, as well as if + the overall operation error (which may be retrieved by calling error()) is updated. + + \ingroup contacts-requests */ /*! @@ -84,6 +90,13 @@ return d->m_contacts; } +/*! Returns the map of input definition list indices to errors which occurred */ +QMap QContactSaveRequest::errorMap() const +{ + Q_D(const QContactSaveRequest); + return d->m_errors; +} + #include "moc_qcontactsaverequest.cpp" QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/contacts/requests/qcontactsaverequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactsaverequest.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/contacts/requests/qcontactsaverequest.h Fri Apr 16 14:53:18 2010 +0300 @@ -64,9 +64,10 @@ /* Results */ QList contacts() const; + QMap errorMap() const; signals: - void progress(QContactSaveRequest* self); + void progress(QContactSaveRequest* self); // deprecated private: Q_DISABLE_COPY(QContactSaveRequest) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/global/global.pro --- a/qtcontactsmobility/src/global/global.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/global/global.pro Fri Apr 16 14:53:18 2010 +0300 @@ -1,4 +1,4 @@ -#for now we don't actually have anything to build +#for now we do not actually have anything to build #just ensure installation of public headers TEMPLATE = subdirs @@ -10,14 +10,16 @@ INSTALLS+= headers symbian { - deploy.path = $$EPOCROOT - exportheaders.sources = $$PUBLIC_HEADERS - exportheaders.path = epoc32/include/mw + path=$$MW_LAYER_PUBLIC_EXPORT_PATH("") - #export headers into EPOCROOT - for(header, exportheaders.sources) { - BLD_INF_RULES.prj_exports += "$$header $$deploy.path$$exportheaders.path/$$basename(header)" + exportPath=$$EPOCROOT"."$$dirname(path) + nativePath=$$replace(exportPath, /,\) + exists($$nativePath) { + } else { + system($$QMAKE_MKDIR $$nativePath) + } + + for(header, headers.files) { + BLD_INF_RULES.prj_exports += "$$header $$MW_LAYER_PUBLIC_EXPORT_PATH($$basename(header))" } } - - diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/global/qmobilityglobal.h --- a/qtcontactsmobility/src/global/qmobilityglobal.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/global/qmobilityglobal.h Fri Apr 16 14:53:18 2010 +0300 @@ -120,6 +120,11 @@ # else # define Q_SYSINFO_EXPORT Q_DECL_IMPORT # endif +# if defined(QT_BUILD_SENSORS_LIB) +# define Q_SENSORS_EXPORT Q_DECL_EXPORT +# else +# define Q_SENSORS_EXPORT Q_DECL_IMPORT +# endif # elif defined(QT_DLL) /* use a Qt DLL library */ # define Q_BEARER_EXPORT Q_DECL_IMPORT # define Q_PUBLISHSUBSCRIBE_EXPORT Q_DECL_IMPORT @@ -130,6 +135,7 @@ # define Q_MESSAGING_EXPORT Q_DECL_IMPORT # define Q_SERVICEFW_EXPORT Q_DECL_IMPORT # define Q_SYSINFO_EXPORT Q_DECL_IMPORT +# define Q_SENSORS_EXPORT Q_DECL_IMPORT # endif # else # endif @@ -144,6 +150,7 @@ # define Q_MESSAGING_EXPORT Q_DECL_EXPORT # define Q_SERVICEFW_EXPORT Q_DECL_EXPORT # define Q_SYSINFO_EXPORT Q_DECL_EXPORT +# define Q_SENSORS_EXPORT Q_DECL_EXPORT # else # define Q_BEARER_EXPORT # define Q_PUBLISHSUBSCRIBE_EXPORT @@ -154,6 +161,7 @@ # define Q_MESSAGING_EXPORT # define Q_SERVICEFW_EXPORT # define Q_SYSINFO_EXPORT +# define Q_SENSORS_EXPORT # endif # endif #endif diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/s60installs/s60installs.pro --- a/qtcontactsmobility/src/s60installs/s60installs.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/s60installs/s60installs.pro Fri Apr 16 14:53:18 2010 +0300 @@ -2,6 +2,7 @@ symbian: { load(data_caging_paths) + include($$QT_MOBILITY_BUILD_TREE/config.pri) SUBDIRS = TARGET = "QtMobility" @@ -22,7 +23,19 @@ qtmobilitydeployment.pkg_prerules += vendorinfo EPOCROOT31 = $${EPOCROOT31} + EPOCROOT32 = $${EPOCROOT32} EPOCROOT50 = $${EPOCROOT50} + + # default to EPOCROOT if EPOCROOTxy not defined + isEmpty(EPOCROOT31) { + EPOCROOT31 = $${EPOCROOT} + } + isEmpty(EPOCROOT32) { + EPOCROOT32 = $${EPOCROOT} + } + isEmpty(EPOCROOT50) { + EPOCROOT50 = $${EPOCROOT} + } qtmobilitydeployment.sources = \ $$(EPOCROOT50)epoc32/release/armv5/urel/QtMessaging.dll \ @@ -33,8 +46,9 @@ $$(EPOCROOT50)epoc32/release/armv5/urel/QtPublishSubscribe.dll \ $$(EPOCROOT50)epoc32/release/armv5/urel/PSPathMapperServer.exe \ $$(EPOCROOT50)epoc32/release/armv5/urel/QtContacts.dll \ - $$(EPOCROOT50)epoc32/release/armv5/urel/QtVersit.dll - + $$(EPOCROOT50)epoc32/release/armv5/urel/QtVersit.dll \ + $$(EPOCROOT50)epoc32/release/armv5/urel/QtMedia.dll \ + $$(EPOCROOT50)epoc32/release/armv5/urel/m3u.dll bearer = \ "IF package(0x1028315F)" \ @@ -51,19 +65,43 @@ "IF package(0x1028315F)" \ " \"$$(EPOCROOT50)epoc32/release/armv5/urel/mobapicontactspluginsymbian.dll\" - \"!:\\sys\\bin\\mobapicontactspluginsymbian.dll\"" \ "ELSEIF package(0x102752AE)" \ - " \"$$(EPOCROOT50)epoc32/release/armv5/urel/mobapicontactspluginsymbian.dll\" - \"!:\\sys\\bin\\mobapicontactspluginsymbian.dll\"" \ + " \"$$(EPOCROOT32)epoc32/release/armv5/urel/mobapicontactspluginsymbian.dll\" - \"!:\\sys\\bin\\mobapicontactspluginsymbian.dll\"" \ "ELSEIF package(0x102032BE)" \ " \"$$(EPOCROOT31)epoc32/release/armv5/urel/mobapicontactspluginsymbian.dll\" - \"!:\\sys\\bin\\mobapicontactspluginsymbian.dll\"" \ "ELSE" \ " \"$$(EPOCROOT50)epoc32/release/armv5/urel/mobapicontactspluginsymbian.dll\" - \"!:\\sys\\bin\\mobapicontactspluginsymbian.dll\"" \ "ENDIF" + multimedia = \ + "IF package(0x1028315F)" \ + " \"$$(EPOCROOT50)epoc32/release/armv5/urel/QtMobilityMultimediaEngine.dll\" - \"!:\\sys\\bin\\QtMobilityMultimediaEngine.dll\"" \ + "ELSEIF package(0x102752AE)" \ + " \"$$(EPOCROOT32)epoc32/release/armv5/urel/QtMobilityMultimediaEngine.dll\" - \"!:\\sys\\bin\\QtMobilityMultimediaEngine.dll\"" \ + "ELSEIF package(0x102032BE)" \ + " \"$$(EPOCROOT31)epoc32/release/armv5/urel/QtMobilityMultimediaEngine.dll\" - \"!:\\sys\\bin\\QtMobilityMultimediaEngine.dll\"" \ + "ELSE" \ + " \"$$(EPOCROOT50)epoc32/release/armv5/urel/QtMobilityMultimediaEngine.dll\" - \"!:\\sys\\bin\\QtMobilityMultimediaEngine.dll\"" \ + "ENDIF" + pluginstubs = \ - "\"$$QT_MOBILITY_BUILD_TREE/plugins/contacts/symbian/qmakepluginstubs/mobapicontactspluginsymbian.qtplugin\" - \"!:\\resource\\qt\\plugins\\contacts\\mobapicontactspluginsymbian.qtplugin\"" + "\"$$QT_MOBILITY_BUILD_TREE/plugins/contacts/symbian/qmakepluginstubs/mobapicontactspluginsymbian.qtplugin\" - \"!:\\resource\\qt\\plugins\\contacts\\mobapicontactspluginsymbian.qtplugin\"" \ + "\"$$QT_MOBILITY_BUILD_TREE/plugins/contacts/symbiansim/qmakepluginstubs/mobapicontactspluginsymbiansim.qtplugin\" - \"!:\\resource\\qt\\plugins\\contacts\\mobapicontactspluginsymbiansim.qtplugin\"" \ + "\"$$QT_MOBILITY_BUILD_TREE/plugins/multimedia/symbian/qmakepluginstubs/QtMobilityMultimediaEngine.qtplugin\" - \"!:\\resource\\qt\\plugins\\mediaservice\\QtMobilityMultimediaEngine.qtplugin\"" \ + "\"$$QT_MOBILITY_BUILD_TREE/plugins/multimedia/m3u/qmakepluginstubs/m3u.qtplugin\" - \"!:\\resource\\qt\\plugins\\playlistformats\\m3u.qtplugin\"" + + symbiancntsim = \ + "\"$${EPOCROOT50}epoc32/release/armv5/urel/mobapicontactspluginsymbiansim.dll\" - \"!:\\sys\\bin\\mobapicontactspluginsymbiansim.dll\"" \ + "\"$$QT_MOBILITY_BUILD_TREE/plugins/contacts/symbiansim/qmakepluginstubs/mobapicontactspluginsymbiansim.qtplugin\" - \"!:\\resource\\qt\\plugins\\contacts\\mobapicontactspluginsymbiansim.qtplugin\"" + qtmobilitydeployment.pkg_postrules += bearer qtmobilitydeployment.pkg_postrules += contacts + qtmobilitydeployment.pkg_postrules += multimedia qtmobilitydeployment.pkg_postrules += pluginstubs + + contains(symbiancntsim_enabled, yes) { + qtmobilitydeployment.pkg_postrules += symbiancntsim + } qtmobilitydeployment.path = /sys/bin diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/src.pro --- a/qtcontactsmobility/src/src.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/src.pro Fri Apr 16 14:53:18 2010 +0300 @@ -30,6 +30,7 @@ contains(mobility_modules,systeminfo): SUBDIRS += systeminfo contains(mobility_modules,versit): SUBDIRS += versit +contains(mobility_modules,sensors): SUBDIRS += sensors # Versit depends on Contacts versit.subdir=versit @@ -45,3 +46,4 @@ symbian { SUBDIRS += s60installs/s60installs.pro } + diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/bwins/QtVersitu.def --- a/qtcontactsmobility/src/versit/bwins/QtVersitu.def Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/bwins/QtVersitu.def Fri Apr 16 14:53:18 2010 +0300 @@ -1,192 +1,127 @@ EXPORTS - ?metaObject@QVersitContactExporter@QtMobility@@UBEPBUQMetaObject@@XZ @ 1 NONAME ; struct QMetaObject const * QtMobility::QVersitContactExporter::metaObject(void) const - ?setVersionFromProperty@QVersitReaderPrivate@QtMobility@@QBE_NAAVQVersitDocument@2@ABVQVersitProperty@2@@Z @ 2 NONAME ABSENT ; bool QtMobility::QVersitReaderPrivate::setVersionFromProperty(class QtMobility::QVersitDocument &, class QtMobility::QVersitProperty const &) const - ?getStaticMetaObject@QVersitContactExporter@QtMobility@@SAABUQMetaObject@@XZ @ 3 NONAME ; struct QMetaObject const & QtMobility::QVersitContactExporter::getStaticMetaObject(void) - ?audioClipPath@QVersitContactImporter@QtMobility@@QBE?AVQString@@XZ @ 4 NONAME ; class QString QtMobility::QVersitContactImporter::audioClipPath(void) const - ?trUtf8@QVersitWriter@QtMobility@@SA?AVQString@@PBD0H@Z @ 5 NONAME ; class QString QtMobility::QVersitWriter::trUtf8(char const *, char const *, int) - ?encodeParameters@QVCard21Writer@QtMobility@@MBE?AVQByteArray@@ABV?$QMultiHash@VQString@@V1@@@@Z @ 6 NONAME ABSENT ; class QByteArray QtMobility::QVCard21Writer::encodeParameters(class QMultiHash const &) const - ??_EQVersitReaderPrivate@QtMobility@@UAE@I@Z @ 7 NONAME ABSENT ; QtMobility::QVersitReaderPrivate::~QVersitReaderPrivate(unsigned int) - ??1QVCard21Writer@QtMobility@@UAE@XZ @ 8 NONAME ABSENT ; QtMobility::QVCard21Writer::~QVCard21Writer(void) - ?metaObject@QVersitReader@QtMobility@@UBEPBUQMetaObject@@XZ @ 9 NONAME ; struct QMetaObject const * QtMobility::QVersitReader::metaObject(void) const - ?encodeGeoLocation@QVersitContactExporterPrivate@QtMobility@@IAEXAAVQVersitProperty@2@ABVQContactDetail@2@@Z @ 10 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::encodeGeoLocation(class QtMobility::QVersitProperty &, class QtMobility::QContactDetail const &) - ??_EQVersitReader@QtMobility@@UAE@I@Z @ 11 NONAME ; QtMobility::QVersitReader::~QVersitReader(unsigned int) - ?staticMetaObject@QVersitWriterPrivate@QtMobility@@2UQMetaObject@@B @ 12 NONAME ABSENT ; struct QMetaObject const QtMobility::QVersitWriterPrivate::staticMetaObject - ?scale@QVersitContactExporterPrivate@QtMobility@@IAEXABVQString@@AAVQByteArray@@@Z @ 13 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::scale(class QString const &, class QByteArray &) - ?encodeDisplayLabel@QVersitContactExporterPrivate@QtMobility@@IAE_NAAVQVersitProperty@2@ABVQContactDetail@2@ABVQContact@2@@Z @ 14 NONAME ABSENT ; bool QtMobility::QVersitContactExporterPrivate::encodeDisplayLabel(class QtMobility::QVersitProperty &, class QtMobility::QContactDetail const &, class QtMobility::QContact const &) - ?trUtf8@QVersitReaderPrivate@QtMobility@@SA?AVQString@@PBD0@Z @ 15 NONAME ABSENT ; class QString QtMobility::QVersitReaderPrivate::trUtf8(char const *, char const *) - ?parseVCard21Property@QVersitReaderPrivate@QtMobility@@QAEXAAVQByteArray@@AAVQVersitProperty@2@@Z @ 16 NONAME ABSENT ; void QtMobility::QVersitReaderPrivate::parseVCard21Property(class QByteArray &, class QtMobility::QVersitProperty &) - ?encodeNickname@QVersitContactExporterPrivate@QtMobility@@IAEXAAVQVersitDocument@2@ABVQContactDetail@2@@Z @ 17 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::encodeNickname(class QtMobility::QVersitDocument &, class QtMobility::QContactDetail const &) - ??1QVersitDocument@QtMobility@@QAE@XZ @ 18 NONAME ; QtMobility::QVersitDocument::~QVersitDocument(void) - ?scale@QVersitContactExporter@QtMobility@@IAEXABVQString@@AAVQByteArray@@@Z @ 19 NONAME ; void QtMobility::QVersitContactExporter::scale(class QString const &, class QByteArray &) - ?quotedPrintableEncode@QVCard21Writer@QtMobility@@IBE_NABVQVersitProperty@2@AAVQByteArray@@@Z @ 20 NONAME ABSENT ; bool QtMobility::QVCard21Writer::quotedPrintableEncode(class QtMobility::QVersitProperty const &, class QByteArray &) const - ?encodeOrganization@QVersitContactExporterPrivate@QtMobility@@IAEXAAVQVersitDocument@2@ABVQContactDetail@2@@Z @ 21 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::encodeOrganization(class QtMobility::QVersitDocument &, class QtMobility::QContactDetail const &) - ?encodeAvatar@QVersitContactExporterPrivate@QtMobility@@IAE_NAAVQVersitProperty@2@ABVQContactDetail@2@@Z @ 22 NONAME ABSENT ; bool QtMobility::QVersitContactExporterPrivate::encodeAvatar(class QtMobility::QVersitProperty &, class QtMobility::QContactDetail const &) - ?setParameters@QVersitProperty@QtMobility@@QAEXABV?$QMultiHash@VQString@@V1@@@@Z @ 23 NONAME ; void QtMobility::QVersitProperty::setParameters(class QMultiHash const &) - ?decodeQuotedPrintable@VersitUtils@QtMobility@@SAXAAVQByteArray@@@Z @ 24 NONAME ABSENT ; void QtMobility::VersitUtils::decodeQuotedPrintable(class QByteArray &) - ?qt_metacast@QVersitWriter@QtMobility@@UAEPAXPBD@Z @ 25 NONAME ; void * QtMobility::QVersitWriter::qt_metacast(char const *) - ?trUtf8@QVersitReader@QtMobility@@SA?AVQString@@PBD0H@Z @ 26 NONAME ; class QString QtMobility::QVersitReader::trUtf8(char const *, char const *, int) - ?encodeEmbeddedContent@QVersitContactExporterPrivate@QtMobility@@IAE_NABVQString@@AAVQVersitProperty@2@_N@Z @ 27 NONAME ABSENT ; bool QtMobility::QVersitContactExporterPrivate::encodeEmbeddedContent(class QString const &, class QtMobility::QVersitProperty &, bool) - ?tr@QVersitWriter@QtMobility@@SA?AVQString@@PBD0H@Z @ 28 NONAME ; class QString QtMobility::QVersitWriter::tr(char const *, char const *, int) - ??1QVersitProperty@QtMobility@@QAE@XZ @ 29 NONAME ; QtMobility::QVersitProperty::~QVersitProperty(void) - ??_EQVersitWriterPrivate@QtMobility@@UAE@I@Z @ 30 NONAME ABSENT ; QtMobility::QVersitWriterPrivate::~QVersitWriterPrivate(unsigned int) - ?setVersitDocument@QVersitWriter@QtMobility@@QAEXABVQVersitDocument@2@@Z @ 31 NONAME ; void QtMobility::QVersitWriter::setVersitDocument(class QtMobility::QVersitDocument const &) - ?getStaticMetaObject@QVersitWriterPrivate@QtMobility@@SAABUQMetaObject@@XZ @ 32 NONAME ABSENT ; struct QMetaObject const & QtMobility::QVersitWriterPrivate::getStaticMetaObject(void) - ?metaObject@QVersitWriterPrivate@QtMobility@@UBEPBUQMetaObject@@XZ @ 33 NONAME ABSENT ; struct QMetaObject const * QtMobility::QVersitWriterPrivate::metaObject(void) const - ?qt_metacast@QVersitReaderPrivate@QtMobility@@UAEPAXPBD@Z @ 34 NONAME ABSENT ; void * QtMobility::QVersitReaderPrivate::qt_metacast(char const *) - ?extractParams@VersitUtils@QtMobility@@SA?AV?$QList@VQByteArray@@@@ABVQByteArray@@@Z @ 35 NONAME ABSENT ; class QList QtMobility::VersitUtils::extractParams(class QByteArray const &) - ?qt_metacall@QVersitContactExporterPrivate@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 36 NONAME ABSENT ; int QtMobility::QVersitContactExporterPrivate::qt_metacall(enum QMetaObject::Call, int, void * *) - ?setDevice@QVersitWriter@QtMobility@@QAEXPAVQIODevice@@@Z @ 37 NONAME ; void QtMobility::QVersitWriter::setDevice(class QIODevice *) - ?extractVCard30PropertyParams@VersitUtils@QtMobility@@SA?AV?$QMultiHash@VQString@@V1@@@ABVQByteArray@@@Z @ 38 NONAME ABSENT ; class QMultiHash QtMobility::VersitUtils::extractVCard30PropertyParams(class QByteArray const &) - ??0QVersitProperty@QtMobility@@QAE@ABV01@@Z @ 39 NONAME ; QtMobility::QVersitProperty::QVersitProperty(class QtMobility::QVersitProperty const &) - ?versitDocument@QVersitWriter@QtMobility@@QBE?AVQVersitDocument@2@XZ @ 40 NONAME ; class QtMobility::QVersitDocument QtMobility::QVersitWriter::versitDocument(void) const - ?result@QVersitReader@QtMobility@@QBE?AV?$QList@VQVersitDocument@QtMobility@@@@XZ @ 41 NONAME ; class QList QtMobility::QVersitReader::result(void) const - ?encodeVersitDocument@QVersitWriterPrivate@QtMobility@@IAE?AVQByteArray@@ABVQVersitDocument@2@@Z @ 42 NONAME ABSENT ; class QByteArray QtMobility::QVersitWriterPrivate::encodeVersitDocument(class QtMobility::QVersitDocument const &) - ??0QVCard21Writer@QtMobility@@QAE@XZ @ 43 NONAME ABSENT ; QtMobility::QVCard21Writer::QVCard21Writer(void) - ?unfold@VersitUtils@QtMobility@@SA?AVQByteArray@@AAV3@@Z @ 44 NONAME ABSENT ; class QByteArray QtMobility::VersitUtils::unfold(class QByteArray &) - ?tr@QVersitWriter@QtMobility@@SA?AVQString@@PBD0@Z @ 45 NONAME ; class QString QtMobility::QVersitWriter::tr(char const *, char const *) - ?getStaticMetaObject@QVersitWriter@QtMobility@@SAABUQMetaObject@@XZ @ 46 NONAME ; struct QMetaObject const & QtMobility::QVersitWriter::getStaticMetaObject(void) - ?tr@QVersitContactExporter@QtMobility@@SA?AVQString@@PBD0H@Z @ 47 NONAME ; class QString QtMobility::QVersitContactExporter::tr(char const *, char const *, int) - ?writingDone@QVersitWriter@QtMobility@@IAEXXZ @ 48 NONAME ; void QtMobility::QVersitWriter::writingDone(void) - ?trUtf8@QVersitContactExporter@QtMobility@@SA?AVQString@@PBD0H@Z @ 49 NONAME ; class QString QtMobility::QVersitContactExporter::trUtf8(char const *, char const *, int) - ?trUtf8@QVersitContactExporter@QtMobility@@SA?AVQString@@PBD0@Z @ 50 NONAME ; class QString QtMobility::QVersitContactExporter::trUtf8(char const *, char const *) - ?removeBackSlashEscaping@VersitUtils@QtMobility@@SAXAAVQByteArray@@@Z @ 51 NONAME ABSENT ; void QtMobility::VersitUtils::removeBackSlashEscaping(class QByteArray &) - ?qt_metacast@QVersitContactExporterPrivate@QtMobility@@UAEPAXPBD@Z @ 52 NONAME ABSENT ; void * QtMobility::QVersitContactExporterPrivate::qt_metacast(char const *) - ?encodeVersitProperty@QVCard30Writer@QtMobility@@MAE?AVQByteArray@@ABVQVersitProperty@2@@Z @ 53 NONAME ABSENT ; class QByteArray QtMobility::QVCard30Writer::encodeVersitProperty(class QtMobility::QVersitProperty const &) - ?metaObject@QVersitReaderPrivate@QtMobility@@UBEPBUQMetaObject@@XZ @ 54 NONAME ABSENT ; struct QMetaObject const * QtMobility::QVersitReaderPrivate::metaObject(void) const - ?device@QVersitWriter@QtMobility@@QBEPAVQIODevice@@XZ @ 55 NONAME ; class QIODevice * QtMobility::QVersitWriter::device(void) const - ?tr@QVersitReader@QtMobility@@SA?AVQString@@PBD0H@Z @ 56 NONAME ; class QString QtMobility::QVersitReader::tr(char const *, char const *, int) - ?extractPropertyGroupsAndName@VersitUtils@QtMobility@@SA?AU?$QPair@VQStringList@@VQString@@@@ABVQByteArray@@@Z @ 57 NONAME ABSENT ; struct QPair QtMobility::VersitUtils::extractPropertyGroupsAndName(class QByteArray const &) - ?getStaticMetaObject@QVersitReaderPrivate@QtMobility@@SAABUQMetaObject@@XZ @ 58 NONAME ABSENT ; struct QMetaObject const & QtMobility::QVersitReaderPrivate::getStaticMetaObject(void) - ?encodeNote@QVersitContactExporterPrivate@QtMobility@@IAEXAAVQVersitProperty@2@ABVQContactDetail@2@@Z @ 59 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::encodeNote(class QtMobility::QVersitProperty &, class QtMobility::QContactDetail const &) - ??1QVersitContactExporter@QtMobility@@UAE@XZ @ 60 NONAME ; QtMobility::QVersitContactExporter::~QVersitContactExporter(void) - ??_EQVCard21Writer@QtMobility@@UAE@I@Z @ 61 NONAME ABSENT ; QtMobility::QVCard21Writer::~QVCard21Writer(unsigned int) - ??1QVCard30Writer@QtMobility@@UAE@XZ @ 62 NONAME ABSENT ; QtMobility::QVCard30Writer::~QVCard30Writer(void) - ?name@QVersitProperty@QtMobility@@QBE?AVQString@@XZ @ 63 NONAME ; class QString QtMobility::QVersitProperty::name(void) const - ??0QVersitWriterPrivate@QtMobility@@IAE@ABVQByteArray@@0@Z @ 64 NONAME ABSENT ; QtMobility::QVersitWriterPrivate::QVersitWriterPrivate(class QByteArray const &, class QByteArray const &) - ?qt_metacall@QVersitReader@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 65 NONAME ; int QtMobility::QVersitReader::qt_metacall(enum QMetaObject::Call, int, void * *) - ?imagePath@QVersitContactImporter@QtMobility@@QBE?AVQString@@XZ @ 66 NONAME ; class QString QtMobility::QVersitContactImporter::imagePath(void) const - ?encodeUid@QVersitContactExporterPrivate@QtMobility@@IAEXAAVQVersitProperty@2@ABVQContactDetail@2@@Z @ 67 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::encodeUid(class QtMobility::QVersitProperty &, class QtMobility::QContactDetail const &) - ??_EQVersitContactExporter@QtMobility@@UAE@I@Z @ 68 NONAME ; QtMobility::QVersitContactExporter::~QVersitContactExporter(unsigned int) - ?encodeBirthDay@QVersitContactExporterPrivate@QtMobility@@IAEXAAVQVersitProperty@2@ABVQContactDetail@2@@Z @ 69 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::encodeBirthDay(class QtMobility::QVersitProperty &, class QtMobility::QContactDetail const &) - ?removeProperties@QVersitDocument@QtMobility@@QAEXABVQString@@@Z @ 70 NONAME ; void QtMobility::QVersitDocument::removeProperties(class QString const &) - ?importContact@QVersitContactImporter@QtMobility@@QAE?AVQContact@2@ABVQVersitDocument@2@@Z @ 71 NONAME ; class QtMobility::QContact QtMobility::QVersitContactImporter::importContact(class QtMobility::QVersitDocument const &) - ?extractPart@VersitUtils@QtMobility@@SA?AVQByteArray@@ABV3@HH@Z @ 72 NONAME ABSENT ; class QByteArray QtMobility::VersitUtils::extractPart(class QByteArray const &, int, int) - ?trUtf8@QVersitContactExporterPrivate@QtMobility@@SA?AVQString@@PBD0@Z @ 73 NONAME ABSENT ; class QString QtMobility::QVersitContactExporterPrivate::trUtf8(char const *, char const *) - ?extractParts@VersitUtils@QtMobility@@SA?AV?$QList@VQByteArray@@@@ABVQByteArray@@D@Z @ 74 NONAME ABSENT ; class QList QtMobility::VersitUtils::extractParts(class QByteArray const &, char) - ?encodeParameters@QVersitContactExporterPrivate@QtMobility@@IAEXAAVQVersitProperty@2@ABVQStringList@@1@Z @ 75 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::encodeParameters(class QtMobility::QVersitProperty &, class QStringList const &, class QStringList const &) - ?removeParameter@QVersitProperty@QtMobility@@QAEXABVQString@@0@Z @ 76 NONAME ; void QtMobility::QVersitProperty::removeParameter(class QString const &, class QString const &) - ?escape@QVersitContactExporterPrivate@QtMobility@@IAE?AVQByteArray@@ABV3@@Z @ 77 NONAME ABSENT ; class QByteArray QtMobility::QVersitContactExporterPrivate::escape(class QByteArray const &) - ?unknownContactDetails@QVersitContactExporter@QtMobility@@QAE?AV?$QList@VQContactDetail@QtMobility@@@@XZ @ 78 NONAME ; class QList QtMobility::QVersitContactExporter::unknownContactDetails(void) - ?exportContact@QVersitContactExporterPrivate@QtMobility@@QAEXAAVQVersitDocument@2@ABVQContact@2@@Z @ 79 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::exportContact(class QtMobility::QVersitDocument &, class QtMobility::QContact const &) - ?backSlashEscape@VersitUtils@QtMobility@@SA_NAAVQByteArray@@@Z @ 80 NONAME ABSENT ; bool QtMobility::VersitUtils::backSlashEscape(class QByteArray &) - ?versitType@QVersitDocument@QtMobility@@QBE?AW4VersitType@12@XZ @ 81 NONAME ; enum QtMobility::QVersitDocument::VersitType QtMobility::QVersitDocument::versitType(void) const - ?encodeOnlineAccount@QVersitContactExporterPrivate@QtMobility@@IAE_NAAVQVersitProperty@2@ABVQContactDetail@2@@Z @ 82 NONAME ABSENT ; bool QtMobility::QVersitContactExporterPrivate::encodeOnlineAccount(class QtMobility::QVersitProperty &, class QtMobility::QContactDetail const &) - ?encodeName@QVersitContactExporterPrivate@QtMobility@@IAEXAAVQVersitProperty@2@ABVQContactDetail@2@@Z @ 83 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::encodeName(class QtMobility::QVersitProperty &, class QtMobility::QContactDetail const &) - ??1QVersitWriterPrivate@QtMobility@@UAE@XZ @ 84 NONAME ABSENT ; QtMobility::QVersitWriterPrivate::~QVersitWriterPrivate(void) - ??1QVersitWriter@QtMobility@@UAE@XZ @ 85 NONAME ; QtMobility::QVersitWriter::~QVersitWriter(void) - ?setGroups@QVersitProperty@QtMobility@@QAEXABVQStringList@@@Z @ 86 NONAME ; void QtMobility::QVersitProperty::setGroups(class QStringList const &) - ??0QVCard30Writer@QtMobility@@QAE@XZ @ 87 NONAME ABSENT ; QtMobility::QVCard30Writer::QVCard30Writer(void) - ?setEmbeddedDocument@QVersitProperty@QtMobility@@QAEXABVQVersitDocument@2@@Z @ 88 NONAME ; void QtMobility::QVersitProperty::setEmbeddedDocument(class QtMobility::QVersitDocument const &) - ?paramValue@VersitUtils@QtMobility@@SA?AVQByteArray@@ABV3@@Z @ 89 NONAME ABSENT ; class QByteArray QtMobility::VersitUtils::paramValue(class QByteArray const &) - ?encodeRev@QVersitContactExporterPrivate@QtMobility@@IAE_NAAVQVersitProperty@2@ABVQContactDetail@2@@Z @ 90 NONAME ABSENT ; bool QtMobility::QVersitContactExporterPrivate::encodeRev(class QtMobility::QVersitProperty &, class QtMobility::QContactDetail const &) - ?setImagePath@QVersitContactImporter@QtMobility@@QAEXABVQString@@@Z @ 91 NONAME ; void QtMobility::QVersitContactImporter::setImagePath(class QString const &) - ?groups@QVersitProperty@QtMobility@@QBE?AVQStringList@@XZ @ 92 NONAME ; class QStringList QtMobility::QVersitProperty::groups(void) const - ?setValue@QVersitProperty@QtMobility@@QAEXABVQByteArray@@@Z @ 93 NONAME ; void QtMobility::QVersitProperty::setValue(class QByteArray const &) - ??0QVersitDocument@QtMobility@@QAE@ABV01@@Z @ 94 NONAME ; QtMobility::QVersitDocument::QVersitDocument(class QtMobility::QVersitDocument const &) - ?tr@QVersitContactExporterPrivate@QtMobility@@SA?AVQString@@PBD0H@Z @ 95 NONAME ABSENT ; class QString QtMobility::QVersitContactExporterPrivate::tr(char const *, char const *, int) - ?isValidRemoteUrl@QVersitContactExporterPrivate@QtMobility@@IAE_NABVQString@@@Z @ 96 NONAME ABSENT ; bool QtMobility::QVersitContactExporterPrivate::isValidRemoteUrl(class QString const &) - ?tr@QVersitWriterPrivate@QtMobility@@SA?AVQString@@PBD0@Z @ 97 NONAME ABSENT ; class QString QtMobility::QVersitWriterPrivate::tr(char const *, char const *) - ?writeAll@QVersitWriter@QtMobility@@QAE_NXZ @ 98 NONAME ; bool QtMobility::QVersitWriter::writeAll(void) - ?run@QVersitWriterPrivate@QtMobility@@MAEXXZ @ 99 NONAME ABSENT ; void QtMobility::QVersitWriterPrivate::run(void) - ?encodeAddress@QVersitContactExporterPrivate@QtMobility@@IAEXAAVQVersitProperty@2@ABVQContactDetail@2@@Z @ 100 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::encodeAddress(class QtMobility::QVersitProperty &, class QtMobility::QContactDetail const &) - ?tr@QVersitContactExporterPrivate@QtMobility@@SA?AVQString@@PBD0@Z @ 101 NONAME ABSENT ; class QString QtMobility::QVersitContactExporterPrivate::tr(char const *, char const *) - ?getStaticMetaObject@QVersitContactExporterPrivate@QtMobility@@SAABUQMetaObject@@XZ @ 102 NONAME ABSENT ; struct QMetaObject const & QtMobility::QVersitContactExporterPrivate::getStaticMetaObject(void) - ?trUtf8@QVersitWriter@QtMobility@@SA?AVQString@@PBD0@Z @ 103 NONAME ; class QString QtMobility::QVersitWriter::trUtf8(char const *, char const *) - ?findHardLineBreakInQuotedPrintable@VersitUtils@QtMobility@@SAHABVQByteArray@@@Z @ 104 NONAME ABSENT ; int QtMobility::VersitUtils::findHardLineBreakInQuotedPrintable(class QByteArray const &) - ??0QVersitDocument@QtMobility@@QAE@XZ @ 105 NONAME ; QtMobility::QVersitDocument::QVersitDocument(void) - ?setDevice@QVersitReader@QtMobility@@QAEXPAVQIODevice@@@Z @ 106 NONAME ; void QtMobility::QVersitReader::setDevice(class QIODevice *) - ?tr@QVersitReader@QtMobility@@SA?AVQString@@PBD0@Z @ 107 NONAME ; class QString QtMobility::QVersitReader::tr(char const *, char const *) - ?exportContact@QVersitContactExporter@QtMobility@@QAE?AVQVersitDocument@2@ABVQContact@2@W4VersitType@32@@Z @ 108 NONAME ; class QtMobility::QVersitDocument QtMobility::QVersitContactExporter::exportContact(class QtMobility::QContact const &, enum QtMobility::QVersitDocument::VersitType) - ?getStaticMetaObject@QVersitReader@QtMobility@@SAABUQMetaObject@@XZ @ 109 NONAME ; struct QMetaObject const & QtMobility::QVersitReader::getStaticMetaObject(void) - ?paramName@VersitUtils@QtMobility@@SA?AVQByteArray@@ABV3@@Z @ 110 NONAME ABSENT ; class QByteArray QtMobility::VersitUtils::paramName(class QByteArray const &) - ?parseNextVersitProperty@QVersitReaderPrivate@QtMobility@@QAE?AVQVersitProperty@2@W4VersitType@QVersitDocument@2@AAVQByteArray@@@Z @ 111 NONAME ABSENT ; class QtMobility::QVersitProperty QtMobility::QVersitReaderPrivate::parseNextVersitProperty(enum QtMobility::QVersitDocument::VersitType, class QByteArray &) - ?readAll@QVersitReader@QtMobility@@QAE_NXZ @ 112 NONAME ; bool QtMobility::QVersitReader::readAll(void) - ??4QVersitDocument@QtMobility@@QAEAAV01@ABV01@@Z @ 113 NONAME ; class QtMobility::QVersitDocument & QtMobility::QVersitDocument::operator=(class QtMobility::QVersitDocument const &) - ??0QVersitReaderPrivate@QtMobility@@QAE@XZ @ 114 NONAME ABSENT ; QtMobility::QVersitReaderPrivate::QVersitReaderPrivate(void) - ?encodeVersitProperty@QVCard21Writer@QtMobility@@MAE?AVQByteArray@@ABVQVersitProperty@2@@Z @ 115 NONAME ABSENT ; class QByteArray QtMobility::QVCard21Writer::encodeVersitProperty(class QtMobility::QVersitProperty const &) - ??1QVersitContactImporter@QtMobility@@QAE@XZ @ 116 NONAME ; QtMobility::QVersitContactImporter::~QVersitContactImporter(void) - ?encodeGender@QVersitContactExporterPrivate@QtMobility@@IAEXAAVQVersitProperty@2@ABVQContactDetail@2@@Z @ 117 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::encodeGender(class QtMobility::QVersitProperty &, class QtMobility::QContactDetail const &) - ??1QVersitContactExporterPrivate@QtMobility@@UAE@XZ @ 118 NONAME ABSENT ; QtMobility::QVersitContactExporterPrivate::~QVersitContactExporterPrivate(void) - ?isReady@QVersitReaderPrivate@QtMobility@@QBE_NXZ @ 119 NONAME ABSENT ; bool QtMobility::QVersitReaderPrivate::isReady(void) const - ?qt_metacall@QVersitWriterPrivate@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 120 NONAME ABSENT ; int QtMobility::QVersitWriterPrivate::qt_metacall(enum QMetaObject::Call, int, void * *) - ?tr@QVersitContactExporter@QtMobility@@SA?AVQString@@PBD0@Z @ 121 NONAME ; class QString QtMobility::QVersitContactExporter::tr(char const *, char const *) - ??0QVersitProperty@QtMobility@@QAE@XZ @ 122 NONAME ; QtMobility::QVersitProperty::QVersitProperty(void) - ??1QVersitReader@QtMobility@@UAE@XZ @ 123 NONAME ; QtMobility::QVersitReader::~QVersitReader(void) - ?addProperty@QVersitDocument@QtMobility@@QAEXABVQVersitProperty@2@@Z @ 124 NONAME ; void QtMobility::QVersitDocument::addProperty(class QtMobility::QVersitProperty const &) - ?extractPropertyValue@VersitUtils@QtMobility@@SA?AVQByteArray@@ABV3@@Z @ 125 NONAME ABSENT ; class QByteArray QtMobility::VersitUtils::extractPropertyValue(class QByteArray const &) - ?tr@QVersitReaderPrivate@QtMobility@@SA?AVQString@@PBD0@Z @ 126 NONAME ABSENT ; class QString QtMobility::QVersitReaderPrivate::tr(char const *, char const *) - ?encodePhoneNumber@QVersitContactExporterPrivate@QtMobility@@IAEXAAVQVersitProperty@2@ABVQContactDetail@2@@Z @ 127 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::encodePhoneNumber(class QtMobility::QVersitProperty &, class QtMobility::QContactDetail const &) - ?encodeUrl@QVersitContactExporterPrivate@QtMobility@@IAEXAAVQVersitProperty@2@ABVQContactDetail@2@@Z @ 128 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::encodeUrl(class QtMobility::QVersitProperty &, class QtMobility::QContactDetail const &) - ??_EQVersitWriter@QtMobility@@UAE@I@Z @ 129 NONAME ; QtMobility::QVersitWriter::~QVersitWriter(unsigned int) - ?encodeEmail@QVersitContactExporterPrivate@QtMobility@@IAEXAAVQVersitProperty@2@ABVQContactDetail@2@@Z @ 130 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::encodeEmail(class QtMobility::QVersitProperty &, class QtMobility::QContactDetail const &) - ?staticMetaObject@QVersitWriter@QtMobility@@2UQMetaObject@@B @ 131 NONAME ; struct QMetaObject const QtMobility::QVersitWriter::staticMetaObject - ?properties@QVersitDocument@QtMobility@@QBE?AV?$QList@VQVersitProperty@QtMobility@@@@XZ @ 132 NONAME ; class QList QtMobility::QVersitDocument::properties(void) const - ??_EQVCard30Writer@QtMobility@@UAE@I@Z @ 133 NONAME ABSENT ; QtMobility::QVCard30Writer::~QVCard30Writer(unsigned int) - ?countLeadingWhiteSpaces@VersitUtils@QtMobility@@SAHABVQByteArray@@H@Z @ 134 NONAME ABSENT ; int QtMobility::VersitUtils::countLeadingWhiteSpaces(class QByteArray const &, int) - ?device@QVersitReader@QtMobility@@QBEPAVQIODevice@@XZ @ 135 NONAME ; class QIODevice * QtMobility::QVersitReader::device(void) const - ?parseVCard30Property@QVersitReaderPrivate@QtMobility@@QAEXAAVQByteArray@@AAVQVersitProperty@2@@Z @ 136 NONAME ABSENT ; void QtMobility::QVersitReaderPrivate::parseVCard30Property(class QByteArray &, class QtMobility::QVersitProperty &) - ?staticMetaObject@QVersitContactExporterPrivate@QtMobility@@2UQMetaObject@@B @ 137 NONAME ABSENT ; struct QMetaObject const QtMobility::QVersitContactExporterPrivate::staticMetaObject - ?quotedPrintableEncode@VersitUtils@QtMobility@@SA_NAAVQByteArray@@@Z @ 138 NONAME ABSENT ; bool QtMobility::VersitUtils::quotedPrintableEncode(class QByteArray &) - ?staticMetaObject@QVersitContactExporter@QtMobility@@2UQMetaObject@@B @ 139 NONAME ; struct QMetaObject const QtMobility::QVersitContactExporter::staticMetaObject - ?staticMetaObject@QVersitReader@QtMobility@@2UQMetaObject@@B @ 140 NONAME ; struct QMetaObject const QtMobility::QVersitReader::staticMetaObject - ??0QVersitWriter@QtMobility@@QAE@XZ @ 141 NONAME ; QtMobility::QVersitWriter::QVersitWriter(void) - ?parseVersitDocument@QVersitReaderPrivate@QtMobility@@QAE_NAAVQByteArray@@AAVQVersitDocument@2@@Z @ 142 NONAME ABSENT ; bool QtMobility::QVersitReaderPrivate::parseVersitDocument(class QByteArray &, class QtMobility::QVersitDocument &) - ?encodeFamily@QVersitContactExporterPrivate@QtMobility@@IAE_NAAVQVersitDocument@2@ABVQContactDetail@2@@Z @ 143 NONAME ABSENT ; bool QtMobility::QVersitContactExporterPrivate::encodeFamily(class QtMobility::QVersitDocument &, class QtMobility::QContactDetail const &) - ?isReady@QVersitWriterPrivate@QtMobility@@QBE_NXZ @ 144 NONAME ABSENT ; bool QtMobility::QVersitWriterPrivate::isReady(void) const - ?encodeGroupsAndName@QVersitWriterPrivate@QtMobility@@IBE?AVQByteArray@@ABVQVersitProperty@2@@Z @ 145 NONAME ABSENT ; class QByteArray QtMobility::QVersitWriterPrivate::encodeGroupsAndName(class QtMobility::QVersitProperty const &) const - ?qt_metacall@QVersitReaderPrivate@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 146 NONAME ABSENT ; int QtMobility::QVersitReaderPrivate::qt_metacall(enum QMetaObject::Call, int, void * *) - ??_EQVersitContactExporterPrivate@QtMobility@@UAE@I@Z @ 147 NONAME ABSENT ; QtMobility::QVersitContactExporterPrivate::~QVersitContactExporterPrivate(unsigned int) - ??4QVersitProperty@QtMobility@@QAEAAV01@ABV01@@Z @ 148 NONAME ; class QtMobility::QVersitProperty & QtMobility::QVersitProperty::operator=(class QtMobility::QVersitProperty const &) - ?metaObject@QVersitContactExporterPrivate@QtMobility@@UBEPBUQMetaObject@@XZ @ 149 NONAME ABSENT ; struct QMetaObject const * QtMobility::QVersitContactExporterPrivate::metaObject(void) const - ??0QVersitWriterPrivate@QtMobility@@AAE@XZ @ 150 NONAME ABSENT ; QtMobility::QVersitWriterPrivate::QVersitWriterPrivate(void) - ?startReading@QVersitReader@QtMobility@@QAE_NXZ @ 151 NONAME ; bool QtMobility::QVersitReader::startReading(void) - ?shouldBeQuotedPrintableEncoded@VersitUtils@QtMobility@@SA_ND@Z @ 152 NONAME ABSENT ; bool QtMobility::VersitUtils::shouldBeQuotedPrintableEncoded(char) - ?tr@QVersitWriterPrivate@QtMobility@@SA?AVQString@@PBD0H@Z @ 153 NONAME ABSENT ; class QString QtMobility::QVersitWriterPrivate::tr(char const *, char const *, int) - ?trUtf8@QVersitContactExporterPrivate@QtMobility@@SA?AVQString@@PBD0H@Z @ 154 NONAME ABSENT ; class QString QtMobility::QVersitContactExporterPrivate::trUtf8(char const *, char const *, int) - ?parseAgentProperty@QVersitReaderPrivate@QtMobility@@QAEXAAVQByteArray@@AAVQVersitProperty@2@@Z @ 155 NONAME ABSENT ; void QtMobility::QVersitReaderPrivate::parseAgentProperty(class QByteArray &, class QtMobility::QVersitProperty &) - ??0QVersitContactImporter@QtMobility@@QAE@XZ @ 156 NONAME ; QtMobility::QVersitContactImporter::QVersitContactImporter(void) - ?qt_metacast@QVersitContactExporter@QtMobility@@UAEPAXPBD@Z @ 157 NONAME ; void * QtMobility::QVersitContactExporter::qt_metacast(char const *) - ?value@QVersitProperty@QtMobility@@QBE?AVQByteArray@@XZ @ 158 NONAME ; class QByteArray QtMobility::QVersitProperty::value(void) const - ??0QVersitContactExporterPrivate@QtMobility@@QAE@XZ @ 159 NONAME ABSENT ; QtMobility::QVersitContactExporterPrivate::QVersitContactExporterPrivate(void) - ?startWriting@QVersitWriter@QtMobility@@QAE_NXZ @ 160 NONAME ; bool QtMobility::QVersitWriter::startWriting(void) - ?staticMetaObject@QVersitReaderPrivate@QtMobility@@2UQMetaObject@@B @ 161 NONAME ABSENT ; struct QMetaObject const QtMobility::QVersitReaderPrivate::staticMetaObject - ?setName@QVersitProperty@QtMobility@@QAEXABVQString@@@Z @ 162 NONAME ; void QtMobility::QVersitProperty::setName(class QString const &) - ?embeddedDocument@QVersitProperty@QtMobility@@QBE?AVQVersitDocument@2@XZ @ 163 NONAME ; class QtMobility::QVersitDocument QtMobility::QVersitProperty::embeddedDocument(void) const - ??1QVersitReaderPrivate@QtMobility@@UAE@XZ @ 164 NONAME ABSENT ; QtMobility::QVersitReaderPrivate::~QVersitReaderPrivate(void) - ?write@QVersitWriterPrivate@QtMobility@@QAE_NXZ @ 165 NONAME ABSENT ; bool QtMobility::QVersitWriterPrivate::write(void) - ?unknownVersitProperties@QVersitContactImporter@QtMobility@@QAE?AV?$QList@VQVersitProperty@QtMobility@@@@XZ @ 166 NONAME ; class QList QtMobility::QVersitContactImporter::unknownVersitProperties(void) - ?qt_metacast@QVersitReader@QtMobility@@UAEPAXPBD@Z @ 167 NONAME ; void * QtMobility::QVersitReader::qt_metacast(char const *) - ?qt_metacall@QVersitWriter@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 168 NONAME ; int QtMobility::QVersitWriter::qt_metacall(enum QMetaObject::Call, int, void * *) - ?readingDone@QVersitReader@QtMobility@@IAEXXZ @ 169 NONAME ; void QtMobility::QVersitReader::readingDone(void) - ?parameters@QVersitProperty@QtMobility@@QBE?AV?$QMultiHash@VQString@@V1@@@XZ @ 170 NONAME ; class QMultiHash QtMobility::QVersitProperty::parameters(void) const - ?trUtf8@QVersitWriterPrivate@QtMobility@@SA?AVQString@@PBD0H@Z @ 171 NONAME ABSENT ; class QString QtMobility::QVersitWriterPrivate::trUtf8(char const *, char const *, int) - ??0QVersitContactExporter@QtMobility@@QAE@XZ @ 172 NONAME ; QtMobility::QVersitContactExporter::QVersitContactExporter(void) - ?tr@QVersitReaderPrivate@QtMobility@@SA?AVQString@@PBD0H@Z @ 173 NONAME ABSENT ; class QString QtMobility::QVersitReaderPrivate::tr(char const *, char const *, int) - ?encodeParameters@QVCard30Writer@QtMobility@@MBE?AVQByteArray@@ABV?$QMultiHash@VQString@@V1@@@@Z @ 174 NONAME ABSENT ; class QByteArray QtMobility::QVCard30Writer::encodeParameters(class QMultiHash const &) const - ?fold@VersitUtils@QtMobility@@SA?AVQByteArray@@AAV3@H@Z @ 175 NONAME ABSENT ; class QByteArray QtMobility::VersitUtils::fold(class QByteArray &, int) - ??0QVersitReader@QtMobility@@QAE@XZ @ 176 NONAME ; QtMobility::QVersitReader::QVersitReader(void) - ?addParameter@QVersitProperty@QtMobility@@QAEXABVQString@@0@Z @ 177 NONAME ; void QtMobility::QVersitProperty::addParameter(class QString const &, class QString const &) - ?setAudioClipPath@QVersitContactImporter@QtMobility@@QAEXABVQString@@@Z @ 178 NONAME ; void QtMobility::QVersitContactImporter::setAudioClipPath(class QString const &) - ?extractVCard21PropertyParams@VersitUtils@QtMobility@@SA?AV?$QMultiHash@VQString@@V1@@@ABVQByteArray@@@Z @ 179 NONAME ABSENT ; class QMultiHash QtMobility::VersitUtils::extractVCard21PropertyParams(class QByteArray const &) - ?qt_metacast@QVersitWriterPrivate@QtMobility@@UAEPAXPBD@Z @ 180 NONAME ABSENT ; void * QtMobility::QVersitWriterPrivate::qt_metacast(char const *) - ?read@QVersitReaderPrivate@QtMobility@@QAE_NXZ @ 181 NONAME ABSENT ; bool QtMobility::QVersitReaderPrivate::read(void) - ?setVersitType@QVersitDocument@QtMobility@@QAEXW4VersitType@12@@Z @ 182 NONAME ; void QtMobility::QVersitDocument::setVersitType(enum QtMobility::QVersitDocument::VersitType) - ?run@QVersitReaderPrivate@QtMobility@@MAEXXZ @ 183 NONAME ABSENT ; void QtMobility::QVersitReaderPrivate::run(void) - ?metaObject@QVersitWriter@QtMobility@@UBEPBUQMetaObject@@XZ @ 184 NONAME ; struct QMetaObject const * QtMobility::QVersitWriter::metaObject(void) const - ?trUtf8@QVersitWriterPrivate@QtMobility@@SA?AVQString@@PBD0@Z @ 185 NONAME ABSENT ; class QString QtMobility::QVersitWriterPrivate::trUtf8(char const *, char const *) - ?trUtf8@QVersitReader@QtMobility@@SA?AVQString@@PBD0@Z @ 186 NONAME ; class QString QtMobility::QVersitReader::trUtf8(char const *, char const *) - ?setEscapedValue@QVersitContactExporterPrivate@QtMobility@@IAEXAAVQVersitProperty@2@ABVQString@@@Z @ 187 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::setEscapedValue(class QtMobility::QVersitProperty &, class QString const &) - ?qt_metacall@QVersitContactExporter@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 188 NONAME ; int QtMobility::QVersitContactExporter::qt_metacall(enum QMetaObject::Call, int, void * *) - ?trUtf8@QVersitReaderPrivate@QtMobility@@SA?AVQString@@PBD0H@Z @ 189 NONAME ABSENT ; class QString QtMobility::QVersitReaderPrivate::trUtf8(char const *, char const *, int) - ?encodeAnniversary@QVersitContactExporterPrivate@QtMobility@@IAEXAAVQVersitProperty@2@ABVQContactDetail@2@@Z @ 190 NONAME ABSENT ; void QtMobility::QVersitContactExporterPrivate::encodeAnniversary(class QtMobility::QVersitProperty &, class QtMobility::QContactDetail const &) + ?error@QVersitWriter@QtMobility@@QBE?AW4Error@12@XZ @ 1 NONAME ; enum QtMobility::QVersitWriter::Error QtMobility::QVersitWriter::error(void) const + ??0QVersitDocument@QtMobility@@QAE@ABV01@@Z @ 2 NONAME ; QtMobility::QVersitDocument::QVersitDocument(class QtMobility::QVersitDocument const &) + ?insertParameter@QVersitProperty@QtMobility@@QAEXABVQString@@0@Z @ 3 NONAME ; void QtMobility::QVersitProperty::insertParameter(class QString const &, class QString const &) + ?setResourceHandler@QVersitContactExporter@QtMobility@@QAEXPAVQVersitResourceHandler@2@@Z @ 4 NONAME ; void QtMobility::QVersitContactExporter::setResourceHandler(class QtMobility::QVersitResourceHandler *) + ??1QVersitDefaultResourceHandler@QtMobility@@UAE@XZ @ 5 NONAME ; QtMobility::QVersitDefaultResourceHandler::~QVersitDefaultResourceHandler(void) + ?audioClipPath@QVersitContactImporter@QtMobility@@QBE?AVQString@@XZ @ 6 NONAME ; class QString QtMobility::QVersitContactImporter::audioClipPath(void) const + ?waitForFinished@QVersitWriter@QtMobility@@QAE_NH@Z @ 7 NONAME ; bool QtMobility::QVersitWriter::waitForFinished(int) + ?results@QVersitReader@QtMobility@@QBE?AV?$QList@VQVersitDocument@QtMobility@@@@XZ @ 8 NONAME ; class QList QtMobility::QVersitReader::results(void) const + ?cancel@QVersitReader@QtMobility@@QAEXXZ @ 9 NONAME ; void QtMobility::QVersitReader::cancel(void) + ?trUtf8@QVersitWriter@QtMobility@@SA?AVQString@@PBD0H@Z @ 10 NONAME ; class QString QtMobility::QVersitWriter::trUtf8(char const *, char const *, int) + ?writeAll@QVersitWriter@QtMobility@@QAE_NXZ @ 11 NONAME ; bool QtMobility::QVersitWriter::writeAll(void) + ??8QVersitProperty@QtMobility@@QBE_NABV01@@Z @ 12 NONAME ; bool QtMobility::QVersitProperty::operator==(class QtMobility::QVersitProperty const &) const + ??1QVersitContactExporterDetailHandler@QtMobility@@UAE@XZ @ 13 NONAME ; QtMobility::QVersitContactExporterDetailHandler::~QVersitContactExporterDetailHandler(void) + ?metaObject@QVersitReader@QtMobility@@UBEPBUQMetaObject@@XZ @ 14 NONAME ; struct QMetaObject const * QtMobility::QVersitReader::metaObject(void) const + ?trUtf8@QVersitWriter@QtMobility@@SA?AVQString@@PBD0@Z @ 15 NONAME ; class QString QtMobility::QVersitWriter::trUtf8(char const *, char const *) + ??_EQVersitReader@QtMobility@@UAE@I@Z @ 16 NONAME ; QtMobility::QVersitReader::~QVersitReader(unsigned int) + ??0QVersitDocument@QtMobility@@QAE@XZ @ 17 NONAME ; QtMobility::QVersitDocument::QVersitDocument(void) + ?setDevice@QVersitReader@QtMobility@@QAEXPAVQIODevice@@@Z @ 18 NONAME ; void QtMobility::QVersitReader::setDevice(class QIODevice *) + ??1QVersitDocument@QtMobility@@QAE@XZ @ 19 NONAME ; QtMobility::QVersitDocument::~QVersitDocument(void) + ?tr@QVersitReader@QtMobility@@SA?AVQString@@PBD0@Z @ 20 NONAME ; class QString QtMobility::QVersitReader::tr(char const *, char const *) + ?readAll@QVersitReader@QtMobility@@QAE_NXZ @ 21 NONAME ; bool QtMobility::QVersitReader::readAll(void) + ?getStaticMetaObject@QVersitReader@QtMobility@@SAABUQMetaObject@@XZ @ 22 NONAME ; struct QMetaObject const & QtMobility::QVersitReader::getStaticMetaObject(void) + ?exportContact@QVersitContactExporter@QtMobility@@QAE?AVQVersitDocument@2@ABVQContact@2@W4VersitType@32@@Z @ 23 NONAME ; class QtMobility::QVersitDocument QtMobility::QVersitContactExporter::exportContact(class QtMobility::QContact const &, enum QtMobility::QVersitDocument::VersitType) + ??4QVersitDocument@QtMobility@@QAEAAV01@ABV01@@Z @ 24 NONAME ; class QtMobility::QVersitDocument & QtMobility::QVersitDocument::operator=(class QtMobility::QVersitDocument const &) + ?setParameters@QVersitProperty@QtMobility@@QAEXABV?$QMultiHash@VQString@@V1@@@@Z @ 25 NONAME ; void QtMobility::QVersitProperty::setParameters(class QMultiHash const &) + ??1QVersitContactImporter@QtMobility@@QAE@XZ @ 26 NONAME ; QtMobility::QVersitContactImporter::~QVersitContactImporter(void) + ?qt_metacast@QVersitWriter@QtMobility@@UAEPAXPBD@Z @ 27 NONAME ; void * QtMobility::QVersitWriter::qt_metacast(char const *) + ??_EQVersitContactImporterPropertyHandler@QtMobility@@UAE@I@Z @ 28 NONAME ; QtMobility::QVersitContactImporterPropertyHandler::~QVersitContactImporterPropertyHandler(unsigned int) + ?trUtf8@QVersitReader@QtMobility@@SA?AVQString@@PBD0H@Z @ 29 NONAME ; class QString QtMobility::QVersitReader::trUtf8(char const *, char const *, int) + ??0QVersitProperty@QtMobility@@QAE@XZ @ 30 NONAME ; QtMobility::QVersitProperty::QVersitProperty(void) + ?tr@QVersitWriter@QtMobility@@SA?AVQString@@PBD0H@Z @ 31 NONAME ; class QString QtMobility::QVersitWriter::tr(char const *, char const *, int) + ?addProperty@QVersitDocument@QtMobility@@QAEXABVQVersitProperty@2@@Z @ 32 NONAME ; void QtMobility::QVersitDocument::addProperty(class QtMobility::QVersitProperty const &) + ??1QVersitReader@QtMobility@@UAE@XZ @ 33 NONAME ; QtMobility::QVersitReader::~QVersitReader(void) + ?exportContacts@QVersitContactExporter@QtMobility@@QAE?AV?$QList@VQVersitDocument@QtMobility@@@@ABV?$QList@VQContact@QtMobility@@@@W4VersitType@QVersitDocument@2@@Z @ 34 NONAME ; class QList QtMobility::QVersitContactExporter::exportContacts(class QList const &, enum QtMobility::QVersitDocument::VersitType) + ??1QVersitProperty@QtMobility@@QAE@XZ @ 35 NONAME ; QtMobility::QVersitProperty::~QVersitProperty(void) + ?setVersitDocument@QVersitWriter@QtMobility@@QAEXABVQVersitDocument@2@@Z @ 36 NONAME ; void QtMobility::QVersitWriter::setVersitDocument(class QtMobility::QVersitDocument const &) + ?resultsAvailable@QVersitReader@QtMobility@@IAEXAAV?$QList@VQVersitDocument@QtMobility@@@@@Z @ 37 NONAME ; void QtMobility::QVersitReader::resultsAvailable(class QList &) + ??_EQVersitWriter@QtMobility@@UAE@I@Z @ 38 NONAME ; QtMobility::QVersitWriter::~QVersitWriter(unsigned int) + ?stateChanged@QVersitWriter@QtMobility@@IAEXW4State@12@@Z @ 39 NONAME ; void QtMobility::QVersitWriter::stateChanged(enum QtMobility::QVersitWriter::State) + ?staticMetaObject@QVersitWriter@QtMobility@@2UQMetaObject@@B @ 40 NONAME ; struct QMetaObject const QtMobility::QVersitWriter::staticMetaObject + ?setValue@QVersitProperty@QtMobility@@QAEXABVQVariant@@@Z @ 41 NONAME ; void QtMobility::QVersitProperty::setValue(class QVariant const &) + ?removeParameters@QVersitProperty@QtMobility@@QAEXABVQString@@@Z @ 42 NONAME ; void QtMobility::QVersitProperty::removeParameters(class QString const &) + ?properties@QVersitDocument@QtMobility@@QBE?AV?$QList@VQVersitProperty@QtMobility@@@@XZ @ 43 NONAME ; class QList QtMobility::QVersitDocument::properties(void) const + ?setDevice@QVersitWriter@QtMobility@@QAEXPAVQIODevice@@@Z @ 44 NONAME ; void QtMobility::QVersitWriter::setDevice(class QIODevice *) + ?device@QVersitReader@QtMobility@@QBEPAVQIODevice@@XZ @ 45 NONAME ; class QIODevice * QtMobility::QVersitReader::device(void) const + ??1QVersitResourceHandler@QtMobility@@UAE@XZ @ 46 NONAME ; QtMobility::QVersitResourceHandler::~QVersitResourceHandler(void) + ??0QVersitProperty@QtMobility@@QAE@ABV01@@Z @ 47 NONAME ; QtMobility::QVersitProperty::QVersitProperty(class QtMobility::QVersitProperty const &) + ??1QVersitContactExporter@QtMobility@@QAE@XZ @ 48 NONAME ; QtMobility::QVersitContactExporter::~QVersitContactExporter(void) + ?versitDocument@QVersitWriter@QtMobility@@QBE?AVQVersitDocument@2@XZ @ 49 NONAME ; class QtMobility::QVersitDocument QtMobility::QVersitWriter::versitDocument(void) const + ?result@QVersitReader@QtMobility@@QBE?AV?$QList@VQVersitDocument@QtMobility@@@@XZ @ 50 NONAME ; class QList QtMobility::QVersitReader::result(void) const + ?variantValue@QVersitProperty@QtMobility@@QBE?AVQVariant@@XZ @ 51 NONAME ; class QVariant QtMobility::QVersitProperty::variantValue(void) const + ?tr@QVersitWriter@QtMobility@@SA?AVQString@@PBD0@Z @ 52 NONAME ; class QString QtMobility::QVersitWriter::tr(char const *, char const *) + ?removeProperty@QVersitDocument@QtMobility@@QAEXABVQVersitProperty@2@@Z @ 53 NONAME ; void QtMobility::QVersitDocument::removeProperty(class QtMobility::QVersitProperty const &) + ?getStaticMetaObject@QVersitWriter@QtMobility@@SAABUQMetaObject@@XZ @ 54 NONAME ; struct QMetaObject const & QtMobility::QVersitWriter::getStaticMetaObject(void) + ?saveResource@QVersitDefaultResourceHandler@QtMobility@@UAE_NABVQByteArray@@ABVQVersitProperty@2@PAVQString@@@Z @ 55 NONAME ; bool QtMobility::QVersitDefaultResourceHandler::saveResource(class QByteArray const &, class QtMobility::QVersitProperty const &, class QString *) + ?error@QVersitReader@QtMobility@@QBE?AW4Error@12@XZ @ 56 NONAME ; enum QtMobility::QVersitReader::Error QtMobility::QVersitReader::error(void) const + ?propertyHandler@QVersitContactImporter@QtMobility@@QBEPAVQVersitContactImporterPropertyHandler@2@XZ @ 57 NONAME ; class QtMobility::QVersitContactImporterPropertyHandler * QtMobility::QVersitContactImporter::propertyHandler(void) const + ?staticMetaObject@QVersitReader@QtMobility@@2UQMetaObject@@B @ 58 NONAME ; struct QMetaObject const QtMobility::QVersitReader::staticMetaObject + ??0QVersitDefaultResourceHandler@QtMobility@@QAE@XZ @ 59 NONAME ; QtMobility::QVersitDefaultResourceHandler::QVersitDefaultResourceHandler(void) + ??0QVersitWriter@QtMobility@@QAE@XZ @ 60 NONAME ; QtMobility::QVersitWriter::QVersitWriter(void) + ??9QVersitDocument@QtMobility@@QBE_NABV01@@Z @ 61 NONAME ; bool QtMobility::QVersitDocument::operator!=(class QtMobility::QVersitDocument const &) const + ?type@QVersitDocument@QtMobility@@QBE?AW4VersitType@12@XZ @ 62 NONAME ; enum QtMobility::QVersitDocument::VersitType QtMobility::QVersitDocument::type(void) const + ?device@QVersitWriter@QtMobility@@QBEPAVQIODevice@@XZ @ 63 NONAME ; class QIODevice * QtMobility::QVersitWriter::device(void) const + ?tr@QVersitReader@QtMobility@@SA?AVQString@@PBD0H@Z @ 64 NONAME ; class QString QtMobility::QVersitReader::tr(char const *, char const *, int) + ?state@QVersitWriter@QtMobility@@QBE?AW4State@12@XZ @ 65 NONAME ; enum QtMobility::QVersitWriter::State QtMobility::QVersitWriter::state(void) const + ?resourceHandler@QVersitContactImporter@QtMobility@@QBEPAVQVersitResourceHandler@2@XZ @ 66 NONAME ; class QtMobility::QVersitResourceHandler * QtMobility::QVersitContactImporter::resourceHandler(void) const + ?isEmpty@QVersitProperty@QtMobility@@QBE_NXZ @ 67 NONAME ; bool QtMobility::QVersitProperty::isEmpty(void) const + ?defaultCodec@QVersitReader@QtMobility@@QBEPAVQTextCodec@@XZ @ 68 NONAME ; class QTextCodec * QtMobility::QVersitReader::defaultCodec(void) const + ??4QVersitProperty@QtMobility@@QAEAAV01@ABV01@@Z @ 69 NONAME ; class QtMobility::QVersitProperty & QtMobility::QVersitProperty::operator=(class QtMobility::QVersitProperty const &) + ?name@QVersitProperty@QtMobility@@QBE?AVQString@@XZ @ 70 NONAME ; class QString QtMobility::QVersitProperty::name(void) const + ?qt_metacall@QVersitReader@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 71 NONAME ; int QtMobility::QVersitReader::qt_metacall(enum QMetaObject::Call, int, void * *) + ?startReading@QVersitReader@QtMobility@@QAE_NXZ @ 72 NONAME ; bool QtMobility::QVersitReader::startReading(void) + ?imagePath@QVersitContactImporter@QtMobility@@QBE?AVQString@@XZ @ 73 NONAME ; class QString QtMobility::QVersitContactImporter::imagePath(void) const + ?clear@QVersitDocument@QtMobility@@QAEXXZ @ 74 NONAME ; void QtMobility::QVersitDocument::clear(void) + ?detailHandler@QVersitContactExporter@QtMobility@@QBEPAVQVersitContactExporterDetailHandler@2@XZ @ 75 NONAME ; class QtMobility::QVersitContactExporterDetailHandler * QtMobility::QVersitContactExporter::detailHandler(void) const + ?isEmpty@QVersitDocument@QtMobility@@QBE_NXZ @ 76 NONAME ; bool QtMobility::QVersitDocument::isEmpty(void) const + ??9QVersitProperty@QtMobility@@QBE_NABV01@@Z @ 77 NONAME ; bool QtMobility::QVersitProperty::operator!=(class QtMobility::QVersitProperty const &) const + ?cancel@QVersitWriter@QtMobility@@QAEXXZ @ 78 NONAME ; void QtMobility::QVersitWriter::cancel(void) + ?setDefaultCodec@QVersitWriter@QtMobility@@QAEXPAVQTextCodec@@@Z @ 79 NONAME ; void QtMobility::QVersitWriter::setDefaultCodec(class QTextCodec *) + ?resultsAvailable@QVersitReader@QtMobility@@IAEXXZ @ 80 NONAME ; void QtMobility::QVersitReader::resultsAvailable(void) + ??0QVersitContactImporter@QtMobility@@QAE@XZ @ 81 NONAME ; QtMobility::QVersitContactImporter::QVersitContactImporter(void) + ??_EQVersitDefaultResourceHandler@QtMobility@@UAE@I@Z @ 82 NONAME ; QtMobility::QVersitDefaultResourceHandler::~QVersitDefaultResourceHandler(unsigned int) + ?removeProperties@QVersitDocument@QtMobility@@QAEXABVQString@@@Z @ 83 NONAME ; void QtMobility::QVersitDocument::removeProperties(class QString const &) + ?importContact@QVersitContactImporter@QtMobility@@QAE?AVQContact@2@ABVQVersitDocument@2@@Z @ 84 NONAME ; class QtMobility::QContact QtMobility::QVersitContactImporter::importContact(class QtMobility::QVersitDocument const &) + ?startWriting@QVersitWriter@QtMobility@@QAE_NXZ @ 85 NONAME ; bool QtMobility::QVersitWriter::startWriting(void) + ?removeParameter@QVersitProperty@QtMobility@@QAEXABVQString@@0@Z @ 86 NONAME ; void QtMobility::QVersitProperty::removeParameter(class QString const &, class QString const &) + ?loadResource@QVersitDefaultResourceHandler@QtMobility@@UAE_NABVQString@@PAVQByteArray@@PAV3@@Z @ 87 NONAME ; bool QtMobility::QVersitDefaultResourceHandler::loadResource(class QString const &, class QByteArray *, class QString *) + ?setName@QVersitProperty@QtMobility@@QAEXABVQString@@@Z @ 88 NONAME ; void QtMobility::QVersitProperty::setName(class QString const &) + ?embeddedDocument@QVersitProperty@QtMobility@@QBE?AVQVersitDocument@2@XZ @ 89 NONAME ; class QtMobility::QVersitDocument QtMobility::QVersitProperty::embeddedDocument(void) const + ?setType@QVersitDocument@QtMobility@@QAEXW4VersitType@12@@Z @ 90 NONAME ; void QtMobility::QVersitDocument::setType(enum QtMobility::QVersitDocument::VersitType) + ?setDetailHandler@QVersitContactExporter@QtMobility@@QAEXPAVQVersitContactExporterDetailHandler@2@@Z @ 91 NONAME ; void QtMobility::QVersitContactExporter::setDetailHandler(class QtMobility::QVersitContactExporterDetailHandler *) + ?unknownContactDetails@QVersitContactExporter@QtMobility@@QAE?AV?$QList@VQContactDetail@QtMobility@@@@XZ @ 92 NONAME ; class QList QtMobility::QVersitContactExporter::unknownContactDetails(void) + ?unknownVersitProperties@QVersitContactImporter@QtMobility@@QAE?AV?$QList@VQVersitProperty@QtMobility@@@@XZ @ 93 NONAME ; class QList QtMobility::QVersitContactImporter::unknownVersitProperties(void) + ?qt_metacast@QVersitReader@QtMobility@@UAEPAXPBD@Z @ 94 NONAME ; void * QtMobility::QVersitReader::qt_metacast(char const *) + ??1QVersitContactImporterPropertyHandler@QtMobility@@UAE@XZ @ 95 NONAME ; QtMobility::QVersitContactImporterPropertyHandler::~QVersitContactImporterPropertyHandler(void) + ?waitForFinished@QVersitReader@QtMobility@@QAE_NH@Z @ 96 NONAME ; bool QtMobility::QVersitReader::waitForFinished(int) + ?qt_metacall@QVersitWriter@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 97 NONAME ; int QtMobility::QVersitWriter::qt_metacall(enum QMetaObject::Call, int, void * *) + ?clear@QVersitProperty@QtMobility@@QAEXXZ @ 98 NONAME ; void QtMobility::QVersitProperty::clear(void) + ?value@QVersitProperty@QtMobility@@QBE?AVQString@@XZ @ 99 NONAME ; class QString QtMobility::QVersitProperty::value(void) const + ?parameters@QVersitProperty@QtMobility@@QBE?AV?$QMultiHash@VQString@@V1@@@XZ @ 100 NONAME ; class QMultiHash QtMobility::QVersitProperty::parameters(void) const + ??0QVersitContactExporter@QtMobility@@QAE@XZ @ 101 NONAME ; QtMobility::QVersitContactExporter::QVersitContactExporter(void) + ?defaultCodec@QVersitWriter@QtMobility@@QBEPAVQTextCodec@@XZ @ 102 NONAME ; class QTextCodec * QtMobility::QVersitWriter::defaultCodec(void) const + ?versitType@QVersitDocument@QtMobility@@QBE?AW4VersitType@12@XZ @ 103 NONAME ; enum QtMobility::QVersitDocument::VersitType QtMobility::QVersitDocument::versitType(void) const + ?setPropertyHandler@QVersitContactImporter@QtMobility@@QAEXPAVQVersitContactImporterPropertyHandler@2@@Z @ 104 NONAME ; void QtMobility::QVersitContactImporter::setPropertyHandler(class QtMobility::QVersitContactImporterPropertyHandler *) + ?setResourceHandler@QVersitContactImporter@QtMobility@@QAEXPAVQVersitResourceHandler@2@@Z @ 105 NONAME ; void QtMobility::QVersitContactImporter::setResourceHandler(class QtMobility::QVersitResourceHandler *) + ??0QVersitReader@QtMobility@@QAE@XZ @ 106 NONAME ; QtMobility::QVersitReader::QVersitReader(void) + ?addParameter@QVersitProperty@QtMobility@@QAEXABVQString@@0@Z @ 107 NONAME ; void QtMobility::QVersitProperty::addParameter(class QString const &, class QString const &) + ?stateChanged@QVersitReader@QtMobility@@IAEXW4State@12@@Z @ 108 NONAME ; void QtMobility::QVersitReader::stateChanged(enum QtMobility::QVersitReader::State) + ?setAudioClipPath@QVersitContactImporter@QtMobility@@QAEXABVQString@@@Z @ 109 NONAME ; void QtMobility::QVersitContactImporter::setAudioClipPath(class QString const &) + ?resourceHandler@QVersitContactExporter@QtMobility@@QBEPAVQVersitResourceHandler@2@XZ @ 110 NONAME ; class QtMobility::QVersitResourceHandler * QtMobility::QVersitContactExporter::resourceHandler(void) const + ?setDefaultCodec@QVersitReader@QtMobility@@QAEXPAVQTextCodec@@@Z @ 111 NONAME ; void QtMobility::QVersitReader::setDefaultCodec(class QTextCodec *) + ??8QVersitDocument@QtMobility@@QBE_NABV01@@Z @ 112 NONAME ; bool QtMobility::QVersitDocument::operator==(class QtMobility::QVersitDocument const &) const + ?startWriting@QVersitWriter@QtMobility@@QAE_NABV?$QList@VQVersitDocument@QtMobility@@@@@Z @ 113 NONAME ; bool QtMobility::QVersitWriter::startWriting(class QList const &) + ??1QVersitWriter@QtMobility@@UAE@XZ @ 114 NONAME ; QtMobility::QVersitWriter::~QVersitWriter(void) + ?setVersitType@QVersitDocument@QtMobility@@QAEXW4VersitType@12@@Z @ 115 NONAME ; void QtMobility::QVersitDocument::setVersitType(enum QtMobility::QVersitDocument::VersitType) + ?setGroups@QVersitProperty@QtMobility@@QAEXABVQStringList@@@Z @ 116 NONAME ; void QtMobility::QVersitProperty::setGroups(class QStringList const &) + ?metaObject@QVersitWriter@QtMobility@@UBEPBUQMetaObject@@XZ @ 117 NONAME ; struct QMetaObject const * QtMobility::QVersitWriter::metaObject(void) const + ?setEmbeddedDocument@QVersitProperty@QtMobility@@QAEXABVQVersitDocument@2@@Z @ 118 NONAME ; void QtMobility::QVersitProperty::setEmbeddedDocument(class QtMobility::QVersitDocument const &) + ?trUtf8@QVersitReader@QtMobility@@SA?AVQString@@PBD0@Z @ 119 NONAME ; class QString QtMobility::QVersitReader::trUtf8(char const *, char const *) + ?setImagePath@QVersitContactImporter@QtMobility@@QAEXABVQString@@@Z @ 120 NONAME ; void QtMobility::QVersitContactImporter::setImagePath(class QString const &) + ?groups@QVersitProperty@QtMobility@@QBE?AVQStringList@@XZ @ 121 NONAME ; class QStringList QtMobility::QVersitProperty::groups(void) const + ??_EQVersitResourceHandler@QtMobility@@UAE@I@Z @ 122 NONAME ; QtMobility::QVersitResourceHandler::~QVersitResourceHandler(unsigned int) + ?state@QVersitReader@QtMobility@@QBE?AW4State@12@XZ @ 123 NONAME ; enum QtMobility::QVersitReader::State QtMobility::QVersitReader::state(void) const + ??_EQVersitContactExporterDetailHandler@QtMobility@@UAE@I@Z @ 124 NONAME ; QtMobility::QVersitContactExporterDetailHandler::~QVersitContactExporterDetailHandler(unsigned int) + ?importContacts@QVersitContactImporter@QtMobility@@QAE?AV?$QList@VQContact@QtMobility@@@@ABV?$QList@VQVersitDocument@QtMobility@@@@@Z @ 125 NONAME ; class QList QtMobility::QVersitContactImporter::importContacts(class QList const &) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/eabi/QtVersitu.def --- a/qtcontactsmobility/src/versit/eabi/QtVersitu.def Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/eabi/QtVersitu.def Fri Apr 16 14:53:18 2010 +0300 @@ -1,207 +1,136 @@ EXPORTS - _ZN10QtMobility11VersitUtils10paramValueERK10QByteArray @ 1 NONAME ABSENT - _ZN10QtMobility11VersitUtils11extractPartERK10QByteArrayii @ 2 NONAME ABSENT - _ZN10QtMobility11VersitUtils12extractPartsERK10QByteArrayc @ 3 NONAME ABSENT - _ZN10QtMobility11VersitUtils13extractParamsERK10QByteArray @ 4 NONAME ABSENT - _ZN10QtMobility11VersitUtils15backSlashEscapeER10QByteArray @ 5 NONAME ABSENT - _ZN10QtMobility11VersitUtils20extractPropertyValueERK10QByteArray @ 6 NONAME ABSENT - _ZN10QtMobility11VersitUtils21decodeQuotedPrintableER10QByteArray @ 7 NONAME ABSENT - _ZN10QtMobility11VersitUtils21quotedPrintableEncodeER10QByteArray @ 8 NONAME ABSENT - _ZN10QtMobility11VersitUtils23countLeadingWhiteSpacesERK10QByteArrayi @ 9 NONAME ABSENT - _ZN10QtMobility11VersitUtils23removeBackSlashEscapingER10QByteArray @ 10 NONAME ABSENT - _ZN10QtMobility11VersitUtils28extractPropertyGroupsAndNameERK10QByteArray @ 11 NONAME ABSENT - _ZN10QtMobility11VersitUtils28extractVCard21PropertyParamsERK10QByteArray @ 12 NONAME ABSENT - _ZN10QtMobility11VersitUtils28extractVCard30PropertyParamsERK10QByteArray @ 13 NONAME ABSENT - _ZN10QtMobility11VersitUtils30shouldBeQuotedPrintableEncodedEc @ 14 NONAME ABSENT - _ZN10QtMobility11VersitUtils34findHardLineBreakInQuotedPrintableERK10QByteArray @ 15 NONAME ABSENT - _ZN10QtMobility11VersitUtils4foldER10QByteArrayi @ 16 NONAME ABSENT - _ZN10QtMobility11VersitUtils6unfoldER10QByteArray @ 17 NONAME ABSENT - _ZN10QtMobility11VersitUtils9paramNameERK10QByteArray @ 18 NONAME ABSENT - _ZN10QtMobility13QVersitReader11qt_metacallEN11QMetaObject4CallEiPPv @ 19 NONAME - _ZN10QtMobility13QVersitReader11qt_metacastEPKc @ 20 NONAME - _ZN10QtMobility13QVersitReader11readingDoneEv @ 21 NONAME - _ZN10QtMobility13QVersitReader12startReadingEv @ 22 NONAME - _ZN10QtMobility13QVersitReader16staticMetaObjectE @ 23 NONAME DATA 16 - _ZN10QtMobility13QVersitReader19getStaticMetaObjectEv @ 24 NONAME - _ZN10QtMobility13QVersitReader7readAllEv @ 25 NONAME - _ZN10QtMobility13QVersitReader9setDeviceEP9QIODevice @ 26 NONAME - _ZN10QtMobility13QVersitReaderC1Ev @ 27 NONAME - _ZN10QtMobility13QVersitReaderC2Ev @ 28 NONAME - _ZN10QtMobility13QVersitReaderD0Ev @ 29 NONAME - _ZN10QtMobility13QVersitReaderD1Ev @ 30 NONAME - _ZN10QtMobility13QVersitReaderD2Ev @ 31 NONAME - _ZN10QtMobility13QVersitWriter11qt_metacallEN11QMetaObject4CallEiPPv @ 32 NONAME - _ZN10QtMobility13QVersitWriter11qt_metacastEPKc @ 33 NONAME - _ZN10QtMobility13QVersitWriter11writingDoneEv @ 34 NONAME - _ZN10QtMobility13QVersitWriter12startWritingEv @ 35 NONAME - _ZN10QtMobility13QVersitWriter16staticMetaObjectE @ 36 NONAME DATA 16 - _ZN10QtMobility13QVersitWriter17setVersitDocumentERKNS_15QVersitDocumentE @ 37 NONAME - _ZN10QtMobility13QVersitWriter19getStaticMetaObjectEv @ 38 NONAME - _ZN10QtMobility13QVersitWriter8writeAllEv @ 39 NONAME - _ZN10QtMobility13QVersitWriter9setDeviceEP9QIODevice @ 40 NONAME - _ZN10QtMobility13QVersitWriterC1Ev @ 41 NONAME - _ZN10QtMobility13QVersitWriterC2Ev @ 42 NONAME - _ZN10QtMobility13QVersitWriterD0Ev @ 43 NONAME - _ZN10QtMobility13QVersitWriterD1Ev @ 44 NONAME - _ZN10QtMobility13QVersitWriterD2Ev @ 45 NONAME - _ZN10QtMobility14QVCard21Writer20encodeVersitPropertyERKNS_15QVersitPropertyE @ 46 NONAME ABSENT - _ZN10QtMobility14QVCard21WriterC1Ev @ 47 NONAME ABSENT - _ZN10QtMobility14QVCard21WriterC2Ev @ 48 NONAME ABSENT - _ZN10QtMobility14QVCard21WriterD0Ev @ 49 NONAME ABSENT - _ZN10QtMobility14QVCard21WriterD1Ev @ 50 NONAME ABSENT - _ZN10QtMobility14QVCard21WriterD2Ev @ 51 NONAME ABSENT - _ZN10QtMobility14QVCard30Writer20encodeVersitPropertyERKNS_15QVersitPropertyE @ 52 NONAME ABSENT - _ZN10QtMobility14QVCard30WriterC1Ev @ 53 NONAME ABSENT - _ZN10QtMobility14QVCard30WriterC2Ev @ 54 NONAME ABSENT - _ZN10QtMobility14QVCard30WriterD0Ev @ 55 NONAME ABSENT - _ZN10QtMobility14QVCard30WriterD1Ev @ 56 NONAME ABSENT - _ZN10QtMobility14QVCard30WriterD2Ev @ 57 NONAME ABSENT - _ZN10QtMobility15QVersitDocument11addPropertyERKNS_15QVersitPropertyE @ 58 NONAME - _ZN10QtMobility15QVersitDocument13setVersitTypeENS0_10VersitTypeE @ 59 NONAME - _ZN10QtMobility15QVersitDocument16removePropertiesERK7QString @ 60 NONAME - _ZN10QtMobility15QVersitDocumentC1ERKS0_ @ 61 NONAME - _ZN10QtMobility15QVersitDocumentC1Ev @ 62 NONAME - _ZN10QtMobility15QVersitDocumentC2ERKS0_ @ 63 NONAME - _ZN10QtMobility15QVersitDocumentC2Ev @ 64 NONAME - _ZN10QtMobility15QVersitDocumentD1Ev @ 65 NONAME - _ZN10QtMobility15QVersitDocumentD2Ev @ 66 NONAME - _ZN10QtMobility15QVersitDocumentaSERKS0_ @ 67 NONAME - _ZN10QtMobility15QVersitProperty12addParameterERK7QStringS3_ @ 68 NONAME - _ZN10QtMobility15QVersitProperty13setParametersERK10QMultiHashI7QStringS2_E @ 69 NONAME - _ZN10QtMobility15QVersitProperty15removeParameterERK7QStringS3_ @ 70 NONAME - _ZN10QtMobility15QVersitProperty19setEmbeddedDocumentERKNS_15QVersitDocumentE @ 71 NONAME - _ZN10QtMobility15QVersitProperty7setNameERK7QString @ 72 NONAME - _ZN10QtMobility15QVersitProperty8setValueERK10QByteArray @ 73 NONAME - _ZN10QtMobility15QVersitProperty9setGroupsERK11QStringList @ 74 NONAME - _ZN10QtMobility15QVersitPropertyC1ERKS0_ @ 75 NONAME - _ZN10QtMobility15QVersitPropertyC1Ev @ 76 NONAME - _ZN10QtMobility15QVersitPropertyC2ERKS0_ @ 77 NONAME - _ZN10QtMobility15QVersitPropertyC2Ev @ 78 NONAME - _ZN10QtMobility15QVersitPropertyD1Ev @ 79 NONAME - _ZN10QtMobility15QVersitPropertyD2Ev @ 80 NONAME - _ZN10QtMobility15QVersitPropertyaSERKS0_ @ 81 NONAME - _ZN10QtMobility20QVersitReaderPrivate11qt_metacallEN11QMetaObject4CallEiPPv @ 82 NONAME ABSENT - _ZN10QtMobility20QVersitReaderPrivate11qt_metacastEPKc @ 83 NONAME ABSENT - _ZN10QtMobility20QVersitReaderPrivate16staticMetaObjectE @ 84 NONAME DATA 16 ABSENT - _ZN10QtMobility20QVersitReaderPrivate18parseAgentPropertyER10QByteArrayRNS_15QVersitPropertyE @ 85 NONAME ABSENT - _ZN10QtMobility20QVersitReaderPrivate19getStaticMetaObjectEv @ 86 NONAME ABSENT - _ZN10QtMobility20QVersitReaderPrivate19parseVersitDocumentER10QByteArrayRNS_15QVersitDocumentE @ 87 NONAME ABSENT - _ZN10QtMobility20QVersitReaderPrivate20parseVCard21PropertyER10QByteArrayRNS_15QVersitPropertyE @ 88 NONAME ABSENT - _ZN10QtMobility20QVersitReaderPrivate20parseVCard30PropertyER10QByteArrayRNS_15QVersitPropertyE @ 89 NONAME ABSENT - _ZN10QtMobility20QVersitReaderPrivate23parseNextVersitPropertyENS_15QVersitDocument10VersitTypeER10QByteArray @ 90 NONAME ABSENT - _ZN10QtMobility20QVersitReaderPrivate3runEv @ 91 NONAME ABSENT - _ZN10QtMobility20QVersitReaderPrivate4readEv @ 92 NONAME ABSENT - _ZN10QtMobility20QVersitReaderPrivateC1Ev @ 93 NONAME ABSENT - _ZN10QtMobility20QVersitReaderPrivateC2Ev @ 94 NONAME ABSENT - _ZN10QtMobility20QVersitReaderPrivateD0Ev @ 95 NONAME ABSENT - _ZN10QtMobility20QVersitReaderPrivateD1Ev @ 96 NONAME ABSENT - _ZN10QtMobility20QVersitReaderPrivateD2Ev @ 97 NONAME ABSENT - _ZN10QtMobility20QVersitWriterPrivate11qt_metacallEN11QMetaObject4CallEiPPv @ 98 NONAME ABSENT - _ZN10QtMobility20QVersitWriterPrivate11qt_metacastEPKc @ 99 NONAME ABSENT - _ZN10QtMobility20QVersitWriterPrivate16staticMetaObjectE @ 100 NONAME DATA 16 ABSENT - _ZN10QtMobility20QVersitWriterPrivate19getStaticMetaObjectEv @ 101 NONAME ABSENT - _ZN10QtMobility20QVersitWriterPrivate20encodeVersitDocumentERKNS_15QVersitDocumentE @ 102 NONAME ABSENT - _ZN10QtMobility20QVersitWriterPrivate3runEv @ 103 NONAME ABSENT - _ZN10QtMobility20QVersitWriterPrivate5writeEv @ 104 NONAME ABSENT - _ZN10QtMobility20QVersitWriterPrivateC2ERK10QByteArrayS3_ @ 105 NONAME ABSENT - _ZN10QtMobility20QVersitWriterPrivateC2Ev @ 106 NONAME ABSENT - _ZN10QtMobility20QVersitWriterPrivateD0Ev @ 107 NONAME ABSENT - _ZN10QtMobility20QVersitWriterPrivateD1Ev @ 108 NONAME ABSENT - _ZN10QtMobility20QVersitWriterPrivateD2Ev @ 109 NONAME ABSENT - _ZN10QtMobility22QVersitContactExporter11qt_metacallEN11QMetaObject4CallEiPPv @ 110 NONAME - _ZN10QtMobility22QVersitContactExporter11qt_metacastEPKc @ 111 NONAME - _ZN10QtMobility22QVersitContactExporter13exportContactERKNS_8QContactENS_15QVersitDocument10VersitTypeE @ 112 NONAME - _ZN10QtMobility22QVersitContactExporter16staticMetaObjectE @ 113 NONAME DATA 16 - _ZN10QtMobility22QVersitContactExporter19getStaticMetaObjectEv @ 114 NONAME - _ZN10QtMobility22QVersitContactExporter21unknownContactDetailsEv @ 115 NONAME - _ZN10QtMobility22QVersitContactExporter5scaleERK7QStringR10QByteArray @ 116 NONAME - _ZN10QtMobility22QVersitContactExporterC1Ev @ 117 NONAME - _ZN10QtMobility22QVersitContactExporterC2Ev @ 118 NONAME - _ZN10QtMobility22QVersitContactExporterD0Ev @ 119 NONAME - _ZN10QtMobility22QVersitContactExporterD1Ev @ 120 NONAME - _ZN10QtMobility22QVersitContactExporterD2Ev @ 121 NONAME - _ZN10QtMobility22QVersitContactImporter12setImagePathERK7QString @ 122 NONAME - _ZN10QtMobility22QVersitContactImporter13importContactERKNS_15QVersitDocumentE @ 123 NONAME - _ZN10QtMobility22QVersitContactImporter16setAudioClipPathERK7QString @ 124 NONAME - _ZN10QtMobility22QVersitContactImporter23unknownVersitPropertiesEv @ 125 NONAME - _ZN10QtMobility22QVersitContactImporterC1Ev @ 126 NONAME - _ZN10QtMobility22QVersitContactImporterC2Ev @ 127 NONAME - _ZN10QtMobility22QVersitContactImporterD1Ev @ 128 NONAME - _ZN10QtMobility22QVersitContactImporterD2Ev @ 129 NONAME - _ZN10QtMobility29QVersitContactExporterPrivate10encodeNameERNS_15QVersitPropertyERKNS_14QContactDetailE @ 130 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate10encodeNoteERNS_15QVersitPropertyERKNS_14QContactDetailE @ 131 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate11encodeEmailERNS_15QVersitPropertyERKNS_14QContactDetailE @ 132 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate11qt_metacallEN11QMetaObject4CallEiPPv @ 133 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate11qt_metacastEPKc @ 134 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate12encodeAvatarERNS_15QVersitPropertyERKNS_14QContactDetailE @ 135 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate12encodeFamilyERNS_15QVersitDocumentERKNS_14QContactDetailE @ 136 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate12encodeGenderERNS_15QVersitPropertyERKNS_14QContactDetailE @ 137 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate13encodeAddressERNS_15QVersitPropertyERKNS_14QContactDetailE @ 138 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate13exportContactERNS_15QVersitDocumentERKNS_8QContactE @ 139 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate14encodeBirthDayERNS_15QVersitPropertyERKNS_14QContactDetailE @ 140 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate14encodeNicknameERNS_15QVersitDocumentERKNS_14QContactDetailE @ 141 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate15setEscapedValueERNS_15QVersitPropertyERK7QString @ 142 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate16encodeParametersERNS_15QVersitPropertyERK11QStringListS5_ @ 143 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate16isValidRemoteUrlERK7QString @ 144 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate16staticMetaObjectE @ 145 NONAME DATA 16 ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate17encodeAnniversaryERNS_15QVersitPropertyERKNS_14QContactDetailE @ 146 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate17encodeGeoLocationERNS_15QVersitPropertyERKNS_14QContactDetailE @ 147 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate17encodePhoneNumberERNS_15QVersitPropertyERKNS_14QContactDetailE @ 148 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate18encodeDisplayLabelERNS_15QVersitPropertyERKNS_14QContactDetailERKNS_8QContactE @ 149 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate18encodeOrganizationERNS_15QVersitDocumentERKNS_14QContactDetailE @ 150 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate19encodeOnlineAccountERNS_15QVersitPropertyERKNS_14QContactDetailE @ 151 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate19getStaticMetaObjectEv @ 152 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate21encodeEmbeddedContentERK7QStringRNS_15QVersitPropertyEb @ 153 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate5scaleERK7QStringR10QByteArray @ 154 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate6escapeERK10QByteArray @ 155 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate9encodeRevERNS_15QVersitPropertyERKNS_14QContactDetailE @ 156 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate9encodeUidERNS_15QVersitPropertyERKNS_14QContactDetailE @ 157 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivate9encodeUrlERNS_15QVersitPropertyERKNS_14QContactDetailE @ 158 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivateC1Ev @ 159 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivateC2Ev @ 160 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivateD0Ev @ 161 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivateD1Ev @ 162 NONAME ABSENT - _ZN10QtMobility29QVersitContactExporterPrivateD2Ev @ 163 NONAME ABSENT - _ZNK10QtMobility13QVersitReader10metaObjectEv @ 164 NONAME - _ZNK10QtMobility13QVersitReader6deviceEv @ 165 NONAME - _ZNK10QtMobility13QVersitReader6resultEv @ 166 NONAME - _ZNK10QtMobility13QVersitWriter10metaObjectEv @ 167 NONAME - _ZNK10QtMobility13QVersitWriter14versitDocumentEv @ 168 NONAME - _ZNK10QtMobility13QVersitWriter6deviceEv @ 169 NONAME - _ZNK10QtMobility14QVCard21Writer16encodeParametersERK10QMultiHashI7QStringS2_E @ 170 NONAME ABSENT - _ZNK10QtMobility14QVCard21Writer21quotedPrintableEncodeERKNS_15QVersitPropertyER10QByteArray @ 171 NONAME ABSENT - _ZNK10QtMobility14QVCard30Writer16encodeParametersERK10QMultiHashI7QStringS2_E @ 172 NONAME ABSENT - _ZNK10QtMobility15QVersitDocument10propertiesEv @ 173 NONAME - _ZNK10QtMobility15QVersitDocument10versitTypeEv @ 174 NONAME - _ZNK10QtMobility15QVersitProperty10parametersEv @ 175 NONAME - _ZNK10QtMobility15QVersitProperty16embeddedDocumentEv @ 176 NONAME - _ZNK10QtMobility15QVersitProperty4nameEv @ 177 NONAME - _ZNK10QtMobility15QVersitProperty5valueEv @ 178 NONAME - _ZNK10QtMobility15QVersitProperty6groupsEv @ 179 NONAME - _ZNK10QtMobility20QVersitReaderPrivate10metaObjectEv @ 180 NONAME ABSENT - _ZNK10QtMobility20QVersitReaderPrivate22setVersionFromPropertyERNS_15QVersitDocumentERKNS_15QVersitPropertyE @ 181 NONAME ABSENT - _ZNK10QtMobility20QVersitReaderPrivate7isReadyEv @ 182 NONAME ABSENT - _ZNK10QtMobility20QVersitWriterPrivate10metaObjectEv @ 183 NONAME ABSENT - _ZNK10QtMobility20QVersitWriterPrivate19encodeGroupsAndNameERKNS_15QVersitPropertyE @ 184 NONAME ABSENT - _ZNK10QtMobility20QVersitWriterPrivate7isReadyEv @ 185 NONAME ABSENT - _ZNK10QtMobility22QVersitContactExporter10metaObjectEv @ 186 NONAME - _ZNK10QtMobility22QVersitContactImporter13audioClipPathEv @ 187 NONAME - _ZNK10QtMobility22QVersitContactImporter9imagePathEv @ 188 NONAME - _ZNK10QtMobility29QVersitContactExporterPrivate10metaObjectEv @ 189 NONAME ABSENT - _ZTIN10QtMobility13QVersitReaderE @ 190 NONAME - _ZTIN10QtMobility13QVersitWriterE @ 191 NONAME - _ZTIN10QtMobility14QVCard21WriterE @ 192 NONAME ABSENT - _ZTIN10QtMobility14QVCard30WriterE @ 193 NONAME ABSENT - _ZTIN10QtMobility20QVersitReaderPrivateE @ 194 NONAME ABSENT - _ZTIN10QtMobility20QVersitWriterPrivateE @ 195 NONAME ABSENT - _ZTIN10QtMobility22QVersitContactExporterE @ 196 NONAME - _ZTIN10QtMobility29QVersitContactExporterPrivateE @ 197 NONAME ABSENT - _ZTVN10QtMobility13QVersitReaderE @ 198 NONAME - _ZTVN10QtMobility13QVersitWriterE @ 199 NONAME - _ZTVN10QtMobility14QVCard21WriterE @ 200 NONAME ABSENT - _ZTVN10QtMobility14QVCard30WriterE @ 201 NONAME ABSENT - _ZTVN10QtMobility20QVersitReaderPrivateE @ 202 NONAME ABSENT - _ZTVN10QtMobility20QVersitWriterPrivateE @ 203 NONAME ABSENT - _ZTVN10QtMobility22QVersitContactExporterE @ 204 NONAME - _ZTVN10QtMobility29QVersitContactExporterPrivateE @ 205 NONAME ABSENT + _ZN10QtMobility13QVersitReader11qt_metacallEN11QMetaObject4CallEiPPv @ 1 NONAME + _ZN10QtMobility13QVersitReader11qt_metacastEPKc @ 2 NONAME + _ZN10QtMobility13QVersitReader12startReadingEv @ 3 NONAME + _ZN10QtMobility13QVersitReader12stateChangedENS0_5StateE @ 4 NONAME + _ZN10QtMobility13QVersitReader15setDefaultCodecEP10QTextCodec @ 5 NONAME + _ZN10QtMobility13QVersitReader15waitForFinishedEi @ 6 NONAME + _ZN10QtMobility13QVersitReader16resultsAvailableER5QListINS_15QVersitDocumentEE @ 7 NONAME + _ZN10QtMobility13QVersitReader16resultsAvailableEv @ 8 NONAME + _ZN10QtMobility13QVersitReader16staticMetaObjectE @ 9 NONAME DATA 16 + _ZN10QtMobility13QVersitReader19getStaticMetaObjectEv @ 10 NONAME + _ZN10QtMobility13QVersitReader6cancelEv @ 11 NONAME + _ZN10QtMobility13QVersitReader7readAllEv @ 12 NONAME + _ZN10QtMobility13QVersitReader9setDeviceEP9QIODevice @ 13 NONAME + _ZN10QtMobility13QVersitReaderC1Ev @ 14 NONAME + _ZN10QtMobility13QVersitReaderC2Ev @ 15 NONAME + _ZN10QtMobility13QVersitReaderD0Ev @ 16 NONAME + _ZN10QtMobility13QVersitReaderD1Ev @ 17 NONAME + _ZN10QtMobility13QVersitReaderD2Ev @ 18 NONAME + _ZN10QtMobility13QVersitWriter11qt_metacallEN11QMetaObject4CallEiPPv @ 19 NONAME + _ZN10QtMobility13QVersitWriter11qt_metacastEPKc @ 20 NONAME + _ZN10QtMobility13QVersitWriter12startWritingERK5QListINS_15QVersitDocumentEE @ 21 NONAME + _ZN10QtMobility13QVersitWriter12startWritingEv @ 22 NONAME + _ZN10QtMobility13QVersitWriter12stateChangedENS0_5StateE @ 23 NONAME + _ZN10QtMobility13QVersitWriter15setDefaultCodecEP10QTextCodec @ 24 NONAME + _ZN10QtMobility13QVersitWriter15waitForFinishedEi @ 25 NONAME + _ZN10QtMobility13QVersitWriter16staticMetaObjectE @ 26 NONAME DATA 16 + _ZN10QtMobility13QVersitWriter17setVersitDocumentERKNS_15QVersitDocumentE @ 27 NONAME + _ZN10QtMobility13QVersitWriter19getStaticMetaObjectEv @ 28 NONAME + _ZN10QtMobility13QVersitWriter6cancelEv @ 29 NONAME + _ZN10QtMobility13QVersitWriter8writeAllEv @ 30 NONAME + _ZN10QtMobility13QVersitWriter9setDeviceEP9QIODevice @ 31 NONAME + _ZN10QtMobility13QVersitWriterC1Ev @ 32 NONAME + _ZN10QtMobility13QVersitWriterC2Ev @ 33 NONAME + _ZN10QtMobility13QVersitWriterD0Ev @ 34 NONAME + _ZN10QtMobility13QVersitWriterD1Ev @ 35 NONAME + _ZN10QtMobility13QVersitWriterD2Ev @ 36 NONAME + _ZN10QtMobility15QVersitDocument11addPropertyERKNS_15QVersitPropertyE @ 37 NONAME + _ZN10QtMobility15QVersitDocument13setVersitTypeENS0_10VersitTypeE @ 38 NONAME + _ZN10QtMobility15QVersitDocument14removePropertyERKNS_15QVersitPropertyE @ 39 NONAME + _ZN10QtMobility15QVersitDocument16removePropertiesERK7QString @ 40 NONAME + _ZN10QtMobility15QVersitDocument5clearEv @ 41 NONAME + _ZN10QtMobility15QVersitDocument7setTypeENS0_10VersitTypeE @ 42 NONAME + _ZN10QtMobility15QVersitDocumentC1ERKS0_ @ 43 NONAME + _ZN10QtMobility15QVersitDocumentC1Ev @ 44 NONAME + _ZN10QtMobility15QVersitDocumentC2ERKS0_ @ 45 NONAME + _ZN10QtMobility15QVersitDocumentC2Ev @ 46 NONAME + _ZN10QtMobility15QVersitDocumentD1Ev @ 47 NONAME + _ZN10QtMobility15QVersitDocumentD2Ev @ 48 NONAME + _ZN10QtMobility15QVersitDocumentaSERKS0_ @ 49 NONAME + _ZN10QtMobility15QVersitProperty12addParameterERK7QStringS3_ @ 50 NONAME + _ZN10QtMobility15QVersitProperty13setParametersERK10QMultiHashI7QStringS2_E @ 51 NONAME + _ZN10QtMobility15QVersitProperty15insertParameterERK7QStringS3_ @ 52 NONAME + _ZN10QtMobility15QVersitProperty15removeParameterERK7QStringS3_ @ 53 NONAME + _ZN10QtMobility15QVersitProperty16removeParametersERK7QString @ 54 NONAME + _ZN10QtMobility15QVersitProperty19setEmbeddedDocumentERKNS_15QVersitDocumentE @ 55 NONAME + _ZN10QtMobility15QVersitProperty5clearEv @ 56 NONAME + _ZN10QtMobility15QVersitProperty7setNameERK7QString @ 57 NONAME + _ZN10QtMobility15QVersitProperty8setValueERK8QVariant @ 58 NONAME + _ZN10QtMobility15QVersitProperty9setGroupsERK11QStringList @ 59 NONAME + _ZN10QtMobility15QVersitPropertyC1ERKS0_ @ 60 NONAME + _ZN10QtMobility15QVersitPropertyC1Ev @ 61 NONAME + _ZN10QtMobility15QVersitPropertyC2ERKS0_ @ 62 NONAME + _ZN10QtMobility15QVersitPropertyC2Ev @ 63 NONAME + _ZN10QtMobility15QVersitPropertyD1Ev @ 64 NONAME + _ZN10QtMobility15QVersitPropertyD2Ev @ 65 NONAME + _ZN10QtMobility15QVersitPropertyaSERKS0_ @ 66 NONAME + _ZN10QtMobility22QVersitContactExporter13exportContactERKNS_8QContactENS_15QVersitDocument10VersitTypeE @ 67 NONAME + _ZN10QtMobility22QVersitContactExporter14exportContactsERK5QListINS_8QContactEENS_15QVersitDocument10VersitTypeE @ 68 NONAME + _ZN10QtMobility22QVersitContactExporter16setDetailHandlerEPNS_35QVersitContactExporterDetailHandlerE @ 69 NONAME + _ZN10QtMobility22QVersitContactExporter18setResourceHandlerEPNS_22QVersitResourceHandlerE @ 70 NONAME + _ZN10QtMobility22QVersitContactExporter21unknownContactDetailsEv @ 71 NONAME + _ZN10QtMobility22QVersitContactExporterC1Ev @ 72 NONAME + _ZN10QtMobility22QVersitContactExporterC2Ev @ 73 NONAME + _ZN10QtMobility22QVersitContactExporterD1Ev @ 74 NONAME + _ZN10QtMobility22QVersitContactExporterD2Ev @ 75 NONAME + _ZN10QtMobility22QVersitContactImporter12setImagePathERK7QString @ 76 NONAME + _ZN10QtMobility22QVersitContactImporter13importContactERKNS_15QVersitDocumentE @ 77 NONAME + _ZN10QtMobility22QVersitContactImporter14importContactsERK5QListINS_15QVersitDocumentEE @ 78 NONAME + _ZN10QtMobility22QVersitContactImporter16setAudioClipPathERK7QString @ 79 NONAME + _ZN10QtMobility22QVersitContactImporter18setPropertyHandlerEPNS_37QVersitContactImporterPropertyHandlerE @ 80 NONAME + _ZN10QtMobility22QVersitContactImporter18setResourceHandlerEPNS_22QVersitResourceHandlerE @ 81 NONAME + _ZN10QtMobility22QVersitContactImporter23unknownVersitPropertiesEv @ 82 NONAME + _ZN10QtMobility22QVersitContactImporterC1Ev @ 83 NONAME + _ZN10QtMobility22QVersitContactImporterC2Ev @ 84 NONAME + _ZN10QtMobility22QVersitContactImporterD1Ev @ 85 NONAME + _ZN10QtMobility22QVersitContactImporterD2Ev @ 86 NONAME + _ZN10QtMobility29QVersitDefaultResourceHandler12loadResourceERK7QStringP10QByteArrayPS1_ @ 87 NONAME + _ZN10QtMobility29QVersitDefaultResourceHandler12saveResourceERK10QByteArrayRKNS_15QVersitPropertyEP7QString @ 88 NONAME + _ZN10QtMobility29QVersitDefaultResourceHandlerC1Ev @ 89 NONAME + _ZN10QtMobility29QVersitDefaultResourceHandlerC2Ev @ 90 NONAME + _ZN10QtMobility29QVersitDefaultResourceHandlerD0Ev @ 91 NONAME + _ZN10QtMobility29QVersitDefaultResourceHandlerD1Ev @ 92 NONAME + _ZN10QtMobility29QVersitDefaultResourceHandlerD2Ev @ 93 NONAME + _ZNK10QtMobility13QVersitReader10metaObjectEv @ 94 NONAME + _ZNK10QtMobility13QVersitReader12defaultCodecEv @ 95 NONAME + _ZNK10QtMobility13QVersitReader5errorEv @ 96 NONAME + _ZNK10QtMobility13QVersitReader5stateEv @ 97 NONAME + _ZNK10QtMobility13QVersitReader6deviceEv @ 98 NONAME + _ZNK10QtMobility13QVersitReader6resultEv @ 99 NONAME + _ZNK10QtMobility13QVersitReader7resultsEv @ 100 NONAME + _ZNK10QtMobility13QVersitWriter10metaObjectEv @ 101 NONAME + _ZNK10QtMobility13QVersitWriter12defaultCodecEv @ 102 NONAME + _ZNK10QtMobility13QVersitWriter14versitDocumentEv @ 103 NONAME + _ZNK10QtMobility13QVersitWriter5errorEv @ 104 NONAME + _ZNK10QtMobility13QVersitWriter5stateEv @ 105 NONAME + _ZNK10QtMobility13QVersitWriter6deviceEv @ 106 NONAME + _ZNK10QtMobility15QVersitDocument10propertiesEv @ 107 NONAME + _ZNK10QtMobility15QVersitDocument10versitTypeEv @ 108 NONAME + _ZNK10QtMobility15QVersitDocument4typeEv @ 109 NONAME + _ZNK10QtMobility15QVersitDocument7isEmptyEv @ 110 NONAME + _ZNK10QtMobility15QVersitDocumenteqERKS0_ @ 111 NONAME + _ZNK10QtMobility15QVersitDocumentneERKS0_ @ 112 NONAME + _ZNK10QtMobility15QVersitProperty10parametersEv @ 113 NONAME + _ZNK10QtMobility15QVersitProperty12variantValueEv @ 114 NONAME + _ZNK10QtMobility15QVersitProperty16embeddedDocumentEv @ 115 NONAME + _ZNK10QtMobility15QVersitProperty4nameEv @ 116 NONAME + _ZNK10QtMobility15QVersitProperty5valueEv @ 117 NONAME + _ZNK10QtMobility15QVersitProperty6groupsEv @ 118 NONAME + _ZNK10QtMobility15QVersitProperty7isEmptyEv @ 119 NONAME + _ZNK10QtMobility15QVersitPropertyeqERKS0_ @ 120 NONAME + _ZNK10QtMobility15QVersitPropertyneERKS0_ @ 121 NONAME + _ZNK10QtMobility22QVersitContactExporter13detailHandlerEv @ 122 NONAME + _ZNK10QtMobility22QVersitContactExporter15resourceHandlerEv @ 123 NONAME + _ZNK10QtMobility22QVersitContactImporter13audioClipPathEv @ 124 NONAME + _ZNK10QtMobility22QVersitContactImporter15propertyHandlerEv @ 125 NONAME + _ZNK10QtMobility22QVersitContactImporter15resourceHandlerEv @ 126 NONAME + _ZNK10QtMobility22QVersitContactImporter9imagePathEv @ 127 NONAME + _ZTIN10QtMobility13QVersitReaderE @ 128 NONAME + _ZTIN10QtMobility13QVersitWriterE @ 129 NONAME + _ZTIN10QtMobility22QVersitResourceHandlerE @ 130 NONAME + _ZTIN10QtMobility29QVersitDefaultResourceHandlerE @ 131 NONAME + _ZTVN10QtMobility13QVersitReaderE @ 132 NONAME + _ZTVN10QtMobility13QVersitWriterE @ 133 NONAME + _ZTVN10QtMobility29QVersitDefaultResourceHandlerE @ 134 NONAME diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qvcard21writer.cpp --- a/qtcontactsmobility/src/versit/qvcard21writer.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qvcard21writer.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -43,11 +43,13 @@ #include "versitutils_p.h" #include "qmobilityglobal.h" -QTM_BEGIN_NAMESPACE +#include + +QTM_USE_NAMESPACE /*! Constructs a writer. */ QVCard21Writer::QVCard21Writer() - : QVersitWriterPrivate(QByteArray("VCARD"),QByteArray("2.1")) + : QVersitDocumentWriter(QByteArray("VCARD"),QByteArray("2.1")) { } @@ -57,87 +59,112 @@ } /*! - * Encodes the \a property to text. + * Encodes the \a property and writes it to the device. */ -QByteArray QVCard21Writer::encodeVersitProperty(const QVersitProperty& property) +void QVCard21Writer::encodeVersitProperty(const QVersitProperty& property) { - QByteArray encodedProperty(encodeGroupsAndName(property)); + encodeGroupsAndName(property); + QMultiHash parameters = property.parameters(); + QVariant variant(property.variantValue()); + + QString renderedValue; + bool useUtf8 = false; + + if (variant.type() == QVariant::String) { + QString valueString = variant.toString(); - // Quoted-Printable encode the value and add Quoted-Pritable parameter, if necessary - QByteArray value(property.value()); - bool valueQuotedPrintableEncoded = quotedPrintableEncode(property,value); - QString encoding(QString::fromAscii("ENCODING")); - QString quotedPrintable(QString::fromAscii("QUOTED-PRINTABLE")); - QMultiHash parameters = property.parameters(); - if (valueQuotedPrintableEncoded && - !parameters.contains(encoding,quotedPrintable)) { - // Add the encoding parameter to the copy, not to the actual property - parameters.insert(encoding,quotedPrintable); + // Quoted-Printable encode the value and add Quoted-Printable parameter, if necessary + if (!parameters.contains(QLatin1String("ENCODING"))) { + if (quotedPrintableEncode(valueString)) + parameters.insert(QLatin1String("ENCODING"), QLatin1String("QUOTED-PRINTABLE")); + } + + // Add the CHARSET parameter, if necessary and encode in UTF-8 later + if (!mCodec->canEncode(valueString)) { + parameters.insert(QLatin1String("CHARSET"), QLatin1String("UTF-8")); + useUtf8 = true; + } + renderedValue = valueString; + } else if (variant.type() == QVariant::ByteArray) { + parameters.insert(QLatin1String("ENCODING"), QLatin1String("BASE64")); + renderedValue = QLatin1String(variant.toByteArray().toBase64().data()); } // Encode parameters - encodedProperty.append(encodeParameters(parameters)); + encodeParameters(parameters); // Encode value - encodedProperty.append(":"); - if (property.name() == QString::fromAscii("AGENT")) { - encodedProperty.append("\r\n"); - QVersitDocument embeddedDocument = property.embeddedDocument(); - encodedProperty.append(encodeVersitDocument(embeddedDocument)); - } else { - if (parameters.contains(encoding,QString::fromAscii("BASE64"))) { - // One extra folding before the value and - // one extra line break after the value are needed in vCard 2.1 - encodedProperty += "\r\n " + value + "\r\n"; - } else { - encodedProperty += value; - } + writeString(QLatin1String(":")); + if (variant.canConvert()) { + writeCrlf(); + QVersitDocument embeddedDocument = variant.value(); + encodeVersitDocument(embeddedDocument); + } else if (variant.type() == QVariant::String) { + writeString(renderedValue, useUtf8); + } else if (variant.type() == QVariant::ByteArray) { + // One extra folding before the value and + // one extra line break after the value are needed in vCard 2.1 + writeCrlf(); + writeString(QLatin1String(" ")); + writeString(renderedValue, useUtf8); + writeCrlf(); } - encodedProperty.append("\r\n"); - - return encodedProperty; + writeCrlf(); } /*! - * Encodes the \a parameters to text. + * Encodes the \a parameters and writes it to the device. */ -QByteArray QVCard21Writer::encodeParameters( - const QMultiHash& parameters) const +void QVCard21Writer::encodeParameters(const QMultiHash& parameters) { - QByteArray encodedParameters; QList names = parameters.uniqueKeys(); foreach (QString name, names) { QStringList values = parameters.values(name); foreach (QString value, values) { - encodedParameters.append(";"); - QString typeParameterName(QString::fromAscii("TYPE")); + writeString(QLatin1String(";")); + QString typeParameterName(QLatin1String("TYPE")); if (name.length() > 0 && name != typeParameterName) { - encodedParameters.append(name.toAscii()); - encodedParameters.append("="); + writeString(name); + writeString(QLatin1String("=")); } - encodedParameters.append(value.toAscii()); + writeString(value); } } - return encodedParameters; } + + /*! - * Encodes the \a value with Quoted-Printable encoding - * if it needs to be encoded and the parameters - * of the \a property do not yet indicate encoding. + * Encodes special characters in \a text + * using Quoted-Printable encoding (RFC 1521). + * Returns true if at least one character was encoded. */ -bool QVCard21Writer::quotedPrintableEncode( - const QVersitProperty& property, - QByteArray& value) const +bool QVCard21Writer::quotedPrintableEncode(QString& text) const { bool encoded = false; - value = property.value(); - if (!property.parameters().contains(QString::fromAscii("ENCODING"))) { - encoded = VersitUtils::quotedPrintableEncode(value); + for (int i=0; i 122 && c < 256)); +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qvcard21writer_p.h --- a/qtcontactsmobility/src/versit/qvcard21writer_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qvcard21writer_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -53,21 +53,21 @@ // We mean it. // -#include "qversitwriter_p.h" +#include "qversitdocumentwriter_p.h" #include "qmobilityglobal.h" QTM_BEGIN_NAMESPACE -class Q_AUTOTEST_EXPORT QVCard21Writer : public QVersitWriterPrivate +class Q_AUTOTEST_EXPORT QVCard21Writer : public QVersitDocumentWriter { public: QVCard21Writer(); ~QVCard21Writer(); -protected: // From QVersitWriterPrivate - QByteArray encodeVersitProperty(const QVersitProperty& property); - QByteArray encodeParameters(const QMultiHash& parameters) const; - bool quotedPrintableEncode(const QVersitProperty& property, QByteArray& value) const; + void encodeVersitProperty(const QVersitProperty& property); + void encodeParameters(const QMultiHash& parameters); + bool quotedPrintableEncode(QString& text) const; + bool shouldBeQuotedPrintableEncoded(QChar chr) const; }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qvcard30writer.cpp --- a/qtcontactsmobility/src/versit/qvcard30writer.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qvcard30writer.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -41,19 +41,20 @@ #include "qvcard30writer_p.h" #include "versitutils_p.h" -#include "qversitdefs.h" #include "qmobilityglobal.h" +#include +#include -QTM_BEGIN_NAMESPACE +QTM_USE_NAMESPACE /*! Constructs a writer. */ QVCard30Writer::QVCard30Writer() - : QVersitWriterPrivate(QByteArray("VCARD"),QByteArray("3.0")) + : QVersitDocumentWriter(QByteArray("VCARD"),QByteArray("3.0")) { mPropertyNameMappings.insert( - QString::fromAscii("X-NICKNAME"),QString::fromAscii("NICKNAME")); + QLatin1String("X-NICKNAME"),QLatin1String("NICKNAME")); mPropertyNameMappings.insert( - QString::fromAscii("X-IMPP"),QString::fromAscii("IMPP")); + QLatin1String("X-IMPP"),QLatin1String("IMPP")); } /*! Destroys a writer. */ @@ -62,58 +63,63 @@ } /*! - * Encodes the \a property to text. + * Encodes the \a property and writes it to the device. */ -QByteArray QVCard30Writer::encodeVersitProperty(const QVersitProperty& property) +void QVCard30Writer::encodeVersitProperty(const QVersitProperty& property) { QVersitProperty modifiedProperty(property); QString name = mPropertyNameMappings.value(property.name(),property.name()); modifiedProperty.setName(name); - QByteArray encodedProperty(encodeGroupsAndName(modifiedProperty)); - encodedProperty.append(encodeParameters(modifiedProperty.parameters())); - encodedProperty.append(":"); - QByteArray value(modifiedProperty.value()); - if (modifiedProperty.name() == QString::fromAscii("AGENT")) { - QVersitDocument embeddedDocument = modifiedProperty.embeddedDocument(); - value = encodeVersitDocument(embeddedDocument); - VersitUtils::backSlashEscape(value); - } - encodedProperty.append(value); - encodedProperty.append("\r\n"); + encodeGroupsAndName(modifiedProperty); + + QVariant variant(modifiedProperty.variantValue()); + if (variant.type() == QVariant::ByteArray) { + modifiedProperty.insertParameter(QLatin1String("ENCODING"), QLatin1String("b")); + } + encodeParameters(modifiedProperty.parameters()); + writeString(QLatin1String(":")); - return encodedProperty; + QString value; + if (variant.canConvert()) { + QVersitDocument embeddedDocument = variant.value(); + QByteArray data; + QBuffer buffer(&data); + buffer.open(QIODevice::WriteOnly); + QVCard30Writer subWriter; + subWriter.setCodec(mCodec); + subWriter.setDevice(&buffer); + subWriter.encodeVersitDocument(embeddedDocument); + QString documentString(mCodec->toUnicode(data)); + VersitUtils::backSlashEscape(documentString); + value = documentString; + } else if (variant.type() == QVariant::String) { + value = variant.toString(); + } else if (variant.type() == QVariant::ByteArray) { + value = QLatin1String(variant.toByteArray().toBase64().data()); + } + writeString(value); + writeCrlf(); } /*! - * Encodes the \a parameters to text. + * Encodes the \a parameters and writes it to the device. */ -QByteArray QVCard30Writer::encodeParameters( - const QMultiHash& parameters) const +void QVCard30Writer::encodeParameters(const QMultiHash& parameters) { - QByteArray encodedParameters; QList names = parameters.uniqueKeys(); foreach (QString nameString, names) { - encodedParameters.append(";"); - QByteArray name = nameString.toAscii(); - VersitUtils::backSlashEscape(name); - encodedParameters.append(name); - encodedParameters.append("="); + writeString(QLatin1String(";")); QStringList values = parameters.values(nameString); + VersitUtils::backSlashEscape(nameString); + writeString(nameString); + writeString(QLatin1String("=")); for (int i=0; i 0) - encodedParameters.append(","); - QByteArray value = values.at(i).toAscii(); - // QVersitContactExporterPrivate implementation may have added - // base64 encoding parameter according to vCard 2.1. - // Convert it to vCard 3.0 compatible. - if (name == "ENCODING" && value == "BASE64") - value = "B"; + writeString(QLatin1String(",")); + QString value = values.at(i); + VersitUtils::backSlashEscape(value); - encodedParameters.append(value); + writeString(value); } } - - return encodedParameters; } - -QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qvcard30writer_p.h --- a/qtcontactsmobility/src/versit/qvcard30writer_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qvcard30writer_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -53,20 +53,19 @@ // We mean it. // -#include "qversitwriter_p.h" +#include "qversitdocumentwriter_p.h" #include "qmobilityglobal.h" QTM_BEGIN_NAMESPACE -class Q_AUTOTEST_EXPORT QVCard30Writer : public QVersitWriterPrivate +class Q_AUTOTEST_EXPORT QVCard30Writer : public QVersitDocumentWriter { public: QVCard30Writer(); ~QVCard30Writer(); -protected: // From QVersitWriterPrivate - QByteArray encodeVersitProperty(const QVersitProperty& property); - QByteArray encodeParameters(const QMultiHash& parameters) const; + void encodeVersitProperty(const QVersitProperty& property); + void encodeParameters(const QMultiHash& parameters); QHash mPropertyNameMappings; }; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitcontactexporter.cpp --- a/qtcontactsmobility/src/versit/qversitcontactexporter.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitcontactexporter.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -47,70 +47,70 @@ #include #include -QTM_BEGIN_NAMESPACE +QTM_USE_NAMESPACE /*! - \class QVersitContactExporter - - \brief The QVersitContactExporter class exports QContact(s) into QVersitDocument(s). - + \class QVersitContactExporterDetailHandler + \preliminary + \brief The QVersitContactExporterDetailHandler class is an interface for clients wishing to + implement custom export behaviour for certain contact details. \ingroup versit - If the exported QContact has some detail with an image as its value, - signal \l QVersitContactExporter::scale() is emitted and - the client can scale the image's data to the size it wishes. - The client may retrieve the list contact details - which were not exported using QVersitContactExporter::unknownContactDetails(). - - \code - - // An example of exporting a QContact: - QVersitContactExporter contactExporter; - QContact contact; - - // Create a name - QContactName name; - name.setFirst(QString::fromAscii("John")); - contact.saveDetail(&name); - - // Create an avatar type which is not supported by the exporter - QContactAvatar contactAvatar; - contactAvatar.setAvatar(QString::fromAscii("/my/image/avatar_path/texture.type")); - contactAvatar.setSubType(QContactAvatar::SubTypeTexturedMesh); - contact.saveDetail(&contactAvatar); - - // Create an organization detail with a title and a logo - QContactOrganization organization; - organization.setTitle(QString::fromAscii("Developer")); - organization.setLogo(QString::fromAscii("/my/image/logo_path/logo.jpg")); - contact.saveDetail(&organization); - - QVersitDocument versitDocument = contactExporter.exportContact(contact); - // Client will receive the signal "scale" with the logo image path - - QList unknownDetails = contactExporter.unknownContactDetails(); - - // The returned unknownDetails can be processed by the client and - // the client can append details directly into QVersitDocument if needed. - // (In this example QContactAvatar::SubTypeTexturedMesh. - // Currently for QContactAvatar details, - // only exporting subtypes QContactAvatar::SubTypeImage and - // QContactAvatar::SubTypeAudioRingtone is supported.) - - \endcode - - \sa QVersitDocument, QVersitProperty + \sa QVersitContactExporter + */ + +/*! + * \fn virtual QVersitContactExporterDetailHandler::~QVersitContactExporterDetailHandler() + * Frees any memory in use by this handler. + */ + +/*! + * \fn virtual bool QVersitContactExporterDetailHandler::preProcessDetail(const QContact& contact, const QContactDetail& detail, QVersitDocument* document) = 0; + * Process \a detail and update \a document with the corresponding QVersitProperty(s). + * \a contact provides the context within which the detail was found. + * + * Returns true if the detail has been handled and requires no furthur processing, false otherwise. + * + * This function is called on every QContactDetail encountered during an export. Supply this + * function and return true to implement custom export behaviour. */ +/*! + * \fn virtual bool QVersitContactExporterDetailHandler::postProcessDetail(const QContact& contact, const QContactDetail& detail, bool alreadyProcessed, QVersitDocument* document) = 0; + * Process \a detail and update \a document with the corresponding QVersitProperty(s). + * \a contact provides the context within which the detail was found. + * \a alreadyProcessed is true if the detail has already been processed either by + * \l preProcessDetail() or by QVersitContactExporter itself. + * + * Returns true if the detail has been handled, false otherwise. + * + * This function is called on every \l QContactDetail encountered during an export. This can be + * used to implement support for QContactDetails not supported by QVersitContactExporter. + */ /*! - * \fn void QVersitContactExporter::scale(const QString& imageFileName, QByteArray& imageData) - * This signal is emitted by \l QVersitContactExporter::exportContact(), - * when a contact detail containing an image is found in a QContact. - * The input for the client is the path of the image in \a imageFileName. - * When the client has performed the scaling, - * it should write the result to \a imageData. - * Image scaling can be done for example by using class QImage. + * \class QVersitContactExporter + * \preliminary + * \brief The QVersitContactExporter class converts \l {QContact}{QContacts} into + * \l {QVersitDocument}{QVersitDocuments}. + * \ingroup versit + * + * A \l QVersitResourceHandler is associated with the exporter to supply the behaviour for loading + * files from persistent storage. By default, this is set to a \l QVersitDefaultResourceHandler, + * which supports basic resource loading from the file system. An alternative resource handler + * can be specified with setResourceHandler(). + * + * By associating a \l QVersitContactExporterDetailHandler with the exporter using + * setDetailHandler(), the client can pass in a handler to override the processing of details and/or + * handle details that QVersitContactExporter doesn't support. + * + * An example detail handler that logs unknown properties: + * \snippet ../../doc/src/snippets/qtversitdocsample/qtversitdocsample.cpp Detail handler + * + * An example usage of QVersitContactExporter + * \snippet ../../doc/src/snippets/qtversitdocsample/qtversitdocsample.cpp Export example + * + * \sa QVersitDocument, QVersitProperty, QVersitContactExporterDetailHandler, QVersitResourceHandler */ /*! @@ -119,8 +119,6 @@ QVersitContactExporter::QVersitContactExporter() : d(new QVersitContactExporterPrivate()) { - connect(d, SIGNAL(scale(const QString&,QByteArray&)), - this, SIGNAL(scale(const QString&,QByteArray&))); } /*! @@ -128,33 +126,71 @@ */ QVersitContactExporter::~QVersitContactExporter() { + delete d; +} + +/*! + * Converts \a contacts into a list of corresponding QVersitDocuments, using the format given by + * \a versitType. + */ +QList QVersitContactExporter::exportContacts( + const QList& contacts, + QVersitDocument::VersitType versitType) +{ + QList list; + foreach (QContact contact, contacts) { + QVersitDocument versitDocument; + versitDocument.setType(versitType); + d->exportContact(contact, versitDocument); + list.append(versitDocument); + } + + return list; +} + +/*! + * Sets \a handler to be the handler for processing QContactDetails, or 0 to have no handler. + */ +void QVersitContactExporter::setDetailHandler(QVersitContactExporterDetailHandler* handler) +{ + d->mDetailHandler = handler; } /*! - * Returns the versit document corresponding - * to the \a contact and \a versitType. + * Gets the handler for processing QContactDetails. */ -QVersitDocument QVersitContactExporter::exportContact( - const QContact& contact, - QVersitDocument::VersitType versitType) +QVersitContactExporterDetailHandler* QVersitContactExporter::detailHandler() const { - QVersitDocument versitDocument; - versitDocument.setVersitType(versitType); - d->exportContact(versitDocument,contact); + return d->mDetailHandler; +} - return versitDocument; +/*! + * Sets \a handler to be the handler to load files with, or 0 to have no handler. + */ +void QVersitContactExporter::setResourceHandler(QVersitResourceHandler* handler) +{ + d->mResourceHandler = handler; } /*! - * Returns the list of contact details, which were not exported - * by the most recent call of \l QVersitContactExporter::exportContact(). + * Returns the associated resource handler. */ +QVersitResourceHandler* QVersitContactExporter::resourceHandler() const +{ + return d->mResourceHandler; +} + +/*! \internal */ +QVersitDocument QVersitContactExporter::exportContact(const QContact& contact, + QVersitDocument::VersitType versitType) +{ + QList list; + list.append(contact); + return exportContacts(list, versitType).first(); +} + +/*! \internal */ QList QVersitContactExporter::unknownContactDetails() { - return d->mUnknownContactDetails; + return QList(); } - - -#include "moc_qversitcontactexporter.cpp" - -QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitcontactexporter.h --- a/qtcontactsmobility/src/versit/qversitcontactexporter.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitcontactexporter.h Fri Apr 16 14:53:18 2010 +0300 @@ -43,33 +43,50 @@ #define QVERSITCONTACTEXPORTER_H #include "qmobilityglobal.h" +#include "qversitresourcehandler.h" #include "qversitdocument.h" #include -#include #include QTM_BEGIN_NAMESPACE class QVersitContactExporterPrivate; -class Q_VERSIT_EXPORT QVersitContactExporter : public QObject +class Q_VERSIT_EXPORT QVersitContactExporterDetailHandler { - Q_OBJECT +public: + virtual ~QVersitContactExporterDetailHandler() {} + virtual bool preProcessDetail(const QContact& contact, + const QContactDetail& detail, + QVersitDocument* document) = 0; + virtual bool postProcessDetail(const QContact& contact, + const QContactDetail& detail, + bool alreadyProcessed, + QVersitDocument* document) = 0; +}; +class Q_VERSIT_EXPORT QVersitContactExporter +{ public: QVersitContactExporter(); ~QVersitContactExporter(); - QVersitDocument exportContact( + QList exportContacts(const QList& contacts, + QVersitDocument::VersitType versitType=QVersitDocument::VCard30Type); + + void setDetailHandler(QVersitContactExporterDetailHandler* handler); + QVersitContactExporterDetailHandler* detailHandler() const; + + void setResourceHandler(QVersitResourceHandler* handler); + QVersitResourceHandler* resourceHandler() const; + + // Deprecated: + QVersitDocument Q_DECL_DEPRECATED exportContact( const QContact& contact, - QVersitDocument::VersitType versitType=QVersitDocument::VCard21); - - QList unknownContactDetails(); - -signals: - void scale(const QString& imageFileName, QByteArray& imageData); + QVersitDocument::VersitType versitType=QVersitDocument::VCard30Type); + QList Q_DECL_DEPRECATED unknownContactDetails(); private: QVersitContactExporterPrivate* d; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitcontactexporter_p.cpp --- a/qtcontactsmobility/src/versit/qversitcontactexporter_p.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitcontactexporter_p.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -39,8 +39,9 @@ ** ****************************************************************************/ +#include "qversitcontactexporter.h" #include "qversitcontactexporter_p.h" -#include "qversitdefs.h" +#include "qversitdefs_p.h" #include "versitutils_p.h" #include "qmobilityglobal.h" @@ -65,52 +66,44 @@ #include #include -#include #include #include -#include -QTM_BEGIN_NAMESPACE +QTM_USE_NAMESPACE /*! * Constructor. */ QVersitContactExporterPrivate::QVersitContactExporterPrivate() : - mVersitType(QVersitDocument::VCard21) + mDetailHandler(NULL), + mDefaultResourceHandler(new QVersitDefaultResourceHandler), + mVersitType(QVersitDocument::InvalidType) { + mResourceHandler = mDefaultResourceHandler; + // Detail mappings int versitPropertyCount = - sizeof(versitContactDetailMappings)/sizeof(versitContactDetailMapping); + sizeof(versitContactDetailMappings)/sizeof(VersitContactDetailMapping); for (int i=0; i < versitPropertyCount; i++) { - QString contactDetailName = - QString::fromAscii(versitContactDetailMappings[i].contactDetailDefinitionName); - QString versitPropertyName = - QString::fromAscii(versitContactDetailMappings[i].versitPropertyName); - mPropertyMappings.insert(contactDetailName,versitPropertyName); + mPropertyMappings.insert( + QLatin1String(versitContactDetailMappings[i].contactDetailDefinitionName), + QLatin1String(versitContactDetailMappings[i].versitPropertyName)); } // Contexts mappings - int contextCount = sizeof(versitContextMappings)/sizeof(versitMapping); + int contextCount = sizeof(versitContextMappings)/sizeof(VersitMapping); for (int i=0; i < contextCount; i++) { mParameterMappings.insert( - QString::fromAscii(versitContextMappings[i].contactString), - QString::fromAscii(versitContextMappings[i].versitString)); + QLatin1String(versitContextMappings[i].contactString), + QLatin1String(versitContextMappings[i].versitString)); } // Subtypes mappings - int subTypeCount = sizeof(versitSubTypeMappings)/sizeof(versitMapping); + int subTypeCount = sizeof(versitSubTypeMappings)/sizeof(VersitMapping); for (int i=0; i < subTypeCount; i++) { mParameterMappings.insert( - QString::fromAscii(versitSubTypeMappings[i].contactString), - QString::fromAscii(versitSubTypeMappings[i].versitString)); - } - - // File extension mappings - int fileExtensionCount = sizeof(versitFileExtensionMappings)/sizeof(versitMapping); - for (int i=0; i < fileExtensionCount; i++) { - mParameterMappings.insert( - QString::fromAscii(versitFileExtensionMappings[i].contactString), - QString::fromAscii(versitFileExtensionMappings[i].versitString)); + QLatin1String(versitSubTypeMappings[i].contactString), + QLatin1String(versitSubTypeMappings[i].versitString)); } } @@ -119,6 +112,7 @@ */ QVersitContactExporterPrivate::~QVersitContactExporterPrivate() { + delete mDefaultResourceHandler; } @@ -126,17 +120,23 @@ * Export QT Contact into Versit Document. */ void QVersitContactExporterPrivate::exportContact( - QVersitDocument& versitDocument, - const QContact& contact) + const QContact& contact, + QVersitDocument& document) { - mUnknownContactDetails.clear(); - mVersitType = versitDocument.versitType(); + mVersitType = document.type(); QList allDetails = contact.details(); for (int i = 0; i < allDetails.size(); i++) { QContactDetail detail = allDetails.at(i); + + // If the custom detail handler handles it, we don't have to. + if (mDetailHandler + && mDetailHandler->preProcessDetail(contact, detail, &document)) + continue; + QVersitProperty property; property.setName(mPropertyMappings.value(detail.definitionName())); bool addProperty = true; + bool unknown = false; if (detail.definitionName() == QContactName::DefinitionName) { encodeName(property, detail); @@ -159,36 +159,39 @@ } else if (detail.definitionName() == QContactNote::DefinitionName) { encodeNote(property, detail); } else if (detail.definitionName() == QContactOrganization::DefinitionName) { - encodeOrganization(versitDocument, detail); + encodeOrganization(document, detail); addProperty = false; } else if (detail.definitionName() == QContactAvatar::DefinitionName){ addProperty = encodeAvatar(property, detail); if (!addProperty) - mUnknownContactDetails.append(detail); + unknown = true; } else if (detail.definitionName() == QContactAnniversary::DefinitionName) { encodeAnniversary(property, detail); } else if (detail.definitionName() == QContactNickname::DefinitionName) { - encodeNickname(versitDocument, detail); + encodeNickname(document, detail); addProperty = false; } else if (detail.definitionName() == QContactGender::DefinitionName) { encodeGender(property, detail); } else if (detail.definitionName() == QContactOnlineAccount::DefinitionName) { addProperty = encodeOnlineAccount(property, detail); if (!addProperty) - mUnknownContactDetails.append(detail); + unknown = true; } else if (detail.definitionName() == QContactFamily::DefinitionName) { - addProperty = encodeFamily(versitDocument, detail); + addProperty = encodeFamily(document, detail); } else if (detail.definitionName() == QContactDisplayLabel::DefinitionName) { addProperty = encodeDisplayLabel(property, detail, contact); if (!addProperty) - mUnknownContactDetails.append(detail); + unknown = true; } else { addProperty = false; - mUnknownContactDetails.append(detail); + unknown = true; } if (addProperty) - versitDocument.addProperty(property); + document.addProperty(property); + + if (mDetailHandler) + mDetailHandler->postProcessDetail(contact, detail, !unknown, &document); } } @@ -200,13 +203,12 @@ const QContactDetail& detail) { QContactName contactName = static_cast(detail); - QByteArray value = - escape(contactName.last().toAscii()) + ';' + - escape(contactName.first().toAscii()) + ';' + - escape(contactName.middle().toAscii()) + ';' + - escape(contactName.prefix().toAscii()) + ';' + - escape(contactName.suffix().toAscii()); - property.setValue(value); + property.setValue(QString::fromAscii("%1;%2;%3;%4;%5").arg( + escape(contactName.lastName()), + escape(contactName.firstName()), + escape(contactName.middleName()), + escape(contactName.prefix()), + escape(contactName.suffix()))); } /*! @@ -242,15 +244,14 @@ { QContactAddress address = static_cast(detail); encodeParameters(property, address.contexts(), address.subTypes()); - QByteArray value = - escape(address.postOfficeBox().toAscii()) + ';' + - ';' + // Extended address - escape(address.street().toAscii()) + ';' + - escape(address.locality().toAscii()) + ';' + - escape(address.region().toAscii()) + ';' + - escape(address.postcode().toAscii()) + ';' + - escape(address.country().toAscii()); - property.setValue(value); + // Leave out the extended address field: + property.setValue(QString::fromAscii("%1;;%2;%3;%4;%5;%6").arg( + escape(address.postOfficeBox()), + escape(address.street()), + escape(address.locality()), + escape(address.region()), + escape(address.postcode()), + escape(address.country()))); } /*! @@ -264,7 +265,7 @@ encodeParameters(property, contactUrl.contexts()); // The vCard specifications do not define any TYPEs for URL property. // No need to try to convert the subtypes to TYPEs. - property.setValue(contactUrl.url().toAscii()); + property.setValue(contactUrl.url()); } /*! @@ -292,7 +293,7 @@ if ( rev.lastModified().toString(Qt::ISODate).size() ) { encoded = true; if ( rev.lastModified().timeSpec() == Qt::UTC ) { - value = rev.lastModified().toString(Qt::ISODate) + QString::fromAscii("Z"); + value = rev.lastModified().toString(Qt::ISODate) + QLatin1Char('Z'); } else { value = rev.lastModified().toString(Qt::ISODate); @@ -302,13 +303,13 @@ else if ( rev.created().toString(Qt::ISODate).size()) { encoded = true; if ( rev.created().timeSpec() == Qt::UTC ) { - value = rev.created().toString(Qt::ISODate) + QString::fromAscii("Z"); + value = rev.created().toString(Qt::ISODate) + QLatin1Char('Z'); } else { value = rev.created().toString(Qt::ISODate); } } - property.setValue(value.toAscii()); + property.setValue(value); return encoded; } @@ -322,7 +323,7 @@ { QContactBirthday bday = static_cast(detail); QString value = bday.date().toString(Qt::ISODate); - property.setValue(value.toAscii()); + property.setValue(value); } /*! @@ -343,12 +344,10 @@ QVersitProperty& property, const QContactDetail& detail) { - QContactGeolocation geoLocation = static_cast(detail); - QByteArray longitude; - QByteArray latitude; - QByteArray value = - longitude.setNum(geoLocation.longitude()) + ',' + - latitude.setNum(geoLocation.latitude()); + QContactGeoLocation geoLocation = static_cast(detail); + QString value = + QString::number(geoLocation.longitude()) + QLatin1Char(',') + + QString::number(geoLocation.latitude()); property.setValue(value); } @@ -362,41 +361,41 @@ QContactOrganization organization = static_cast(detail); if (organization.title().length() > 0) { QVersitProperty property; - property.setName(QString::fromAscii("TITLE")); + property.setName(QLatin1String("TITLE")); setEscapedValue(property,organization.title()); document.addProperty(property); } if (organization.name().length() > 0 || organization.department().size() > 0) { QVersitProperty property; - property.setName(QString::fromAscii("ORG")); - QByteArray value = escape(organization.name().toAscii()); + property.setName(QLatin1String("ORG")); + QString value = escape(organization.name()); QStringList departments(organization.department()); if (departments.count() == 0) - value += ";"; + value += QLatin1Char(';'); foreach (QString department, departments) { - value += ";"; - value += escape(department.toAscii()); + value += QLatin1Char(';'); + value += escape(department); } property.setValue(value); document.addProperty(property); } if (organization.logo().length() > 0) { QVersitProperty property; - if (encodeEmbeddedContent(organization.logo(), property, true)) { - property.setName(QString::fromAscii("LOGO")); + if (encodeContentFromFile(organization.logo(), property)) { + property.setName(QLatin1String("LOGO")); document.addProperty(property); } } if (organization.assistantName().length() > 0) { QVersitProperty property; - property.setName(QString::fromAscii("X-ASSISTANT")); + property.setName(QLatin1String("X-ASSISTANT")); setEscapedValue(property,organization.assistantName()); document.addProperty(property); } if (organization.role().length() > 0) { QVersitProperty property; - property.setName(QString::fromAscii("ROLE")); + property.setName(QLatin1String("ROLE")); setEscapedValue(property,organization.role()); document.addProperty(property); } @@ -410,19 +409,19 @@ const QContactDetail& detail) { QContactAvatar contactAvatar = static_cast(detail); - bool scalingAllowed = false; bool encoded = false; QString propertyName; if (contactAvatar.subType() == QContactAvatar::SubTypeImage) { - scalingAllowed = true; - propertyName = QString::fromAscii("PHOTO"); + propertyName = QLatin1String("PHOTO"); } else if (contactAvatar.subType() == QContactAvatar::SubTypeAudioRingtone) { - propertyName = QString::fromAscii("SOUND"); + propertyName = QLatin1String("SOUND"); } else { // NOP } if (propertyName.length() > 0) { - encoded = encodeEmbeddedContent(contactAvatar.avatar(), property, scalingAllowed); + encoded = encodeContentFromFile(contactAvatar.avatar(), property); + if (!encoded) + encoded = encodeContentFromPixmap(contactAvatar.pixmap(), property); if (encoded) property.setName(propertyName); } @@ -449,23 +448,23 @@ { QContactNickname nicknameDetail = static_cast(detail); QVersitProperty property; - property.setName(QString::fromAscii("X-NICKNAME")); + property.setName(QLatin1String("X-NICKNAME")); bool found = false; - for (int i=0; i < document.properties().count() && !found; i++) { - QVersitProperty currentProperty = document.properties()[i]; - if (currentProperty.name() == QString::fromAscii("X-NICKNAME")) { + foreach (QVersitProperty currentProperty, document.properties()) { + if (currentProperty.name() == QLatin1String("X-NICKNAME")) { property = currentProperty; found = true; + break; } } - QByteArray value(property.value()); + QString value(property.value()); if (found) - value += ','; - QByteArray nickname = escape(nicknameDetail.nickname().toAscii()); + value += QLatin1Char(','); + QString nickname = escape(nicknameDetail.nickname()); value.append(nickname); property.setValue(value); // Replace the current property - document.removeProperties(QString::fromAscii("X-NICKNAME")); + document.removeProperties(QLatin1String("X-NICKNAME")); document.addProperty(property); } @@ -477,7 +476,7 @@ const QContactDetail& detail) { QContactAnniversary anniversary = static_cast(detail); - property.setValue(anniversary.originalDate().toString(Qt::ISODate).toAscii()); + property.setValue(anniversary.originalDate().toString(Qt::ISODate)); } /*! @@ -497,9 +496,9 @@ subTypes.contains(QContactOnlineAccount::SubTypeImpp)) { encoded = true; encodeParameters(property, onlineAccount.contexts(), subTypes); - QString name(QString::fromAscii("X-SIP")); + QString name(QLatin1String("X-SIP")); if (subTypes.contains(QContactOnlineAccount::SubTypeImpp)) - name = QString::fromAscii("X-IMPP"); + name = QLatin1String("X-IMPP"); property.setName(name); setEscapedValue(property,onlineAccount.accountUri()); } @@ -517,15 +516,15 @@ if (family.spouse().size()) { QVersitProperty property; - property.setName(QString::fromAscii("X-SPOUSE")); + property.setName(QLatin1String("X-SPOUSE")); setEscapedValue(property,family.spouse()); document.addProperty(property); } if (family.children().size()) { QVersitProperty property; - property.setName(QString::fromAscii("X-CHILDREN")); - QString children = family.children().join(QString::fromAscii(",")); + property.setName(QLatin1String("X-CHILDREN")); + QString children = family.children().join(QLatin1String(",")); setEscapedValue(property,children); document.addProperty(property); } @@ -554,15 +553,15 @@ break; } QContactName name = static_cast(contactDetail); - QByteArray value; + QString value; if (name.customLabel().length()) { - value = name.customLabel().toAscii(); + value = name.customLabel(); } else { - value = name.first().toAscii() + ' ' + name.last().toAscii(); + value = name.firstName() + QLatin1Char(' ') + name.lastName(); } if (name.customLabel().length() || - name.first().length() || - name.last().length()) { + name.firstName().length() || + name.lastName().length()) { encoded = true; property.setValue(escape(value)); } @@ -579,7 +578,7 @@ QUrl remoteResource(resourceIdentifier); if ((!remoteResource.scheme().isEmpty() && !remoteResource.host().isEmpty()) || - resourceIdentifier.contains(QString::fromAscii("www."),Qt::CaseInsensitive)) + resourceIdentifier.contains(QLatin1String("www."), Qt::CaseInsensitive)) return true; return false; } @@ -600,54 +599,61 @@ if (mappedValue.length() > 0) { // QVersitProperty::addParameter inserts into beginning. // This is why the last value is taken from the list - property.addParameter(QString::fromAscii("TYPE"),mappedValue); + property.insertParameter(QLatin1String("TYPE"),mappedValue); } } } /*! - * Encode embedded content into the Versit Document + * Encode embedded content from the given \a resourcePath into \a property. */ -bool QVersitContactExporterPrivate::encodeEmbeddedContent( - const QString& resourcePath, - QVersitProperty& property, - bool performScaling) +bool QVersitContactExporterPrivate::encodeContentFromFile(const QString& resourcePath, + QVersitProperty& property) { bool encodeContent = false; - QString resourceExt = resourcePath.section(QString::fromAscii("."), -1).toUpper(); - QString resourceFormat = mParameterMappings.value(resourceExt); - - if (!resourceFormat.length()) - resourceFormat = resourceExt; + QVariant value; + QByteArray imageData; + QString mimeType; + if (isValidRemoteUrl( resourcePath )) { + encodeContent = true; + value.setValue(resourcePath); + property.insertParameter(QLatin1String("VALUE"), QLatin1String("URL")); + } else if (mResourceHandler + && mResourceHandler->loadResource(resourcePath, &imageData, &mimeType)) { + value.setValue(imageData); + if (!mimeType.isEmpty()) { + // If mimeType is (eg.) "image/jpeg", set type parameter to "JPEG" + int slashIndex = mimeType.indexOf(QLatin1Char('/')); + if (slashIndex >= 0) + property.insertParameter(QLatin1String("TYPE"), + mimeType.remove(0, slashIndex+1).toUpper()); + } + encodeContent = true; + } else { + // The file doesn't exist. Don't encode the path to a local file. + } + property.setValue(value); + return encodeContent; +} - if (resourceFormat.length() > 0) { - QByteArray value; - QFile resourceFile(resourcePath); - if ( resourceFile.open(QIODevice::ReadOnly)) { - encodeContent = true; - if (performScaling) - emit scale(resourcePath,value); - if (value.length() == 0) - value = resourceFile.readAll(); // Image not scaled - value = value.toBase64(); - property.addParameter( - QString::fromAscii("ENCODING"), - QString::fromAscii("BASE64")); - property.addParameter(QString::fromAscii("TYPE"),resourceFormat); - } - else if (isValidRemoteUrl( resourcePath )) { - encodeContent = true; - value = resourcePath.toAscii(); - property.addParameter( - QString::fromAscii("VALUE"), - QString::fromAscii("URL")); - property.addParameter(QString::fromAscii("TYPE"),resourceFormat); - } else { - // The file has been removed. Don't encode the path to a local file. - } - property.setValue(value); +/*! + * Encode embedded content from the given \a pixmap into \a property. + */ +bool QVersitContactExporterPrivate::encodeContentFromPixmap(const QPixmap& pixmap, + QVersitProperty& property) +{ + if (pixmap.isNull()) + return false; + QByteArray imageData; + QBuffer buffer(&imageData); + buffer.open(QIODevice::WriteOnly); + // Always store a pixmap as a PNG. + if (!pixmap.save(&buffer, "PNG")) { + return false; } - return encodeContent; + property.setValue(imageData); + property.insertParameter(QLatin1String("TYPE"), QLatin1String("PNG")); + return true; } /*! @@ -657,7 +663,7 @@ QVersitProperty& property, const QString& value) { - QByteArray escapedValue(escape(value.toAscii())); + QString escapedValue(escape(value)); property.setValue(escapedValue); } @@ -667,15 +673,11 @@ * Starting from 3.0 the property values having certain special * characters should be escaped. */ -QByteArray QVersitContactExporterPrivate::escape(const QByteArray& value) +QString QVersitContactExporterPrivate::escape(const QString& value) { - QByteArray escaped(value); - if (mVersitType != QVersitDocument::VCard21) { + QString escaped(value); + if (mVersitType != QVersitDocument::VCard21Type) { VersitUtils::backSlashEscape(escaped); } return escaped; } - -#include "moc_qversitcontactexporter_p.cpp" - -QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitcontactexporter_p.h --- a/qtcontactsmobility/src/versit/qversitcontactexporter_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitcontactexporter_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -42,6 +42,17 @@ #ifndef QVERSITCONTACTEXPORTER_P_H #define QVERSITCONTACTEXPORTER_P_H +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + #include "qversitdocument.h" #include "qversitproperty.h" #include "qmobilityglobal.h" @@ -53,17 +64,13 @@ class QContact; class QContactDetail; -class Q_AUTOTEST_EXPORT QVersitContactExporterPrivate : public QObject +class Q_AUTOTEST_EXPORT QVersitContactExporterPrivate { - Q_OBJECT public: QVersitContactExporterPrivate(); ~QVersitContactExporterPrivate(); - void exportContact(QVersitDocument& versitDocument, const QContact& contact); - -signals: - void scale(const QString& imageFileName, QByteArray& imageData); + void exportContact(const QContact& contact, QVersitDocument& versitDocument); protected: void encodeName(QVersitProperty& property, const QContactDetail& detail); @@ -91,16 +98,15 @@ void encodeParameters(QVersitProperty& property, const QStringList& contexts, const QStringList& subTypes=QStringList()); - bool encodeEmbeddedContent(const QString& resourcePath, - QVersitProperty& property, - bool performScaling); + bool encodeContentFromFile(const QString& resourcePath, QVersitProperty& property); + bool encodeContentFromPixmap(const QPixmap& pixmap, QVersitProperty& property); void setEscapedValue(QVersitProperty& property,const QString& value); - QByteArray escape(const QByteArray& value); + QString escape(const QString& value); public: // Data - QList mUnknownContactDetails; - -protected: // Data + QVersitContactExporterDetailHandler* mDetailHandler; + QVersitDefaultResourceHandler* mDefaultResourceHandler; + QVersitResourceHandler* mResourceHandler; QHash mPropertyMappings; QHash mParameterMappings; QVersitDocument::VersitType mVersitType; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitcontactimporter.cpp --- a/qtcontactsmobility/src/versit/qversitcontactimporter.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitcontactimporter.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -45,48 +45,78 @@ #include "qversitproperty.h" #include "qmobilityglobal.h" -QTM_BEGIN_NAMESPACE +QTM_USE_NAMESPACE /*! - \class QVersitContactImporter + \class QVersitContactImporterPropertyHandler + \preliminary + \brief The QVersitContactImporterPropertyHandler class is an interface for clients wishing to + implement custom import behaviour for versit properties - \brief The QVersitContactImporter class creates QContacts from QVersitDocuments. - \ingroup versit - The versit properties (\l QVersitProperty) that were not imported by - \l QVersitContactImporter::importContact() can be fetched after importing - by calling \l QVersitContactImporter::unknownVersitProperties(). - For the returned properties, - the client can perform the conversions from versit properties - to contact details and add the converted details to the QContact. - - \code - - QVersitDocument document; - QVersitProperty property; - - property.setName(QString::fromAscii("N")); - property.setValue("Citizen;John;Q;;"); - document.addProperty(property); - - property.setName(QString::fromAscii("X-UNKNOWN-PROPERTY")); - property.setValue("some value"); - document.addProperty(property); - - QVersitContactImporter importer; - importer.setImagePath(QString::fromAscii("/my/image/path")); - importer.setAudioClipPath(QString::fromAscii("my/audio_clip/path")); - - QContact contact = importer.importContact(document); - // contact now contains the "N" property as a QContactName - QList unknownProperties = importer.unknownVersitProperties(); - // unknownProperties contains "X-UNKNOWN-PROPERTY" - // that can be handled by the client itself - - \endcode - - \sa QVersitDocument, QVersitReader + \sa QVersitContactImporter + */ + +/*! + * \fn QVersitContactImporterPropertyHandler::~QVersitContactImporterPropertyHandler() + * Frees any memory in use by this handler. + */ + +/*! + * \fn virtual bool QVersitContactImporterPropertyHandler::preProcessProperty(const QVersitDocument& document, const QVersitProperty& property, int contactIndex, QContact* contact) = 0; + * Process \a property and update \a contact with the corresponding QContactDetail(s). + * \a document provides the context within which the property was found. + * \a contactIndex specifies the position that \a contact will take in the list returned by + * \l QVersitContactImporter::importContacts(). + * + * Returns true if the property has been handled and requires no further processing, false + * otherwise. + * + * This function is called on every QVersitProperty encountered during an import. Supply this + * function and return true to implement custom import behaviour. + */ + +/*! + * \fn virtual bool QVersitContactImporterPropertyHandler::postProcessProperty(const QVersitDocument& document, const QVersitProperty& property, bool alreadyProcessed, int contactIndex, QContact* contact) = 0; + * Process \a property and update \a contact with the corresponding QContactDetail(s). + * \a document provides the context within which the property was found. + * \a contactIndex specifies the position that \a contact will take in the list returned by + * \l QVersitContactImporter::importContacts(). + * \a alreadyProcessed is true if the detail has already been processed either by + * \l preProcessProperty() or by QVersitContactImporter itself. + * + * Returns true if the property has been handled, false otherwise. + * + * This function is called on every QVersitProperty encountered during an import. This can be + * used to implement support for QVersitProperties not supported by QVersitContactImporter. + */ + +/*! + * \class QVersitContactImporter + * \preliminary + * \brief The QVersitContactImporter class creates QContacts from QVersitDocuments. + * + * \ingroup versit + * + * A \l QVersitResourceHandler is associated with the importer to supply the behaviour for saving + * files to persistent storage. By default, this is set to a \l QVersitDefaultResourceHandler, + * which does not save files to persistent storage. Note that although avatars found in vCards + * are not saved to disk by default, the importer does set the pixmap of the contact detail to the + * image. If a full-sized avatar image needs to be persisted, a custom QVersitResourceHandler + * should be supplied which implements this. + * + * By associating a QVersitContactImporterPropertyHandler with the importer using + * setPropertyHandler(), the client can pass in a handler to override the processing of properties + * and/or handle properties that QVersitContactImporter doesn't support. + * + * An example property handler that logs unknown properties: + * \snippet ../../doc/src/snippets/qtversitdocsample/qtversitdocsample.cpp Property handler + * + * An example usage of QVersitContactImporter + * \snippet ../../doc/src/snippets/qtversitdocsample/qtversitdocsample.cpp Import example + * + * \sa QVersitDocument, QVersitReader, QVersitContactImporterPropertyHandler */ /*! Constructs a new importer */ @@ -102,60 +132,86 @@ } /*! - * Sets the \a path where the contact photos will be saved. - * This function should be called before calling \l importContact(). - * If the image path has not been set, - * the images in the versit document will not be added to the contact. - * There is no default path for them. + * Converts \a documents into a corresponding list of QContacts. */ -void QVersitContactImporter::setImagePath(const QString& path) +QList QVersitContactImporter::importContacts(const QList& documents) { - d->mImagePath = path; + QList list; + int i = 0; + foreach (QVersitDocument document, documents) { + list.append(d->importContact(document, i)); + i++; + } + + return list; } /*! - * Returns the path where the contact photos are saved. + * Sets \a handler to be the handler for processing QVersitProperties, or 0 to have no handler. + */ +void QVersitContactImporter::setPropertyHandler(QVersitContactImporterPropertyHandler* handler) +{ + d->mPropertyHandler = handler; +} + +/*! + * Gets the handler for processing QVersitProperties. */ -QString QVersitContactImporter::imagePath() const +QVersitContactImporterPropertyHandler* QVersitContactImporter::propertyHandler() const { - return d->mImagePath; + return d->mPropertyHandler; +} + +/*! + * Sets \a handler to be the handler to save files with, or 0 to have no handler. + */ +void QVersitContactImporter::setResourceHandler(QVersitResourceHandler* handler) +{ + d->mResourceHandler = handler; } /*! - * Sets the \a path where the contact related audio clips will be saved. - * This function should be called before calling \l importContact(). - * If the audio clip path has not been set, - * the audio clips in the versit document will not be added to the contact. - * There is no default path for them. + * Returns the associated resource handler. */ -void QVersitContactImporter::setAudioClipPath(const QString& path) +QVersitResourceHandler* QVersitContactImporter::resourceHandler() const { - d->mAudioClipPath = path; + return d->mResourceHandler; } -/*! - * Returns the path where the contact related audio clips will be saved. - */ -QString QVersitContactImporter::audioClipPath() const +/*! \internal */ +void QVersitContactImporter::setImagePath(const QString& path) { - return d->mAudioClipPath; + Q_UNUSED(path) +} + +/*! \internal */ +QString QVersitContactImporter::imagePath() const +{ + return QString(); } -/*! - * Creates a QContact from \a versitDocument. - */ -QContact QVersitContactImporter::importContact(const QVersitDocument& versitDocument) +/*! \internal */ +void QVersitContactImporter::setAudioClipPath(const QString& path) { - return d->importContact(versitDocument); + Q_UNUSED(path) +} + +/*! \internal */ +QString QVersitContactImporter::audioClipPath() const +{ + return QString(); } -/*! - * Returns the list of versit properties that were not imported - * by the most recent call of \l importContact(). - */ +/*! \internal */ +QContact QVersitContactImporter::importContact(const QVersitDocument& versitDocument) +{ + QList list; + list.append(versitDocument); + return importContacts(list).first(); +} + +/*! \internal */ QList QVersitContactImporter::unknownVersitProperties() { - return d->mUnknownVersitProperties; + return QList(); } - -QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitcontactimporter.h --- a/qtcontactsmobility/src/versit/qversitcontactimporter.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitcontactimporter.h Fri Apr 16 14:53:18 2010 +0300 @@ -43,6 +43,7 @@ #define QVERSITCONTACTIMPORTER_H #include "qmobilityglobal.h" +#include "qversitresourcehandler.h" #include @@ -51,8 +52,23 @@ QTM_BEGIN_NAMESPACE class QVersitDocument; +class QVersitContactImporterPrivate; class QVersitProperty; -class QVersitContactImporterPrivate; + +class Q_VERSIT_EXPORT QVersitContactImporterPropertyHandler +{ +public: + virtual ~QVersitContactImporterPropertyHandler() {} + virtual bool preProcessProperty(const QVersitDocument& document, + const QVersitProperty& property, + int contactIndex, + QContact* contact) = 0; + virtual bool postProcessProperty(const QVersitDocument& document, + const QVersitProperty& property, + bool alreadyProcessed, + int contactIndex, + QContact* contact) = 0; +}; class Q_VERSIT_EXPORT QVersitContactImporter { @@ -60,15 +76,23 @@ QVersitContactImporter(); ~QVersitContactImporter(); - void setImagePath(const QString& path); - QString imagePath() const; + // XXX We need some way of importing/exporting groups and "self-contact" from vCard. + QList importContacts(const QList& documents); + + void setPropertyHandler(QVersitContactImporterPropertyHandler* handler); + QVersitContactImporterPropertyHandler* propertyHandler() const; - void setAudioClipPath(const QString& path); - QString audioClipPath() const; + void setResourceHandler(QVersitResourceHandler* handler); + QVersitResourceHandler* resourceHandler() const; - QContact importContact(const QVersitDocument& versitDocument); - QList unknownVersitProperties(); - + // Deprecated + void Q_DECL_DEPRECATED setImagePath(const QString& path); + QString Q_DECL_DEPRECATED imagePath() const; + void Q_DECL_DEPRECATED setAudioClipPath(const QString& path); + QString Q_DECL_DEPRECATED audioClipPath() const; + QContact Q_DECL_DEPRECATED importContact(const QVersitDocument& versitDocument); + QList Q_DECL_DEPRECATED unknownVersitProperties(); + private: QVersitContactImporterPrivate* d; }; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitcontactimporter_p.cpp --- a/qtcontactsmobility/src/versit/qversitcontactimporter_p.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitcontactimporter_p.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -39,7 +39,7 @@ ** ****************************************************************************/ -#include "qversitdefs.h" +#include "qversitdefs_p.h" #include "qversitcontactimporter_p.h" #include "qversitdocument.h" #include "qversitproperty.h" @@ -69,49 +69,45 @@ #include #include -QTM_BEGIN_NAMESPACE +QTM_USE_NAMESPACE /*! * Constructor. */ -QVersitContactImporterPrivate::QVersitContactImporterPrivate() +QVersitContactImporterPrivate::QVersitContactImporterPrivate() : + mPropertyHandler(NULL), + mDefaultResourceHandler(new QVersitDefaultResourceHandler) { + mResourceHandler = mDefaultResourceHandler; + // Contact detail mappings int versitPropertyCount = - sizeof(versitContactDetailMappings)/sizeof(versitContactDetailMapping); + sizeof(versitContactDetailMappings)/sizeof(VersitContactDetailMapping); for (int i=0; i < versitPropertyCount; i++) { QString versitPropertyName = - QString::fromAscii(versitContactDetailMappings[i].versitPropertyName); + QLatin1String(versitContactDetailMappings[i].versitPropertyName); QPair contactDetail; contactDetail.first = - QString::fromAscii(versitContactDetailMappings[i].contactDetailDefinitionName); + QLatin1String(versitContactDetailMappings[i].contactDetailDefinitionName); contactDetail.second = - QString::fromAscii(versitContactDetailMappings[i].contactDetailValueKey); + QLatin1String(versitContactDetailMappings[i].contactDetailValueKey); mDetailMappings.insert(versitPropertyName,contactDetail); } // Context mappings - int contextCount = sizeof(versitContextMappings)/sizeof(versitMapping); + int contextCount = sizeof(versitContextMappings)/sizeof(VersitMapping); for (int i=0; i < contextCount; i++) { mContextMappings.insert( - QString::fromAscii(versitContextMappings[i].versitString), - QString::fromAscii(versitContextMappings[i].contactString)); + QLatin1String(versitContextMappings[i].versitString), + QLatin1String(versitContextMappings[i].contactString)); } // Subtype mappings - int subTypeCount = sizeof(versitSubTypeMappings)/sizeof(versitMapping); + int subTypeCount = sizeof(versitSubTypeMappings)/sizeof(VersitMapping); for (int i=0; i < subTypeCount; i++) { mSubTypeMappings.insert( - QString::fromAscii(versitSubTypeMappings[i].versitString), - QString::fromAscii(versitSubTypeMappings[i].contactString)); - } - - // File extension mappings - int fileExtensionCount = sizeof(versitFileExtensionMappings)/sizeof(versitMapping); - for (int i=0; i < fileExtensionCount; i++) { - mFileExtensionMappings.insert( - QString::fromAscii(versitFileExtensionMappings[i].versitString), - QString::fromAscii(versitFileExtensionMappings[i].contactString)); + QLatin1String(versitSubTypeMappings[i].versitString), + QLatin1String(versitSubTypeMappings[i].contactString)); } } @@ -120,187 +116,186 @@ */ QVersitContactImporterPrivate::~QVersitContactImporterPrivate() { + delete mDefaultResourceHandler; } /*! * Generates a QContact from \a versitDocument. */ QContact QVersitContactImporterPrivate::importContact( - const QVersitDocument& versitDocument) + const QVersitDocument& document, int contactIndex) { - mUnknownVersitProperties.clear(); QContact contact; - const QList properties = versitDocument.properties(); + const QList properties = document.properties(); foreach (QVersitProperty property, properties) { + if (mPropertyHandler + && mPropertyHandler->preProcessProperty(document, property, contactIndex, &contact)) + continue; + QPair detailDefinition = mDetailMappings.value(property.name()); QString detailDefinitionName = detailDefinition.first; - QContactDetail* detail = 0; + bool success = false; + bool known = true; if (detailDefinitionName == QContactAddress::DefinitionName) { - detail = createAddress(property); + success = createAddress(property, &contact); } else if (detailDefinitionName == QContactName::DefinitionName) { - detail = createName(property,contact); + success = createName(property, &contact); } else if (detailDefinitionName == QContactBirthday::DefinitionName) { - detail = createBirthday(property); + success = createBirthday(property, &contact); } else if (detailDefinitionName == QContactGeolocation::DefinitionName){ - detail = createGeoLocation(property); + success = createGeoLocation(property, &contact); } else if (detailDefinitionName == QContactOrganization::DefinitionName) { - detail = createOrganization(property,contact); + success = createOrganization(property, &contact); } else if (detailDefinitionName == QContactNickname::DefinitionName) { - createNicknames(property,contact); + success = createNicknames(property, &contact); } else if (detailDefinitionName == QContactAvatar::DefinitionName) { - detail = createAvatar(property,versitDocument,detailDefinition.second); + success = createAvatar(property,detailDefinition.second, &contact); } else if (detailDefinitionName == QContactTimestamp::DefinitionName) { - detail = createTimeStamp(property); + success = createTimeStamp(property, &contact); } else if (detailDefinitionName == QContactPhoneNumber::DefinitionName) { - detail = createPhone(property); + success = createPhone(property, &contact); } else if (detailDefinitionName == QContactAnniversary::DefinitionName) { - detail = createAnniversary(property); + success = createAnniversary(property, &contact); } else if (detailDefinitionName == QContactFamily::DefinitionName) { - detail = createFamily(property,contact); + success = createFamily(property, &contact); } else if (detailDefinitionName == QContactOnlineAccount::DefinitionName) { - detail = createOnlineAccount(property); + success = createOnlineAccount(property, &contact); } else if (detailDefinitionName == QContactDisplayLabel::DefinitionName) { - detail = createLabel(property, contact); + // This actually sets the QContactName's customLabel field (not QContactDisplayLabel) + success = createLabel(property, &contact); } else { - detail = createNameValueDetail(property); - if (!detail) - mUnknownVersitProperties.append(property); + known = false; } - if (detail) { - QStringList contexts(extractContexts(property)); - if (!contexts.empty()) - detail->setContexts(contexts); - contact.saveDetail(detail); - delete detail; - } + if (mPropertyHandler) + success = mPropertyHandler->postProcessProperty( + document, property, success, contactIndex, &contact) || success; + if (!known && !success) + createNameValueDetail(property, &contact); } + contact.setType(QContactType::TypeContact); return contact; } /*! * Creates a QContactName from \a property */ -QContactDetail* QVersitContactImporterPrivate::createName( - const QVersitProperty& property,const QContact& contact) const +bool QVersitContactImporterPrivate::createName( + const QVersitProperty& property, QContact* contact) const { - QContactName* name = 0; - QContactDetail detail = contact.detail(QContactName::DefinitionName); + QContactName name; + QContactDetail detail = contact->detail(QContactName::DefinitionName); if (!detail.isEmpty()) { - name = new QContactName(static_cast(detail)); // If multiple name properties exist, // discard all except the first occurence - if (!name->first().isEmpty()) { - return 0; - } - } else { - name = new QContactName(); + if (!detail.value(QContactName::FieldFirst).isEmpty()) + return false; + else + name = QContactName(static_cast(detail)); } - QList values = property.value().split(';'); - name->setLast(takeFirst(values)); - name->setFirst(takeFirst(values)); - name->setMiddle(takeFirst(values)); - name->setPrefix(takeFirst(values)); - name->setSuffix(takeFirst(values)); - return name; + QStringList values = property.value().split(QLatin1Char(';')); + name.setLastName(takeFirst(values)); + name.setFirstName(takeFirst(values)); + name.setMiddleName(takeFirst(values)); + name.setPrefix(takeFirst(values)); + name.setSuffix(takeFirst(values)); + + saveDetailWithContext(contact, &name, extractContexts(property)); + return true; } /*! * Creates a QContactPhoneNumber from \a property */ -QContactDetail* QVersitContactImporterPrivate::createPhone( - const QVersitProperty& property) const +bool QVersitContactImporterPrivate::createPhone( + const QVersitProperty& property, QContact* contact) const { - QContactPhoneNumber* phone = new QContactPhoneNumber(); - phone->setNumber(QString::fromAscii(property.value())); - phone->setSubTypes(extractSubTypes(property)); - return phone; + QContactPhoneNumber phone; + phone.setNumber(property.value()); + phone.setSubTypes(extractSubTypes(property)); + + saveDetailWithContext(contact, &phone, extractContexts(property)); + return true; } /*! * Creates a QContactAddress from \a property */ -QContactDetail* QVersitContactImporterPrivate::createAddress( - const QVersitProperty& property) const +bool QVersitContactImporterPrivate::createAddress( + const QVersitProperty& property, QContact* contact) const { - QContactAddress* address = new QContactAddress(); + QContactAddress address; - QList addressParts = property.value().split(';'); - address->setPostOfficeBox(takeFirst(addressParts)); + QStringList addressParts = property.value().split(QLatin1Char(';')); + address.setPostOfficeBox(takeFirst(addressParts)); // There is no setter for the Extended Address in QContactAddress: if (!addressParts.isEmpty()) addressParts.removeFirst(); - address->setStreet(takeFirst(addressParts)); - address->setLocality(takeFirst(addressParts)); - address->setRegion(takeFirst(addressParts)); - address->setPostcode(takeFirst(addressParts)); - address->setCountry(takeFirst(addressParts)); + address.setStreet(takeFirst(addressParts)); + address.setLocality(takeFirst(addressParts)); + address.setRegion(takeFirst(addressParts)); + address.setPostcode(takeFirst(addressParts)); + address.setCountry(takeFirst(addressParts)); + address.setSubTypes(extractSubTypes(property)); - address->setSubTypes(extractSubTypes(property)); - - return address; + saveDetailWithContext(contact, &address, extractContexts(property)); + return true; } /*! * Creates a QContactOrganization from \a property */ -QContactDetail* QVersitContactImporterPrivate::createOrganization( - const QVersitProperty& property, - const QContact& contact) const +bool QVersitContactImporterPrivate::createOrganization( + const QVersitProperty& property, QContact* contact) const { - QContactOrganization* organization = 0; + QContactOrganization organization; QPair detailNameAndFieldName = mDetailMappings.value(property.name()); QString fieldName = detailNameAndFieldName.second; - QList organizations = - contact.details(QContactOrganization::DefinitionName); - foreach(QContactDetail detail, organizations) { - QContactOrganization current = static_cast(detail); + QList organizations = contact->details(); + foreach(QContactOrganization current, organizations) { if (current.value(fieldName).length() == 0) { - organization = new QContactOrganization(current); + organization = current; break; } } - if (!organization) { - organization = new QContactOrganization(); - } if (fieldName == QContactOrganization::FieldName) { - setOrganizationNames(*organization,property); + setOrganizationNames(organization, property); } else if (fieldName == QContactOrganization::FieldTitle) { - organization->setTitle(QString::fromAscii(property.value())); + organization.setTitle(property.value()); } else if (fieldName == QContactOrganization::FieldRole) { - organization->setRole(QString::fromAscii(property.value())); + organization.setRole(property.value()); } else if (fieldName == QContactOrganization::FieldLogo) { - setOrganizationLogo(*organization,property); + setOrganizationLogo(organization, property); } else if (fieldName == QContactOrganization::FieldAssistantName) { - organization->setAssistantName(QString::fromAscii(property.value())); + organization.setAssistantName(property.value()); } else { - delete organization; - organization = 0; + return false; } - return organization; + + saveDetailWithContext(contact, &organization, extractContexts(property)); + return true; } /*! * Set the organization name and department(s) from \a property. */ void QVersitContactImporterPrivate::setOrganizationNames( - QContactOrganization& organization, - const QVersitProperty& property) const + QContactOrganization& organization, const QVersitProperty& property) const { - QByteArray value = property.value(); - int firstSemicolon = value.indexOf(";"); + QString value = property.value(); + int firstSemicolon = value.indexOf(QLatin1Char(';')); if (firstSemicolon >= 0) { - organization.setName(QString::fromAscii(value.left(firstSemicolon))); - QString departmentsStr(QString::fromAscii(value.mid(firstSemicolon+1))); + organization.setName(value.left(firstSemicolon)); + QString departmentsStr(value.mid(firstSemicolon+1)); QStringList departments = - departmentsStr.split(QString::fromAscii(";"),QString::SkipEmptyParts); + departmentsStr.split(QLatin1Char(';'), QString::SkipEmptyParts); organization.setDepartment(departments); } else { - organization.setName(QString::fromAscii(value)); + organization.setName(value); } } @@ -308,208 +303,200 @@ * Set the organization logo from \a property. */ void QVersitContactImporterPrivate::setOrganizationLogo( - QContactOrganization& org, - const QVersitProperty& property) const + QContactOrganization& org, const QVersitProperty& property) const { - QString value(QString::fromAscii(property.value())); - - const QString valueParam = - property.parameters().value(QString::fromAscii("VALUE")); - - if (valueParam != QString::fromAscii("URL")) { - QString path(mImagePath); - if (!path.endsWith(QString::fromAscii("/"))) - path += QString::fromAscii("/"); - // Let saveContentToFile to generate a random string as the name - value = saveContentToFile(path,property); - } - - org.setLogo(value); + QString location; + QByteArray data; + saveDataFromProperty(property, &location, &data); + if (!location.isEmpty()) + org.setLogo(location); } /*! * Creates a QContactTimeStamp from \a property */ -QContactDetail* QVersitContactImporterPrivate::createTimeStamp( - const QVersitProperty& property) const +bool QVersitContactImporterPrivate::createTimeStamp( + const QVersitProperty& property, QContact* contact) const { - QContactTimestamp* timeStamp = new QContactTimestamp(); - QByteArray value(property.value()); - bool utc = (value.endsWith("Z") || value.endsWith("z")); + QContactTimestamp timeStamp; + QString value(property.value()); + bool utc = value.endsWith(QLatin1Char('Z'), Qt::CaseInsensitive); if (utc) value.chop(1); // take away z from end; - QDateTime dateTime = parseDateTime(value,"yyyyMMddThhmmss"); + QDateTime dateTime = parseDateTime(value,QLatin1String("yyyyMMddThhmmss")); if (utc) dateTime.setTimeSpec(Qt::UTC); - timeStamp->setLastModified(dateTime); - return timeStamp; + timeStamp.setLastModified(dateTime); + + saveDetailWithContext(contact, &timeStamp, extractContexts(property)); + return true; } /*! * Creates a QContactAnniversary from \a property */ -QContactDetail* QVersitContactImporterPrivate::createAnniversary( - const QVersitProperty& property) const +bool QVersitContactImporterPrivate::createAnniversary( + const QVersitProperty& property, QContact* contact) const { - QContactAnniversary* anniversary = new QContactAnniversary(); + QContactAnniversary anniversary; QDateTime dateTime = - parseDateTime(property.value(),"yyyyMMdd"); - anniversary->setOriginalDate(dateTime.date()); - return anniversary; + parseDateTime(property.value(), QLatin1String("yyyyMMdd")); + anniversary.setOriginalDate(dateTime.date()); + + saveDetailWithContext(contact, &anniversary, extractContexts(property)); + return true; } /*! * Creates a QContactBirthday from \a property */ -QContactDetail* QVersitContactImporterPrivate::createBirthday( - const QVersitProperty& property) const +bool QVersitContactImporterPrivate::createBirthday( + const QVersitProperty& property, QContact* contact) const { - QContactBirthday* bday = new QContactBirthday(); + QContactBirthday bday; QDateTime dateTime = - parseDateTime(property.value(),"yyyyMMdd"); - bday->setDate(dateTime.date()); - return bday; + parseDateTime(property.value(), QLatin1String("yyyyMMdd")); + bday.setDate(dateTime.date()); + + saveDetailWithContext(contact, &bday, extractContexts(property)); + return true; } /*! * Creates QContactNicknames from \a property and adds them to \a contact */ -void QVersitContactImporterPrivate::createNicknames( - const QVersitProperty& property, - QContact& contact) const +bool QVersitContactImporterPrivate::createNicknames( + const QVersitProperty& property, QContact* contact) const { - QList values = property.value().split(','); - foreach(QByteArray value,values) { - QContactNickname* nickName = new QContactNickname(); - nickName->setNickname(QString::fromAscii(value)); - contact.saveDetail(nickName); - delete nickName; + QStringList values = property.value().split(QLatin1Char(','), QString::SkipEmptyParts); + QStringList contexts = extractContexts(property); + foreach(QString value, values) { + QContactNickname nickName; + nickName.setNickname(value); + saveDetailWithContext(contact, &nickName, extractContexts(property)); } + return true; } /*! * Creates a QContactOnlineAccount from \a property */ -QContactDetail* QVersitContactImporterPrivate::createOnlineAccount( - const QVersitProperty& property) const +bool QVersitContactImporterPrivate::createOnlineAccount( + const QVersitProperty& property, QContact* contact) const { - QContactOnlineAccount* onlineAccount = new QContactOnlineAccount(); - onlineAccount->setAccountUri(QString::fromAscii(property.value())); - if (property.name() == QString::fromAscii("X-SIP")) { + QContactOnlineAccount onlineAccount; + onlineAccount.setAccountUri(property.value()); + if (property.name() == QLatin1String("X-SIP")) { QStringList subTypes = extractSubTypes(property); if (subTypes.count() == 0) subTypes.append(QContactOnlineAccount::SubTypeSip); - onlineAccount->setSubTypes(subTypes); + onlineAccount.setSubTypes(subTypes); } - else if (property.name() == QString::fromAscii("X-IMPP") || - property.name() == QString::fromAscii("IMPP")) { - onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeImpp); + else if (property.name() == QLatin1String("X-IMPP") || + property.name() == QLatin1String("IMPP")) { + onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeImpp); } else { // NOP } - return onlineAccount; + + saveDetailWithContext(contact, &onlineAccount, extractContexts(property)); + return true; } /*! * Creates a QContactAvatar from \a property */ -QContactDetail* QVersitContactImporterPrivate::createAvatar( - const QVersitProperty& property, - const QVersitDocument& versitDocument, - const QString& subType) const +bool QVersitContactImporterPrivate::createAvatar( + const QVersitProperty& property, const QString& subType, QContact* contact) const { - QString value(QString::fromAscii(property.value())); - - const QString valueParam = - property.parameters().value(QString::fromAscii("VALUE")); + QString location; + QByteArray data; + if (!(saveDataFromProperty(property, &location, &data))) + return false; - if (valueParam != QString::fromAscii("URL")) { - QString pathAndName(mImagePath); - if (subType == QContactAvatar::SubTypeAudioRingtone) - pathAndName = mAudioClipPath; - if (!pathAndName.endsWith(QString::fromAscii("/"))) - pathAndName += QString::fromAscii("/"); - pathAndName += getFirstAndLastName(versitDocument); - value = saveContentToFile(pathAndName,property); + QContactAvatar avatar; + if (!location.isEmpty()) + avatar.setAvatar(location); + if (subType == QContactAvatar::SubTypeImage && !data.isEmpty()) { + QPixmap pixmap; + if (pixmap.loadFromData(data)) + avatar.setPixmap(pixmap); } + avatar.setSubType(subType); - QContactAvatar* avatar = 0; - if (!value.isEmpty()) { - avatar = new QContactAvatar(); - avatar->setAvatar(value); - avatar->setSubType(subType); - } - return avatar; + saveDetailWithContext(contact, &avatar, extractContexts(property)); + return true; } /*! * Creates a QContactGeolocation from \a property */ -QContactDetail* QVersitContactImporterPrivate::createGeoLocation( - const QVersitProperty& property) const +bool QVersitContactImporterPrivate::createGeoLocation( + const QVersitProperty& property, QContact* contact) const { - QContactGeolocation* geo = new QContactGeolocation(); - QList values = property.value().split(','); - geo->setLongitude(takeFirst(values).toDouble()); - geo->setLatitude(takeFirst(values).toDouble()); - return geo; + QContactGeoLocation geo; + QStringList values = property.value().split(QLatin1Char(',')); + geo.setLongitude(takeFirst(values).toDouble()); + geo.setLatitude(takeFirst(values).toDouble()); + + saveDetailWithContext(contact, &geo, extractContexts(property)); + return true; } /*! * Creates a QContactFamily from \a property */ -QContactDetail* QVersitContactImporterPrivate::createFamily( - const QVersitProperty& property, - const QContact& contact) const +bool QVersitContactImporterPrivate::createFamily( + const QVersitProperty& property, QContact* contact) const { - QString val = QString::fromAscii(property.value()); - QContactFamily family = - static_cast(contact.detail(QContactFamily::DefinitionName)); - if (property.name() == QString::fromAscii("X-SPOUSE")) { + QString val = property.value(); + QContactFamily family = contact->detail(); + if (property.name() == QLatin1String("X-SPOUSE")) { family.setSpouse(val); - } else if (property.name() == QString::fromAscii("X-CHILDREN")) { - family.setChildren(val.split(QString::fromAscii(","))); + } else if (property.name() == QLatin1String("X-CHILDREN")) { + family.setChildren(val.split(QLatin1String(","))); } - return new QContactDetail(family); + + saveDetailWithContext(contact, &family, extractContexts(property)); + return true; } /*! * Creates a simple name-value contact detail. */ -QContactDetail* QVersitContactImporterPrivate::createNameValueDetail( - const QVersitProperty& property) const +bool QVersitContactImporterPrivate::createNameValueDetail( + const QVersitProperty& property, QContact* contact) const { - QContactDetail* detail = 0; QPair nameAndValueType = mDetailMappings.value(property.name()); - if (nameAndValueType.first.length() > 0) { - detail = new QContactDetail(nameAndValueType.first); - detail->setValue( - nameAndValueType.second,QString::fromAscii(property.value())); + if (nameAndValueType.first.isEmpty()) { + return false; } - return detail; + QContactDetail detail(nameAndValueType.first); + detail.setValue(nameAndValueType.second, property.value()); + + saveDetailWithContext(contact, &detail, extractContexts(property)); + return true; } /*! * Creates a simple name-value contact detail. */ -QContactDetail* QVersitContactImporterPrivate::createLabel( - const QVersitProperty& property, - const QContact& contact) const +bool QVersitContactImporterPrivate::createLabel( + const QVersitProperty& property, QContact* contact) const { - QContactName* name = 0; - QContactDetail detail = contact.detail(QContactName::DefinitionName); - if (!detail.isEmpty()) { - name = new QContactName(static_cast(detail)); - } else { - name = new QContactName(); + QContactName name; + QContactName existingName = contact->detail(); + if (!existingName.isEmpty()) { + name = existingName; } - // Setting the QContactDisplayLabel is done by the backend - name->setCustomLabel(QString::fromAscii(property.value())); - return name; + name.setCustomLabel(property.value()); + + saveDetailWithContext(contact, &name, extractContexts(property)); + return true; } /*! @@ -519,7 +506,7 @@ const QVersitProperty& property) const { QStringList types = - property.parameters().values(QString::fromAscii("TYPE")); + property.parameters().values(QLatin1String("TYPE")); QStringList contexts; foreach (QString type, types) { QString value = mContextMappings.value(type); @@ -536,7 +523,7 @@ const QVersitProperty& property) const { QStringList types = - property.parameters().values(QString::fromAscii("TYPE")); + property.parameters().values(QLatin1String("TYPE")); QStringList subTypes; foreach (QString type, types) { QString subType = mSubTypeMappings.value(type); @@ -547,88 +534,76 @@ } /*! - * Takes the first value in \a list and converts it to a QString. - * An empty QString is returned, if the list is empty. + * Takes the first value in \a list, or an empty QString is if the list is empty. */ -QString QVersitContactImporterPrivate::takeFirst(QList& list) const +QString QVersitContactImporterPrivate::takeFirst(QList& list) const { - QString first; - if (!list.isEmpty()) - first = QString::fromAscii(list.takeFirst()); - return first; + return list.empty() ? QString() : list.takeFirst(); } /*! * Parses a date and time from text */ QDateTime QVersitContactImporterPrivate::parseDateTime( - const QByteArray& text, - const QByteArray& format) const + const QString& value, + const QString& format) const { QDateTime dateTime; - QString value(QString::fromAscii(text)); - if (text.contains("-")) { + if (value.contains(QLatin1Char('-'))) { dateTime = QDateTime::fromString(value,Qt::ISODate); } else { - dateTime = QDateTime::fromString(value, QString::fromAscii(format)); + dateTime = QDateTime::fromString(value, format); } return dateTime; } /*! - * Save the value of the \a property to a file with name \a pathAndName. + * Extracts either a location (URI/filepath) from a \a property, or data (eg. if it was base64 + * encoded). If the property contains data, an attempt is made to save it and the location of the + * saved resource is recovered to *\a location. The data is stored into *\a data. */ -QString QVersitContactImporterPrivate::saveContentToFile( - const QString& pathAndName, - const QVersitProperty& property) const +bool QVersitContactImporterPrivate::saveDataFromProperty(const QVersitProperty &property, + QString *location, + QByteArray *data) const { - QString encoding = - property.parameters().value(QString::fromAscii("ENCODING")); - QByteArray content = property.value(); - - QString type = - property.parameters().value(QString::fromAscii("TYPE")); - // Use the type parameter value as it is, if not found in the mapping table - QString extension = mFileExtensionMappings.value(type,type); - - QString fileName(pathAndName); - fileName += QString::number(qrand()); - fileName += QString::fromAscii("."); - fileName += extension.toLower(); - - QFile file(fileName); - qint64 writeResult = -1; - if (file.open(QIODevice::WriteOnly)) { - if (encoding == QString::fromAscii("BASE64") || - encoding == QString::fromAscii("B")) { - writeResult = file.write(QByteArray::fromBase64(property.value())); - } else { - // default assumption - // quoted-printable encoding is parsed already in the reader - writeResult = file.write(property.value()); + bool found = false; + const QString valueParam = property.parameters().value(QLatin1String("VALUE")); + QVariant variant(property.variantValue()); + if (variant.type() == QVariant::String + || valueParam == QLatin1String("URL")) { + *location = property.value(); + found |= !location->isEmpty(); + } else if (variant.type() == QVariant::ByteArray) { + *data = variant.toByteArray(); + if (!data->isEmpty()) { + found = true; + *location = saveContentToFile(property, *data); } } - file.close(); - return (writeResult > 0) ? fileName : QString(); + return found; } /*! - * Extracts the first and last name from \a document to a string. + * Writes \a data to a file and returns the filename. \a property specifies the context in which + * the data was found. */ -QString QVersitContactImporterPrivate::getFirstAndLastName( - const QVersitDocument& document) const +QString QVersitContactImporterPrivate::saveContentToFile( + const QVersitProperty& property, const QByteArray& data) const { - QString name; - const QList properties = document.properties(); - foreach(const QVersitProperty& nameProperty, properties) { - if (nameProperty.name() == QString::fromAscii("N")) { - QList values = nameProperty.value().split(';'); - name.append(takeFirst(values)); - name.append(takeFirst(values)); - break; - } - } - return name; + QString filename; + bool ok = false; + if (mResourceHandler) + ok = mResourceHandler->saveResource(data, property, &filename); + return ok ? filename : QString(); } -QTM_END_NAMESPACE +/*! + * Saves \a detail to the \a contact. Also sets the contexts to \a contexts if it is not empty. + */ +void QVersitContactImporterPrivate::saveDetailWithContext( + QContact* contact, QContactDetail* detail, const QStringList& contexts) const +{ + if (!contexts.isEmpty()) + detail->setContexts(contexts); + contact->saveDetail(detail); +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitcontactimporter_p.h --- a/qtcontactsmobility/src/versit/qversitcontactimporter_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitcontactimporter_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -53,8 +53,8 @@ // We mean it. // -#include "qversitdefs.h" #include "qmobilityglobal.h" +#include "qversitcontactimporter.h" #include #include @@ -65,96 +65,53 @@ class QContact; class QContactDetail; class QContactOrganization; -QTM_END_NAMESPACE - -QTM_BEGIN_NAMESPACE - class QVersitProperty; class QVersitDocument; -class QVersitContactImporterPrivate +class Q_AUTOTEST_EXPORT QVersitContactImporterPrivate { public: QVersitContactImporterPrivate(); ~QVersitContactImporterPrivate(); - QContact importContact(const QVersitDocument& versitDocument); + QContact importContact(const QVersitDocument& versitDocument, int contactIndex); QList unconvertedVersitProperties(); - -private: - QContactDetail* createName( - const QVersitProperty& property, - const QContact& contact) const; - - QContactDetail* createPhone(const QVersitProperty& property) const; - - QContactDetail* createAddress(const QVersitProperty& property) const; - - QContactDetail* createOrganization( - const QVersitProperty& property, - const QContact& contact) const; - - void setOrganizationNames( - QContactOrganization& org, - const QVersitProperty& property) const; - - void setOrganizationLogo( - QContactOrganization& org, - const QVersitProperty& property) const; - - QContactDetail* createTimeStamp(const QVersitProperty& property) const; - - QContactDetail* createAnniversary(const QVersitProperty& property) const; - - QContactDetail* createBirthday(const QVersitProperty& property) const; - - QContactDetail* createAvatar( - const QVersitProperty& property, - const QVersitDocument& versitDocument, - const QString& subType) const; - void createNicknames( - const QVersitProperty& property, - QContact& contact) const; - - QContactDetail* createGeoLocation(const QVersitProperty& property) const; - - QContactDetail* createOnlineAccount(const QVersitProperty& property) const; - - QContactDetail* createFamily( - const QVersitProperty& property, - const QContact& contact)const; - - QContactDetail* createNameValueDetail(const QVersitProperty& property) const; - - QContactDetail* createLabel( - const QVersitProperty& property, - const QContact& contact) const; +private: + bool createName(const QVersitProperty& property, QContact* contact) const; + bool createPhone(const QVersitProperty& property, QContact* contact) const; + bool createAddress(const QVersitProperty& property, QContact* contact) const; + bool createOrganization(const QVersitProperty& property, QContact* contact) const; + void setOrganizationNames(QContactOrganization& org, const QVersitProperty& property) const; + void setOrganizationLogo(QContactOrganization& org, const QVersitProperty& property) const; + bool createTimeStamp(const QVersitProperty& property, QContact* contact) const; + bool createAnniversary(const QVersitProperty& property, QContact* contact) const; + bool createBirthday(const QVersitProperty& property, QContact* contact) const; + bool createNicknames(const QVersitProperty& property, QContact* contact) const; + bool createOnlineAccount(const QVersitProperty& property, QContact* contact) const; + bool createAvatar(const QVersitProperty& property, const QString& subType, QContact* contact) const; + bool createGeoLocation(const QVersitProperty& property, QContact* contact) const; + bool createFamily(const QVersitProperty& property, QContact* contact) const; + bool createNameValueDetail(const QVersitProperty& property, QContact* contact) const; + bool createLabel(const QVersitProperty& property, QContact* contact) const; + QStringList extractContexts(const QVersitProperty& property) const; + QStringList extractSubTypes(const QVersitProperty& property) const; + QString takeFirst(QList& list) const; + QDateTime parseDateTime(const QString& text, const QString& format) const; + QString saveContentToFile(const QVersitProperty& property, const QByteArray& data) const; + bool saveDataFromProperty(const QVersitProperty& property, QString* location, QByteArray* data) const; + void saveDetailWithContext( + QContact* contact, QContactDetail* detail, const QStringList& contexts) const; - QStringList extractContexts(const QVersitProperty& property) const; - - QStringList extractSubTypes(const QVersitProperty& property) const; - - QString takeFirst(QList& list) const; - - QDateTime parseDateTime(const QByteArray& text, const QByteArray& format) const; - - QString saveContentToFile( - const QString& path, - const QVersitProperty& property) const; - - QString getFirstAndLastName(const QVersitDocument& document) const; - public: // Data - QString mImagePath; - QString mAudioClipPath; - QList mUnknownVersitProperties; + QVersitContactImporterPropertyHandler* mPropertyHandler; + QVersitDefaultResourceHandler* mDefaultResourceHandler; + QVersitResourceHandler* mResourceHandler; private: // Data QHash > mDetailMappings; QHash mContextMappings; QHash mSubTypeMappings; - QHash mFileExtensionMappings; }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitdefaultresourcehandler_p.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/versit/qversitdefaultresourcehandler_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QVERSITDEFAULTRESOURCEHANDLER_P_H +#define QVERSITDEFAULTRESOURCEHANDLER_P_H + +#include + +QTM_BEGIN_NAMESPACE + +class QVersitDefaultResourceHandlerPrivate { +public: + QMap mFileExtensionMapping; +}; + +QTM_END_NAMESPACE + +#endif // QVERSITDEFAULTRESOURCEHANDLER_P_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitdefs.h --- a/qtcontactsmobility/src/versit/qversitdefs.h Fri Mar 19 09:27:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,186 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#ifndef QVERSITDEFS_H -#define QVERSITDEFS_H - -#include "qmobilityglobal.h" - -#include -#include -#include -#include -#include "qcontactaddress.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -QTM_BEGIN_NAMESPACE - -// Mapping between a string in versit specifications and Qt contact details -struct versitContactDetailMapping { - const char* versitPropertyName; - const char* contactDetailDefinitionName; - const char* contactDetailValueKey; -}; - -//! [Property name mappings] -// Mappings from versit property names to Qt contact details -const versitContactDetailMapping versitContactDetailMappings[] = { - {"ADR", QContactAddress::DefinitionName.str, - ""}, - {"BDAY", QContactBirthday::DefinitionName.str, - QContactBirthday::FieldBirthday.str}, - {"FN", QContactDisplayLabel::DefinitionName.str, - ""}, - {"GEO", QContactGeolocation::DefinitionName.str, - ""}, - {"EMAIL", QContactEmailAddress::DefinitionName.str, - QContactEmailAddress::FieldEmailAddress.str}, - {"IMPP", QContactOnlineAccount::DefinitionName.str, - QContactOnlineAccount::SubTypeImpp.str}, - {"LOGO", QContactOrganization::DefinitionName.str, - QContactOrganization::FieldLogo.str}, - {"N", QContactName::DefinitionName.str, - ""}, - {"NICKNAME", QContactNickname::DefinitionName.str, - QContactNickname::FieldNickname.str}, - {"NOTE", QContactNote::DefinitionName.str, - QContactNote::FieldNote.str}, - {"ORG", QContactOrganization::DefinitionName.str, - QContactOrganization::FieldName.str}, - {"PHOTO", QContactAvatar::DefinitionName.str, - QContactAvatar::SubTypeImage.str}, - {"REV", QContactTimestamp::DefinitionName.str, - ""}, - {"ROLE", QContactOrganization::DefinitionName.str, - QContactOrganization::FieldRole.str}, - {"SOUND", QContactAvatar::DefinitionName.str, - QContactAvatar::SubTypeAudioRingtone.str}, - {"TEL", QContactPhoneNumber::DefinitionName.str, - QContactPhoneNumber::FieldNumber.str}, - {"TITLE", QContactOrganization::DefinitionName.str, - QContactOrganization::FieldTitle.str}, - {"UID", QContactGuid::DefinitionName.str, - QContactGuid::FieldGuid.str}, - {"URL", QContactUrl::DefinitionName.str, - QContactUrl::FieldUrl.str}, - {"X-ANNIVERSARY", QContactAnniversary::DefinitionName.str, - ""}, - {"X-ASSISTANT", QContactOrganization::DefinitionName.str, - QContactOrganization::FieldAssistantName.str}, - {"X-CHILDREN", QContactFamily::DefinitionName.str, - QContactFamily::FieldChildren.str}, - {"X-GENDER", QContactGender::DefinitionName.str, - QContactGender::FieldGender.str}, - {"X-IMPP", QContactOnlineAccount::DefinitionName.str, - QContactOnlineAccount::SubTypeImpp.str}, - {"X-NICKNAME", QContactNickname::DefinitionName.str, - QContactNickname::FieldNickname.str}, - {"X-SIP", QContactOnlineAccount::DefinitionName.str, - ""}, - {"X-SPOUSE", QContactFamily::DefinitionName.str, - QContactFamily::FieldSpouse.str} -}; -//! [Property name mappings] - -// Mapping between a string in versit specifications and Qt contacts -struct versitMapping { - const char* versitString; - const char* contactString; -}; - -// Mappings from versit TYPE parameters to Qt contact detail contexts -const versitMapping versitContextMappings[] = { - {"HOME", QContactDetail::ContextHome.str}, - {"WORK", QContactDetail::ContextWork.str}, -}; - -//! [Property type parameter mappings] -// Mappings from versit TYPE parameters to Qt contact detail subtypes -const versitMapping versitSubTypeMappings[] = { - {"DOM", QContactAddress::SubTypeDomestic.str}, - {"INTL", QContactAddress::SubTypeInternational.str}, - {"POSTAL", QContactAddress::SubTypePostal.str}, - {"PARCEL", QContactAddress::SubTypeParcel.str}, - {"VOICE", QContactPhoneNumber::SubTypeVoice.str}, - {"CELL", QContactPhoneNumber::SubTypeMobile.str}, - {"MODEM", QContactPhoneNumber::SubTypeModem.str}, - {"CAR", QContactPhoneNumber::SubTypeCar.str}, - {"VIDEO", QContactPhoneNumber::SubTypeVideo.str}, - {"FAX", QContactPhoneNumber::SubTypeFacsimile.str}, - {"BBS", QContactPhoneNumber::SubTypeBulletinBoardSystem.str}, - {"PAGER", QContactPhoneNumber::SubTypePager.str}, - {"SWIS", QContactOnlineAccount::SubTypeVideoShare.str}, - {"VOIP", QContactOnlineAccount::SubTypeSipVoip.str} -}; -//! [Property type parameter mappings] - -//! [File extension mappings] -// Mappings from file types in versit specifications to file extensions -const versitMapping versitFileExtensionMappings[] = { - {"JPEG", "JPG"}, - {"WAVE", "WAV"}, - {"PICT", "PCT"}, - {"TIFF", "TIF"}, - {"MPEG", "MPG"}, - {"MPEG2", "M2P"}, - {"QTIME", "QT"}, - {"AIFF", "AIF"}, - {"GIF", "GIF"} -}; -//! [File extension mappings] - -QTM_END_NAMESPACE - -#endif // QVERSITDEFS_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitdefs_p.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/versit/qversitdefs_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,309 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#ifndef QVERSITDEFS_P_H +#define QVERSITDEFS_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qmobilityglobal.h" + +#include +#include +#include +#include +#include "qcontactaddress.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QTM_BEGIN_NAMESPACE + +// Mapping between a string in versit specifications and Qt contact details +struct VersitContactDetailMapping { + const char* versitPropertyName; + const char* contactDetailDefinitionName; + const char* contactDetailValueKey; +}; + +//! [Property name mappings] +// Mappings from versit property names to Qt contact details +const VersitContactDetailMapping versitContactDetailMappings[] = { + {"ADR", QContactAddress::DefinitionName.str, + ""}, + {"BDAY", QContactBirthday::DefinitionName.str, + QContactBirthday::FieldBirthday.str}, + {"FN", QContactDisplayLabel::DefinitionName.str, + ""}, + {"GEO", QContactGeolocation::DefinitionName.str, + ""}, + {"EMAIL", QContactEmailAddress::DefinitionName.str, + QContactEmailAddress::FieldEmailAddress.str}, + {"IMPP", QContactOnlineAccount::DefinitionName.str, + QContactOnlineAccount::SubTypeImpp.str}, + {"LOGO", QContactOrganization::DefinitionName.str, + QContactOrganization::FieldLogo.str}, + {"N", QContactName::DefinitionName.str, + ""}, + {"NICKNAME", QContactNickname::DefinitionName.str, + QContactNickname::FieldNickname.str}, + {"NOTE", QContactNote::DefinitionName.str, + QContactNote::FieldNote.str}, + {"ORG", QContactOrganization::DefinitionName.str, + QContactOrganization::FieldName.str}, + {"PHOTO", QContactAvatar::DefinitionName.str, + QContactAvatar::SubTypeImage.str}, + {"REV", QContactTimestamp::DefinitionName.str, + ""}, + {"ROLE", QContactOrganization::DefinitionName.str, + QContactOrganization::FieldRole.str}, + {"SOUND", QContactAvatar::DefinitionName.str, + QContactAvatar::SubTypeAudioRingtone.str}, + {"TEL", QContactPhoneNumber::DefinitionName.str, + QContactPhoneNumber::FieldNumber.str}, + {"TITLE", QContactOrganization::DefinitionName.str, + QContactOrganization::FieldTitle.str}, + {"UID", QContactGuid::DefinitionName.str, + QContactGuid::FieldGuid.str}, + {"URL", QContactUrl::DefinitionName.str, + QContactUrl::FieldUrl.str}, + {"X-ANNIVERSARY", QContactAnniversary::DefinitionName.str, + ""}, + {"X-ASSISTANT", QContactOrganization::DefinitionName.str, + QContactOrganization::FieldAssistantName.str}, + {"X-CHILDREN", QContactFamily::DefinitionName.str, + QContactFamily::FieldChildren.str}, + {"X-EPOCSECONDNAME",QContactNickname::DefinitionName.str, + QContactNickname::FieldNickname.str}, + {"X-GENDER", QContactGender::DefinitionName.str, + QContactGender::FieldGender.str}, + {"X-IMPP", QContactOnlineAccount::DefinitionName.str, + QContactOnlineAccount::SubTypeImpp.str}, + {"X-NICKNAME", QContactNickname::DefinitionName.str, + QContactNickname::FieldNickname.str}, + {"X-SIP", QContactOnlineAccount::DefinitionName.str, + ""}, + {"X-SPOUSE", QContactFamily::DefinitionName.str, + QContactFamily::FieldSpouse.str} +}; +//! [Property name mappings] + +// Mapping between a string in versit specifications and Qt contacts +struct VersitMapping { + const char* versitString; + const char* contactString; +}; + +// Mappings from versit TYPE parameters to Qt contact detail contexts +const VersitMapping versitContextMappings[] = { + {"HOME", QContactDetail::ContextHome.str}, + {"WORK", QContactDetail::ContextWork.str}, +}; + +//! [Property type parameter mappings] +// Mappings from versit TYPE parameters to Qt contact detail subtypes +const VersitMapping versitSubTypeMappings[] = { + {"DOM", QContactAddress::SubTypeDomestic.str}, + {"INTL", QContactAddress::SubTypeInternational.str}, + {"POSTAL", QContactAddress::SubTypePostal.str}, + {"PARCEL", QContactAddress::SubTypeParcel.str}, + {"VOICE", QContactPhoneNumber::SubTypeVoice.str}, + {"CELL", QContactPhoneNumber::SubTypeMobile.str}, + {"MODEM", QContactPhoneNumber::SubTypeModem.str}, + {"CAR", QContactPhoneNumber::SubTypeCar.str}, + {"VIDEO", QContactPhoneNumber::SubTypeVideo.str}, + {"FAX", QContactPhoneNumber::SubTypeFacsimile.str}, + {"BBS", QContactPhoneNumber::SubTypeBulletinBoardSystem.str}, + {"PAGER", QContactPhoneNumber::SubTypePager.str}, + {"SWIS", QContactOnlineAccount::SubTypeVideoShare.str}, + {"VOIP", QContactOnlineAccount::SubTypeSipVoip.str} +}; +//! [Property type parameter mappings] + +//! [File extension mappings] +// Mappings from mime types to file extensions +const VersitMapping versitFileExtensionMappings[] = { + {"application/octet-stream", "obj"}, + {"audio/x-pn-realaudio", "ra"}, + {"application/xml", "wsdl"}, + {"application/octet-stream", "dll"}, + {"image/x-cmu-raster", "ras"}, + {"application/x-pn-realaudio", "ram"}, + {"application/x-bcpio", "bcpio"}, + {"application/x-sh", "sh"}, + {"video/mpeg", "m1v"}, + {"image/x-xwindowdump", "xwd"}, + {"video/x-msvideo", "avi"}, + {"image/x-ms-bmp", "bmp"}, + {"application/x-shar", "shar"}, + {"application/x-javascript", "js"}, + {"application/x-wais-source", "src"}, + {"application/x-dvi", "dvi"}, + {"audio/x-aiff", "aif"}, + {"text/plain", "ksh"}, + {"application/msword", "dot"}, + {"message/rfc822", "mht"}, + {"application/x-pkcs12", "p12"}, + {"text/css", "css"}, + {"application/x-csh", "csh"}, + {"application/vnd.ms-powerpoint", "pwz"}, + {"application/pdf", "pdf"}, + {"application/x-netcdf", "cdf"}, + {"text/plain", "pl"}, + {"text/plain", "c"}, + {"image/jpeg", "jpe"}, + {"image/jpeg", "jpg"}, + {"text/x-python", "py"}, + {"text/xml", "xml"}, + {"image/jpeg", "jpeg"}, + {"application/postscript", "ps"}, + {"application/x-gtar", "gtar"}, + {"image/x-xpixmap", "xpm"}, + {"application/x-hdf", "hdf"}, + {"message/rfc822", "nws"}, + {"text/tab-separated-values", "tsv"}, + {"application/xml", "xpdl"}, + {"application/pkcs7-mime", "p7c"}, + {"application/postscript", "eps"}, + {"image/ief", "ief"}, + {"application/octet-stream", "so"}, + {"application/vnd.ms-excel", "xlb"}, + {"image/x-portable-bitmap", "pbm"}, + {"application/x-texinfo", "texinfo"}, + {"application/vnd.ms-excel", "xls"}, + {"application/x-tex", "tex"}, + {"text/richtext", "rtx"}, + {"text/html", "html"}, + {"audio/x-aiff", "aiff"}, + {"audio/x-aiff", "aifc"}, + {"application/octet-stream", "exe"}, + {"text/x-sgml", "sgm"}, + {"image/tiff", "tif"}, + {"video/mpeg", "mpeg"}, + {"application/x-ustar", "ustar"}, + {"image/gif", "gif"}, + {"application/vnd.ms-powerpoint", "ppt"}, + {"application/vnd.ms-powerpoint", "pps"}, + {"text/x-sgml", "sgml"}, + {"image/x-portable-pixmap", "ppm"}, + {"application/x-latex", "latex"}, + {"text/plain", "bat"}, + {"video/quicktime", "mov"}, + {"application/vnd.ms-powerpoint", "ppa"}, + {"application/x-troff", "tr"}, + {"application/xml", "rdf"}, + {"application/xml", "xsl"}, + {"message/rfc822", "eml"}, + {"application/x-netcdf", "nc"}, + {"application/x-sv4cpio", "sv4cpio"}, + {"application/octet-stream", "bin"}, + {"text/plain", "h"}, + {"application/x-tcl", "tcl"}, + {"application/msword", "wiz"}, + {"application/octet-stream", "o"}, + {"application/octet-stream", "a"}, + {"application/postscript", "ai"}, + {"audio/x-wav", "wav"}, + {"text/x-vcard", "vcf"}, + {"image/x-xbitmap", "xbm"}, + {"text/plain", "txt"}, + {"audio/basic", "au"}, + {"application/x-troff", "t"}, + {"image/tiff", "tiff"}, + {"application/x-texinfo", "texi"}, + {"application/oda", "oda"}, + {"application/x-troff-ms", "ms"}, + {"image/x-rgb", "rgb"}, + {"application/x-troff-me", "me"}, + {"application/x-sv4crc", "sv4crc"}, + {"video/quicktime", "qt"}, + {"video/mpeg", "mpa"}, + {"video/mpeg", "mpg"}, + {"video/mpeg", "mpe"}, + {"application/msword", "doc"}, + {"image/x-portable-graymap", "pgm"}, + {"application/vnd.ms-powerpoint", "pot"}, + {"application/x-mif", "mif"}, + {"application/x-troff", "roff"}, + {"text/html", "htm"}, + {"application/x-troff-man", "man"}, + {"text/x-setext", "etx"}, + {"application/zip", "zip"}, + {"video/x-sgi-movie", "movie"}, + {"application/x-python-code", "pyc"}, + {"image/png", "png"}, + {"application/x-pkcs12", "pfx"}, + {"message/rfc822", "mhtml"}, + {"application/x-tar", "tar"}, + {"image/x-portable-anymap", "pnm"}, + {"application/x-python-code", "pyo"}, + {"audio/basic", "snd"}, + {"application/x-cpio", "cpio"}, + {"application/x-shockwave-flash", "swf"}, + {"audio/mpeg", "mp3"}, + {"audio/mpeg", "mp2"} +}; +//! [File extension mappings] + +QTM_END_NAMESPACE + +#endif // QVERSITDEFS_P_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitdocument.cpp --- a/qtcontactsmobility/src/versit/qversitdocument.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitdocument.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -43,20 +43,19 @@ #include "qversitdocument_p.h" #include "qmobilityglobal.h" -QTM_BEGIN_NAMESPACE +#include + +QTM_USE_NAMESPACE /*! \class QVersitDocument - - \brief The QVersitDocument class is a container for 0..n versit properties. - + \preliminary + \brief The QVersitDocument class is a container for a list of versit properties. \ingroup versit - For example a vCard can be presented as a QVersitDocument that - consists of 0..n properties such as a name (N), - a telephone number (TEL) and an email address (EMAIL) to name a few. - Each of these properties is stored as - an instance of a QVersitProperty in a QVersitDocument. + For example a vCard can be presented as a QVersitDocument that consists of a number of properties + such as a name (N), a telephone number (TEL) and an email address (EMAIL) to name a few. + Each of these properties is stored as an instance of a QVersitProperty in a QVersitDocument. QVersitDocument supports implicit sharing. @@ -86,10 +85,23 @@ return *this; } +/*! Returns true if this is equal to \a other; false otherwise. */ +bool QVersitDocument::operator==(const QVersitDocument& other) const +{ + return d->mVersitType == other.d->mVersitType && + d->mProperties == other.d->mProperties; +} + +/*! Returns true if this is not equal to \a other; false otherwise. */ +bool QVersitDocument::operator!=(const QVersitDocument& other) const +{ + return !(*this == other); +} + /*! * Sets the versit document type to \a type. */ -void QVersitDocument::setVersitType(VersitType type) +void QVersitDocument::setType(VersitType type) { d->mVersitType = type; } @@ -97,7 +109,7 @@ /*! * Gets the versit document type. */ -QVersitDocument::VersitType QVersitDocument::versitType() const +QVersitDocument::VersitType QVersitDocument::type() const { return d->mVersitType; } @@ -112,16 +124,15 @@ } /*! - * Gets the list of the contained versit properties. - * Note that the actual properties cannot be modified using the copy. + * Removes the property \a property from the versit document. */ -QList QVersitDocument::properties() const +void QVersitDocument::removeProperty(const QVersitProperty& property) { - return d->mProperties; + d->mProperties.removeAll(property); } /*! - * Removes all the properties with \a name from the versit document. + * Removes all the properties with the given \a name from the versit document. */ void QVersitDocument::removeProperties(const QString& name) { @@ -132,4 +143,41 @@ } } -QTM_END_NAMESPACE +/*! + * Clears the document, removing all properties and metadata + * and resetting the codec to the default. + */ +void QVersitDocument::clear() +{ + d->mProperties.clear(); + d->mVersitType = QVersitDocument::InvalidType; +} + +/*! + * Gets the list of the contained versit properties. + * Note that the actual properties cannot be modified using the copy. + */ +QList QVersitDocument::properties() const +{ + return d->mProperties; +} + +/*! + * Returns true if the document is empty. + */ +bool QVersitDocument::isEmpty() const +{ + return d->mProperties.count() == 0 && d->mVersitType == QVersitDocument::InvalidType; +} + +/*! \internal */ +void QVersitDocument::setVersitType(VersitType type) +{ + setType(type); +} + +/*! \internal */ +QVersitDocument::VersitType QVersitDocument::versitType() const +{ + return type(); +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitdocument.h --- a/qtcontactsmobility/src/versit/qversitdocument.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitdocument.h Fri Apr 16 14:53:18 2010 +0300 @@ -46,6 +46,9 @@ #include #include +#include + +class QTextCodec; QTM_BEGIN_NAMESPACE @@ -60,20 +63,35 @@ ~QVersitDocument(); QVersitDocument& operator=(const QVersitDocument& other); + bool operator==(const QVersitDocument& other) const; + bool operator!=(const QVersitDocument& other) const; /*! Versit document type */ enum VersitType { - VCard21, // vCard version 2.1 - VCard30 // vCard version 3.0 (RFC 2426) + InvalidType, + VCard21Type, // vCard version 2.1 + VCard30Type // vCard version 3.0 (RFC 2426) + // Deprecated: + , + VCard21 = VCard21Type, + VCard30 = VCard30Type }; // metadata about the versit document itself. - void setVersitType(VersitType type); - VersitType versitType() const; + void setType(VersitType type); + VersitType type() const; void addProperty(const QVersitProperty& property); + void removeProperty(const QVersitProperty& property); + void removeProperties(const QString& name); QList properties() const; - void removeProperties(const QString& name); + + bool isEmpty() const; + void clear(); + + // Deprecated: + void Q_DECL_DEPRECATED setVersitType(VersitType type); + VersitType Q_DECL_DEPRECATED versitType() const; private: @@ -82,4 +100,6 @@ QTM_END_NAMESPACE +Q_DECLARE_METATYPE(QTM_PREPEND_NAMESPACE(QVersitDocument)) + #endif // QVERSITDOCUMENT_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitdocument_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/versit/qversitdocument_p.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qversitdocument_p.h" + +QTM_USE_NAMESPACE + +QVersitDocumentPrivate::QVersitDocumentPrivate() + : QSharedData(), + mVersitType(QVersitDocument::InvalidType) +{ +} + +QVersitDocumentPrivate::QVersitDocumentPrivate(const QVersitDocumentPrivate& other) + : QSharedData(other), + mVersitType(other.mVersitType), + mProperties(other.mProperties) +{ +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitdocument_p.h --- a/qtcontactsmobility/src/versit/qversitdocument_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitdocument_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -42,6 +42,17 @@ #ifndef QVERSITDOCUMENT_P_H #define QVERSITDOCUMENT_P_H +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + #include "qversitdocument.h" #include "qversitproperty.h" #include "qmobilityglobal.h" @@ -49,23 +60,16 @@ #include #include +class QTextCodec; + QTM_BEGIN_NAMESPACE class QVersitDocumentPrivate : public QSharedData { public: - QVersitDocumentPrivate() - : QSharedData(), - mVersitType(QVersitDocument::VCard21) - { - } + QVersitDocumentPrivate(); - QVersitDocumentPrivate(const QVersitDocumentPrivate& other) - : QSharedData(other), - mVersitType(other.mVersitType), - mProperties(other.mProperties) - { - } + QVersitDocumentPrivate(const QVersitDocumentPrivate& other); ~QVersitDocumentPrivate() { diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitdocumentwriter_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/versit/qversitdocumentwriter_p.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,175 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qversitdocumentwriter_p.h" +#include "versitutils_p.h" +#include + +QTM_USE_NAMESPACE + +#define MAX_LINE_LENGTH 76 + +/*! + \class QVersitDocumentWriter + \internal + \brief The QVersitDocumentWriter class provides an interface for writing a + single versit document into a vCard text string. + */ + +/*! Constructs a writer. + * \a documentType is the type of Versit document, as printed on the BEGIN line of output + * eg. "VCARD" + * \a version is the version of the Versit format, as printed on the VERSION line of output. + * eg. "2.1" + */ +QVersitDocumentWriter::QVersitDocumentWriter( + const QByteArray& documentType, + const QByteArray& version) + : mDocumentType(documentType), + mVersion(version), + mCodec(0), + mEncoder(0), + mUtf8Encoder(QTextCodec::codecForName("UTF-8")->makeEncoder()), + mSuccessful(true), + mCurrentLineLength(0) +{ + // Hack so the encoder doesn't output a byte order mark for UTF-8. + mUtf8Encoder->fromUnicode(QString()); +} + +QVersitDocumentWriter::~QVersitDocumentWriter() +{ + if (mEncoder) + delete mEncoder; + delete mUtf8Encoder; +} + +/*! + Sets the codec to write with. + */ +void QVersitDocumentWriter::setCodec(QTextCodec *codec) +{ + if (mEncoder) + delete mEncoder; + mCodec = codec; + mEncoder = codec->makeEncoder(); + + // Hack so the encoder doesn't output a byte order mark for UTF-8. + if (mCodec->name() == "UTF-8") + mEncoder->fromUnicode(QString()); +} + +/*! + Sets the device to write to. + */ +void QVersitDocumentWriter::setDevice(QIODevice *device) +{ + mDevice = device; +} + +/*! +* Encodes the \a document and writes it to the device +*/ +void QVersitDocumentWriter::encodeVersitDocument(const QVersitDocument& document) +{ + mSuccessful = true; + QList properties = document.properties(); + + writeString(QLatin1String("BEGIN:" + mDocumentType)); + writeCrlf(); + writeString(QLatin1String("VERSION:" + mVersion)); + writeCrlf(); + foreach (QVersitProperty property, properties) { + encodeVersitProperty(property); + } + writeString(QLatin1String("END:" + mDocumentType)); + writeCrlf(); +} + +/*! + * Encodes the groups and name in the \a property and writes it to the device + */ +void QVersitDocumentWriter::encodeGroupsAndName(const QVersitProperty& property) +{ + QStringList groups = property.groups(); + if (!groups.isEmpty()) { + writeString(groups.join(QLatin1String("."))); + writeString(QLatin1String(".")); + } + writeString(property.name()); +} + +/*! + Writes \a string to the device. + If \a useUtf8 is true, uses the UTF-8 codec instead of the one set in setCodec(). + + This function tracks how many characters have been written to the line and folds (wraps) the line + according to RFC2425. + */ +void QVersitDocumentWriter::writeString(const QString &string, bool useUtf8) +{ + QString value(string); // nonconst copy + QTextEncoder* encoder = useUtf8 ? mUtf8Encoder : mEncoder; + int spaceRemaining = MAX_LINE_LENGTH - mCurrentLineLength; + while (spaceRemaining < value.length()) { + // Write the first "spaceRemaining" characters + QString line(value.left(spaceRemaining)); + value.remove(0, spaceRemaining); + if (mDevice->write(encoder->fromUnicode(line + QLatin1String("\r\n "))) < 0) + mSuccessful = false; + spaceRemaining = MAX_LINE_LENGTH - 1; // minus 1 for the space at the front. + mCurrentLineLength = 1; + } + + if (mDevice->write(encoder->fromUnicode(value)) < 0) + mSuccessful = false; + mCurrentLineLength += value.length(); +} + +/*! + Writes a CRLF to the device. By using this function, rather than writeString("\\r\\n"), you will + allow the writer to know where a line starts, for folding purposes. + */ +void QVersitDocumentWriter::writeCrlf() +{ + writeString(QLatin1String("\r\n")); + mCurrentLineLength = 0; +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitdocumentwriter_p.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/versit/qversitdocumentwriter_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,95 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QVERSITDOCUMENTWRITER_H +#define QVERSITDOCUMENTWRITER_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qversitproperty.h" +#include +#include + +class QIODevice; +class QTextCodec; +class QTextEncoder; + +QTM_BEGIN_NAMESPACE + +class Q_AUTOTEST_EXPORT QVersitDocumentWriter +{ +public: + QVersitDocumentWriter(const QByteArray& documentType, const QByteArray& version); + virtual ~QVersitDocumentWriter(); + + void setCodec(QTextCodec* codec); + void setDevice(QIODevice* device); + + virtual void encodeVersitProperty(const QVersitProperty& property) = 0; + virtual void encodeParameters(const QMultiHash& parameters) = 0; + void encodeVersitDocument(const QVersitDocument& document); + void encodeGroupsAndName(const QVersitProperty& property); + + void writeString(const QString& string, bool useUtf8 = false); + void writeCrlf(); + + QByteArray mDocumentType; + QByteArray mVersion; + QIODevice* mDevice; + QTextCodec* mCodec; + QTextEncoder* mEncoder; + QTextEncoder* mUtf8Encoder; + bool mSuccessful; + int mCurrentLineLength; +}; + +QTM_END_NAMESPACE + +#endif // QVERSITDOCUMENTWRITER_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitproperty.cpp --- a/qtcontactsmobility/src/versit/qversitproperty.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitproperty.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -44,26 +44,29 @@ #include "qmobilityglobal.h" #include +#include -QTM_BEGIN_NAMESPACE +QTM_USE_NAMESPACE /*! \class QVersitProperty - - \brief The QVersitProperty class stores the name, value and parameters of a versit property. - + \preliminary + \brief The QVersitProperty class stores the name, value, groups and parameters of a Versit property. \ingroup versit - - For example a vCard can be presented as a QVersitDocument that - consists of 0..n properties such as a name (N), - a telephone number (TEL) and an email address (EMAIL) to name a few. - Each of these properties is stored as - an instance of a QVersitProperty in a QVersitDocument. + + For example a vCard can be presented as a QVersitDocument that consists of a number of properties + such as a name (N), a telephone number (TEL) and an email address (EMAIL) to name a few. + Each of these properties is stored as an instance of a QVersitProperty in a QVersitDocument. QVersitProperty supports implicit sharing. - The property name and parameters of a QVersitProperty are converted - to upper-case when they are stored to a QVersitProperty. - The value of a QVersitProperty is raw data and it is case-sensitive. + The property name and parameters of a QVersitProperty are converted to upper-case when they are + stored to a QVersitProperty. + + The value of a QVersitProperty is stored as a QVariant and should always be one of three types: + QString for textual values, QByteArray for binary data (eg. images), or QVersitDocument for + nested documents. The \l QVersitReader will parse Versit properties and assign the correct type + of object to the property value. The \l QVersitWriter will serialise objects of these types + correctly into the (text-based) Versit format. \sa QVersitDocument */ @@ -92,6 +95,21 @@ return *this; } +/*! Returns true if this is equal to \a other; false otherwise. */ +bool QVersitProperty::operator==(const QVersitProperty& other) const +{ + return d->mGroups == other.d->mGroups && + d->mName == other.d->mName && + d->mParameters == other.d->mParameters && + d->mValue == other.d->mValue; +} + +/*! Returns true if this is not equal to \a other; false otherwise. */ +bool QVersitProperty::operator!=(const QVersitProperty& other) const +{ + return !(*this == other); +} + /*! * Sets the groups in the property to the given list of \a groups. */ @@ -104,7 +122,7 @@ } /*! - * Gets the groups part of the property. + * Gets the groups of the property. */ QStringList QVersitProperty::groups() const { @@ -143,7 +161,7 @@ QList values = parameters.values(key); for (int j=values.count()-1; j >= 0; j--) { // Convert all the parameter names and values to upper case - addParameter(key,values.at(j)); + insertParameter(key,values.at(j)); } } } @@ -152,17 +170,29 @@ * Adds a new parameter with \a name and \a value. * Both the name and the value are converted to upper-case. */ -void QVersitProperty::addParameter(const QString& name, const QString& value) +void QVersitProperty::insertParameter(const QString& name, const QString& value) { - d->mParameters.insert(name.toUpper(),value.toUpper()); + d->mParameters.insert(name.toUpper(), value.toUpper()); } /*! * Removes a parameter with \a name and \a value. + * + * \sa removeParameters() */ void QVersitProperty::removeParameter(const QString& name, const QString& value) { - d->mParameters.remove(name.toUpper(),value.toUpper()); + d->mParameters.remove(name.toUpper(), value.toUpper()); +} + +/*! + * Removes all parameters with the given \a name. + * + * \sa removeParameter() + */ +void QVersitProperty::removeParameters(const QString& name) +{ + d->mParameters.remove(name.toUpper()); } /*! @@ -175,9 +205,9 @@ } /*! - * Sets the \a value of the property. + * Sets the property value to \a value. */ -void QVersitProperty::setValue(const QByteArray& value) +void QVersitProperty::setValue(const QVariant& value) { d->mValue = value; } @@ -185,26 +215,76 @@ /*! * Returns the value of the property. */ -QByteArray QVersitProperty::value() const +QVariant QVersitProperty::variantValue() const { return d->mValue; } /*! - * Sets the embedded \a document of the property + * \fn T QVersitProperty::value() const + * \overload + * Returns the value of the property as a \tt T. + */ + +/*! + * Returns the value of the property as a string if possible, otherwise return an empty string. + * If the property is stored as a QByteArray, it is decoded using the charset specified in the + * property's parameters. + * \sa QVariant::toString() */ -void QVersitProperty::setEmbeddedDocument(const QVersitDocument& document) +QString QVersitProperty::value() const { - d->mDocument = document; + if (d->mValue.type() == QVariant::ByteArray) { + if (d->mParameters.contains(QLatin1String("CHARSET"))) { + QTextCodec* codec = QTextCodec::codecForName( + d->mParameters.value(QLatin1String("CHARSET")).toAscii()); + if (codec != NULL) { + return codec->toUnicode(d->mValue.toByteArray()); + } + } + return QString(); + } else { + return d->mValue.toString(); + } } /*! - * Returns the embedded document of the property. - * If the embedded document has not been set, an empty document is returned. + * Returns true if the property is empty. + */ +bool QVersitProperty::isEmpty() const +{ + return d->mGroups.isEmpty() + && d->mName.isEmpty() + && d->mParameters.isEmpty() + && !d->mValue.isValid(); +} + +/*! + * Clears the contents of this property. */ +void QVersitProperty::clear() +{ + d->mGroups.clear(); + d->mName.clear(); + d->mValue.clear(); + d->mParameters.clear(); +} + +/*! \internal */ +void QVersitProperty::addParameter(const QString& name, const QString& value) +{ + Q_UNUSED(name) + Q_UNUSED(value) +} + +/*! \internal */ +void QVersitProperty::setEmbeddedDocument(const QVersitDocument& document) +{ + setValue(QVariant::fromValue(document)); +} + +/*! \internal */ QVersitDocument QVersitProperty::embeddedDocument() const { - return d->mDocument; + return value(); } - -QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitproperty.h --- a/qtcontactsmobility/src/versit/qversitproperty.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitproperty.h Fri Apr 16 14:53:18 2010 +0300 @@ -51,8 +51,9 @@ #include #include +class QVariant; + QTM_BEGIN_NAMESPACE - class QVersitPropertyPrivate; class Q_VERSIT_EXPORT QVersitProperty @@ -63,6 +64,8 @@ ~QVersitProperty(); QVersitProperty& operator=(const QVersitProperty& other); + bool operator==(const QVersitProperty& other) const; + bool operator!=(const QVersitProperty& other) const; void setGroups(const QStringList& groups); QStringList groups() const; @@ -70,16 +73,28 @@ void setName(const QString& name); QString name() const; - void addParameter(const QString& name, const QString& value); + void insertParameter(const QString& name, const QString& value); void removeParameter(const QString& name, const QString& value); + void removeParameters(const QString& name); + void setParameters(const QMultiHash& parameters); QMultiHash parameters() const; - - void setValue(const QByteArray& value); - QByteArray value() const; - void setEmbeddedDocument(const QVersitDocument& document); - QVersitDocument embeddedDocument() const; + void setValue(const QVariant& value); + QVariant variantValue() const; + template T value() const + { + return variantValue().value(); + } + QString value() const; + + bool isEmpty() const; + void clear(); + + // Deprecated: + void Q_DECL_DEPRECATED addParameter(const QString& name, const QString& value); + void Q_DECL_DEPRECATED setEmbeddedDocument(const QVersitDocument& document); + QVersitDocument Q_DECL_DEPRECATED embeddedDocument() const; private: diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitproperty_p.h --- a/qtcontactsmobility/src/versit/qversitproperty_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitproperty_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -42,6 +42,17 @@ #ifndef QVERSITPROPERTY_P_H #define QVERSITPROPERTY_P_H +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + #include "qversitdocument.h" #include "qmobilityglobal.h" @@ -50,6 +61,7 @@ #include #include #include +#include QTM_BEGIN_NAMESPACE @@ -65,8 +77,7 @@ mGroups(other.mGroups), mName(other.mName), mParameters(other.mParameters), - mValue(other.mValue), - mDocument(other.mDocument) + mValue(other.mValue) { } @@ -75,8 +86,7 @@ QStringList mGroups; QString mName; QMultiHash mParameters; - QByteArray mValue; - QVersitDocument mDocument; + QVariant mValue; }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitreader.cpp --- a/qtcontactsmobility/src/versit/qversitreader.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitreader.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -45,50 +45,78 @@ #include "versitutils_p.h" #include "qmobilityglobal.h" -QTM_BEGIN_NAMESPACE +#include +#include + +QTM_USE_NAMESPACE /*! \class QVersitReader - - \brief The QVersitReader class provides an interface - for reading versit documents such as vCards from a stream. - + \preliminary + \brief The QVersitReader class reads Versit documents such as vCards from a device. \ingroup versit - QVersitReader reads 0..n versit documents such as vCards - from a text stream into 0..n QVersitDocument instances. + QVersitReader concatenation of Versit documents such as vCards + from a text stream and returns a list of QVersitDocument instances. QVersitReader supports reading from an abstract I/O device which can be for example a file or a memory buffer. - The reading can be done synchronously or asynchronously. - - \code - // An example of reading a simple vCard from a memory buffer: - QBuffer vCardBuffer; - vCardBuffer.open(QBuffer::ReadWrite); - QByteArray vCard = - "BEGIN:VCARD\r\nVERSION:2.1\r\nN:Citizen;John;Q;;\r\nEND:VCARD\r\n"; - vCardBuffer.write(vCard); - vCardBuffer.seek(0); - QVersitReader reader; - reader.setDevice(&vCardBuffer); - if (reader.readAll()) { - QList versitDocuments = reader.result(); - // Use the resulting document(s)... - } - \endcode + The reading can be done asynchronously, and the + waitForFinished() function can be used to make a blocking + read. \sa QVersitDocument */ /*! - * \fn QVersitReader::readingDone() - * The signal is emitted by the reader when the asynchronous reading has been completed. + * \enum QVersitReader::Error + * This enum specifies an error that occurred during the most recent operation: + * \value NoError The most recent operation was successful + * \value UnspecifiedError The most recent operation failed for an undocumented reason + * \value IOError The most recent operation failed because of a problem with the device + * \value OutOfMemoryError The most recent operation failed due to running out of memory + * \value NotReadyError The most recent operation failed because there is an operation in progress + * \value ParseError The most recent operation failed because the input was malformed + */ + +/*! + * \enum QVersitReader::State + * Enumerates the various states that a reader may be in at any given time + * \value InactiveState Read operation not yet started + * \value ActiveState Read operation started, not yet finished + * \value CanceledState Read operation is finished due to cancellation + * \value FinishedState Read operation successfully completed + */ + +/*! + * \fn QVersitReader::stateChanged(QVersitReader::State state) + * The signal is emitted by the reader when its state has changed (eg. when it has finished + * reading from the device). + * \a state is the new state of the reader. + */ + +/*! + * \fn QVersitReader::resultsAvailable(QList& results) + * \deprecated + * The signal is emitted by the reader as it reads from the device when it has made more Versit + * documents available. + * \a results is the complete list of documents read so far. + */ + +/*! + * \fn QVersitReader::resultsAvailable() + * The signal is emitted by the reader as it reads from the device when it has made more Versit + * documents available. */ /*! Constructs a new reader. */ QVersitReader::QVersitReader() : d(new QVersitReaderPrivate) { - connect(d,SIGNAL(finished()),this,SIGNAL(readingDone()),Qt::DirectConnection); + connect(d, SIGNAL(stateChanged(QVersitReader::State)), + this, SIGNAL(stateChanged(QVersitReader::State)),Qt::DirectConnection); + connect(d, SIGNAL(resultsAvailable(QList&)), + this, SIGNAL(resultsAvailable(QList&)), Qt::DirectConnection); + connect(d, SIGNAL(resultsAvailable(QList&)), + this, SIGNAL(resultsAvailable()), Qt::DirectConnection); } /*! @@ -102,7 +130,7 @@ } /*! - * Sets the device used for reading the input to be the given device \a device. + * Sets the device used for reading the input to be the given \a device. */ void QVersitReader::setDevice(QIODevice* device) { @@ -118,45 +146,112 @@ } /*! + * Sets \a codec as the codec for the reader to use when parsing the input stream to. + * This codec is not used for values where the CHARSET Versit parameter occurs. + */ +void QVersitReader::setDefaultCodec(QTextCodec *codec) +{ + if (codec != NULL) { + d->mDefaultCodec = codec; + } else { + d->mDefaultCodec = QTextCodec::codecForName("UTF-8"); + } +} + +/*! + * Returns the codec the reader uses when parsing the input stream. + */ +QTextCodec* QVersitReader::defaultCodec() const +{ + return d->mDefaultCodec; +} + +/*! * Starts reading the input asynchronously. * Returns false if the input device has not been set or opened or * if there is another asynchronous read operation already pending. - * Signal \l readingDone() is emitted when the reading has finished. + * Signal \l stateChanged() is emitted with parameter FinishedState + * when the reading has finished. */ bool QVersitReader::startReading() -{ - bool started = false; - if (d->isReady() && !d->isRunning()) { +{ if (d->state() == ActiveState || d->isRunning()) { + d->setError(QVersitReader::NotReadyError); + return false; + } else if (!d->mIoDevice || !d->mIoDevice->isReadable()) { + d->setError(QVersitReader::IOError); + return false; + } else { + d->setState(ActiveState); + d->setError(NoError); + d->setCanceling(false); d->start(); - started = true; + return true; } - return started; +} + +/*! + * Attempts to asynchronously cancel the read request. + */ +void QVersitReader::cancel() +{ + d->setCanceling(true); } /*! - * Reads the input synchronously. - * Returns false if the input device has not been set or opened or - * if there is an asynchronous read operation pending. - * Using this function may block the user thread for an undefined period. - * In most cases asynchronous \l startReading() should be used instead. + * If the state is ActiveState, blocks until the reader has finished reading or \a msec milliseconds + * has elapsed, returning true if it successfully finishes or is cancelled by the user. + * If the state is FinishedState, returns true immediately. + * Otherwise, returns false immediately. */ -bool QVersitReader::readAll() +bool QVersitReader::waitForFinished(int msec) { - bool ok = false; - if (!d->isRunning()) - ok = d->read(); - return ok; + State state = d->state(); + if (state == ActiveState) { + return d->wait(msec); + } else if (state == FinishedState) { + return true; + } else { + return false; + } +} + +/*! + * Returns the reading result. Even if there was an error or reading has not completed, a partial + * list of results may be returned. + */ +QList QVersitReader::results() const +{ + QMutexLocker locker(&d->mMutex); + return d->mVersitDocuments; } /*! - * Returns the reading result or an empty list - * if the reading was not completed successfully. + * Returns the state of the reader. + */ +QVersitReader::State QVersitReader::state() const +{ + return d->state(); +} + +/*! + * Returns the error encountered by the last operation. */ +QVersitReader::Error QVersitReader::error() const +{ + return d->error(); +} + +/*! \internal */ +bool QVersitReader::readAll() +{ + startReading(); + return waitForFinished(); +} + +/*! \internal */ QList QVersitReader::result() const { - return d->mVersitDocuments; + return results(); } #include "moc_qversitreader.cpp" - -QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitreader.h --- a/qtcontactsmobility/src/versit/qversitreader.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitreader.h Fri Apr 16 14:53:18 2010 +0300 @@ -47,9 +47,8 @@ #include -QT_BEGIN_NAMESPACE class QIODevice; -QT_END_NAMESPACE +class QTextCodec; QTM_BEGIN_NAMESPACE @@ -61,6 +60,22 @@ Q_OBJECT public: + enum Error { + NoError = 0, + UnspecifiedError, + IOError, + OutOfMemoryError, + NotReadyError, + ParseError + }; + + enum State { + InactiveState = 0, + ActiveState, + CanceledState, + FinishedState + }; + QVersitReader(); ~QVersitReader(); @@ -68,15 +83,28 @@ void setDevice(QIODevice* device); QIODevice* device() const; + void setDefaultCodec(QTextCodec* codec); + QTextCodec* defaultCodec() const; + // reading: bool startReading(); - bool readAll(); + void cancel(); + bool waitForFinished(int msec = -1); // output: - QList result() const; + QList results() const; + + State state() const; + Error error() const; + + // Deprecated + bool Q_DECL_DEPRECATED readAll(); + QList Q_DECL_DEPRECATED result() const; signals: - void readingDone(); + void stateChanged(QVersitReader::State state); + void resultsAvailable(QList& results); + void resultsAvailable(); private: // data QVersitReaderPrivate* d; @@ -84,4 +112,6 @@ QTM_END_NAMESPACE +Q_DECLARE_METATYPE(QTM_PREPEND_NAMESPACE(QVersitReader::State)) + #endif // QVERSITREADER_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitreader_p.cpp --- a/qtcontactsmobility/src/versit/qversitreader_p.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitreader_p.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -40,52 +40,170 @@ ****************************************************************************/ #include "qversitreader_p.h" +#include "qversitdocument.h" #include "versitutils_p.h" #include "qmobilityglobal.h" +#include +#include +#include +#include -QTM_BEGIN_NAMESPACE +QTM_USE_NAMESPACE -// Some big enough value for nested versit documents to prevent infite recursion +// Some big enough value for nested versit documents to prevent infinite recursion #define MAX_VERSIT_DOCUMENT_NESTING_DEPTH 20 -/*! Construct a reader. */ -QVersitReaderPrivate::QVersitReaderPrivate() - : mIoDevice(0), - mDocumentNestingLevel(0) -{ -} - -/*! Destroy a reader. */ -QVersitReaderPrivate::~QVersitReaderPrivate() +/*! + \class LineReader + \brief The LineReader class is a wrapper around a QIODevice that allows line-by-line reading. + + This class keeps an internal buffer which it uses to temporarily store data which it has read from + the device but not returned to the user. + */ + +/*! + Constructs a LineReader that reads from the given \a device using the given \a codec. + \a chunkSize is the number of bytes to read at a time (it is useful for testing but shouldn't + otherwise be set). + */ +LineReader::LineReader(QIODevice* device, QTextCodec *codec, int chunkSize) + : mDevice(device), + mCodec(codec), + mChunkSize(chunkSize), + mCrlfList(*VersitUtils::newlineList(mCodec)), + mBuffer(VersitCursor(QByteArray())), + mOdometer(0) { } /*! - * Checks whether the reader is ready for reading. + Attempts to read a line and returns a VersitCursor describing the line. The cursor returned + includes the data, as well as the position and selection index bounds. Data within those bounds + represents the line. Data outside those bounds should not be used. */ -bool QVersitReaderPrivate::isReady() const +VersitCursor LineReader::readLine() { - return (mIoDevice && mIoDevice->isOpen()); + mBuffer.position = mBuffer.selection; + mSearchFrom = mBuffer.position; + + // First, look for a newline in the already-existing buffer. If found, return the line. + if (tryReadLine(mBuffer, false)) { + mBuffer.dropOldData(); + mOdometer += mBuffer.selection - mBuffer.position; + return mBuffer; + } + + // Otherwise, keep reading more data until either a CRLF is found, or there's no more to read. + while (!mDevice->atEnd()) { + QByteArray temp = mDevice->read(mChunkSize); + mBuffer.data.append(temp); + if (tryReadLine(mBuffer, false)) { + mBuffer.dropOldData(); + mOdometer += mBuffer.selection - mBuffer.position; + return mBuffer; + } + } + + // We've reached the end of the stream. Find a newline from the buffer (or return what's left). + tryReadLine(mBuffer, true); + mBuffer.dropOldData(); + mOdometer += mBuffer.selection - mBuffer.position; + return mBuffer; +} + +/*! + How many bytes have been returned in the VersitCursor in the lifetime of the LineReader. + */ +int LineReader::odometer() +{ + return mOdometer; +} + +/*! + Returns true if there are no more lines left for readLine() to return. It is possible for atEnd() + to return false and for there to be no more data left (eg. if there are trailing newlines at the + end of the input. In this case, readLine() will return an empty line (ie. position == selection). + */ +bool LineReader::atEnd() +{ + return mDevice->atEnd() && mBuffer.selection == mBuffer.data.size(); +} + +/*! + Returns the codec that the LineReader reads with. + */ +QTextCodec* LineReader::codec() +{ + return mCodec; } /*! - * Inherited from QThread. Does the actual reading. + * Get the next line of input from \a device to parse. Also performs unfolding by removing + * sequences of newline-space from the retrieved line. Skips over any newlines at the start of the + * input. + * + * Returns a VersitCursor containing and selecting the line. */ -bool QVersitReaderPrivate::read() +bool LineReader::tryReadLine(VersitCursor &cursor, bool atEnd) { - mVersitDocuments.clear(); - if (isReady()) { - QByteArray input = mIoDevice->readAll(); - VersitUtils::unfold(input); - while (input.length() > 0) { - QVersitDocument document; - if (parseVersitDocument(input,document) && - document.properties().count() > 0) - mVersitDocuments.append(document); + int crlfPos; + + QByteArray space = VersitUtils::encode(' ', mCodec); + QByteArray tab = VersitUtils::encode('\t', mCodec); + int spaceLength = space.length(); + + forever { + foreach(const QByteArrayMatcher& crlf, mCrlfList) { + int crlfLength = crlf.pattern().length(); + crlfPos = crlf.indexIn(cursor.data, mSearchFrom); + if (crlfPos == cursor.position) { + // Newline at start of line. Set position to directly after it. + cursor.position += crlfLength; + mSearchFrom = cursor.position; + break; + } else if (crlfPos > cursor.position) { + // Found the CRLF. + if (QVersitReaderPrivate::containsAt(cursor.data, space, crlfPos + crlfLength) + || QVersitReaderPrivate::containsAt(cursor.data, tab, crlfPos + crlfLength)) { + // If it's followed by whitespace, collapse it. + cursor.data.remove(crlfPos, crlfLength + spaceLength); + mSearchFrom = crlfPos; + break; + } else if (!atEnd && crlfPos + crlfLength + spaceLength >= cursor.data.size()) { + // If our CRLF is at the end of the current buffer but there's more to read, + // it's possible that a space could be hiding on the next read from the device. + // Just pretend we didn't see the CRLF and pick it up the next time round. + mSearchFrom = crlfPos; + return false; + } else { + // Found the CRLF. + cursor.selection = crlfPos; + return true; + } + } + } + if (crlfPos == -1) { + // No CRLF found. + cursor.selection = cursor.data.size(); + return false; } } +} - return (mVersitDocuments.count() > 0); +/*! Construct a reader. */ +QVersitReaderPrivate::QVersitReaderPrivate() + : mIoDevice(0), + mDocumentNestingLevel(0), + mDefaultCodec(QTextCodec::codecForName("UTF-8")), + mState(QVersitReader::InactiveState), + mError(QVersitReader::NoError), + mIsCanceling(false) +{ +} + +/*! Destroy a reader. */ +QVersitReaderPrivate::~QVersitReaderPrivate() +{ } /*! @@ -97,46 +215,149 @@ } /*! + * Does the actual reading and sets the error and state as appropriate. + * If \a async, then stateChanged() signals are emitted as the reading happens. + */ +void QVersitReaderPrivate::read() +{ + mMutex.lock(); + mVersitDocuments.clear(); + mMutex.unlock(); + bool canceled = false; + + LineReader lineReader(mIoDevice, mDefaultCodec); + while(!lineReader.atEnd()) { + if (isCanceling()) { + canceled = true; + break; + } + QVersitDocument document; + int oldPos = lineReader.odometer(); + bool ok = parseVersitDocument(lineReader, document); + + if (ok) { + if (document.isEmpty()) + break; + else { + QMutexLocker locker(&mMutex); + mVersitDocuments.append(document); + emit resultsAvailable(mVersitDocuments); + } + } else { + setError(QVersitReader::ParseError); + if (lineReader.odometer() == oldPos) + break; + } + }; + if (canceled) + setState(QVersitReader::CanceledState); + else + setState(QVersitReader::FinishedState); +} + +void QVersitReaderPrivate::setState(QVersitReader::State state) +{ + mMutex.lock(); + mState = state; + mMutex.unlock(); + emit stateChanged(state); +} + +QVersitReader::State QVersitReaderPrivate::state() const +{ + QMutexLocker locker(&mMutex); + return mState; +} + +void QVersitReaderPrivate::setError(QVersitReader::Error error) +{ + QMutexLocker locker(&mMutex); + mError = error; +} + +QVersitReader::Error QVersitReaderPrivate::error() const +{ + QMutexLocker locker(&mMutex); + return mError; +} + +void QVersitReaderPrivate::setCanceling(bool canceling) +{ + QMutexLocker locker(&mMutex); + mIsCanceling = canceling; +} + +bool QVersitReaderPrivate::isCanceling() +{ + QMutexLocker locker(&mMutex); + return mIsCanceling; +} + +/*! * Parses a versit document. Returns true if the parsing was successful. */ -bool QVersitReaderPrivate::parseVersitDocument( - QByteArray& text, - QVersitDocument& document) +bool QVersitReaderPrivate::parseVersitDocument(LineReader& lineReader, QVersitDocument& document, + bool foundBegin) { if (mDocumentNestingLevel >= MAX_VERSIT_DOCUMENT_NESTING_DEPTH) return false; // To prevent infinite recursion + bool parsingOk = true; mDocumentNestingLevel++; - text = text.mid(VersitUtils::countLeadingWhiteSpaces(text)); - QVersitProperty property = - parseNextVersitProperty(document.versitType(),text); - if (property.name() == QString::fromAscii("BEGIN") && - property.value().trimmed().toUpper() == "VCARD") { - while (property.name().length() > 0 && - property.name() != QString::fromAscii("END")) { - property = parseNextVersitProperty(document.versitType(),text); - if (property.name() == QString::fromAscii("BEGIN") && - property.value().trimmed().toUpper() == "VCARD") { + + // TODO: Various readers should be made subclasses and eliminate assumptions like this. + // We don't know what type it is: just assume it's a vCard 3.0 + document.setType(QVersitDocument::VCard30Type); + + QVersitProperty property; + + if (!foundBegin) { + property = parseNextVersitProperty(document.type(), lineReader); + if (property.name() == QLatin1String("BEGIN") + && property.value().trimmed().toUpper() == QLatin1String("VCARD")) { + foundBegin = true; + } else if (property.isEmpty()) { + // A blank document (or end of file) was found. + document = QVersitDocument(); + } else { + // Some property other than BEGIN was found. + parsingOk = false; + } + } + + if (foundBegin) { + do { + /* Grab it */ + property = parseNextVersitProperty(document.type(), lineReader); + + /* Discard embedded vcard documents - not supported yet. Discard the entire vCard */ + if (property.name() == QLatin1String("BEGIN") && + QString::compare(property.value().trimmed(), + QLatin1String("VCARD"), Qt::CaseInsensitive) == 0) { parsingOk = false; - // Parse through the embedded cards, but don't save them - text.prepend("BEGIN:VCARD\r\n"); QVersitDocument nestedDocument; - if (!parseVersitDocument(text,nestedDocument)) + if (!parseVersitDocument(lineReader, nestedDocument, true)) break; } - if (!setVersionFromProperty(document,property)) { + + // See if this is a version property and continue parsing under that version + if (!setVersionFromProperty(document, property)) { parsingOk = false; break; } - if (property.name() != QString::fromAscii("VERSION") && - property.name() != QString::fromAscii("END")) + + /* Nope, something else.. just add it */ + if (property.name() != QLatin1String("VERSION") && + property.name() != QLatin1String("END")) document.addProperty(property); - - } + } while (property.name().length() > 0 && property.name() != QLatin1String("END")); + if (property.name() != QLatin1String("END")) + parsingOk = false; } mDocumentNestingLevel--; if (!parsingOk) document = QVersitDocument(); + return parsingOk; } @@ -144,112 +365,119 @@ * Parses a versit document and returns whether parsing succeeded. */ QVersitProperty QVersitReaderPrivate::parseNextVersitProperty( - QVersitDocument::VersitType versitType, - QByteArray& text) + QVersitDocument::VersitType versitType, + LineReader& lineReader) { - QVersitProperty property; + VersitCursor cursor = lineReader.readLine(); + if (cursor.position >= cursor.selection) + return QVersitProperty(); + + // Otherwise, do stuff. QPair groupsAndName = - VersitUtils::extractPropertyGroupsAndName(text); + extractPropertyGroupsAndName(cursor, lineReader.codec()); + + QVersitProperty property; property.setGroups(groupsAndName.first); property.setName(groupsAndName.second); - if (versitType == QVersitDocument::VCard21) - parseVCard21Property(text,property); - else if (versitType == QVersitDocument::VCard30) - parseVCard30Property(text,property); - else - return QVersitProperty(); // type not supported + + if (versitType == QVersitDocument::VCard21Type) + parseVCard21Property(cursor, property, lineReader); + else if (versitType == QVersitDocument::VCard30Type) + parseVCard30Property(cursor, property, lineReader); + return property; } /*! * Parses the property according to vCard 2.1 syntax. */ -void QVersitReaderPrivate::parseVCard21Property( - QByteArray& text, - QVersitProperty& property) +void QVersitReaderPrivate::parseVCard21Property(VersitCursor& cursor, QVersitProperty& property, + LineReader& lineReader) { - property.setParameters(VersitUtils::extractVCard21PropertyParams(text)); - text = VersitUtils::extractPropertyValue(text); - if (property.name() == QString::fromAscii("AGENT")) { - parseAgentProperty(text,property); + property.setParameters(extractVCard21PropertyParams(cursor, lineReader.codec())); + + QByteArray value = extractPropertyValue(cursor); + if (property.name() == QLatin1String("AGENT")) { + // Hack to handle cases where start of document is on the same or next line as "AGENT:" + // XXX: Handle non-ASCII charsets in nested AGENT documents. + bool foundBegin = false; + if (value == "BEGIN:VCARD") { + foundBegin = true; + } else if (value.isEmpty()) { + } else { + property = QVersitProperty(); + return; + } + QVersitDocument agentDocument; + if (!parseVersitDocument(lineReader, agentDocument, foundBegin)) { + property = QVersitProperty(); + } else { + property.setValue(QVariant::fromValue(agentDocument)); + } } else { - int crlfPos = -1; - QString encoding(QString::fromAscii("ENCODING")); - QString quotedPrintable(QString::fromAscii("QUOTED-PRINTABLE")); - if (property.parameters().contains(encoding,quotedPrintable)) { - crlfPos = VersitUtils::findHardLineBreakInQuotedPrintable(text); - QByteArray value = text.left(crlfPos); - VersitUtils::decodeQuotedPrintable(value); - // Remove the encoding parameter as the value is now decoded - property.removeParameter(encoding,quotedPrintable); - property.setValue(value); - } else { - crlfPos = text.indexOf("\r\n"); - QByteArray value = text.left(crlfPos); - QString base64(QString::fromAscii("BASE64")); - if (property.parameters().contains(encoding,base64)) { - // Remove the linear whitespaces left by vCard 2.1 unfolding - value.replace(' ',""); - value.replace('\t',""); - } - property.setValue(value); - } - text = text.mid(crlfPos+2); // +2 is for skipping the CRLF + QTextCodec* codec; + QVariant valueVariant(decodeCharset(value, property, lineReader.codec(), &codec)); + unencode(valueVariant, cursor, property, codec, lineReader); + property.setValue(valueVariant); } } /*! * Parses the property according to vCard 3.0 syntax. */ -void QVersitReaderPrivate::parseVCard30Property( - QByteArray& text, - QVersitProperty& property) +void QVersitReaderPrivate::parseVCard30Property(VersitCursor& cursor, QVersitProperty& property, + LineReader& lineReader) { - property.setParameters(VersitUtils::extractVCard30PropertyParams(text)); - text = VersitUtils::extractPropertyValue(text); - int crlfPos = text.indexOf("\r\n"); - QByteArray value = text.left(crlfPos); - VersitUtils::removeBackSlashEscaping(value); - if (property.name() == QString::fromAscii("AGENT")) { - parseAgentProperty(value,property); + property.setParameters(extractVCard30PropertyParams(cursor, lineReader.codec())); + + QByteArray value = extractPropertyValue(cursor); + + QTextCodec* codec; + QString valueString(decodeCharset(value, property, lineReader.codec(), &codec)); + VersitUtils::removeBackSlashEscaping(valueString); + + if (property.name() == QLatin1String("AGENT")) { + // Make a line reader from the value of the property. + QByteArray agentValue(codec->fromUnicode(valueString)); + QBuffer agentData(&agentValue); + agentData.open(QIODevice::ReadOnly); + agentData.seek(0); + LineReader agentLineReader(&agentData, codec); + + QVersitDocument agentDocument; + if (!parseVersitDocument(agentLineReader, agentDocument)) { + property = QVersitProperty(); + } else { + property.setValue(QVariant::fromValue(agentDocument)); + } } else { - property.setValue(value); - } - text = text.mid(crlfPos+2); // +2 is for skipping the CRLF -} - -/*! - * Parses the value of AGENT \a property from \a text - */ -void QVersitReaderPrivate::parseAgentProperty( - QByteArray& text, - QVersitProperty& property) -{ - QVersitDocument agentDocument; - if (!parseVersitDocument(text,agentDocument)) { - property = QVersitProperty(); - } else { - property.setEmbeddedDocument(agentDocument); + QVariant valueVariant(valueString); + unencode(valueVariant, cursor, property, codec, lineReader); + if (valueVariant.type() == QVariant::ByteArray) { + // hack: add the charset parameter back in (even if there wasn't one to start with and + // the default codec was used). This will help later on if someone calls valueString() + // on the property. + property.insertParameter(QLatin1String("CHARSET"), QLatin1String(codec->name())); + } + property.setValue(valueVariant); } } /*! * Sets version to \a document if \a property contains a supported version. */ -bool QVersitReaderPrivate::setVersionFromProperty( - QVersitDocument& document, - const QVersitProperty& property) const +bool QVersitReaderPrivate::setVersionFromProperty(QVersitDocument& document, const QVersitProperty& property) const { bool valid = true; - if (property.name() == QString::fromAscii("VERSION")) { - QByteArray value = property.value().trimmed(); - if (property.parameters().contains( - QString::fromAscii("ENCODING"),QString::fromAscii("BASE64"))) - value = QByteArray::fromBase64(value); - if (value == "2.1") { - document.setVersitType(QVersitDocument::VCard21); - } else if (value == "3.0") { - document.setVersitType(QVersitDocument::VCard30); + if (property.name() == QLatin1String("VERSION")) { + QString value = property.value().trimmed(); + if (property.parameters().contains(QLatin1String("ENCODING"),QLatin1String("BASE64")) + || property.parameters().contains(QLatin1String("TYPE"),QLatin1String("BASE64"))) + value = QLatin1String(QByteArray::fromBase64(value.toAscii())); + if (value == QLatin1String("2.1")) { + document.setType(QVersitDocument::VCard21Type); + } else if (value == QLatin1String("3.0")) { + document.setType(QVersitDocument::VCard30Type); } else { valid = false; } @@ -257,7 +485,332 @@ return valid; } +/*! + * On entry, \a value should hold a QString. On exit, it may be either a QString or a QByteArray. + */ +void QVersitReaderPrivate::unencode(QVariant& value, VersitCursor& cursor, + QVersitProperty& property, QTextCodec* codec, + LineReader& lineReader) const +{ + Q_ASSERT(value.type() == QVariant::String); + + QString valueString = value.toString(); + + if (property.parameters().contains(QLatin1String("ENCODING"), QLatin1String("QUOTED-PRINTABLE"))) { + // At this point, we need to accumulate bytes until we hit a real line break (no = before + // it) value already contains everything up to the character before the newline + while (valueString.endsWith(QLatin1Char('='))) { + valueString.chop(1); // Get rid of '=' + // We add each line (minus the escaped = and newline chars) + cursor = lineReader.readLine(); + QString line = codec->toUnicode( + cursor.data.mid(cursor.position, cursor.selection-cursor.position)); + valueString.append(line); + } + decodeQuotedPrintable(valueString); + // Remove the encoding parameter as the value is now decoded + property.removeParameters(QLatin1String("ENCODING")); + value.setValue(valueString); + } else if (property.parameters().contains(QLatin1String("ENCODING"), QLatin1String("BASE64")) + || property.parameters().contains(QLatin1String("ENCODING"), QLatin1String("B")) + || property.parameters().contains(QLatin1String("TYPE"), QLatin1String("BASE64")) + || property.parameters().contains(QLatin1String("TYPE"), QLatin1String("B"))) { + value.setValue(QByteArray::fromBase64(valueString.toAscii())); + // Remove the encoding parameter as the value is now decoded + property.removeParameters(QLatin1String("ENCODING")); + // Hack: add the charset parameter back in (even if there wasn't one to start with and + // the default codec was used). This will help later on if someone calls valueString() + // on the property. + property.insertParameter(QLatin1String("CHARSET"), QLatin1String(codec->name())); + } +} + +/*! + * Decodes \a value, after working out what charset it is in using the context of \a property and + * returns it. The codec used to decode is returned in \a codec. + */ +QString QVersitReaderPrivate::decodeCharset(const QByteArray& value, + QVersitProperty& property, + QTextCodec* defaultCodec, + QTextCodec** codec) const +{ + const QString charset(QLatin1String("CHARSET")); + if (property.parameters().contains(charset)) { + QString charsetValue = *property.parameters().find(charset); + property.removeParameters(charset); + *codec = QTextCodec::codecForName(charsetValue.toAscii()); + if (*codec != NULL) { + return (*codec)->toUnicode(value); + } else { + *codec = defaultCodec; + return defaultCodec->toUnicode(value); + } + } + *codec = defaultCodec; + return defaultCodec->toUnicode(value); +} + +/*! + * Decodes Quoted-Printable encoded (RFC 1521) characters in /a text. + */ +void QVersitReaderPrivate::decodeQuotedPrintable(QString& text) const +{ + for (int i=0; i < text.length(); i++) { + QChar current = text.at(i); + if (current == QLatin1Char('=') && i+2 < text.length()) { + int next = text.at(i+1).unicode(); + int nextAfterNext = text.at(i+2).unicode(); + if (((next >= 'a' && next <= 'f') || + (next >= 'A' && next <= 'F') || + (next >= '0' && next <= '9')) && + ((nextAfterNext >= 'a' && nextAfterNext <= 'f') || + (nextAfterNext >= 'A' && nextAfterNext <= 'F') || + (nextAfterNext >= '0' && nextAfterNext <= '9'))) { + bool ok; + QChar decodedChar(text.mid(i+1, 2).toInt(&ok,16)); + if (ok) + text.replace(i, 3, decodedChar); + } else if (next == '\r' && nextAfterNext == '\n') { + // Newlines can still be found here if they are encoded in a non-default charset. + text.remove(i, 3); + } + } + } +} + + +/*! + * Extracts the groups and the name of the property using \a codec to determine the delimiters + * + * On entry, \a line should select a whole line. + * On exit, \a line will be updated to point after the groups and name. + */ +QPairQVersitReaderPrivate::extractPropertyGroupsAndName( + VersitCursor& line, QTextCodec *codec) const +{ + const QByteArray semicolon = VersitUtils::encode(';', codec); + const QByteArray colon = VersitUtils::encode(':', codec); + const QByteArray backslash = VersitUtils::encode('\\', codec); + QPair groupsAndName; + int length = 0; + Q_ASSERT(line.data.size() >= line.position); + + int separatorLength = semicolon.length(); + for (int i = line.position; i < line.selection - separatorLength + 1; i++) { + if ((containsAt(line.data, semicolon, i) + && !containsAt(line.data, backslash, i-separatorLength)) + || containsAt(line.data, colon, i)) { + length = i - line.position; + break; + } + } + if (length > 0) { + QString trimmedGroupsAndName = + codec->toUnicode(line.data.mid(line.position, length)).trimmed(); + QStringList parts = trimmedGroupsAndName.split(QLatin1Char('.')); + if (parts.count() > 1) { + groupsAndName.second = parts.takeLast(); + groupsAndName.first = parts; + } else { + groupsAndName.second = trimmedGroupsAndName; + } + line.setPosition(length + line.position); + } + + return groupsAndName; +} + +/*! + * Extracts the value of the property. + * Returns an empty string if the value was not found. + * + * On entry \a line should point to the value anyway. + * On exit \a line should point to newline after the value + */ +QByteArray QVersitReaderPrivate::extractPropertyValue(VersitCursor& line) const +{ + QByteArray value = line.data.mid(line.position, line.selection - line.position); + + /* Now advance the cursor in all cases. */ + line.position = line.selection; + return value; +} + +/*! + * Extracts the property parameters as a QMultiHash using \a codec to determine the delimiters. + * The parameters without names are added as "TYPE" parameters. + * + * On entry \a line should contain the entire line. + * On exit, line will be updated to point to the start of the value. + */ +QMultiHash QVersitReaderPrivate::extractVCard21PropertyParams( + VersitCursor& line, QTextCodec *codec) const +{ + QMultiHash result; + QList paramList = extractParams(line, codec); + while (!paramList.isEmpty()) { + QByteArray param = paramList.takeLast(); + QString name = paramName(param, codec); + QString value = paramValue(param, codec); + result.insert(name,value); + } + + return result; +} + +/*! + * Extracts the property parameters as a QMultiHash using \a codec to determine the delimiters. + * The parameters without names are added as "TYPE" parameters. + */ +QMultiHash QVersitReaderPrivate::extractVCard30PropertyParams( + VersitCursor& line, QTextCodec *codec) const +{ + QMultiHash result; + QList paramList = extractParams(line, codec); + while (!paramList.isEmpty()) { + QByteArray param = paramList.takeLast(); + QString name(paramName(param, codec)); + VersitUtils::removeBackSlashEscaping(name); + QString values = paramValue(param, codec); + QList valueList = values.split(QLatin1Char(','), QString::SkipEmptyParts); + QString buffer; // for any part ending in a backslash, join it to the next. + foreach (QString value, valueList) { + if (value.endsWith(QLatin1Char('\\')) && !value.endsWith(QLatin1String("\\\\"))) { + value.chop(1); + buffer.append(value); + buffer.append(QLatin1Char(',')); // because the comma got nuked by split() + } + else { + buffer.append(value); + VersitUtils::removeBackSlashEscaping(buffer); + result.insert(name, buffer); + buffer.clear(); + } + } + } + + return result; +} + + +/*! + * Extracts the parameters as delimited by semicolons using \a codec to determine the delimiters. + * + * On entry \a line should point to the start of the parameter section (past the name). + * On exit, \a line will be updated to point to the start of the value. + */ +QList QVersitReaderPrivate::extractParams(VersitCursor& line, QTextCodec *codec) const +{ + const QByteArray colon = VersitUtils::encode(':', codec); + QList params; + + /* find the end of the name¶ms */ + int colonIndex = line.data.indexOf(colon, line.position); + if (colonIndex > line.position && colonIndex < line.selection) { + QByteArray nameAndParamsString = line.data.mid(line.position, colonIndex - line.position); + params = extractParts(nameAndParamsString, VersitUtils::encode(';', codec), codec); + + /* Update line */ + line.setPosition(colonIndex + colon.length()); + } else if (colonIndex == line.position) { + // No parameters.. advance past it + line.setPosition(line.position + colon.length()); + } + + return params; +} + +/*! + * Extracts the parts separated by separator discarding the separators escaped with a backslash + * encoded with \a codec + */ +QList QVersitReaderPrivate::extractParts( + const QByteArray& text, const QByteArray& separator, QTextCodec* codec) const +{ + QList parts; + int partStartIndex = 0; + int textLength = text.length(); + int separatorLength = separator.length(); + QByteArray backslash = VersitUtils::encode('\\', codec); + int backslashLength = backslash.length(); + + for (int i=0; i < textLength-separatorLength+1; i++) { + if (containsAt(text, separator, i) + && (i < backslashLength + || !containsAt(text, backslash, i-backslashLength))) { + int length = i-partStartIndex; + QByteArray part = extractPart(text,partStartIndex,length); + if (part.length() > 0) + parts.append(part); + partStartIndex = i+separatorLength; + } + } + + // Add the last or only part + QByteArray part = extractPart(text,partStartIndex); + if (part.length() > 0) + parts.append(part); + return parts; +} + +/*! + * Extracts a substring limited by /a startPosition and /a length. + */ +QByteArray QVersitReaderPrivate::extractPart( + const QByteArray& text, int startPosition, int length) const +{ + QByteArray part; + if (startPosition >= 0) + part = text.mid(startPosition,length).trimmed(); + return part; +} + +/*! + * Extracts the name of the parameter using \a codec to determine the delimiters. + * No name is interpreted as an implicit "TYPE". + */ +QString QVersitReaderPrivate::paramName(const QByteArray& parameter, QTextCodec* codec) const +{ + if (parameter.trimmed().length() == 0) + return QString(); + QByteArray equals = VersitUtils::encode('=', codec); + int equalsIndex = parameter.indexOf(equals); + if (equalsIndex > 0) { + return codec->toUnicode(parameter.left(equalsIndex)).trimmed(); + } + + return QLatin1String("TYPE"); +} + +/*! + * Extracts the value of the parameter using \a codec to determine the delimiters + */ +QString QVersitReaderPrivate::paramValue(const QByteArray& parameter, QTextCodec* codec) const +{ + QByteArray value(parameter); + QByteArray equals = VersitUtils::encode('=', codec); + int equalsIndex = parameter.indexOf(equals); + if (equalsIndex > 0) { + int valueLength = parameter.length() - (equalsIndex + equals.length()); + value = parameter.right(valueLength).trimmed(); + } + + return codec->toUnicode(value); +} + +/*! + * Returns true if and only if \a text contains \a ba at \a index + * + * On entry, index must be >= 0 + */ +bool QVersitReaderPrivate::containsAt(const QByteArray& text, const QByteArray& match, int index) +{ + int n = match.length(); + if (text.length() - index < n) + return false; + const char* textData = text.constData(); + const char* matchData = match.constData(); + return memcmp(textData+index, matchData, n) == 0; +} #include "moc_qversitreader_p.cpp" - -QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitreader_p.h --- a/qtcontactsmobility/src/versit/qversitreader_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitreader_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -54,60 +54,161 @@ // We mean it. // +#include "qmobilityglobal.h" +#include "qversitreader.h" #include "qversitdocument.h" #include "qversitproperty.h" -#include "qmobilityglobal.h" +#include "versitutils_p.h" #include #include #include #include #include -#include +#include +#include +#include +#include QTM_BEGIN_NAMESPACE +// The maximum number of bytes allowed to stay in memory after being read. The smaller this is, +// the more time spent moving bytes around. The larger it is, the more memory is wasted. +static const int MAX_OLD_BYTES_TO_KEEP = 8192; + +class Q_AUTOTEST_EXPORT VersitCursor +{ +public: + VersitCursor() : position(-1), selection(-1) {} + explicit VersitCursor(const QByteArray& d) :data(d), position(0), selection(0) {} + QByteArray data; + int position; + int selection; + + void setData(const QByteArray& d) {data = d; position = selection = 0;} + void setPosition(int pos) {position = pos; selection = qMax(pos, selection);} + void setSelection(int pos) {selection = qMax(pos, position);} + void dropOldData() + { + if (position > MAX_OLD_BYTES_TO_KEEP && selection >= position) { + data.remove(0, position); + selection -= position; + position = 0; + } + } +}; + +class Q_AUTOTEST_EXPORT LineReader +{ +public: + LineReader(QIODevice* device, QTextCodec* codec, int chunkSize = 1000); + VersitCursor readLine(); + int odometer(); + bool atEnd(); + QTextCodec* codec(); + +private: + bool tryReadLine(VersitCursor& cursor, bool atEnd); + + QIODevice* mDevice; + QTextCodec* mCodec; + int mChunkSize; // How many bytes to read in one go. + QList mCrlfList; + VersitCursor mBuffer; + int mOdometer; + int mSearchFrom; +}; + class Q_AUTOTEST_EXPORT QVersitReaderPrivate : public QThread { Q_OBJECT public: // Constructors and destructor - QVersitReaderPrivate(); + QVersitReaderPrivate(); ~QVersitReaderPrivate(); +signals: + void stateChanged(QVersitReader::State state); + void resultsAvailable(QList& results); + +protected: // From QThread + void run(); + public: // New functions - bool isReady() const; - bool read(); + void read(); - bool parseVersitDocument(QByteArray& text, QVersitDocument& document); + // mutexed getters and setters. + void setState(QVersitReader::State); + QVersitReader::State state() const; + void setError(QVersitReader::Error); + QVersitReader::Error error() const; + void setCanceling(bool cancelling); + bool isCanceling(); + + bool parseVersitDocument(LineReader& device, + QVersitDocument& document, + bool foundBegin = false); QVersitProperty parseNextVersitProperty( QVersitDocument::VersitType versitType, - QByteArray& text); + LineReader& lineReader); void parseVCard21Property( - QByteArray& text, - QVersitProperty& property); + VersitCursor& text, + QVersitProperty& property, + LineReader& lineReader); void parseVCard30Property( - QByteArray& text, - QVersitProperty& property); - - void parseAgentProperty( - QByteArray& text, - QVersitProperty& property); + VersitCursor& text, + QVersitProperty& property, + LineReader& lineReader); bool setVersionFromProperty( QVersitDocument& document, const QVersitProperty& property) const; -protected: // From QThread - void run(); + void unencode( + QVariant& value, + VersitCursor& cursor, + QVersitProperty& property, + QTextCodec* codec, + LineReader& lineReader) const; + + QString decodeCharset( + const QByteArray& value, + QVersitProperty& property, + QTextCodec* defaultCodec, + QTextCodec** codec) const; + + void decodeQuotedPrintable(QString& text) const; + + /* These functions operate on a cursor describing a single line */ + QPair extractPropertyGroupsAndName(VersitCursor& line, QTextCodec* codec) + const; + QByteArray extractPropertyValue(VersitCursor& line) const; + QMultiHash extractVCard21PropertyParams(VersitCursor& line, QTextCodec* codec) + const; + QMultiHash extractVCard30PropertyParams(VersitCursor& line, QTextCodec* codec) + const; + + // "Private" functions + QList extractParams(VersitCursor& line, QTextCodec *codec) const; + QList extractParts(const QByteArray& text, const QByteArray& separator, + QTextCodec *codec) const; + QByteArray extractPart(const QByteArray& text, int startPosition, int length=-1) const; + QString paramName(const QByteArray& parameter, QTextCodec* codec) const; + QString paramValue(const QByteArray& parameter, QTextCodec* codec) const; + static bool containsAt(const QByteArray& text, const QByteArray& ba, int index); public: // Data - QIODevice* mIoDevice; + QPointer mIoDevice; QList mVersitDocuments; int mDocumentNestingLevel; // Depth in parsing nested Versit documents + QTextCodec* mDefaultCodec; + QVersitReader::State mState; + QVersitReader::Error mError; + bool mIsCanceling; + mutable QMutex mMutex; }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitresourcehandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/versit/qversitresourcehandler.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,155 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qversitresourcehandler.h" +#include "qversitproperty.h" +#include "qversitdefaultresourcehandler_p.h" +#include "qversitdefs_p.h" +#include + +QTM_USE_NAMESPACE + +/*! + \class QVersitResourceHandler + \preliminary + \brief The QVersitResourceHandler class is an interface for clients wishing to implement custom + behaviour for loading and saving files to disk when exporting and importing. + \ingroup versit + + \sa QVersitContactImporter + \sa QVersitContactExporter + \sa QVersitDefaultResourceHandler + */ + +/*! + * \fn virtual QVersitResourceHandler::~QVersitResourceHandler() + * Frees any memory used by the handler. + */ + +/*! + * \fn virtual bool QVersitResourceHandler::saveResource(const QByteArray& contents, const QVersitProperty& property, QString* location) = 0; + * Saves the binary data \a contents to a file on a persistent storage medium. + * + * \a property holds the QVersitProperty which is the context in which the binary is coming from. + * The QVersitResourceHandler can use this, for example, to determine file extension it should choose. + * *\a location is filled with the contents of the file. + * Returns true on success, false on failure. + */ + +/*! + \fn virtual bool QVersitResourceHandler::loadResource(const QString& location, QByteArray* contents, QString* mimeType) = 0 + Loads a file from \a location. + *\a contents is filled with the contents of the file and *\a mimeType is set to the MIME + type that it is determined to be. + Returns true on success, false on failure. +*/ + +/*! + * \class QVersitDefaultResourceHandler + * + * \brief The QVersitDefaultResourceHandler class provides a default implementation of a Versit + * resource handler. + * + * An example resource handler implementation: + * \snippet ../../doc/src/snippets/qtversitdocsample/qtversitdocsample.cpp Resource handler + * \ingroup versit + * + * \sa QVersitContactImporter, QVersitContactExporter, QVersitResourceHandler + */ + +/*! + * Constructs a QVersitDefaultResourceHandler. + */ +QVersitDefaultResourceHandler::QVersitDefaultResourceHandler() + : d(new QVersitDefaultResourceHandlerPrivate) +{ + // File extension mappings + int fileExtensionCount = sizeof(versitFileExtensionMappings)/sizeof(VersitMapping); + for (int i = 0; i < fileExtensionCount; i++) { + d->mFileExtensionMapping.insert( + QLatin1String(versitFileExtensionMappings[i].contactString), + QLatin1String(versitFileExtensionMappings[i].versitString)); + } +} + +/*! + * Frees any memory used by the resource handler. + */ +QVersitDefaultResourceHandler::~QVersitDefaultResourceHandler() +{ + delete d; +} + +/*! + * Default resource loader. + * Loads file from given \a location into \a contents and returns true if successful. + * Sets the \a mimeType based on the file extension. + */ +bool QVersitDefaultResourceHandler::loadResource(const QString& location, + QByteArray* contents, + QString* mimeType) +{ + QString extension = location.split(QLatin1Char('.')).last().toLower(); + *mimeType = d->mFileExtensionMapping.value(extension); + if (location.isEmpty()) + return false; + QFile file(location); + file.open(QIODevice::ReadOnly); + if (!file.isReadable()) + return false; + *contents = file.readAll(); + return contents->size() > 0; +} + +/*! + * Default resource saver. + * Does nothing and returns false, ignoring \a contents, \a property and \a location. By default, + * resources aren't persisted because we don't know when it is safe to remove them. + */ +bool QVersitDefaultResourceHandler::saveResource(const QByteArray& contents, + const QVersitProperty& property, + QString* location) +{ + Q_UNUSED(contents) + Q_UNUSED(property) + Q_UNUSED(location) + return false; +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitresourcehandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/versit/qversitresourcehandler.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QVERSITRESOURCEHANDLER_H +#define QVERSITRESOURCEHANDLER_H + +#include "qmobilityglobal.h" + +#include +#include + +QTM_BEGIN_NAMESPACE + +class QVersitDefaultResourceHandlerPrivate; +class QVersitProperty; + +class Q_VERSIT_EXPORT QVersitResourceHandler +{ +public: + virtual ~QVersitResourceHandler() {} + virtual bool loadResource(const QString& location, QByteArray* contents, QString* mimeType) = 0; + virtual bool saveResource(const QByteArray& contents, const QVersitProperty& property, + QString* location) = 0; +}; + +class Q_VERSIT_EXPORT QVersitDefaultResourceHandler : public QVersitResourceHandler +{ +public: + QVersitDefaultResourceHandler(); + virtual ~QVersitDefaultResourceHandler(); + virtual bool loadResource(const QString& location, QByteArray* contents, QString* mimeType); + virtual bool saveResource(const QByteArray& contents, const QVersitProperty& property, + QString* location); + +protected: + QVersitDefaultResourceHandlerPrivate* d; +}; + +QTM_END_NAMESPACE + +#endif // QVERSITRESOURCEHANDLER_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitwriter.cpp --- a/qtcontactsmobility/src/versit/qversitwriter.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitwriter.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -40,57 +40,75 @@ ****************************************************************************/ #include "qversitwriter.h" -#include "qvcard21writer_p.h" -#include "qvcard30writer_p.h" +#include "qversitwriter_p.h" #include "versitutils_p.h" #include "qmobilityglobal.h" #include +#include -QTM_BEGIN_NAMESPACE +QTM_USE_NAMESPACE /*! \class QVersitWriter - - \brief The QVersitWriter class provides an interface - for writing a versit document such as a vCard to a text stream. - + \preliminary + \brief The QVersitWriter class writes Versit documents such as vCards to a device. \ingroup versit QVersitWriter converts a QVersitDocument into its textual representation. QVersitWriter supports writing to an abstract I/O device which can be for example a file or a memory buffer. - The writing can be done synchronously or asynchronously. - - \code - // An example of writing a simple vCard to a memory buffer: - QBuffer vCardBuffer; - vCardBuffer.open(QBuffer::ReadWrite); - QVersitWriter writer; - writer.setDevice(&vCardBuffer); - QVersitDocument document; - QVersitProperty property; - property.setName("N"); - property.setValue("Citizen;John;Q;;"); - document.addProperty(property); - writer.setVersitDocument(document); - if (writer.writeAll()) { - // Use the vCardBuffer... - } - \endcode - + The writing can be done asynchronously and the waitForFinished() + function can be used to implement a blocking write. + + The serialization of the document is done in accordance with the type of the QVersitDocument + being written. The value of each QVersitProperty is encoded according to the type of object: + \list + \o \l{QString}{QStrings} are serialized verbatim, unless the default codec of the writer cannot + encode the string: in this case, UTF-8 is used to encode it (and the CHARSET parameter added to + the property, as per the vCard 2.1 specification). If the document type is vCard 2.1, + quoted-printable encoding may also be performed. + \o \l{QByteArray}{QByteArrays} are assumed to be binary data and are serialized as base-64 encoded + values. + \o \l{QVersitDocument}{QVersitDocuments} are serialized as a nested document (eg. as per the + AGENT property in vCard). + \endlist + \sa QVersitDocument, QVersitProperty */ + /*! - * \fn QVersitWriter::writingDone() - * The signal is emitted by the writer when the asynchronous writing has been completed. + * \enum QVersitWriter::Error + * This enum specifies an error that occurred during the most recent operation: + * \value NoError The most recent operation was successful + * \value UnspecifiedError The most recent operation failed for an undocumented reason + * \value IOError The most recent operation failed because of a problem with the device + * \value OutOfMemoryError The most recent operation failed due to running out of memory + * \value NotReadyError The most recent operation failed because there is an operation in progress + */ + +/*! + * \enum QVersitWriter::State + * Enumerates the various states that a reader may be in at any given time + * \value InactiveState Write operation not yet started + * \value ActiveState Write operation started, not yet finished + * \value CanceledState Write operation is finished due to cancelation + * \value FinishedState Write operation successfully completed + */ + +/*! + * \fn QVersitWriter::stateChanged(QVersitWriter::State state) + * The signal is emitted by the writer when its state has changed (eg. when it has finished + * writing to the device). + * \a state is the new state of the writer. */ /*! Constructs a new writer. */ -QVersitWriter::QVersitWriter() : d(new QVCard21Writer) +QVersitWriter::QVersitWriter() : d(new QVersitWriterPrivate) { - connect(d,SIGNAL(finished()),this,SIGNAL(writingDone()),Qt::DirectConnection); + connect(d, SIGNAL(stateChanged(QVersitWriter::State)), + this, SIGNAL(stateChanged(QVersitWriter::State)), Qt::DirectConnection); } /*! @@ -104,40 +122,6 @@ } /*! - * Set the versit document to be written to \a versitDocument and - * selects the actual writer implementation based on the versit document type. - */ -void QVersitWriter::setVersitDocument(const QVersitDocument& versitDocument) -{ - QVersitWriterPrivate* updatedWriter = 0; - switch (versitDocument.versitType()) { - case QVersitDocument::VCard21: - updatedWriter = new QVCard21Writer; - break; - case QVersitDocument::VCard30: - updatedWriter = new QVCard30Writer; - break; - default: - break; - } - if (updatedWriter) { - updatedWriter->mIoDevice = d->mIoDevice; - delete d; - d = updatedWriter; - connect(d,SIGNAL(finished()),this,SIGNAL(writingDone()),Qt::DirectConnection); - } - d->mVersitDocument = versitDocument; -} - -/*! - * Returns the current versit document. - */ -QVersitDocument QVersitWriter::versitDocument() const -{ - return d->mVersitDocument; -} - -/*! * Sets the device used for writing to \a device. */ void QVersitWriter::setDevice(QIODevice* device) @@ -154,37 +138,116 @@ } /*! - * Starts writing the output asynchronously. + * Sets the default codec for the writer to use for writing the entire output. + * + * If \a codec is NULL, the writer uses the codec according to the specification prescribed default. + * (for vCard 2.1, ASCII; for vCard 3.0, UTF-8). + */ +void QVersitWriter::setDefaultCodec(QTextCodec *codec) +{ + d->mDefaultCodec = codec; +} + +/*! + * Returns the document's codec. + */ +QTextCodec* QVersitWriter::defaultCodec() const +{ + return d->mDefaultCodec; +} + +/*! + * Starts writing \a input to device() asynchronously. * Returns false if the output device has not been set or opened or * if there is another asynchronous write operation already pending. - * Signal \l writingDone() is emitted when the writing has finished. + * Signal \l stateChanged() is emitted with parameter FinishedState + * when the writing has finished. */ -bool QVersitWriter::startWriting() +bool QVersitWriter::startWriting(const QList& input) { - bool started = false; - if (d->isReady() && !d->isRunning()) { + d->mInput = input; + if (d->state() == ActiveState || d->isRunning()) { + d->setError(QVersitWriter::NotReadyError); + return false; + } else if (!d->mIoDevice || !d->mIoDevice->isWritable()) { + d->setError(QVersitWriter::IOError); + return false; + } else { + d->setState(ActiveState); + d->setError(NoError); d->start(); - started = true; + return true; } +} - return started; +/*! + * Attempts to asynchronously cancel the write request. + */ +void QVersitWriter::cancel() +{ + d->setCanceling(true); } /*! - * Writes the output synchronously. - * Returns false if the output device has not been set or opened or - * if there is an asynchronous write operation pending. - * Using this function may block the user thread for an undefined period. - * In most cases asynchronous \l startWriting() should be used instead. + * If the state is ActiveState, blocks until the writer has finished writing or \a msec milliseconds + * has elapsed, returning true if it successfully finishes or is cancelled by the user. + * If the state is FinishedState, returns true immediately. + * Otherwise, returns false immediately. + */ +bool QVersitWriter::waitForFinished(int msec) +{ + State state = d->state(); + if (state == ActiveState) { + return d->wait(msec); + } else if (state == FinishedState) { + return true; + } else { + return false; + } +} + +/*! + * Returns the state of the writer. + */ +QVersitWriter::State QVersitWriter::state() const +{ + return d->state(); +} + +/*! + * Returns the error encountered by the last operation. */ +QVersitWriter::Error QVersitWriter::error() const +{ + return d->error(); +} + + +/*! \internal */ +void QVersitWriter::setVersitDocument(const QVersitDocument& versitDocument) +{ + QList documents; + documents.append(versitDocument); + d->mInput = documents; +} + +/*! \internal */ +QVersitDocument QVersitWriter::versitDocument() const +{ + return QVersitDocument(); +} + +/*! \internal */ +bool QVersitWriter::startWriting() +{ + return startWriting(d->mInput); +} + +/*! \internal */ bool QVersitWriter::writeAll() { - bool ok = false; - if (!d->isRunning()) - ok = d->write(); - return ok; + startWriting(d->mInput); + return waitForFinished(); } #include "moc_qversitwriter.cpp" - -QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitwriter.h --- a/qtcontactsmobility/src/versit/qversitwriter.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitwriter.h Fri Apr 16 14:53:18 2010 +0300 @@ -58,21 +58,47 @@ Q_OBJECT public: + enum Error { + NoError = 0, + UnspecifiedError, + IOError, + OutOfMemoryError, + NotReadyError + }; + + enum State { + InactiveState = 0, + ActiveState, + CanceledState, + FinishedState + }; + QVersitWriter(); ~QVersitWriter(); - // input: - void setVersitDocument(const QVersitDocument& versitDocument); - QVersitDocument versitDocument() const; - // output: + // output device void setDevice(QIODevice* device); QIODevice* device() const; + + void setDefaultCodec(QTextCodec* codec); + QTextCodec* defaultCodec() const; + // writing: - bool startWriting(); - bool writeAll(); + bool startWriting(const QList& input); + void cancel(); + bool waitForFinished(int msec = -1); + + State state() const; + Error error() const; + + // Deprecated + void Q_DECL_DEPRECATED setVersitDocument(const QVersitDocument& versitDocument); + QVersitDocument Q_DECL_DEPRECATED versitDocument() const; + bool Q_DECL_DEPRECATED startWriting(); + bool Q_DECL_DEPRECATED writeAll(); signals: - void writingDone(); + void stateChanged(QVersitWriter::State state); private: // data QVersitWriterPrivate* d; @@ -80,4 +106,6 @@ QTM_END_NAMESPACE +Q_DECLARE_METATYPE(QTM_PREPEND_NAMESPACE(QVersitWriter::State)) + #endif // QVERSITWRITER_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitwriter_p.cpp --- a/qtcontactsmobility/src/versit/qversitwriter_p.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitwriter_p.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -39,27 +39,27 @@ ** ****************************************************************************/ +#include "qmobilityglobal.h" #include "qversitwriter_p.h" +#include "qversitdocumentwriter_p.h" +#include "qvcard21writer_p.h" +#include "qvcard30writer_p.h" #include "versitutils_p.h" -#include "qmobilityglobal.h" #include +#include +#include +#include -QTM_BEGIN_NAMESPACE - -#define MAX_CHARS_FOR_LINE 76 +QTM_USE_NAMESPACE /*! Constructs a writer. */ QVersitWriterPrivate::QVersitWriterPrivate() - : mIoDevice(0) -{ -} - -/*! Constructs a writer. */ -QVersitWriterPrivate::QVersitWriterPrivate( - const QByteArray& documentType, - const QByteArray& version) - : mIoDevice(0), mDocumentType(documentType), mVersion(version) + : mIoDevice(0), + mState(QVersitWriter::InactiveState), + mError(QVersitWriter::NoError), + mIsCanceling(false), + mDefaultCodec(0) { } @@ -69,25 +69,36 @@ } /*! - * Checks whether the writer is ready for writing. - */ -bool QVersitWriterPrivate::isReady() const -{ - return (mIoDevice && mIoDevice->isOpen() && !mVersitDocument.properties().empty()); -} - -/*! - * Do the actual writing. + * Do the actual writing and set the error and state appropriately. */ -bool QVersitWriterPrivate::write() +void QVersitWriterPrivate::write() { - bool ok = false; - if (isReady()) { - QByteArray output = encodeVersitDocument(mVersitDocument); - ok = (mIoDevice->write(output) > 0); + bool canceled = false; + foreach (QVersitDocument document, mInput) { + if (isCanceling()) { + canceled = true; + break; + } + QScopedPointer writer(writerForType(document.type())); + QTextCodec* codec = mDefaultCodec; + if (codec == NULL) { + if (document.type() == QVersitDocument::VCard21Type) + codec = QTextCodec::codecForName("ISO-8859-1"); + else + codec = QTextCodec::codecForName("UTF-8"); + } + writer->setCodec(codec); + writer->setDevice(mIoDevice); + writer->encodeVersitDocument(document); + if (!writer->mSuccessful) { + setError(QVersitWriter::IOError); + break; + } } - - return ok; + if (canceled) + setState(QVersitWriter::CanceledState); + else + setState(QVersitWriter::FinishedState); } /*! @@ -98,42 +109,58 @@ write(); } -/*! -* Encodes the \a document to text. -*/ -QByteArray QVersitWriterPrivate::encodeVersitDocument(const QVersitDocument& document) +void QVersitWriterPrivate::setState(QVersitWriter::State state) { - QList properties = document.properties(); - QByteArray encodedDocument; + mMutex.lock(); + mState = state; + mMutex.unlock(); + emit stateChanged(state); +} - encodedDocument += "BEGIN:" + mDocumentType + "\r\n"; - encodedDocument += "VERSION:" + mVersion + "\r\n"; - foreach (QVersitProperty property, properties) { - encodedDocument.append(encodeVersitProperty(property)); - } - encodedDocument += "END:" + mDocumentType + "\r\n"; +QVersitWriter::State QVersitWriterPrivate::state() const +{ + QMutexLocker locker(&mMutex); + return mState; +} - VersitUtils::fold(encodedDocument,MAX_CHARS_FOR_LINE); - return encodedDocument; +void QVersitWriterPrivate::setError(QVersitWriter::Error error) +{ + QMutexLocker locker(&mMutex); + mError = error; +} + +QVersitWriter::Error QVersitWriterPrivate::error() const +{ + QMutexLocker locker(&mMutex); + return mError; } /*! - * Encodes the groups and name in the \a property to text. + * Returns a QVersitDocumentWriter that can encode a QVersitDocument of type \a type. + * The caller is responsible for deleting the object. */ -QByteArray QVersitWriterPrivate::encodeGroupsAndName( - const QVersitProperty& property) const +QVersitDocumentWriter* QVersitWriterPrivate::writerForType(QVersitDocument::VersitType type) { - QByteArray encodedGroupAndName; - QStringList groups = property.groups(); - if (!groups.isEmpty()) { - QString groupAsString = groups.join(QString::fromAscii(".")); - encodedGroupAndName.append(groupAsString.toAscii()); - encodedGroupAndName.append("."); + switch (type) { + case QVersitDocument::VCard21Type: + return new QVCard21Writer; + case QVersitDocument::VCard30Type: + return new QVCard30Writer; + default: + return new QVCard21Writer; } - encodedGroupAndName.append(property.name().toAscii()); - return encodedGroupAndName; +} + +void QVersitWriterPrivate::setCanceling(bool canceling) +{ + QMutexLocker locker(&mMutex); + mIsCanceling = canceling; +} + +bool QVersitWriterPrivate::isCanceling() +{ + QMutexLocker locker(&mMutex); + return mIsCanceling; } #include "moc_qversitwriter_p.cpp" - -QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/qversitwriter_p.h --- a/qtcontactsmobility/src/versit/qversitwriter_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/qversitwriter_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -53,50 +53,52 @@ // We mean it. // +#include "qversitwriter.h" #include "qversitdocument.h" #include "qversitproperty.h" #include "qmobilityglobal.h" +#include "qversitwriter.h" #include -#include #include +#include +#include QTM_BEGIN_NAMESPACE +class QVersitDocumentWriter; + class Q_AUTOTEST_EXPORT QVersitWriterPrivate : public QThread { Q_OBJECT -public: - virtual ~QVersitWriterPrivate(); - bool isReady() const; - bool write(); +signals: + void stateChanged(QVersitWriter::State state); -public: // Data - QIODevice* mIoDevice; - QVersitDocument mVersitDocument; - -protected: // To be implemented in each of the subclasses - virtual QByteArray encodeVersitProperty(const QVersitProperty& property) = 0; - virtual QByteArray encodeParameters( - const QMultiHash& parameters) const = 0; +public: + QVersitWriterPrivate(); + virtual ~QVersitWriterPrivate(); + void write(); -protected: // Protected Constructors - QVersitWriterPrivate(const QByteArray& documentType, const QByteArray& version); + // mutexed getters and setters. + void setState(QVersitWriter::State); + QVersitWriter::State state() const; + void setError(QVersitWriter::Error); + QVersitWriter::Error error() const; + void setCanceling(bool cancelling); + bool isCanceling(); -protected: // From QThread - void run(); + void run(); -protected: // New functions - QByteArray encodeVersitDocument(const QVersitDocument& document); - QByteArray encodeGroupsAndName(const QVersitProperty& property) const; + static QVersitDocumentWriter* writerForType(QVersitDocument::VersitType type); -private: // Constructors - QVersitWriterPrivate(); - -private: // Data - QByteArray mDocumentType; - QByteArray mVersion; + QIODevice* mIoDevice; + QList mInput; + QVersitWriter::State mState; + QVersitWriter::Error mError; + bool mIsCanceling; + mutable QMutex mMutex; + QTextCodec* mDefaultCodec; }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/versit.pro --- a/qtcontactsmobility/src/versit/versit.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/versit.pro Fri Apr 16 14:53:18 2010 +0300 @@ -24,10 +24,14 @@ qversitreader.h \ qversitwriter.h \ qversitcontactexporter.h \ - qversitcontactimporter.h + qversitcontactimporter.h \ + qversitresourcehandler.h # Private Headers -PRIVATE_HEADERS += qversitdocument_p.h \ +PRIVATE_HEADERS += \ + qversitdefaultresourcehandler_p.h \ + qversitdocument_p.h \ + qversitdocumentwriter_p.h \ qversitproperty_p.h \ qversitreader_p.h \ qversitwriter_p.h \ @@ -35,11 +39,13 @@ qvcard30writer_p.h \ qversitcontactexporter_p.h \ qversitcontactimporter_p.h \ - qversitdefs.h \ + qversitdefs_p.h \ versitutils_p.h # Implementation SOURCES += qversitdocument.cpp \ + qversitdocument_p.cpp \ + qversitdocumentwriter_p.cpp \ qversitproperty.cpp \ qversitreader.cpp \ qversitreader_p.cpp \ @@ -51,6 +57,7 @@ qversitcontactexporter_p.cpp \ qversitcontactimporter.cpp \ qversitcontactimporter_p.cpp \ + qversitresourcehandler.cpp \ versitutils.cpp HEADERS += \ @@ -60,13 +67,9 @@ qtAddLibrary(QtContacts) symbian { + TARGET.UID3 = 0x2002BFBF TARGET.EPOCALLOWDLLDATA = 1 - TARGET.CAPABILITY = ALL \ - -TCB - deploy.path = $$EPOCROOT - exportheaders.sources = $$PUBLIC_HEADERS - exportheaders.path = epoc32/include/app - DEPLOYMENT += exportheaders + TARGET.CAPABILITY = ALL -TCB defFiles = \ "$${LITERAL_HASH}ifdef WINSCW" \ @@ -76,9 +79,10 @@ "$${LITERAL_HASH}endif " MMP_RULES += defFiles - # This is for new exporting system coming in garden - for(header, exportheaders.sources):BLD_INF_RULES.prj_exports += "$$header $$deploy.path$$exportheaders.path/$$basename(header)" + VERSIT_DEPLOYMENT.sources = QtVersit.dll + VERSIT_DEPLOYMENT.path = \sys\bin + DEPLOYMENT += VERSIT_DEPLOYMENT } +CONFIG += app include(../../features/deploy.pri) - diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/versitutils.cpp --- a/qtcontactsmobility/src/versit/versitutils.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/versitutils.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -43,417 +43,102 @@ #include "qmobilityglobal.h" #include -#include - -QTM_BEGIN_NAMESPACE - -/*! - * Folds \a text by making all lines \a maxChars long. - */ -QByteArray VersitUtils::fold(QByteArray& text, int maxChars) -{ - char previous = 0; - int charsSinceLastLineBreak = 0; - for (int i=0; i +#include -/*! - * Unfolds \a text by removing all the CRLFs - *followed immediately by a linear whitespace (SPACE or TAB). - */ -QByteArray VersitUtils::unfold(QByteArray& text) -{ - char previous = 0; - char previousOfTheprevious = 0; - for (int i=0; i* VersitUtils::m_newlineList = 0; +QByteArray VersitUtils::m_encodingMap[256]; /*! - * Encodes special characters in /a text - * using Quoted-Printable encoding (RFC 1521). - * Returns true if at least one character was encoded. + * Performs backslash escaping for line breaks (CRLFs), semicolons, backslashes and commas according + * to RFC 2426. This is called on parameter names and values and property values. + * Colons ARE NOT escaped because the examples in RFC2426 suggest that they shouldn't be. */ -bool VersitUtils::quotedPrintableEncode(QByteArray& text) -{ - bool encoded = false; - for (int i=0; i= 'a' && next <= 'f') || - (next >= 'A' && next <= 'F') || - (next >= '0' && next <= '9')) && - ((nextAfterNext >= 'a' && nextAfterNext <= 'f') || - (nextAfterNext >= 'A' && nextAfterNext <= 'F') || - (nextAfterNext >= '0' && nextAfterNext <= '9'))) { - QByteArray hexEncodedChar(text.mid(i+1,2)); - bool decoded = false; - char decodedChar = hexEncodedChar.toInt(&decoded,16); - QByteArray decodedCharAsByteArray; - decodedCharAsByteArray.append(decodedChar); - if (decoded) { - text.replace(i,3,decodedCharAsByteArray); - } - } - } - } -} - -/*! - * Performs backslash escaping for line breaks (CRLFs), - * semicolons, backslashes and commas according to RFC 2426. - */ -bool VersitUtils::backSlashEscape(QByteArray& text) -{ - bool escaped = false; - bool withinQuotes = false; - char previous = 0; - for (int i=0; i < text.length(); i++) { - char current = text.at(i); - if (previous != '\\' && !withinQuotes) { - char next = 0; - if (i != text.length()-1) - next = text.at(i+1); - if (current == ';' || current == ',' || - (current == '\\' && - next != '\\' && next != ';' && next != ',' && next != 'n')) { - text.insert(i,'\\'); - i++; - escaped = true; - } else if (previous == '\r' && current == '\n') { - text.replace(i-1,2,"\\n"); - escaped = true; - } else { - // NOP - } - } - if (current == '"') - withinQuotes = !withinQuotes; - previous = current; - } - return escaped; -} - -/*! - * Removes backslash escaping for line breaks (CRLFs), - * semicolons, backslashes and commas according to RFC 2426. - */ -void VersitUtils::removeBackSlashEscaping(QByteArray& text) -{ - char previous = 0; - bool withinQuotes = false; - for (int i=0; i < text.length(); i++) { - char current = text.at(i); - if (previous == '\\' && !withinQuotes) { - if (current == ';' || current == ',' || current == '\\') { - text.remove(i-1,1); - } else if (current == 'n' || current == 'N') { - text.replace(i-1,2,"\r\n"); - } else { - // NOP - } - } - if (current == '"') - withinQuotes = !withinQuotes; - previous = current; - } + /* replaces ; with \; + , with \, + \ with \\ + */ + text.replace(QRegExp(QLatin1String("([;,\\\\])")), QLatin1String("\\\\1")); + // replaces any CRLFs with \n + text.replace(QRegExp(QLatin1String("\r\n|\r|\n")), QLatin1String("\\n")); } /*! - * Finds the position of the first non-soft line break - * in a Quoted-Printable encoded string. + * Removes backslash escaping for line breaks (CRLFs), colons, semicolons, backslashes and commas + * according to RFC 2426. This is called on parameter names and values and property values. + * Colons ARE unescaped because the text of RFC2426 suggests that they should be. */ -int VersitUtils::findHardLineBreakInQuotedPrintable(const QByteArray& encoded) +void VersitUtils::removeBackSlashEscaping(QString& text) { - int crlfIndex = encoded.indexOf("\r\n"); - if (crlfIndex <= 0) - return -1; - while (crlfIndex > 0 && encoded.at(crlfIndex-1) == '=') { - crlfIndex = encoded.indexOf("\r\n",crlfIndex+2); + if (!(text.startsWith(QLatin1Char('"')) && text.endsWith(QLatin1Char('"')))) { + /* replaces \; with ; + \, with , + \: with : + \\ with \ + */ + text.replace(QRegExp(QLatin1String("\\\\([;,:\\\\])")), QLatin1String("\\1")); + // replaces \n with a CRLF + text.replace(QLatin1String("\\n"), QLatin1String("\r\n"), Qt::CaseInsensitive); } - - return crlfIndex; } -/*! - * Extracts the groups and the name of the property. - */ -QPair VersitUtils::extractPropertyGroupsAndName( - const QByteArray& property) -{ - QPair groupsAndName; - int length = 0; - char previous = 0; - for (int i=0; i < property.length(); i++) { - char current = property.at(i); - if ((current == ';' && previous != '\\') || - current == ':') { - length = i; - break; - } - previous = current; - } - if (length > 0) { - QString trimmedGroupsAndName = - QString::fromAscii(property.left(length).trimmed()); - QStringList parts = trimmedGroupsAndName.split(QString::fromAscii(".")); - if (parts.count() > 1) { - groupsAndName.second = parts.takeLast(); - groupsAndName.first = parts; - } else { - groupsAndName.second = trimmedGroupsAndName; - } - } - - return groupsAndName; -} /*! - * Extracts the value of the property. - * Returns an empty string if the value was not found + * Encode \a ch with \a codec, without adding an byte-order mark */ -QByteArray VersitUtils::extractPropertyValue(const QByteArray& property) +QByteArray VersitUtils::encode(char ch, QTextCodec* codec) { - QByteArray value; - int index = property.indexOf(':') + 1; - if (index > 0 && property.length() > index) - value = property.mid(index); - return value; -} - -/*! - * Extracts the property parameters as a QMultiHash. - * The parameters without names are added as "TYPE" parameters. - */ -QMultiHash VersitUtils::extractVCard21PropertyParams( - const QByteArray& property) -{ - QMultiHash result; - QList paramList = extractParams(property); - while (!paramList.isEmpty()) { - QByteArray param = paramList.takeLast(); - QString name = QString::fromAscii(paramName(param)); - QString value = QString::fromAscii(paramValue(param)); - result.insert(name,value); + if (codec != m_previousCodec) { + changeCodec(codec); } - - return result; -} - -/*! - * Extracts the property parameters as a QMultiHash. - * The parameters without names are added as "TYPE" parameters. - */ -QMultiHash VersitUtils::extractVCard30PropertyParams( - const QByteArray& property) -{ - QMultiHash result; - QList paramList = extractParams(property); - while (!paramList.isEmpty()) { - QByteArray param = paramList.takeLast(); - QByteArray name = paramName(param); - removeBackSlashEscaping(name); - QByteArray values = paramValue(param); - QList valueList = extractParts(values,','); - while (!valueList.isEmpty()) { - QByteArray value(valueList.takeLast()); - removeBackSlashEscaping(value); - result.insert(QString::fromAscii(name),QString::fromAscii(value)); - } - } - - return result; + return m_encodingMap[(int)ch]; } /*! - * Extracts the parameters as delimited by semicolons. + * Encode \a ba with \a codec, without adding an byte-order mark. \a ba is interpreted as ASCII */ -QList VersitUtils::extractParams(const QByteArray& property) +QByteArray VersitUtils::encode(const QByteArray& ba, QTextCodec* codec) { - QList params; - int colonIndex = property.indexOf(':'); - if (colonIndex > 0) { - QByteArray nameAndParamsString = property.left(colonIndex); - params = extractParts(nameAndParamsString,';'); - if (!params.isEmpty()) - params.removeFirst(); // Remove property name - } - - return params; + QTextCodec::ConverterState state(QTextCodec::IgnoreHeader); + return codec->fromUnicode(QString::fromAscii(ba.data()).data(), ba.length(), &state); } /*! - * Extracts the parts separated by separator - * discarding the separators escaped with a backslash + * Returns the list of DOS, UNIX and Mac newline characters for \a codec. */ -QList VersitUtils::extractParts( - const QByteArray& text, - char separator) +QList* VersitUtils::newlineList(QTextCodec* codec) { - QList parts; - int partStartIndex = 0; - char previous = 0; - for (int i=0; i 0) - parts.append(part); - partStartIndex = i+1; - } - previous = current; + if (m_newlineList != 0 && codec == m_previousCodec) { + return m_newlineList; } - - // Add the last or only part - QByteArray part = extractPart(text,partStartIndex); - if (part.length() > 0) - parts.append(part); - return parts; + changeCodec(codec); + return m_newlineList; } /*! - * Extracts a substring limited by /a startPosition and /a length. - */ -QByteArray VersitUtils::extractPart( - const QByteArray& text, - int startPosition, - int length) -{ - QByteArray part; - if (startPosition >= 0) - part = text.mid(startPosition,length).trimmed(); - return part; -} - -/*! - * Extracts the name of the parameter. - * No name is interpreted as an implicit "TYPE". + * Update the cached tables of pregenerated encoded text with \a codec. */ -QByteArray VersitUtils::paramName(const QByteArray& parameter) -{ - if (parameter.trimmed().length() == 0) - return QByteArray(); - int equalsIndex = parameter.indexOf('='); - if (equalsIndex > 0) { - return parameter.left(equalsIndex).trimmed(); - } - - return QByteArray("TYPE"); -} - -/*! - * Extracts the value of the parameter - */ -QByteArray VersitUtils::paramValue(const QByteArray& parameter) -{ - QByteArray value(parameter); - int equalsIndex = parameter.indexOf('='); - if (equalsIndex > 0) { - if (equalsIndex == parameter.length()-1) { - value = QByteArray(); - } else { - int valueLength = parameter.length() - (equalsIndex + 1); - value = parameter.right(valueLength).trimmed(); - } +void VersitUtils::changeCodec(QTextCodec* codec) { + // Build m_encodingMap + QChar qch; + QTextCodec::ConverterState state(QTextCodec::IgnoreHeader); + for (int c = 0; c < 256; c++) { + qch = QLatin1Char(c); + m_encodingMap[c] = codec->fromUnicode(&qch, 1, &state); } - return value; -} + // Build m_newlineList + if (m_newlineList != 0) + delete m_newlineList; + m_newlineList = new QList; + m_newlineList->append(QByteArrayMatcher(encode("\r\n", codec))); + m_newlineList->append(QByteArrayMatcher(encode("\n", codec))); + m_newlineList->append(QByteArrayMatcher(encode("\r", codec))); -/*! - * Checks whether the \a chr should be Quoted-Printable encoded (RFC 1521). - */ -bool VersitUtils::shouldBeQuotedPrintableEncoded(char chr) -{ - return (chr < 32 || - chr == '!' || chr == '"' || chr == '#' || chr == '$' || - chr == '=' || chr == '@' || chr == '[' || chr == '\\' || - chr == ']' || chr == '^' || chr == '`' || - chr > 122 ); + m_previousCodec = codec; } - -QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/src/versit/versitutils_p.h --- a/qtcontactsmobility/src/versit/versitutils_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/src/versit/versitutils_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -43,9 +43,21 @@ #ifndef VERSITUTILS_P_H #define VERSITUTILS_P_H +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + #include "qmobilityglobal.h" #include +#include #include #include #include @@ -56,32 +68,22 @@ class Q_AUTOTEST_EXPORT VersitUtils { public: - static QByteArray fold(QByteArray& text, int maxChars); - static QByteArray unfold(QByteArray& text); - static int countLeadingWhiteSpaces(const QByteArray& text, int pos=0); - static bool quotedPrintableEncode(QByteArray& text); - static void decodeQuotedPrintable(QByteArray& text); - static bool backSlashEscape(QByteArray& text); - static void removeBackSlashEscaping(QByteArray& text); - static int findHardLineBreakInQuotedPrintable(const QByteArray& encoded); - static QPair extractPropertyGroupsAndName( - const QByteArray& property); - static QByteArray extractPropertyValue(const QByteArray& property); - static QMultiHash extractVCard21PropertyParams( - const QByteArray& property); - static QMultiHash extractVCard30PropertyParams( - const QByteArray& property); + static void backSlashEscape(QString& text); + static void removeBackSlashEscaping(QString& text); + + static QByteArray encode(const QByteArray& ba, QTextCodec* codec); + static QByteArray encode(char ch, QTextCodec* codec); + static QList* newlineList(QTextCodec* codec); + static void changeCodec(QTextCodec* codec); - // "Private" functions - static QList extractParams(const QByteArray& property); - static QList extractParts(const QByteArray& text, char separator); - static QByteArray extractPart( - const QByteArray& text, - int startPosition, - int length=-1); - static QByteArray paramName(const QByteArray& parameter); - static QByteArray paramValue(const QByteArray& parameter); - static bool shouldBeQuotedPrintableEncoded(char chr); +private: + // These are caches for performance: + // The previous codec that encode(char, QTextCodec) was called with + static QTextCodec* m_previousCodec; + // The QByteArray corresponding to each char from 0-255, encoded with m_previousCodec + static QByteArray m_encodingMap[256]; + // List of different newline delimeters, encoded with m_previousCodec + static QList* m_newlineList; }; QTM_END_NAMESPACE diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/auto.pro --- a/qtcontactsmobility/tests/auto/auto.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/auto.pro Fri Apr 16 14:53:18 2010 +0300 @@ -10,7 +10,8 @@ qservicefilter \ qservicemanager \ qabstractsecuritysession \ - qservicecontext + qservicecontext \ + icheck # servicedatabase is not compiled into the serviceframework library on symbian, # special handling is needed @@ -69,7 +70,8 @@ } contains(mobility_modules,contacts) { - SUBDIRS += qcontact \ #Contacts + #Contacts + SUBDIRS += qcontact \ qcontactactions \ qcontactasync \ qcontactdetail \ @@ -80,6 +82,19 @@ qcontactmanagerplugins \ qcontactmanagerfiltering \ qcontactrelationship + + SUBDIRS += qcontact_deprecated \ + qcontactactions_deprecated \ + qcontactasync_deprecated \ + qcontactdetail_deprecated \ + qcontactdetaildefinition_deprecated \ + qcontactdetails_deprecated \ + qcontactfilter_deprecated \ + qcontactmanager_deprecated \ + qcontactmanagerplugins_deprecated \ + qcontactmanagerfiltering_deprecated \ + qcontactrelationship_deprecated + } contains(mobility_modules,versit) { @@ -87,6 +102,7 @@ SUBDIRS += \ qvcard21writer \ qvcard30writer \ + qversit \ qversitcontactexporter \ qversitcontactimporter \ qversitdocument \ @@ -112,14 +128,25 @@ qmediaserviceprovider \ qmediacontent \ qradiotuner \ - qvideowidget + qvideowidget \ + qmediatimerange contains(QT_CONFIG, multimedia) { SUBDIRS += \ qgraphicsvideoitem \ qpaintervideosurface -} + } + + symbian: { + #symbian spesific autotests + SUBDIRS += symbian + SUBDIRS -= \ + qcamera \ + qmediaplayer \ + qradiotuner \ + qmediaobject + } } #Messaging contains(mobility_modules,messaging) { diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qcontact/tst_qcontact.cpp --- a/qtcontactsmobility/tests/auto/qcontact/tst_qcontact.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qcontact/tst_qcontact.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -172,6 +172,7 @@ QVERIFY(p == p3); // now we want to add multiple details of the same type, and test that retrieval works correctly. + p2 = QContactPhoneNumber(); p2.setNumber("22222"); p2.setValue("nonexistent-field", QVariant("22222-2")); c.saveDetail(&p); @@ -333,7 +334,7 @@ four.setNumber(""); c.saveDetail(&four); QVERIFY(c.details(QContactPhoneNumber::DefinitionName).count() == 2); - QVERIFY(!four.values().isEmpty()); // an empty qstring is not invalid; make sure it exists in the detail. + QVERIFY(!four.variantValues().isEmpty()); // an empty qstring is not invalid; make sure it exists in the detail. // ensure that clearing a contact's details works correctly QContactName nameDetail; @@ -599,7 +600,7 @@ /* * The display label is not updated until you save the contact! */ - QString synth = cm.synthesizeDisplayLabel(d); + QString synth = cm.synthesizedDisplayLabel(d); QVERIFY(d.displayLabel().isEmpty()); //QVERIFY(synth == name.customLabel()); // XXX Perhaps not guaranteed, depends on backend synth rules. diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qcontactactions/sendemailaction/sendemailaction.cpp --- a/qtcontactsmobility/tests/auto/qcontactactions/sendemailaction/sendemailaction.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qcontactactions/sendemailaction/sendemailaction.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -115,6 +115,11 @@ return QVariantMap(); } +QVariantMap QContactSendEmailAction::metaData() const +{ + return QVariantMap(); +} + QContactFilter QContactSendEmailAction::contactFilter(const QVariant& value) const { QContactDetailFilter retn; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qcontactactions/sendemailaction/sendemailaction_p.h --- a/qtcontactsmobility/tests/auto/qcontactactions/sendemailaction/sendemailaction_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qcontactactions/sendemailaction/sendemailaction_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -72,6 +72,7 @@ QContactActionDescriptor actionDescriptor() const; QVariantMap metadata() const; + QVariantMap metaData() const; QContactFilter contactFilter(const QVariant& value) const; bool supportsDetail(const QContactDetail& detail) const; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qcontactasync/maliciousplugin/maliciousplugin.cpp --- a/qtcontactsmobility/tests/auto/qcontactasync/maliciousplugin/maliciousplugin.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qcontactasync/maliciousplugin/maliciousplugin.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -63,7 +63,7 @@ // does this leak? } -QString MaliciousAsyncManagerEngine::synthesizeDisplayLabel(const QContact& contact, QContactManager::Error& error) const +QString MaliciousAsyncManagerEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const { Q_UNUSED(contact); error = QContactManager::NotSupportedError; @@ -77,7 +77,11 @@ bool MaliciousAsyncManagerEngine::startRequest(QContactAbstractRequest* req) { - QContactManager::Error errorResult = QContactManager::NoError; + // maliciously attempt to update the request with every result type + updateRequestState(req, QContactAbstractRequest::ActiveState); + // XXX TODO: call the request-type specific update functions +/* + //QContactManager::Error errorResult = QContactManager::NoError; QList errorsResult; QList idResult; QList contactResult; @@ -85,23 +89,19 @@ QMap defMapResult; QList relResult; - // maliciously attempt to update the request with every result type - updateRequestStatus(req, errorResult, errorsResult, QContactAbstractRequest::Active, false); - updateRequest(req, idResult, errorResult, errorsResult, QContactAbstractRequest::Active, false); - updateRequest(req, contactResult, errorResult, errorsResult, QContactAbstractRequest::Active, false); - updateRequest(req, defResult, errorResult, errorsResult, QContactAbstractRequest::Active); - updateRequest(req, defMapResult, errorResult, errorsResult, QContactAbstractRequest::Active, false); - updateRequest(req, relResult, errorResult, errorsResult, QContactAbstractRequest::Active, false); - + updateContactLocalIdFetchRequest(req, idResult, errorResult, errorsResult, QContactAbstractRequest::ActiveState, false); + updateContactFetchRequest(req, contactResult, errorResult, errorsResult, QContactAbstractRequest::ActiveState, false); + updateDefinitionSaveRequest(req, defResult, errorResult, errorsResult, QContactAbstractRequest::ActiveState); + updateDefinitionFetchRequest(req, defMapResult, errorResult, errorsResult, QContactAbstractRequest::ActiveState, false); + updateRequest(req, relResult, errorResult, errorsResult, QContactAbstractRequest::ActiveState, false); +*/ QContactManagerEngine::startRequest(req); return true; } bool MaliciousAsyncManagerEngine::cancelRequest(QContactAbstractRequest *req) { - QContactManager::Error errorResult = QContactManager::NoError; - QList errorsResult; - updateRequestStatus(req, errorResult, errorsResult, QContactAbstractRequest::Cancelled, false); + updateRequestState(req, QContactAbstractRequest::CanceledState); QContactManagerEngine::cancelRequest(req); return true; } diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qcontactasync/maliciousplugin/maliciousplugin_p.h --- a/qtcontactsmobility/tests/auto/qcontactasync/maliciousplugin/maliciousplugin_p.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qcontactasync/maliciousplugin/maliciousplugin_p.h Fri Apr 16 14:53:18 2010 +0300 @@ -70,7 +70,7 @@ MaliciousAsyncManagerEngine(); void deref(); - QString synthesizeDisplayLabel(const QContact& contact, QContactManager::Error& error) const; + QString synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const; QString managerName() const; bool startRequest(QContactAbstractRequest* req); bool cancelRequest(QContactAbstractRequest *req); diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qcontactasync/unittest/tst_qcontactasync.cpp --- a/qtcontactsmobility/tests/auto/qcontactasync/unittest/tst_qcontactasync.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qcontactasync/unittest/tst_qcontactasync.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -42,10 +42,131 @@ #include #include +#include + #include "qtcontacts.h" #include "qcontactmanagerdataholder.h" //QContactManagerDataHolder QTM_USE_NAMESPACE +/* Define an innocuous request (fetch ie doesn't mutate) to "fill up" any queues */ +#define FILL_QUEUE_WITH_FETCH_REQUESTS() QContactFetchRequest fqcfr1, fqcfr2, fqcfr3; \ + QContactDetailDefinitionFetchRequest fqdfr1, fqdfr2, fqdfr3; \ + fqcfr1.start(); \ + fqcfr2.start(); \ + fqcfr3.start(); \ + fqdfr1.start(); \ + fqdfr2.start(); \ + fqdfr3.start(); + + +//TESTED_CLASS= +//TESTED_FILES= + +// Unfortunately the plumbing isn't in place to allow cancelling requests at arbitrary points +// in their processing. So we do multiple loops until things work out.. or not +#define MAX_OPTIMISTIC_SCHEDULING_LIMIT 100 + + +// Thread capable QThreadSignalSpy (to avoid data races with count/appendArgS) +class QThreadSignalSpy: public QObject +{ +public: + QThreadSignalSpy(QObject *obj, const char *aSignal) + { +#ifdef Q_CC_BOR + const int memberOffset = QObject::staticMetaObject.methodCount(); +#else + static const int memberOffset = QObject::staticMetaObject.methodCount(); +#endif + Q_ASSERT(obj); + Q_ASSERT(aSignal); + + if (((aSignal[0] - '0') & 0x03) != QSIGNAL_CODE) { + qWarning("QThreadSignalSpy: Not a valid signal, use the SIGNAL macro"); + return; + } + + QByteArray ba = QMetaObject::normalizedSignature(aSignal + 1); + const QMetaObject *mo = obj->metaObject(); + int sigIndex = mo->indexOfMethod(ba.constData()); + if (sigIndex < 0) { + qWarning("QThreadSignalSpy: No such signal: '%s'", ba.constData()); + return; + } + + if (!QMetaObject::connect(obj, sigIndex, this, memberOffset, + Qt::DirectConnection, 0)) { + qWarning("QThreadSignalSpy: QMetaObject::connect returned false. Unable to connect."); + return; + } + sig = ba; + initArgs(mo->method(sigIndex)); + } + + inline bool isValid() const { return !sig.isEmpty(); } + inline QByteArray signal() const { return sig; } + + int qt_metacall(QMetaObject::Call call, int methodId, void **a) + { + methodId = QObject::qt_metacall(call, methodId, a); + if (methodId < 0) + return methodId; + + if (call == QMetaObject::InvokeMetaMethod) { + if (methodId == 0) { + appendArgs(a); + } + --methodId; + } + return methodId; + } + + // The QList API we actually use + int count() const + { + QMutexLocker m(&lock); + return savedArgs.count(); + } + void clear() + { + QMutexLocker m(&lock); + savedArgs.clear(); + } + +private: + void initArgs(const QMetaMethod &member) + { + QMutexLocker m(&lock); + QList params = member.parameterTypes(); + for (int i = 0; i < params.count(); ++i) { + int tp = QMetaType::type(params.at(i).constData()); + if (tp == QMetaType::Void) + qWarning("Don't know how to handle '%s', use qRegisterMetaType to register it.", + params.at(i).constData()); + args << tp; + } + } + + void appendArgs(void **a) + { + QMutexLocker m(&lock); + QList list; + for (int i = 0; i < args.count(); ++i) { + QMetaType::Type type = static_cast(args.at(i)); + list << QVariant(type, a[i + 1]); + } + savedArgs.append(list); + } + + // the full, normalized signal name + QByteArray sig; + // holds the QMetaType types for the argument list of the signal + QList args; + + mutable QMutex lock; + // Different API + QList< QVariantList> savedArgs; +}; class tst_QContactAsync : public QObject { @@ -91,6 +212,9 @@ void maliciousManager(); // uses it's own custom data (manager) + void testQuickDestruction(); + void testQuickDestruction_data() { addManagers(); } + void threadDelivery(); void progressReceived(QContactFetchRequest* request, bool appendOnly); void threadDelivery_data() { addManagers(); } @@ -98,24 +222,21 @@ private: bool containsIgnoringTimestamps(const QList& list, const QContact& c); bool compareIgnoringTimestamps(const QContact& ca, const QContact& cb); - bool prepareModel(const QString &uri, QContactManager *&cm); - bool prepareModel(const QString &uri, QContactManager *&cm, QList &contacts, QList &relationships); + QContactManager* prepareModel(const QString& uri); Qt::HANDLE m_mainThreadId; Qt::HANDLE m_progressSlotThreadId; QContactManagerDataHolder managerDataHolder; }; -typedef QList QContactLocalIdList; -Q_DECLARE_METATYPE(QContactLocalIdList); - tst_QContactAsync::tst_QContactAsync() { // ensure we can load all of the plugins we need to. QString path = QApplication::applicationDirPath() + "/dummyplugin/plugins"; QApplication::addLibraryPath(path); - qRegisterMetaType("QList"); + qRegisterMetaType("QContactAbstractRequest::State"); + } tst_QContactAsync::~tst_QContactAsync() @@ -181,13 +302,11 @@ void tst_QContactAsync::testDestructor() { QFETCH(QString, uri); - QContactManager* cm(0); - QVERIFY(prepareModel(uri, cm)); + QContactManager* cm = prepareModel(uri); QContactFetchRequest* req = new QContactFetchRequest; req->setManager(cm); - QContactManager* cm2(0); - QVERIFY(prepareModel(uri, cm2)); + QContactManager* cm2 = prepareModel(uri); QContactFetchRequest* req2 = new QContactFetchRequest; req2->setManager(cm2); @@ -203,8 +322,8 @@ void tst_QContactAsync::contactFetch() { QFETCH(QString, uri); - QContactManager* cm(0); - QVERIFY(prepareModel(uri, cm)); + QScopedPointer cm(prepareModel(uri)); + QContactFetchRequest cfr; QVERIFY(cfr.type() == QContactAbstractRequest::ContactFetchRequest); @@ -214,34 +333,31 @@ QVERIFY(!cfr.start()); QVERIFY(!cfr.cancel()); QVERIFY(!cfr.waitForFinished()); - QVERIFY(!cfr.waitForProgress()); // "all contacts" retrieval QContactFilter fil; - cfr.setManager(cm); - QCOMPARE(cfr.manager(), cm); + cfr.setManager(cm.data()); + QCOMPARE(cfr.manager(), cm.data()); QVERIFY(!cfr.isActive()); QVERIFY(!cfr.isFinished()); QVERIFY(!cfr.cancel()); QVERIFY(!cfr.waitForFinished()); - QVERIFY(!cfr.waitForProgress()); qRegisterMetaType("QContactFetchRequest*"); - QSignalSpy spy(&cfr, SIGNAL(progress(QContactFetchRequest*, bool))); + QThreadSignalSpy spy(&cfr, SIGNAL(stateChanged(QContactAbstractRequest::State))); cfr.setFilter(fil); QCOMPARE(cfr.filter(), fil); QVERIFY(!cfr.cancel()); // not started + QVERIFY(cfr.start()); - QVERIFY(cfr.isActive()); - QVERIFY(cfr.status() == QContactAbstractRequest::Active); - QVERIFY(!cfr.isFinished()); - QVERIFY(!cfr.start()); // already started. + //QVERIFY(cfr.isFinished() || !cfr.start()); // already started. // thread scheduling means this is untestable + QVERIFY((cfr.isActive() && cfr.state() == QContactAbstractRequest::ActiveState) || cfr.isFinished()); QVERIFY(cfr.waitForFinished()); - int expectedCount = 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(cfr.isFinished()); - QVERIFY(!cfr.isActive()); - QList contactIds = cm->contacts(); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); + + QList contactIds = cm->contactIds(); QList contacts = cfr.contacts(); QCOMPARE(contactIds.size(), contacts.size()); for (int i = 0; i < contactIds.size(); i++) { @@ -255,18 +371,16 @@ cfr.setFilter(dfil); QVERIFY(cfr.filter() == dfil); QVERIFY(!cfr.cancel()); // not started + QVERIFY(cfr.start()); - QVERIFY(cfr.isActive()); - QVERIFY(cfr.status() == QContactAbstractRequest::Active); - QVERIFY(!cfr.isFinished()); - QVERIFY(!cfr.start()); // already started. + QVERIFY((cfr.isActive() && cfr.state() == QContactAbstractRequest::ActiveState) || cfr.isFinished()); + //QVERIFY(cfr.isFinished() || !cfr.start()); // already started. // thread scheduling means this is untestable QVERIFY(cfr.waitForFinished()); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(cfr.isFinished()); - QVERIFY(!cfr.isActive()); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); - contactIds = cm->contacts(dfil); + contactIds = cm->contactIds(dfil); contacts = cfr.contacts(); QCOMPARE(contactIds.size(), contacts.size()); for (int i = 0; i < contactIds.size(); i++) { @@ -284,17 +398,15 @@ QCOMPARE(cfr.sorting(), sorting); QVERIFY(!cfr.cancel()); // not started QVERIFY(cfr.start()); - QVERIFY(cfr.isActive()); - QVERIFY(cfr.status() == QContactAbstractRequest::Active); - QVERIFY(!cfr.isFinished()); - QVERIFY(!cfr.start()); // already started. + QVERIFY((cfr.isActive() && cfr.state() == QContactAbstractRequest::ActiveState) || cfr.isFinished()); + //QVERIFY(cfr.isFinished() || !cfr.start()); // already started. // thread scheduling means this is untestable QVERIFY(cfr.waitForFinished()); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(cfr.isFinished()); - QVERIFY(!cfr.isActive()); - contactIds = cm->contacts(sorting); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); + + contactIds = cm->contactIds(sorting); contacts = cfr.contacts(); QCOMPARE(contactIds.size(), contacts.size()); for (int i = 0; i < contactIds.size(); i++) { @@ -310,17 +422,15 @@ QCOMPARE(cfr.definitionRestrictions(), QStringList(QContactName::DefinitionName)); QVERIFY(!cfr.cancel()); // not started QVERIFY(cfr.start()); - QVERIFY(cfr.isActive()); - QVERIFY(cfr.status() == QContactAbstractRequest::Active); - QVERIFY(!cfr.isFinished()); - QVERIFY(!cfr.start()); // already started. + QVERIFY((cfr.isActive() && cfr.state() == QContactAbstractRequest::ActiveState) || cfr.isFinished()); + //QVERIFY(cfr.isFinished() || !cfr.start()); // already started. // thread scheduling means this is untestable QVERIFY(cfr.waitForFinished()); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(cfr.isFinished()); - QVERIFY(!cfr.isActive()); - contactIds = cm->contacts(sorting); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); + + contactIds = cm->contactIds(sorting); contacts = cfr.contacts(); QCOMPARE(contactIds.size(), contacts.size()); for (int i = 0; i < contactIds.size(); i++) { @@ -349,9 +459,9 @@ QVERIFY(found); // must exist or fail. // ensure that the contact is the same (except synth fields) - QList fdets = retrievedRestricted.details(); - QList rdets = currRestricted.details(); - foreach (const QContactDetail& det, fdets) { + QList retrievedDetails = retrievedRestricted.details(); + QList expectedDetails = currRestricted.details(); + foreach (const QContactDetail& det, expectedDetails) { // ignore backend synthesised details // again, this requires a "default contact details" function to work properly. if (det.definitionName() == QContactDisplayLabel::DefinitionName @@ -359,10 +469,8 @@ continue; } - // everything else must exist in both. - if(!rdets.contains(det)) { - qWarning("A detail exists in retrieved contact which doesn't exist in restricted contact! This could be due to backend synthesization, or represent a bug! (Definition name: %s)", det.definitionName().toAscii().constData()); - } + // everything else in the expected contact should be in the retrieved one. + QVERIFY(retrievedDetails.contains(det)); } } @@ -371,49 +479,75 @@ cfr.setFilter(fil); cfr.setSorting(sorting); cfr.setDefinitionRestrictions(QStringList()); - QVERIFY(!cfr.cancel()); // not started - QVERIFY(cfr.start()); - QVERIFY(cfr.isActive()); - QVERIFY(cfr.status() == QContactAbstractRequest::Active); - QVERIFY(!cfr.isFinished()); - QVERIFY(cfr.cancel()); - QVERIFY(cfr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(cfr.isActive()); // still cancelling - QVERIFY(!cfr.isFinished()); // not finished cancelling - QVERIFY(!cfr.start()); // already started. - QVERIFY(cfr.waitForFinished()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(cfr.isFinished()); - QVERIFY(!cfr.isActive()); - QVERIFY(cfr.status() == QContactAbstractRequest::Cancelled); + + int bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; // attempt to cancel 40 times. If it doesn't work due to threading, bail out. + while (true) { + QVERIFY(!cfr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(cfr.start()); + if (!cfr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + spy.clear(); + cfr.waitForFinished(); + sorting.clear(); + cfr.setFilter(fil); + cfr.setSorting(sorting); + cfr.setDefinitionRestrictions(QStringList()); + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + continue; + } + + // if we get here, then we are cancelling the request. + QVERIFY(cfr.waitForFinished()); + QVERIFY(cfr.isCanceled()); + + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); + break; + } // restart, and wait for progress after cancel. - QVERIFY(!cfr.cancel()); // not started - QVERIFY(cfr.start()); - QVERIFY(cfr.isActive()); - QVERIFY(cfr.status() == QContactAbstractRequest::Active); - QVERIFY(!cfr.isFinished()); - QVERIFY(cfr.cancel()); - QVERIFY(cfr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(cfr.isActive()); // still cancelling - QVERIFY(!cfr.isFinished()); // not finished cancelling - QVERIFY(!cfr.start()); // already started. - QVERIFY(cfr.waitForProgress()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(cfr.isFinished()); - QVERIFY(!cfr.isActive()); - QVERIFY(cfr.status() == QContactAbstractRequest::Cancelled); + while (true) { + QVERIFY(!cfr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(cfr.start()); + if (!cfr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + cfr.waitForFinished(); + sorting.clear(); + cfr.setFilter(fil); + cfr.setSorting(sorting); + cfr.setDefinitionRestrictions(QStringList()); + bailoutCount -= 1; + spy.clear(); + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + continue; + } + cfr.waitForFinished(); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); + QVERIFY(!cfr.isActive()); + QVERIFY(cfr.state() == QContactAbstractRequest::CanceledState); + break; + } - delete cm; } void tst_QContactAsync::contactIdFetch() { QFETCH(QString, uri); - QContactManager* cm(0); - QVERIFY(prepareModel(uri, cm)); + QScopedPointer cm(prepareModel(uri)); QContactLocalIdFetchRequest cfr; QVERIFY(cfr.type() == QContactAbstractRequest::ContactLocalIdFetchRequest); @@ -423,34 +557,32 @@ QVERIFY(!cfr.start()); QVERIFY(!cfr.cancel()); QVERIFY(!cfr.waitForFinished()); - QVERIFY(!cfr.waitForProgress()); // "all contacts" retrieval QContactFilter fil; - cfr.setManager(cm); - QCOMPARE(cfr.manager(), cm); + cfr.setManager(cm.data()); + QCOMPARE(cfr.manager(), cm.data()); QVERIFY(!cfr.isActive()); QVERIFY(!cfr.isFinished()); QVERIFY(!cfr.cancel()); QVERIFY(!cfr.waitForFinished()); - QVERIFY(!cfr.waitForProgress()); qRegisterMetaType("QContactLocalIdFetchRequest*"); - QSignalSpy spy(&cfr, SIGNAL(progress(QContactLocalIdFetchRequest*, bool))); + + QThreadSignalSpy spy(&cfr, SIGNAL(stateChanged(QContactAbstractRequest::State))); cfr.setFilter(fil); QCOMPARE(cfr.filter(), fil); QVERIFY(!cfr.cancel()); // not started QVERIFY(cfr.start()); - QVERIFY(cfr.isActive()); - QVERIFY(cfr.status() == QContactAbstractRequest::Active); - QVERIFY(!cfr.isFinished()); - QVERIFY(!cfr.start()); // already started. + + QVERIFY((cfr.isActive() &&cfr.state() == QContactAbstractRequest::ActiveState) || cfr.isFinished()); + //QVERIFY(cfr.isFinished() || !cfr.start()); // already started. // thread scheduling means this is untestable QVERIFY(cfr.waitForFinished()); - int expectedCount = 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(cfr.isFinished()); - QVERIFY(!cfr.isActive()); - QList contactIds = cm->contacts(); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); + + QList contactIds = cm->contactIds(); QList result = cfr.ids(); QCOMPARE(contactIds, result); @@ -460,18 +592,17 @@ cfr.setFilter(dfil); QVERIFY(cfr.filter() == dfil); QVERIFY(!cfr.cancel()); // not started + QVERIFY(cfr.start()); - QVERIFY(cfr.isActive()); - QVERIFY(cfr.status() == QContactAbstractRequest::Active); - QVERIFY(!cfr.isFinished()); - QVERIFY(!cfr.start()); // already started. + QVERIFY((cfr.isActive() && cfr.state() == QContactAbstractRequest::ActiveState) || cfr.isFinished()); + //QVERIFY(cfr.isFinished() || !cfr.start()); // already started. // thread scheduling means this is untestable QVERIFY(cfr.waitForFinished()); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(cfr.isFinished()); - QVERIFY(!cfr.isActive()); - contactIds = cm->contacts(dfil); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); + + contactIds = cm->contactIds(dfil); result = cfr.ids(); QCOMPARE(contactIds, result); @@ -485,17 +616,15 @@ QCOMPARE(cfr.sorting(), sorting); QVERIFY(!cfr.cancel()); // not started QVERIFY(cfr.start()); - QVERIFY(cfr.isActive()); - QVERIFY(cfr.status() == QContactAbstractRequest::Active); - QVERIFY(!cfr.isFinished()); - QVERIFY(!cfr.start()); // already started. + QVERIFY((cfr.isActive() && cfr.state() == QContactAbstractRequest::ActiveState) || cfr.isFinished()); + //QVERIFY(cfr.isFinished() || !cfr.start()); // already started. // thread scheduling means this is untestable QVERIFY(cfr.waitForFinished()); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(cfr.isFinished()); - QVERIFY(!cfr.isActive()); - contactIds = cm->contacts(sorting); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); + + contactIds = cm->contactIds(sorting); result = cfr.ids(); QCOMPARE(contactIds, result); @@ -503,49 +632,73 @@ sorting.clear(); cfr.setFilter(fil); cfr.setSorting(sorting); - QVERIFY(!cfr.cancel()); // not started - QVERIFY(cfr.start()); - QVERIFY(cfr.isActive()); - QVERIFY(cfr.status() == QContactAbstractRequest::Active); - QVERIFY(!cfr.isFinished()); - QVERIFY(cfr.cancel()); - QVERIFY(cfr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(cfr.isActive()); // still cancelling - QVERIFY(!cfr.isFinished()); // not finished cancelling - QVERIFY(!cfr.start()); // already started. - QVERIFY(cfr.waitForFinished()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(cfr.isFinished()); - QVERIFY(!cfr.isActive()); - QVERIFY(cfr.status() == QContactAbstractRequest::Cancelled); + + int bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; // attempt to cancel 40 times. If it doesn't work due to threading, bail out. + while (true) { + QVERIFY(!cfr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(cfr.start()); + if (!cfr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + cfr.waitForFinished(); + sorting.clear(); + cfr.setFilter(fil); + cfr.setSorting(sorting); + bailoutCount -= 1; + spy.clear(); + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + continue; + } + + // if we get here, then we are cancelling the request. + QVERIFY(cfr.waitForFinished()); + QVERIFY(cfr.isCanceled()); + + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); + + break; + } // restart, and wait for progress after cancel. - QVERIFY(!cfr.cancel()); // not started - QVERIFY(cfr.start()); - QVERIFY(cfr.isActive()); - QVERIFY(cfr.status() == QContactAbstractRequest::Active); - QVERIFY(!cfr.isFinished()); - QVERIFY(cfr.cancel()); - QVERIFY(cfr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(cfr.isActive()); // still cancelling - QVERIFY(!cfr.isFinished()); // not finished cancelling - QVERIFY(!cfr.start()); // already started. - QVERIFY(cfr.waitForProgress()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(cfr.isFinished()); - QVERIFY(!cfr.isActive()); - QVERIFY(cfr.status() == QContactAbstractRequest::Cancelled); + while (true) { + QVERIFY(!cfr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(cfr.start()); + if (!cfr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + cfr.waitForFinished(); + sorting.clear(); + cfr.setFilter(fil); + cfr.setSorting(sorting); + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + continue; + } + cfr.waitForFinished(); + QVERIFY(cfr.isCanceled()); - delete cm; + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); + break; + } + } void tst_QContactAsync::contactRemove() { QFETCH(QString, uri); - QContactManager* cm(0); - QVERIFY(prepareModel(uri, cm)); + QScopedPointer cm(prepareModel(uri)); QContactRemoveRequest crr; QVERIFY(crr.type() == QContactAbstractRequest::ContactRemoveRequest); @@ -555,113 +708,132 @@ QVERIFY(!crr.start()); QVERIFY(!crr.cancel()); QVERIFY(!crr.waitForFinished()); - QVERIFY(!crr.waitForProgress()); - // specific contact removal - int originalCount = cm->contacts().size(); + // specific contact removal via detail filter + int originalCount = cm->contactIds().size(); QContactDetailFilter dfil; dfil.setDetailDefinitionName(QContactUrl::DefinitionName, QContactUrl::FieldUrl); - crr.setFilter(dfil); - crr.setManager(cm); - QCOMPARE(crr.manager(), cm); + crr.setContactIds(cm->contactIds(dfil)); + crr.setManager(cm.data()); + QCOMPARE(crr.manager(), cm.data()); QVERIFY(!crr.isActive()); QVERIFY(!crr.isFinished()); QVERIFY(!crr.cancel()); QVERIFY(!crr.waitForFinished()); - QVERIFY(!crr.waitForProgress()); qRegisterMetaType("QContactRemoveRequest*"); - QSignalSpy spy(&crr, SIGNAL(progress(QContactRemoveRequest*))); - QVERIFY(crr.filter() == dfil); + QThreadSignalSpy spy(&crr, SIGNAL(stateChanged(QContactAbstractRequest::State))); QVERIFY(!crr.cancel()); // not started + + QVERIFY(!cm->contactIds(dfil).isEmpty()); + QVERIFY(crr.start()); - QVERIFY(crr.isActive()); - QVERIFY(crr.status() == QContactAbstractRequest::Active); - QVERIFY(!crr.isFinished()); - QVERIFY(!crr.start()); // already started. + + QVERIFY((crr.isActive() &&crr.state() == QContactAbstractRequest::ActiveState) || crr.isFinished()); + //QVERIFY(crr.isFinished() || !crr.start()); // already started. // thread scheduling means this is untestable QVERIFY(crr.waitForFinished()); - int expectedCount = 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(crr.isFinished()); - QVERIFY(!crr.isActive()); - QCOMPARE(cm->contacts().size(), originalCount - 1); - QVERIFY(cm->contacts(dfil).isEmpty()); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); + + QCOMPARE(cm->contactIds().size(), originalCount - 1); + QVERIFY(cm->contactIds(dfil).isEmpty()); // remove all contacts dfil.setDetailDefinitionName(QContactDisplayLabel::DefinitionName); // delete everything. - crr.setFilter(dfil); - QVERIFY(crr.filter() == dfil); + crr.setContactIds(cm->contactIds(dfil)); + QVERIFY(!crr.cancel()); // not started QVERIFY(crr.start()); - QVERIFY(crr.isActive()); - QVERIFY(crr.status() == QContactAbstractRequest::Active); - QVERIFY(!crr.isFinished()); - QVERIFY(!crr.start()); // already started. + + QVERIFY((crr.isActive() && crr.state() == QContactAbstractRequest::ActiveState) || crr.isFinished()); + //QVERIFY(crr.isFinished() || !crr.start()); // already started. // thread scheduling means this is untestable QVERIFY(crr.waitForFinished()); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(crr.isFinished()); - QVERIFY(!crr.isActive()); - QCOMPARE(cm->contacts().size(), 0); // no contacts should be left. + QCOMPARE(cm->contactIds().size(), 0); // no contacts should be left. + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); // cancelling QContact temp; QContactName nameDetail; - nameDetail.setFirst("Should not be removed"); + nameDetail.setFirstName("Should not be removed"); temp.saveDetail(&nameDetail); cm->saveContact(&temp); - crr.setFilter(dfil); - QVERIFY(!crr.cancel()); // not started - QVERIFY(crr.start()); - QVERIFY(crr.isActive()); - QVERIFY(crr.status() == QContactAbstractRequest::Active); - QVERIFY(!crr.isFinished()); - QVERIFY(crr.cancel()); - QVERIFY(crr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(crr.isActive()); // still cancelling - QVERIFY(!crr.isFinished()); // not finished cancelling - QVERIFY(!crr.start()); // already started. - QVERIFY(crr.waitForFinished()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(crr.isFinished()); - QVERIFY(!crr.isActive()); - QVERIFY(crr.status() == QContactAbstractRequest::Cancelled); + crr.setContactIds(cm->contactIds(dfil)); - QCOMPARE(cm->contacts().size(), 1); - QCOMPARE(cm->contact(cm->contacts().first()), temp); + int bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; // attempt to cancel 40 times. If it doesn't work due to threading, bail out. + while (true) { + QVERIFY(!crr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(spy.count() == 0); + QVERIFY(crr.start()); + if (!crr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + crr.waitForFinished(); + crr.setContactIds(cm->contactIds(dfil)); + temp.setId(QContactId()); + if (!cm->saveContact(&temp)) { + QSKIP("Unable to save temporary contact for remove request cancellation test!", SkipSingle); + } + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + spy.clear(); + continue; + } + + // if we get here, then we are cancelling the request. + QVERIFY(crr.waitForFinished()); + QVERIFY(crr.isCanceled()); + QCOMPARE(cm->contactIds().size(), 1); + QCOMPARE(cm->contact(cm->contactIds().first()), temp); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); + break; + } // restart, and wait for progress after cancel. - QVERIFY(!crr.cancel()); // not started - QVERIFY(crr.start()); - QVERIFY(crr.isActive()); - QVERIFY(crr.status() == QContactAbstractRequest::Active); - QVERIFY(!crr.isFinished()); - QVERIFY(crr.cancel()); - QVERIFY(crr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(crr.isActive()); // still cancelling - QVERIFY(!crr.isFinished()); // not finished cancelling - QVERIFY(!crr.start()); // already started. - QVERIFY(crr.waitForProgress()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(crr.isFinished()); - QVERIFY(!crr.isActive()); - QVERIFY(crr.status() == QContactAbstractRequest::Cancelled); + while (true) { + QVERIFY(!crr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(crr.start()); + if (!crr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + crr.waitForFinished(); + crr.setContactIds(cm->contactIds(dfil)); + temp.setId(QContactId()); + cm->saveContact(&temp); + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + spy.clear(); + continue; + } + crr.waitForFinished(); + QVERIFY(crr.isCanceled()); + QCOMPARE(cm->contactIds().size(), 1); + QCOMPARE(cm->contact(cm->contactIds().first()), temp); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); + break; + } - QCOMPARE(cm->contacts().size(), 1); - QCOMPARE(cm->contact(cm->contacts().first()), temp); - cm->removeContact(temp.localId()); // clean up - - delete cm; } void tst_QContactAsync::contactSave() { QFETCH(QString, uri); - QContactManager* cm(0); - QVERIFY(prepareModel(uri, cm)); + QScopedPointer cm(prepareModel(uri)); QContactSaveRequest csr; QVERIFY(csr.type() == QContactAbstractRequest::ContactSaveRequest); @@ -671,44 +843,40 @@ QVERIFY(!csr.start()); QVERIFY(!csr.cancel()); QVERIFY(!csr.waitForFinished()); - QVERIFY(!csr.waitForProgress()); // save a new contact - int originalCount = cm->contacts().size(); + int originalCount = cm->contactIds().size(); QContact testContact; QContactName nameDetail; - nameDetail.setFirst("Test Contact"); + nameDetail.setFirstName("Test Contact"); testContact.saveDetail(&nameDetail); QList saveList; saveList << testContact; - csr.setManager(cm); - QCOMPARE(csr.manager(), cm); + csr.setManager(cm.data()); + QCOMPARE(csr.manager(), cm.data()); QVERIFY(!csr.isActive()); QVERIFY(!csr.isFinished()); QVERIFY(!csr.cancel()); QVERIFY(!csr.waitForFinished()); - QVERIFY(!csr.waitForProgress()); qRegisterMetaType("QContactSaveRequest*"); - QSignalSpy spy(&csr, SIGNAL(progress(QContactSaveRequest*))); + QThreadSignalSpy spy(&csr, SIGNAL(stateChanged(QContactAbstractRequest::State))); csr.setContacts(saveList); QCOMPARE(csr.contacts(), saveList); QVERIFY(!csr.cancel()); // not started QVERIFY(csr.start()); - QVERIFY(csr.isActive()); - QVERIFY(csr.status() == QContactAbstractRequest::Active); - QVERIFY(!csr.isFinished()); - QVERIFY(!csr.start()); // already started. + + QVERIFY((csr.isActive() && csr.state() == QContactAbstractRequest::ActiveState) || csr.isFinished()); + //QVERIFY(csr.isFinished() || !csr.start()); // already started. // thread scheduling means this is untestable QVERIFY(csr.waitForFinished()); - int expectedCount = 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(csr.isFinished()); - QVERIFY(!csr.isActive()); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); QList expected; - expected << cm->contact(cm->contacts().last()); + expected << cm->contact(cm->contactIds().last()); QList result = csr.contacts(); QCOMPARE(expected, result); - QCOMPARE(cm->contacts().size(), originalCount + 1); + QCOMPARE(cm->contactIds().size(), originalCount + 1); // update a previously saved contact QContactPhoneNumber phn; @@ -721,26 +889,25 @@ QCOMPARE(csr.contacts(), saveList); QVERIFY(!csr.cancel()); // not started QVERIFY(csr.start()); - QVERIFY(csr.isActive()); - QVERIFY(csr.status() == QContactAbstractRequest::Active); - QVERIFY(!csr.isFinished()); - QVERIFY(!csr.start()); // already started. + + QVERIFY((csr.isActive() && csr.state() == QContactAbstractRequest::ActiveState) || csr.isFinished()); + //QVERIFY(csr.isFinished() || !csr.start()); // already started. // thread scheduling means this is untestable QVERIFY(csr.waitForFinished()); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. + QVERIFY(csr.isFinished()); - QVERIFY(!csr.isActive()); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); expected.clear(); - expected << cm->contact(cm->contacts().last()); + expected << cm->contact(cm->contactIds().last()); result = csr.contacts(); QCOMPARE(expected, result); - //here we can't compare the whole contact details, testContact would be updated by async call because we just use QSignalSpy to receive signals. + //here we can't compare the whole contact details, testContact would be updated by async call because we just use QThreadSignalSpy to receive signals. //QVERIFY(containsIgnoringTimestamps(expected, testContact)); QVERIFY(expected.at(0).detail().number() == phn.number()); - QCOMPARE(cm->contacts().size(), originalCount + 1); + QCOMPARE(cm->contactIds().size(), originalCount + 1); // cancelling QContact temp = testContact; @@ -750,67 +917,96 @@ saveList.clear(); saveList << temp; csr.setContacts(saveList); - QVERIFY(!csr.cancel()); // not started - QVERIFY(csr.start()); - QVERIFY(csr.isActive()); - QVERIFY(csr.status() == QContactAbstractRequest::Active); - QVERIFY(!csr.isFinished()); - QVERIFY(csr.cancel()); - QVERIFY(csr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(csr.isActive()); // still cancelling - QVERIFY(!csr.isFinished()); // not finished cancelling - QVERIFY(!csr.start()); // already started. - QVERIFY(csr.waitForFinished()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(csr.isFinished()); - QVERIFY(!csr.isActive()); - QVERIFY(csr.status() == QContactAbstractRequest::Cancelled); - // verify that the changes were not saved - expected.clear(); - QList allContacts = cm->contacts(); - for (int i = 0; i < allContacts.size(); i++) { - expected.append(cm->contact(allContacts.at(i))); + int bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; // attempt to cancel 40 times. If it doesn't work due to threading, bail out. + while (true) { + QVERIFY(!csr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(csr.start()); + if (!csr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + csr.waitForFinished(); + saveList = csr.contacts(); + if (cm->contactIds().size() > (originalCount + 1) && !cm->removeContact(saveList.at(0).localId())) { + QSKIP("Unable to remove saved contact to test cancellation of contact save request", SkipSingle); + } + saveList.clear(); + saveList << temp; + csr.setContacts(saveList); + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + spy.clear(); + continue; + } + + // if we get here, then we are cancelling the request. + QVERIFY(csr.waitForFinished()); + QVERIFY(csr.isCanceled()); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); + + // verify that the changes were not saved + expected.clear(); + QList allContacts = cm->contactIds(); + for (int i = 0; i < allContacts.size(); i++) { + expected.append(cm->contact(allContacts.at(i))); + } + QVERIFY(!expected.contains(temp)); + QCOMPARE(cm->contactIds().size(), originalCount + 1); + break; } - QVERIFY(!expected.contains(temp)); - QCOMPARE(cm->contacts().size(), originalCount + 1); - // restart, and wait for progress after cancel. - QVERIFY(!csr.cancel()); // not started - QVERIFY(csr.start()); - QVERIFY(csr.isActive()); - QVERIFY(csr.status() == QContactAbstractRequest::Active); - QVERIFY(!csr.isFinished()); - QVERIFY(csr.cancel()); - QVERIFY(csr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(csr.isActive()); // still cancelling - QVERIFY(!csr.isFinished()); // not finished cancelling - QVERIFY(!csr.start()); // already started. - QVERIFY(csr.waitForProgress()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(csr.isFinished()); - QVERIFY(!csr.isActive()); - QVERIFY(csr.status() == QContactAbstractRequest::Cancelled); - // verify that the changes were not saved - expected.clear(); - allContacts = cm->contacts(); - for (int i = 0; i < allContacts.size(); i++) { - expected.append(cm->contact(allContacts.at(i))); + while (true) { + QVERIFY(!csr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(csr.start()); + if (!csr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + csr.waitForFinished(); + saveList = csr.contacts(); + if (cm->contactIds().size() > (originalCount + 1) && !cm->removeContact(saveList.at(0).localId())) { + QSKIP("Unable to remove saved contact to test cancellation of contact save request", SkipSingle); + } + saveList.clear(); + saveList << temp; + csr.setContacts(saveList); + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + spy.clear(); + continue; + } + csr.waitForFinished(); // now wait until finished (if it hasn't already). + QVERIFY(csr.isCanceled()); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); + + // verify that the changes were not saved + expected.clear(); + QList allContacts = cm->contactIds(); + for (int i = 0; i < allContacts.size(); i++) { + expected.append(cm->contact(allContacts.at(i))); + } + QVERIFY(!expected.contains(temp)); + QCOMPARE(cm->contactIds().size(), originalCount + 1); + break; } - QVERIFY(!expected.contains(temp)); - QCOMPARE(cm->contacts().size(), originalCount + 1); - - delete cm; } void tst_QContactAsync::definitionFetch() { QFETCH(QString, uri); - QContactManager* cm(0); - QVERIFY(prepareModel(uri, cm)); + QScopedPointer cm(prepareModel(uri)); QContactDetailDefinitionFetchRequest dfr; QVERIFY(dfr.type() == QContactAbstractRequest::DetailDefinitionFetchRequest); dfr.setContactType(QContactType::TypeContact); @@ -822,30 +1018,26 @@ QVERIFY(!dfr.start()); QVERIFY(!dfr.cancel()); QVERIFY(!dfr.waitForFinished()); - QVERIFY(!dfr.waitForProgress()); // "all definitions" retrieval - dfr.setManager(cm); - QCOMPARE(dfr.manager(), cm); + dfr.setManager(cm.data()); + QCOMPARE(dfr.manager(), cm.data()); QVERIFY(!dfr.isActive()); QVERIFY(!dfr.isFinished()); QVERIFY(!dfr.cancel()); QVERIFY(!dfr.waitForFinished()); - QVERIFY(!dfr.waitForProgress()); qRegisterMetaType("QContactDetailDefinitionFetchRequest*"); - QSignalSpy spy(&dfr, SIGNAL(progress(QContactDetailDefinitionFetchRequest*, bool))); - dfr.setNames(QStringList()); + QThreadSignalSpy spy(&dfr, SIGNAL(stateChanged(QContactAbstractRequest::State))); + dfr.setDefinitionNames(QStringList()); QVERIFY(!dfr.cancel()); // not started QVERIFY(dfr.start()); - QVERIFY(dfr.isActive()); - QVERIFY(dfr.status() == QContactAbstractRequest::Active); - QVERIFY(!dfr.isFinished()); - QVERIFY(!dfr.start()); // already started. + + QVERIFY((dfr.isActive() && dfr.state() == QContactAbstractRequest::ActiveState) || dfr.isFinished()); + //QVERIFY(dfr.isFinished() || !dfr.start()); // already started. // thread scheduling means this is untestable QVERIFY(dfr.waitForFinished()); - int expectedCount = 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(dfr.isFinished()); - QVERIFY(!dfr.isActive()); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); QMap defs = cm->detailDefinitions(); QMap result = dfr.definitions(); @@ -854,18 +1046,16 @@ // specific definition retrieval QStringList specific; specific << QContactUrl::DefinitionName; - dfr.setNames(specific); + dfr.setDefinitionNames(specific); QVERIFY(!dfr.cancel()); // not started QVERIFY(dfr.start()); - QVERIFY(dfr.isActive()); - QVERIFY(dfr.status() == QContactAbstractRequest::Active); - QVERIFY(!dfr.isFinished()); - QVERIFY(!dfr.start()); // already started. + + QVERIFY((dfr.isActive() && dfr.state() == QContactAbstractRequest::ActiveState) || dfr.isFinished()); + //QVERIFY(dfr.isFinished() || !dfr.start()); // already started. // thread scheduling means this is untestable QVERIFY(dfr.waitForFinished()); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(dfr.isFinished()); - QVERIFY(!dfr.isActive()); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); defs.clear(); defs.insert(QContactUrl::DefinitionName, cm->detailDefinition(QContactUrl::DefinitionName)); @@ -873,56 +1063,76 @@ QCOMPARE(defs, result); // cancelling - dfr.setNames(QStringList()); - QVERIFY(!dfr.cancel()); // not started - QVERIFY(dfr.start()); - QVERIFY(dfr.isActive()); - QVERIFY(dfr.status() == QContactAbstractRequest::Active); - QVERIFY(!dfr.isFinished()); - QVERIFY(dfr.cancel()); - QVERIFY(dfr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(dfr.isActive()); // still cancelling - QVERIFY(!dfr.isFinished()); // not finished cancelling - QVERIFY(!dfr.start()); // already started. - QVERIFY(dfr.waitForFinished()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(dfr.isFinished()); - QVERIFY(!dfr.isActive()); - QVERIFY(dfr.status() == QContactAbstractRequest::Cancelled); + dfr.setDefinitionNames(QStringList()); + + int bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; // attempt to cancel 40 times. If it doesn't work due to threading, bail out. + while (true) { + QVERIFY(!dfr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(dfr.start()); + if (!dfr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + dfr.waitForFinished(); + dfr.setDefinitionNames(QStringList()); + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + spy.clear(); + continue; + } + + // if we get here, then we are cancelling the request. + QVERIFY(dfr.waitForFinished()); + QVERIFY(dfr.isCanceled()); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); + break; + } // restart, and wait for progress after cancel. - QVERIFY(!dfr.cancel()); // not started - QVERIFY(dfr.start()); - QVERIFY(dfr.isActive()); - QVERIFY(dfr.status() == QContactAbstractRequest::Active); - QVERIFY(!dfr.isFinished()); - QVERIFY(dfr.cancel()); - QVERIFY(dfr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(dfr.isActive()); // still cancelling - QVERIFY(!dfr.isFinished()); // not finished cancelling - QVERIFY(!dfr.start()); // already started. - QVERIFY(dfr.waitForProgress()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(dfr.isFinished()); - QVERIFY(!dfr.isActive()); - QVERIFY(dfr.status() == QContactAbstractRequest::Cancelled); + while (true) { + QVERIFY(!dfr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(dfr.start()); + if (!dfr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + dfr.waitForFinished(); + dfr.setDefinitionNames(QStringList()); + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + spy.clear(); + continue; + } + dfr.waitForFinished(); + QVERIFY(dfr.isCanceled()); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); - delete cm; + break; + } + } void tst_QContactAsync::definitionRemove() { QFETCH(QString, uri); - QContactManager* cm(0); - QVERIFY(prepareModel(uri, cm)); - if (!cm->hasFeature(QContactManager::MutableDefinitions, QContactType::TypeContact)) { + + QScopedPointer cm(prepareModel(uri)); + if (!cm->hasFeature(QContactManager::MutableDefinitions)) { QSKIP("This contact manager doest not support mutable definitions, can't remove a definition!", SkipSingle); } QContactDetailDefinitionRemoveRequest drr; QVERIFY(drr.type() == QContactAbstractRequest::DetailDefinitionRemoveRequest); - drr.setContactType(QContactType::TypeContact); + drr.setDefinitionNames(QContactType::TypeContact, QStringList()); QVERIFY(drr.contactType() == QString(QLatin1String(QContactType::TypeContact))); // initial state - not started, no manager. @@ -931,89 +1141,81 @@ QVERIFY(!drr.start()); QVERIFY(!drr.cancel()); QVERIFY(!drr.waitForFinished()); - QVERIFY(!drr.waitForProgress()); // specific group removal int originalCount = cm->detailDefinitions().keys().size(); QStringList removeIds; removeIds << cm->detailDefinitions().keys().first(); - drr.setNames(removeIds); - drr.setManager(cm); - QCOMPARE(drr.manager(), cm); + drr.setDefinitionNames(QContactType::TypeContact, removeIds); + drr.setManager(cm.data()); + QCOMPARE(drr.manager(), cm.data()); QVERIFY(!drr.isActive()); QVERIFY(!drr.isFinished()); QVERIFY(!drr.cancel()); QVERIFY(!drr.waitForFinished()); - QVERIFY(!drr.waitForProgress()); qRegisterMetaType("QContactDetailDefinitionRemoveRequest*"); - QSignalSpy spy(&drr, SIGNAL(progress(QContactDetailDefinitionRemoveRequest*))); - QVERIFY(drr.names() == removeIds); + QThreadSignalSpy spy(&drr, SIGNAL(stateChanged(QContactAbstractRequest::State))); + QVERIFY(drr.definitionNames() == removeIds); QVERIFY(!drr.cancel()); // not started QVERIFY(drr.start()); - QVERIFY(drr.isActive()); - QVERIFY(drr.status() == QContactAbstractRequest::Active); - QVERIFY(!drr.isFinished()); - QVERIFY(!drr.start()); // already started. + + QVERIFY((drr.isActive() && drr.state() == QContactAbstractRequest::ActiveState) || drr.isFinished()); + //QVERIFY(drr.isFinished() || !drr.start()); // already started. // thread scheduling means this is untestable QVERIFY(drr.waitForFinished()); - int expectedCount = 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(drr.isFinished()); - QVERIFY(!drr.isActive()); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); QCOMPARE(cm->detailDefinitions().keys().size(), originalCount - 1); cm->detailDefinition(removeIds.first()); // check that it has already been removed. QCOMPARE(cm->error(), QContactManager::DoesNotExistError); // remove (asynchronously) a nonexistent group - should fail. - drr.setNames(removeIds); + drr.setDefinitionNames(QContactType::TypeContact, removeIds); QVERIFY(!drr.cancel()); // not started QVERIFY(drr.start()); - QVERIFY(drr.isActive()); - QVERIFY(drr.status() == QContactAbstractRequest::Active); - QVERIFY(!drr.isFinished()); - QVERIFY(!drr.start()); // already started. + + QVERIFY((drr.isActive() && drr.state() == QContactAbstractRequest::ActiveState) || drr.isFinished()); + //QVERIFY(drr.isFinished() || !drr.start()); // already started. // thread scheduling means this is untestable QVERIFY(drr.waitForFinished()); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(drr.isFinished()); - QVERIFY(!drr.isActive()); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); QCOMPARE(cm->detailDefinitions().keys().size(), originalCount - 1); // hasn't changed QCOMPARE(drr.error(), QContactManager::DoesNotExistError); // remove with list containing one valid and one invalid id. removeIds << cm->detailDefinitions().keys().first(); - drr.setNames(removeIds); + drr.setDefinitionNames(QContactType::TypeContact, removeIds); QVERIFY(!drr.cancel()); // not started QVERIFY(drr.start()); - QVERIFY(drr.isActive()); - QVERIFY(drr.status() == QContactAbstractRequest::Active); - QVERIFY(!drr.isFinished()); - QVERIFY(!drr.start()); // already started. + + QVERIFY((drr.isActive() && drr.state() == QContactAbstractRequest::ActiveState) || drr.isFinished()); + //QVERIFY(drr.isFinished() || !drr.start()); // already started. // thread scheduling means this is untestable QVERIFY(drr.waitForFinished()); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(drr.isFinished()); - QVERIFY(!drr.isActive()); + QVERIFY(spy.count() >= 1); // active + finished signals + spy.clear(); QCOMPARE(cm->detailDefinitions().keys().size(), originalCount - 2); // only one more has been removed - QCOMPARE(drr.errors().first(), QContactManager::DoesNotExistError); - QCOMPARE(drr.errors().at(1), QContactManager::NoError); + QVERIFY(drr.errorMap().count() == 1); + QVERIFY(drr.errorMap().keys().contains(0)); + QCOMPARE(drr.errorMap().value(0), QContactManager::DoesNotExistError); // remove with empty list - nothing should happen. removeIds.clear(); - drr.setNames(removeIds); + drr.setDefinitionNames(QContactType::TypeContact, removeIds); QVERIFY(!drr.cancel()); // not started QVERIFY(drr.start()); - QVERIFY(drr.isActive()); - QVERIFY(drr.status() == QContactAbstractRequest::Active); - QVERIFY(!drr.isFinished()); - QVERIFY(!drr.start()); // already started. + + QVERIFY(drr.isActive() || drr.isFinished()); + //QVERIFY(drr.isFinished() || !drr.start()); // already started. // thread scheduling means this is untestable QVERIFY(drr.waitForFinished()); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. + QVERIFY(drr.isFinished()); - QVERIFY(!drr.isActive()); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); QCOMPARE(cm->detailDefinitions().keys().size(), originalCount - 2); // hasn't changed QCOMPARE(drr.error(), QContactManager::NoError); // no error but no effect. @@ -1021,56 +1223,78 @@ // cancelling removeIds.clear(); removeIds << cm->detailDefinitions().keys().first(); - drr.setNames(removeIds); - QVERIFY(!drr.cancel()); // not started - QVERIFY(drr.start()); - QVERIFY(drr.isActive()); - QVERIFY(drr.status() == QContactAbstractRequest::Active); - QVERIFY(!drr.isFinished()); - QVERIFY(drr.cancel()); - QVERIFY(drr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(drr.isActive()); // still cancelling - QVERIFY(!drr.isFinished()); // not finished cancelling - QVERIFY(!drr.start()); // already started. - QVERIFY(drr.waitForFinished()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(drr.isFinished()); - QVERIFY(!drr.isActive()); - QVERIFY(drr.status() == QContactAbstractRequest::Cancelled); + drr.setDefinitionNames(QContactType::TypeContact, removeIds); + + int bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; // attempt to cancel 40 times. If it doesn't work due to threading, bail out. + while (true) { + QVERIFY(!drr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(drr.start()); + if (!drr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + drr.waitForFinished(); + drr.setDefinitionNames(QContactType::TypeContact, removeIds); - QCOMPARE(cm->detailDefinitions().keys().size(), originalCount - 2); // hasn't changed + QCOMPARE(cm->detailDefinitions().keys().size(), originalCount - 2); // hasn't changed + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + spy.clear(); + continue; + } + + // if we get here, then we are cancelling the request. + QVERIFY(drr.waitForFinished()); + QVERIFY(drr.isCanceled()); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); + + QCOMPARE(cm->detailDefinitions().keys().size(), originalCount - 2); // hasn't changed + break; + } // restart, and wait for progress after cancel. - QVERIFY(!drr.cancel()); // not started - QVERIFY(drr.start()); - QVERIFY(drr.isActive()); - QVERIFY(drr.status() == QContactAbstractRequest::Active); - QVERIFY(!drr.isFinished()); - QVERIFY(drr.cancel()); - QVERIFY(drr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(drr.isActive()); // still cancelling - QVERIFY(!drr.isFinished()); // not finished cancelling - QVERIFY(!drr.start()); // already started. - QVERIFY(drr.waitForProgress()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(drr.isFinished()); - QVERIFY(!drr.isActive()); - QVERIFY(drr.status() == QContactAbstractRequest::Cancelled); + while (true) { + QVERIFY(!drr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(drr.start()); + if (!drr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + drr.waitForFinished(); + drr.setDefinitionNames(QContactType::TypeContact, removeIds); + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + spy.clear(); + continue; + } + drr.waitForFinished(); + QVERIFY(drr.isCanceled()); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); - QCOMPARE(cm->detailDefinitions().keys().size(), originalCount - 2); // hasn't changed + QCOMPARE(cm->detailDefinitions().keys().size(), originalCount - 2); // hasn't changed + break; + } - delete cm; } void tst_QContactAsync::definitionSave() { QFETCH(QString, uri); - QContactManager* cm(0); - QVERIFY(prepareModel(uri, cm)); - - if (!cm->hasFeature(QContactManager::MutableDefinitions, QContactType::TypeContact)) { + + QScopedPointer cm(prepareModel(uri)); + + if (!cm->hasFeature(QContactManager::MutableDefinitions)) { + QSKIP("This contact manager doest not support mutable definitions, can't save a definition!", SkipSingle); } @@ -1085,7 +1309,6 @@ QVERIFY(!dsr.start()); QVERIFY(!dsr.cancel()); QVERIFY(!dsr.waitForFinished()); - QVERIFY(!dsr.waitForProgress()); // save a new detail definition int originalCount = cm->detailDefinitions().keys().size(); @@ -1098,28 +1321,25 @@ testDef.setFields(fields); QList saveList; saveList << testDef; - dsr.setManager(cm); - QCOMPARE(dsr.manager(), cm); + dsr.setManager(cm.data()); + QCOMPARE(dsr.manager(), cm.data()); QVERIFY(!dsr.isActive()); QVERIFY(!dsr.isFinished()); QVERIFY(!dsr.cancel()); QVERIFY(!dsr.waitForFinished()); - QVERIFY(!dsr.waitForProgress()); qRegisterMetaType("QContactDetailDefinitionSaveRequest*"); - QSignalSpy spy(&dsr, SIGNAL(progress(QContactDetailDefinitionSaveRequest*))); + QThreadSignalSpy spy(&dsr, SIGNAL(stateChanged(QContactAbstractRequest::State))); dsr.setDefinitions(saveList); QCOMPARE(dsr.definitions(), saveList); QVERIFY(!dsr.cancel()); // not started QVERIFY(dsr.start()); - QVERIFY(dsr.isActive()); - QVERIFY(dsr.status() == QContactAbstractRequest::Active); - QVERIFY(!dsr.isFinished()); - QVERIFY(!dsr.start()); // already started. + + QVERIFY((dsr.isActive() && dsr.state() == QContactAbstractRequest::ActiveState) || dsr.isFinished()); + //QVERIFY(dsr.isFinished() || !dsr.start()); // already started. // thread scheduling means this is untestable QVERIFY(dsr.waitForFinished()); - int expectedCount = 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(dsr.isFinished()); - QVERIFY(!dsr.isActive()); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); QList expected; expected << cm->detailDefinition("TestDefinitionId"); @@ -1137,15 +1357,13 @@ QCOMPARE(dsr.definitions(), saveList); QVERIFY(!dsr.cancel()); // not started QVERIFY(dsr.start()); - QVERIFY(dsr.isActive()); - QVERIFY(dsr.status() == QContactAbstractRequest::Active); - QVERIFY(!dsr.isFinished()); - QVERIFY(!dsr.start()); // already started. + + QVERIFY((dsr.isActive() && dsr.state() == QContactAbstractRequest::ActiveState) || dsr.isFinished()); + //QVERIFY(dsr.isFinished() || !dsr.start()); // already started. // thread scheduling means this is untestable QVERIFY(dsr.waitForFinished()); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(dsr.isFinished()); - QVERIFY(!dsr.isActive()); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); expected.clear(); expected << cm->detailDefinition("TestDefinitionId"); @@ -1160,561 +1378,433 @@ saveList.clear(); saveList << testDef; dsr.setDefinitions(saveList); - QCOMPARE(dsr.definitions(), saveList); - QVERIFY(!dsr.cancel()); // not started - QVERIFY(dsr.start()); - QVERIFY(dsr.isActive()); - QVERIFY(dsr.status() == QContactAbstractRequest::Active); - QVERIFY(!dsr.isFinished()); - QVERIFY(dsr.cancel()); - QVERIFY(dsr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(dsr.isActive()); // still cancelling - QVERIFY(!dsr.isFinished()); // not finished cancelling - QVERIFY(!dsr.start()); // already started. - QVERIFY(dsr.waitForFinished()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(dsr.isFinished()); - QVERIFY(!dsr.isActive()); - QVERIFY(dsr.status() == QContactAbstractRequest::Cancelled); - // verify that the changes were not saved - QList allDefs = cm->detailDefinitions().values(); - QVERIFY(!allDefs.contains(testDef)); - QCOMPARE(cm->detailDefinitions().values().size(), originalCount + 1); + int bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; // attempt to cancel 40 times. If it doesn't work due to threading, bail out. + while (true) { + QVERIFY(!dsr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(dsr.start()); + if (!dsr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + dsr.waitForFinished(); + saveList.clear(); + saveList << testDef; + dsr.setDefinitions(saveList); + cm->removeDetailDefinition(testDef.name()); + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + spy.clear(); + continue; + } + + // if we get here, then we are cancelling the request. + QVERIFY(dsr.waitForFinished()); + QVERIFY(dsr.isCanceled()); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); + + // verify that the changes were not saved + QList allDefs = cm->detailDefinitions().values(); + QVERIFY(!allDefs.contains(testDef)); + QCOMPARE(cm->detailDefinitions().values().size(), originalCount + 1); + + break; + } // restart, and wait for progress after cancel. - QVERIFY(!dsr.cancel()); // not started - QVERIFY(dsr.start()); - QVERIFY(dsr.isActive()); - QVERIFY(dsr.status() == QContactAbstractRequest::Active); - QVERIFY(!dsr.isFinished()); - QVERIFY(dsr.cancel()); - QVERIFY(dsr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(dsr.isActive()); // still cancelling - QVERIFY(!dsr.isFinished()); // not finished cancelling - QVERIFY(!dsr.start()); // already started. - QVERIFY(dsr.waitForProgress()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(dsr.isFinished()); - QVERIFY(!dsr.isActive()); - QVERIFY(dsr.status() == QContactAbstractRequest::Cancelled); + while (true) { + QVERIFY(!dsr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(dsr.start()); + if (!dsr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + dsr.waitForFinished(); + saveList.clear(); + saveList << testDef; + dsr.setDefinitions(saveList); + cm->removeDetailDefinition(testDef.name()); + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + spy.clear(); + continue; + } + dsr.waitForFinished(); + QVERIFY(dsr.isCanceled()); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); - // verify that the changes were not saved - allDefs = cm->detailDefinitions().values(); - QVERIFY(!allDefs.contains(testDef)); - QCOMPARE(cm->detailDefinitions().values().size(), originalCount + 1); + // verify that the changes were not saved + QList allDefs = cm->detailDefinitions().values(); + QVERIFY(!allDefs.contains(testDef)); + QCOMPARE(cm->detailDefinitions().values().size(), originalCount + 1); - delete cm; + break; + } + } void tst_QContactAsync::relationshipFetch() { QFETCH(QString, uri); - QContactManager* cm(0); - QList contacts; - QList relationships; - QVERIFY(prepareModel(uri, cm, contacts, relationships)); + QScopedPointer cm(prepareModel(uri)); QContactRelationshipFetchRequest rfr; QVERIFY(rfr.type() == QContactAbstractRequest::RelationshipFetchRequest); - + // initial state - not started, no manager. QVERIFY(!rfr.isActive()); QVERIFY(!rfr.isFinished()); QVERIFY(!rfr.start()); QVERIFY(!rfr.cancel()); QVERIFY(!rfr.waitForFinished()); - QVERIFY(!rfr.waitForProgress()); - - if (!cm->hasFeature(QContactManager::Relationships)) - { - // ensure manager returs errors - rfr.setManager(cm); - QCOMPARE(rfr.manager(), cm); - QVERIFY(!rfr.isActive()); - QVERIFY(!rfr.isFinished()); - QVERIFY(!rfr.cancel()); - QVERIFY(!rfr.waitForFinished()); - QVERIFY(!rfr.waitForProgress()); - QVERIFY(!rfr.cancel()); // not started - QVERIFY(rfr.start()); - QVERIFY(rfr.isActive()); - QVERIFY(rfr.status() == QContactAbstractRequest::Active); - QVERIFY(!rfr.isFinished()); - QVERIFY(!rfr.start()); // already started. - QVERIFY(rfr.waitForFinished()); - QVERIFY(rfr.error() == QContactManager::NotSupportedError); - QVERIFY(rfr.isFinished()); - QVERIFY(!rfr.isActive()); - return; - } - - // use variables to make code more readable - QContactId aId = contacts.at(0).id(); - QContactId bId = contacts.at(1).id(); - QContactId cId = contacts.at(2).id(); - QContactId dId = contacts.at(3).id(); - QContactId eId = contacts.at(4).id(); - QContactId fId = contacts.at(5).id(); - QContactRelationship adRel = relationships.at(0); - QContactRelationship aeRel = relationships.at(1); - QContactRelationship beRel = relationships.at(2); - QContactRelationship ceRel = relationships.at(3); - QContactRelationship cfRel = relationships.at(4); - QString relType = adRel.relationshipType(); // "all relationships" retrieval - rfr.setManager(cm); - QCOMPARE(rfr.manager(), cm); + rfr.setManager(cm.data()); + QCOMPARE(rfr.manager(), cm.data()); QVERIFY(!rfr.isActive()); QVERIFY(!rfr.isFinished()); QVERIFY(!rfr.cancel()); QVERIFY(!rfr.waitForFinished()); - QVERIFY(!rfr.waitForProgress()); qRegisterMetaType("QContactRelationshipFetchRequest*"); - QSignalSpy spy(&rfr, SIGNAL(progress(QContactRelationshipFetchRequest*, bool))); + QThreadSignalSpy spy(&rfr, SIGNAL(stateChanged(QContactAbstractRequest::State))); QVERIFY(!rfr.cancel()); // not started QVERIFY(rfr.start()); - QVERIFY(rfr.isActive()); - QVERIFY(rfr.status() == QContactAbstractRequest::Active); - QVERIFY(!rfr.isFinished()); - QVERIFY(!rfr.start()); // already started. + + QVERIFY((rfr.isActive() && rfr.state() == QContactAbstractRequest::ActiveState) || rfr.isFinished()); + //QVERIFY(rfr.isFinished() || !rfr.start()); // already started. // thread scheduling means this is untestable QVERIFY(rfr.waitForFinished()); - QVERIFY(rfr.error() == QContactManager::NoError); - int expectedCount = 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. + QVERIFY(rfr.isFinished()); - QVERIFY(!rfr.isActive()); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); + QList rels = cm->relationships(); QList result = rfr.relationships(); QCOMPARE(rels, result); - + // specific relationship type retrieval - rfr.setRelationshipType(relType); + rfr.setRelationshipType(QContactRelationship::HasManager); QVERIFY(!rfr.cancel()); // not started QVERIFY(rfr.start()); - QVERIFY(rfr.isActive()); - QVERIFY(rfr.status() == QContactAbstractRequest::Active); - QVERIFY(!rfr.isFinished()); - QVERIFY(!rfr.start()); // already started. + + QVERIFY((rfr.isActive() && rfr.state() == QContactAbstractRequest::ActiveState) || rfr.isFinished()); + //QVERIFY(rfr.isFinished() || !rfr.start()); // already started. // thread scheduling means this is untestable QVERIFY(rfr.waitForFinished()); - QVERIFY(rfr.error() == QContactManager::NoError); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(rfr.isFinished()); - QVERIFY(!rfr.isActive()); - rels = cm->relationships(relType); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); + + rels = cm->relationships(QContactRelationship::HasManager); result = rfr.relationships(); QCOMPARE(rels, result); // specific source contact retrieval + rfr.setRelationshipType(QString()); + QList contacts = cm->contactIds(); + QContactId aId; + foreach (const QContactLocalId& currId, contacts) { + QContact curr = cm->contact(currId); + if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Aaron")) { + aId = curr.id(); + break; + } + } rfr.setFirst(aId); - rfr.setRelationshipType(QString()); QVERIFY(!rfr.cancel()); // not started QVERIFY(rfr.start()); - QVERIFY(rfr.isActive()); - QVERIFY(rfr.status() == QContactAbstractRequest::Active); - QVERIFY(!rfr.isFinished()); - QVERIFY(!rfr.start()); // already started. + + QVERIFY((rfr.isActive() && rfr.state() == QContactAbstractRequest::ActiveState) || rfr.isFinished()); + //QVERIFY(rfr.isFinished() || !rfr.start()); // already started. // thread scheduling means this is untestable QVERIFY(rfr.waitForFinished()); - QVERIFY(rfr.error() == QContactManager::NoError); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(rfr.isFinished()); - QVERIFY(!rfr.isActive()); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); + rels = cm->relationships(aId, QContactRelationshipFilter::First); result = rfr.relationships(); QCOMPARE(rels, result); // specific participant retrieval #1 - destination participant rfr.setFirst(QContactId()); - rfr.setParticipant(eId, QContactRelationshipFilter::Second); - QVERIFY(rfr.participantRole() == QContactRelationshipFilter::Second); + contacts = cm->contactIds(); + QContactId bId; + foreach (const QContactLocalId& currId, contacts) { + QContact curr = cm->contact(currId); + if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Bob")) { + bId = curr.id(); + break; + } + } + rfr.setSecond(bId); + QVERIFY(!rfr.cancel()); // not started QVERIFY(rfr.start()); - QVERIFY(rfr.isActive()); - QVERIFY(rfr.status() == QContactAbstractRequest::Active); - QVERIFY(!rfr.isFinished()); - QVERIFY(!rfr.start()); // already started. + + QVERIFY((rfr.isActive() && rfr.state() == QContactAbstractRequest::ActiveState) || rfr.isFinished()); + //QVERIFY(rfr.isFinished() || !rfr.start()); // already started. // thread scheduling means this is untestable QVERIFY(rfr.waitForFinished()); - QVERIFY(rfr.error() == QContactManager::NoError); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(rfr.isFinished()); - QVERIFY(!rfr.isActive()); - rels = cm->relationships(eId, QContactRelationshipFilter::Second); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); + + // retrieve rels where second = id of B, and ensure that we get the same results + rels = cm->relationships(bId, QContactRelationshipFilter::Second); result = rfr.relationships(); QCOMPARE(rels, result); // specific participant retrieval #2 - source participant rfr.setFirst(QContactId()); - rfr.setParticipant(cId, QContactRelationshipFilter::First); - QVERIFY(rfr.participantRole() == QContactRelationshipFilter::First); + contacts = cm->contactIds(); + QContactId cId; + foreach (const QContactLocalId& currId, contacts) { + QContact curr = cm->contact(currId); + if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Borris")) { + cId = curr.id(); + break; + } + } + rfr.setSecond(cId); + QVERIFY(!rfr.cancel()); // not started QVERIFY(rfr.start()); - QVERIFY(rfr.isActive()); - QVERIFY(rfr.status() == QContactAbstractRequest::Active); - QVERIFY(!rfr.isFinished()); - QVERIFY(!rfr.start()); // already started. + + QVERIFY((rfr.isActive() && rfr.state() == QContactAbstractRequest::ActiveState) || rfr.isFinished()); + //QVERIFY(rfr.isFinished() || !rfr.start()); // already started. // thread scheduling means this is untestable QVERIFY(rfr.waitForFinished()); - QVERIFY(rfr.error() == QContactManager::NoError); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(rfr.isFinished()); - QVERIFY(!rfr.isActive()); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); + + // retrieve rels where first = id of C and compare the results + rfr.setFirst(cId); + rfr.setSecond(QContactId()); + QVERIFY(rfr.start()); + QVERIFY(rfr.waitForFinished()); + result = rfr.relationships(); rels = cm->relationships(cId, QContactRelationshipFilter::First); - result = rfr.relationships(); QCOMPARE(rels, result); - - if (relationships.count() > 4) - { - // specific participant retrieval #3 - either participant - rfr.setFirst(QContactId()); - rfr.setParticipant(aId, QContactRelationshipFilter::Either); - QVERIFY(rfr.participantRole() == QContactRelationshipFilter::Either); - QVERIFY(!rfr.cancel()); // not started - QVERIFY(rfr.start()); - QVERIFY(rfr.isActive()); - QVERIFY(rfr.status() == QContactAbstractRequest::Active); - QVERIFY(!rfr.isFinished()); - QVERIFY(!rfr.start()); // already started. - QVERIFY(rfr.waitForFinished()); - QVERIFY(rfr.error() == QContactManager::NoError); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. - QVERIFY(rfr.isFinished()); - QVERIFY(!rfr.isActive()); - rels = cm->relationships(aId); // either role. - result = rfr.relationships(); - QCOMPARE(rels, result); - } // cancelling rfr.setRelationshipType(QString()); - QVERIFY(!rfr.cancel()); // not started - QVERIFY(rfr.start()); - QVERIFY(rfr.isActive()); - QVERIFY(rfr.status() == QContactAbstractRequest::Active); - QVERIFY(!rfr.isFinished()); - QVERIFY(rfr.cancel()); - QVERIFY(rfr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(rfr.isActive()); // still cancelling - QVERIFY(!rfr.isFinished()); // not finished cancelling - QVERIFY(!rfr.start()); // already started. - QVERIFY(rfr.waitForFinished()); - QVERIFY(rfr.error() == QContactManager::NoError); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(rfr.isFinished()); - QVERIFY(!rfr.isActive()); - QVERIFY(rfr.status() == QContactAbstractRequest::Cancelled); + + int bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; // attempt to cancel 40 times. If it doesn't work due to threading, bail out. + while (true) { + QVERIFY(!rfr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(rfr.start()); + if (!rfr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + rfr.waitForFinished(); + rfr.setRelationshipType(QString()); + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + spy.clear(); + continue; + } + + // if we get here, then we are cancelling the request. + QVERIFY(rfr.waitForFinished()); + QVERIFY(rfr.isCanceled()); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); + break; + } // restart, and wait for progress after cancel. - QVERIFY(!rfr.cancel()); // not started - QVERIFY(rfr.start()); - QVERIFY(rfr.isActive()); - QVERIFY(rfr.status() == QContactAbstractRequest::Active); - QVERIFY(!rfr.isFinished()); - QVERIFY(rfr.cancel()); - QVERIFY(rfr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(rfr.isActive()); // still cancelling - QVERIFY(!rfr.isFinished()); // not finished cancelling - QVERIFY(!rfr.start()); // already started. - QVERIFY(rfr.waitForProgress()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(rfr.isFinished()); - QVERIFY(!rfr.isActive()); - QVERIFY(rfr.status() == QContactAbstractRequest::Cancelled); - - delete cm; + while (true) { + QVERIFY(!rfr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(rfr.start()); + if (!rfr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + rfr.waitForFinished(); + rfr.setRelationshipType(QString()); + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + spy.clear(); + continue; + } + rfr.waitForFinished(); + QVERIFY(rfr.isCanceled()); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); + break; + } } void tst_QContactAsync::relationshipRemove() { QFETCH(QString, uri); - QContactManager* cm(0); - QList contacts; - QList relationships; - QVERIFY(prepareModel(uri, cm, contacts, relationships)); + QScopedPointer cm(prepareModel(uri)); QContactRelationshipRemoveRequest rrr; QVERIFY(rrr.type() == QContactAbstractRequest::RelationshipRemoveRequest); - - if (!cm->hasFeature(QContactManager::Relationships)) - { - // ensure manager returns error - rrr.setFirst(contacts.at(0).id()); - rrr.setManager(cm); - QCOMPARE(rrr.manager(), cm); - QVERIFY(!rrr.isActive()); - QVERIFY(!rrr.isFinished()); - QVERIFY(!rrr.cancel()); - QVERIFY(!rrr.waitForFinished()); - QVERIFY(!rrr.waitForProgress()); - QVERIFY(!rrr.cancel()); // not started - QVERIFY(rrr.start()); - QVERIFY(rrr.isActive()); - QVERIFY(rrr.status() == QContactAbstractRequest::Active); - QVERIFY(!rrr.isFinished()); - QVERIFY(!rrr.start()); // already started. - QVERIFY(rrr.waitForFinished()); - QVERIFY(rrr.error() == QContactManager::NotSupportedError); - QVERIFY(rrr.isFinished()); - QVERIFY(!rrr.isActive()); - return; - } - // use variables to make code more readable - QContactId aId = contacts.at(0).id(); - QContactId bId = contacts.at(1).id(); - QContactId cId = contacts.at(2).id(); - QContactId dId = contacts.at(3).id(); - QContactId eId = contacts.at(4).id(); - QContactId fId = contacts.at(5).id(); - QContactRelationship adRel = relationships.at(0); - QContactRelationship aeRel = relationships.at(1); - QContactRelationship beRel = relationships.at(2); - QContactRelationship ceRel = relationships.at(3); - QContactRelationship cfRel = relationships.at(4); - QString relType = adRel.relationshipType(); - // initial state - not started, no manager. QVERIFY(!rrr.isActive()); QVERIFY(!rrr.isFinished()); QVERIFY(!rrr.start()); QVERIFY(!rrr.cancel()); QVERIFY(!rrr.waitForFinished()); - QVERIFY(!rrr.waitForProgress()); + + QList contacts = cm->contactIds(); + QContactId aId, bId, cId; + foreach (const QContactLocalId& currId, contacts) { + QContact curr = cm->contact(currId); + if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Aaron")) { + aId = curr.id(); + continue; + } + if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Bob")) { + bId = curr.id(); + continue; + } + if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Borris")) { + cId = curr.id(); + continue; + } + } // specific source, destination and type removal - int relationshipCount = cm->relationships().count(); - rrr.setFirst(adRel.first()); - rrr.setSecond(adRel.second()); - rrr.setRelationshipType(adRel.relationshipType()); - rrr.setManager(cm); + QList relationships; + QContactRelationship r; + r.setFirst(aId); + r.setSecond(cId); + r.setRelationshipType(QContactRelationship::HasAssistant); + relationships.push_back(r); + + rrr.setRelationships(relationships); + rrr.setManager(cm.data()); qRegisterMetaType("QContactRelationshipRemoveRequest*"); - QSignalSpy spy(&rrr, SIGNAL(progress(QContactRelationshipRemoveRequest*))); - QCOMPARE(rrr.manager(), cm); + QThreadSignalSpy spy(&rrr, SIGNAL(stateChanged(QContactAbstractRequest::State))); + QCOMPARE(rrr.manager(), cm.data()); QVERIFY(!rrr.isActive()); QVERIFY(!rrr.isFinished()); QVERIFY(!rrr.cancel()); QVERIFY(!rrr.waitForFinished()); - QVERIFY(!rrr.waitForProgress()); - QVERIFY(rrr.relationshipType() == adRel.relationshipType()); - QVERIFY(!rrr.cancel()); // not started - QVERIFY(rrr.start()); - QVERIFY(rrr.isActive()); - QVERIFY(rrr.status() == QContactAbstractRequest::Active); - QVERIFY(!rrr.isFinished()); - QVERIFY(!rrr.start()); // already started. - QVERIFY(rrr.waitForFinished()); - QVERIFY(rrr.error() == QContactManager::NoError); - int expectedCount = 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. - QVERIFY(rrr.isFinished()); - QVERIFY(!rrr.isActive()); - QCOMPARE(cm->relationships().count(), relationshipCount-1); - // remove (asynchronously) a nonexistent relationship - should fail. - relationshipCount = cm->relationships().count(); - rrr.setFirst(bId); - rrr.setSecond(aId); - rrr.setRelationshipType(relType); - rrr.setManager(cm); QVERIFY(!rrr.cancel()); // not started QVERIFY(rrr.start()); - QVERIFY(rrr.isActive()); - QVERIFY(rrr.status() == QContactAbstractRequest::Active); - QVERIFY(!rrr.isFinished()); - QVERIFY(!rrr.start()); // already started. + + QVERIFY((rrr.isActive() && rrr.state() == QContactAbstractRequest::ActiveState) || rrr.isFinished()); + //QVERIFY(rrr.isFinished() || !rrr.start()); // already started. // thread scheduling means this is untestable QVERIFY(rrr.waitForFinished()); - QCOMPARE(rrr.error(), QContactManager::DoesNotExistError); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(rrr.isFinished()); - QVERIFY(!rrr.isActive()); - QCOMPARE(cm->relationships().count(), relationshipCount); - - // specific relationship type plus source removal - rrr.setFirst(cId); - rrr.setSecond(QContactId()); - rrr.setRelationshipType(relType); - rrr.setManager(cm); - QCOMPARE(rrr.manager(), cm); - QVERIFY(!rrr.isActive()); - QVERIFY(!rrr.cancel()); - QVERIFY(!rrr.waitForFinished()); - QVERIFY(!rrr.waitForProgress()); - QVERIFY(rrr.relationshipType() == relType); - QVERIFY(!rrr.cancel()); // not started - QVERIFY(rrr.start()); - QVERIFY(rrr.isActive()); - QVERIFY(rrr.status() == QContactAbstractRequest::Active); - QVERIFY(!rrr.isFinished()); - QVERIFY(!rrr.start()); // already started. - QVERIFY(rrr.waitForFinished()); - QVERIFY(rrr.error() == QContactManager::NoError); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. - QVERIFY(rrr.isFinished()); - QVERIFY(!rrr.isActive()); - QCOMPARE(cm->relationships(relType, cId, QContactRelationshipFilter::First).size(), 0); - QCOMPARE(cm->error(), QContactManager::DoesNotExistError); - - // specific source removal - rrr.setFirst(aId); - rrr.setSecond(QContactId()); - rrr.setRelationshipType(QString()); - rrr.setManager(cm); - QCOMPARE(rrr.manager(), cm); - QVERIFY(!rrr.isActive()); - QVERIFY(!rrr.cancel()); - QVERIFY(!rrr.waitForFinished()); - QVERIFY(!rrr.waitForProgress()); - QVERIFY(rrr.relationshipType() == QString()); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); + QCOMPARE(cm->relationships(QContactRelationship::HasAssistant, cId, QContactRelationshipFilter::Second).size(), 1); + + // remove (asynchronously) a nonexistent relationship - should fail. + r.setFirst(cId); + r.setSecond(aId); + r.setRelationshipType(QContactRelationship::HasManager); + relationships.clear(); + relationships.push_back(r); + rrr.setRelationships(relationships); + rrr.setManager(cm.data()); QVERIFY(!rrr.cancel()); // not started QVERIFY(rrr.start()); - QVERIFY(rrr.isActive()); - QVERIFY(rrr.status() == QContactAbstractRequest::Active); - QVERIFY(!rrr.isFinished()); - QVERIFY(!rrr.start()); // already started. + + QVERIFY((rrr.isActive() && rrr.state() == QContactAbstractRequest::ActiveState) || rrr.isFinished()); + //QVERIFY(rrr.isFinished() || !rrr.start()); // already started. // thread scheduling means this is untestable QVERIFY(rrr.waitForFinished()); - QVERIFY(rrr.error() == QContactManager::NoError); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(rrr.isFinished()); - QVERIFY(!rrr.isActive()); - QCOMPARE(cm->relationships(aId, QContactRelationshipFilter::First).size(), 0); - QCOMPARE(cm->error(), QContactManager::DoesNotExistError); - + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); + + QCOMPARE(cm->relationships(QContactRelationship::HasManager, cId, QContactRelationshipFilter::First).size(), 0); +// QCOMPARE(rrr.error(), QContactManager::DoesNotExistError); + // cancelling - rrr.setFirst(bId); - rrr.setSecond(QContactId()); - rrr.setRelationshipType(QString()); - QVERIFY(!rrr.cancel()); // not started - QVERIFY(rrr.start()); - QVERIFY(rrr.isActive()); - QVERIFY(rrr.status() == QContactAbstractRequest::Active); - QVERIFY(!rrr.isFinished()); - QVERIFY(rrr.cancel()); - QVERIFY(rrr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(rrr.isActive()); // still cancelling - QVERIFY(!rrr.isFinished()); // not finished cancelling - QVERIFY(!rrr.start()); // already started. - QVERIFY(rrr.waitForFinished()); - QVERIFY(rrr.error() == QContactManager::NoError); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(rrr.isFinished()); - QVERIFY(!rrr.isActive()); - QVERIFY(rrr.status() == QContactAbstractRequest::Cancelled); - QVERIFY(cm->relationships(bId).size() != 0); // didn't remove them. + r.setFirst(cId); + r.setSecond(QContactId()); + relationships.clear(); + relationships.push_back(r); + + int bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; // attempt to cancel 40 times. If it doesn't work due to threading, bail out. + while (true) { + QVERIFY(!rrr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(rrr.start()); + if (!rrr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + rrr.waitForFinished(); + rrr.setRelationships(relationships); + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + spy.clear(); + continue; + } + + // if we get here, then we are cancelling the request. + QVERIFY(rrr.waitForFinished()); + QVERIFY(rrr.isCanceled()); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); + + QVERIFY(cm->relationships(cId).size() != 0); // didn't remove them. + break; + } + // restart, and wait for progress after cancel. - QVERIFY(!rrr.cancel()); // not started - QVERIFY(rrr.start()); - QVERIFY(rrr.isActive()); - QVERIFY(rrr.status() == QContactAbstractRequest::Active); - QVERIFY(!rrr.isFinished()); - QVERIFY(rrr.cancel()); - QVERIFY(rrr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(rrr.isActive()); // still cancelling - QVERIFY(!rrr.isFinished()); // not finished cancelling - QVERIFY(!rrr.start()); // already started. - QVERIFY(rrr.waitForProgress()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(rrr.isFinished()); - QVERIFY(!rrr.isActive()); - QVERIFY(rrr.status() == QContactAbstractRequest::Cancelled); - QVERIFY(cm->relationships(bId).size() != 0); // didn't remove them. - - // specific relationship type removal - rrr.setFirst(QContactId()); - rrr.setSecond(QContactId()); - rrr.setRelationshipType(relType); - rrr.setManager(cm); - QCOMPARE(rrr.manager(), cm); - QVERIFY(!rrr.isActive()); - QVERIFY(!rrr.cancel()); - QVERIFY(!rrr.waitForFinished()); - QVERIFY(!rrr.waitForProgress()); - QVERIFY(rrr.relationshipType() == relType); - QVERIFY(!rrr.cancel()); // not started - QVERIFY(rrr.start()); - QVERIFY(rrr.isActive()); - QVERIFY(rrr.status() == QContactAbstractRequest::Active); - QVERIFY(!rrr.isFinished()); - QVERIFY(!rrr.start()); // already started. - QVERIFY(rrr.waitForFinished()); - QVERIFY(rrr.error() == QContactManager::NoError); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. - QVERIFY(rrr.isFinished()); - QVERIFY(!rrr.isActive()); - - QCOMPARE(cm->relationships(relType).size(), 0); - cm->relationships(relType); // check that it has already been removed. - QCOMPARE(cm->error(), QContactManager::DoesNotExistError); + while (true) { + QVERIFY(!rrr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(rrr.start()); + if (!rrr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + rrr.waitForFinished(); + rrr.setRelationships(relationships); + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + spy.clear(); + continue; + } + rrr.waitForFinished(); + QVERIFY(rrr.isCanceled()); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); - delete cm; + QVERIFY(cm->relationships(cId).size() != 0); // didn't remove them. + break; + } } void tst_QContactAsync::relationshipSave() { QFETCH(QString, uri); - QContactManager* cm(0); - QList contacts; - QList relationships; - QVERIFY(prepareModel(uri, cm, contacts, relationships)); + QScopedPointer cm(prepareModel(uri)); QContactRelationshipSaveRequest rsr; QVERIFY(rsr.type() == QContactAbstractRequest::RelationshipSaveRequest); - - if (!cm->hasFeature(QContactManager::Relationships)) - { - // ensure saving returns errors - QContactRelationship rel; - rel.setFirst(contacts.at(0).id()); - rel.setSecond(contacts.at(1).id()); - rel.setRelationshipType(QContactRelationship::HasManager); - QList list; - list << rel; - rsr.setManager(cm); - QCOMPARE(rsr.manager(), cm); - QVERIFY(!rsr.isActive()); - QVERIFY(!rsr.isFinished()); - QVERIFY(!rsr.cancel()); - QVERIFY(!rsr.waitForFinished()); - QVERIFY(!rsr.waitForProgress()); - rsr.setRelationships(list); - QCOMPARE(rsr.relationships(), list); - QVERIFY(!rsr.cancel()); // not started - QVERIFY(rsr.start()); - QVERIFY(rsr.isActive()); - QVERIFY(rsr.status() == QContactAbstractRequest::Active); - QVERIFY(!rsr.isFinished()); - QVERIFY(!rsr.start()); // already started. - QVERIFY(rsr.waitForFinished()); - QVERIFY(rsr.error() == QContactManager::NotSupportedError); - QVERIFY(rsr.isFinished()); - QVERIFY(!rsr.isActive()); - return; - } - - // use variables to make code more readable - QContactId aId = contacts.at(0).id(); - QContactId bId = contacts.at(1).id(); - QContactId cId = contacts.at(2).id(); - QContactId dId = contacts.at(3).id(); - QContactId eId = contacts.at(4).id(); - QContactId fId = contacts.at(5).id(); - QContactRelationship adRel = relationships.at(0); - QContactRelationship aeRel = relationships.at(1); - QContactRelationship beRel = relationships.at(2); - QContactRelationship ceRel = relationships.at(3); - QContactRelationship cfRel = relationships.at(4); - QString relType = adRel.relationshipType(); // initial state - not started, no manager. QVERIFY(!rsr.isActive()); @@ -1722,120 +1812,153 @@ QVERIFY(!rsr.start()); QVERIFY(!rsr.cancel()); QVERIFY(!rsr.waitForFinished()); - QVERIFY(!rsr.waitForProgress()); + + QList contacts = cm->contactIds(); + QContactId cId, aId, bId; + foreach (const QContactLocalId& currId, contacts) { + QContact curr = cm->contact(currId); + if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Borris")) { + cId = curr.id(); + } else if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Bob")) { + bId = curr.id(); + } else if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Aaron")) { + aId = curr.id(); + } + } // save a new relationship - int originalCount = cm->relationships(bId).size(); + int originalCount = cm->relationships(aId).size(); QContactRelationship testRel; - testRel.setFirst(bId); - testRel.setSecond(dId); - testRel.setRelationshipType(relType); + testRel.setFirst(aId); + testRel.setRelationshipType(QContactRelationship::HasSpouse); + testRel.setSecond(bId); QList saveList; saveList << testRel; - rsr.setManager(cm); - QCOMPARE(rsr.manager(), cm); + rsr.setManager(cm.data()); + QCOMPARE(rsr.manager(), cm.data()); QVERIFY(!rsr.isActive()); QVERIFY(!rsr.isFinished()); QVERIFY(!rsr.cancel()); QVERIFY(!rsr.waitForFinished()); - QVERIFY(!rsr.waitForProgress()); qRegisterMetaType("QContactRelationshipSaveRequest*"); - QSignalSpy spy(&rsr, SIGNAL(progress(QContactRelationshipSaveRequest*))); + QThreadSignalSpy spy(&rsr, SIGNAL(stateChanged(QContactAbstractRequest::State))); rsr.setRelationships(saveList); QCOMPARE(rsr.relationships(), saveList); QVERIFY(!rsr.cancel()); // not started QVERIFY(rsr.start()); - QVERIFY(rsr.isActive()); - QVERIFY(rsr.status() == QContactAbstractRequest::Active); - QVERIFY(!rsr.isFinished()); - QVERIFY(!rsr.start()); // already started. + + QVERIFY((rsr.isActive() && rsr.state() == QContactAbstractRequest::ActiveState) || rsr.isFinished()); + //QVERIFY(rsr.isFinished() || !rsr.start()); // already started. // thread scheduling means this is untestable QVERIFY(rsr.waitForFinished()); - int expectedCount = 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(rsr.isFinished()); - QVERIFY(!rsr.isActive()); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); + + QList expected = cm->relationships(QContactRelationship::HasSpouse, aId, QContactRelationshipFilter::First); QList result = rsr.relationships(); + QCOMPARE(expected, result); QVERIFY(result.contains(testRel)); - QList bRelationships = cm->relationships(relType, bId, QContactRelationshipFilter::First); - QVERIFY(bRelationships.contains(testRel)); - QCOMPARE(cm->relationships(bId).size(), originalCount + 1); // should be one extra + QCOMPARE(cm->relationships(aId).size(), originalCount + 1); // should be one extra // save a new relationship - testRel.setSecond(fId); + testRel.setSecond(cId); saveList.clear(); saveList << testRel; rsr.setRelationships(saveList); QCOMPARE(rsr.relationships(), saveList); QVERIFY(!rsr.cancel()); // not started QVERIFY(rsr.start()); - QVERIFY(rsr.isActive()); - QVERIFY(rsr.status() == QContactAbstractRequest::Active); - QVERIFY(!rsr.isFinished()); - QVERIFY(!rsr.start()); // already started. + + QVERIFY((rsr.isActive() && rsr.state() == QContactAbstractRequest::ActiveState) || rsr.isFinished()); + //QVERIFY(rsr.isFinished() || !rsr.start()); // already started. // thread scheduling means this is untestable QVERIFY(rsr.waitForFinished()); - expectedCount += 2; - QCOMPARE(spy.count(), expectedCount); // active + finished progress signals. QVERIFY(rsr.isFinished()); - QVERIFY(!rsr.isActive()); - bRelationships.clear(); - bRelationships = cm->relationships(relType, bId, QContactRelationshipFilter::First); + QVERIFY(spy.count() >= 1); // active + finished progress signals + spy.clear(); + + expected.clear(); + expected = cm->relationships(QContactRelationship::HasSpouse, aId, QContactRelationshipFilter::First); result = rsr.relationships(); QCOMPARE(result, QList() << testRel); - QVERIFY(bRelationships.contains(testRel)); - QCOMPARE(cm->relationships(bId).size(), originalCount + 2); // should now be two extra + QVERIFY(expected.contains(testRel)); + QCOMPARE(cm->relationships(aId).size(), originalCount + 2); // should now be two extra // cancelling - testRel.setSecond(bId); // shouldn't get saved (circular anyway) + testRel.setSecond(aId); // shouldn't get saved (circular anyway) saveList.clear(); saveList << testRel; rsr.setRelationships(saveList); - QCOMPARE(rsr.relationships(), saveList); - QVERIFY(!rsr.cancel()); // not started - QVERIFY(rsr.start()); - QVERIFY(rsr.isActive()); - QVERIFY(rsr.status() == QContactAbstractRequest::Active); - QVERIFY(!rsr.isFinished()); - QVERIFY(rsr.cancel()); - QVERIFY(rsr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(rsr.isActive()); // still cancelling - QVERIFY(!rsr.isFinished()); // not finished cancelling - QVERIFY(!rsr.start()); // already started. - QVERIFY(rsr.waitForFinished()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(rsr.isFinished()); - QVERIFY(!rsr.isActive()); - QVERIFY(rsr.status() == QContactAbstractRequest::Cancelled); + int bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; // attempt to cancel 40 times. If it doesn't work due to threading, bail out. + while (true) { + QVERIFY(!rsr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(rsr.start()); + if (!rsr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + rsr.waitForFinished(); + saveList.clear(); + saveList << testRel; + rsr.setRelationships(saveList); + cm->removeRelationship(testRel); // probably shouldn't have been saved anyway (circular) + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + spy.clear(); + continue; + } - // verify that the changes were not saved - QList aRels = cm->relationships(bId, QContactRelationshipFilter::First); - QVERIFY(!aRels.contains(testRel)); - QCOMPARE(cm->relationships(bId).size(), originalCount + 2); // should still only be two extra + // if we get here, then we are cancelling the request. + QVERIFY(rsr.waitForFinished()); + QVERIFY(rsr.isCanceled()); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); + + // verify that the changes were not saved + QList aRels = cm->relationships(aId, QContactRelationshipFilter::First); + QVERIFY(!aRels.contains(testRel)); + QCOMPARE(cm->relationships(aId).size(), originalCount + 2); // should still only be two extra + + break; + } // restart, and wait for progress after cancel. - QVERIFY(!rsr.cancel()); // not started - QVERIFY(rsr.start()); - QVERIFY(rsr.isActive()); - QVERIFY(rsr.status() == QContactAbstractRequest::Active); - QVERIFY(!rsr.isFinished()); - QVERIFY(rsr.cancel()); - QVERIFY(rsr.status() == QContactAbstractRequest::Cancelling); - QVERIFY(rsr.isActive()); // still cancelling - QVERIFY(!rsr.isFinished()); // not finished cancelling - QVERIFY(!rsr.start()); // already started. - QVERIFY(rsr.waitForProgress()); - expectedCount += 3; - QCOMPARE(spy.count(), expectedCount); // active + cancelling + cancelled progress signals. - QVERIFY(rsr.isFinished()); - QVERIFY(!rsr.isActive()); - QVERIFY(rsr.status() == QContactAbstractRequest::Cancelled); + while (true) { + QVERIFY(!rsr.cancel()); // not started + FILL_QUEUE_WITH_FETCH_REQUESTS(); + QVERIFY(rsr.start()); + if (!rsr.cancel()) { + // due to thread scheduling, async cancel might be attempted + // after the request has already finished.. so loop and try again. + rsr.waitForFinished(); + saveList.clear(); + saveList << testRel; + rsr.setRelationships(saveList); + cm->removeRelationship(testRel); // probably shouldn't have been saved anyway (circular) + bailoutCount -= 1; + if (!bailoutCount) { + qWarning("Unable to test cancelling due to thread scheduling!"); + bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; + break; + } + spy.clear(); + continue; + } + rsr.waitForFinished(); + QVERIFY(rsr.isCanceled()); + QVERIFY(spy.count() >= 1); // active + cancelled progress signals + spy.clear(); - // verify that the changes were not saved - aRels = cm->relationships(bId); - QVERIFY(!aRels.contains(testRel)); - QCOMPARE(cm->relationships(bId).size(), originalCount + 2); // should still only be two extra + // verify that the changes were not saved + QList aRels = cm->relationships(aId, QContactRelationshipFilter::First); + QVERIFY(!aRels.contains(testRel)); + QCOMPARE(cm->relationships(aId).size(), originalCount + 2); // should still only be two extra - delete cm; + break; + } } void tst_QContactAsync::maliciousManager() @@ -1850,7 +1973,6 @@ QVERIFY(!cfr.cancel()); QVERIFY(!cfr.waitForFinished()); QVERIFY(!cfr.start()); - QVERIFY(!cfr.waitForProgress()); // ensure that the base class implementation of requestDestroyed() is called QContactFetchRequest *destroyedRequest = new QContactFetchRequest; @@ -1872,10 +1994,8 @@ cfr.setManager(&mcm); QVERIFY(cfr.start()); QVERIFY(cfr.cancel()); - QVERIFY(!cfr.waitForProgress(100)); - QVERIFY(!cfr.waitForFinished(100)); + QVERIFY(cfr.waitForFinished(100)); QVERIFY(cfr.start()); - QVERIFY(!cfr.waitForProgress(100)); QVERIFY(!cfr.waitForFinished(100)); QVERIFY(cfr.cancel()); @@ -1884,22 +2004,18 @@ cifr.setManager(&mcm); QVERIFY(cifr.start()); QVERIFY(cifr.cancel()); - QVERIFY(!cifr.waitForProgress(100)); - QVERIFY(!cifr.waitForFinished(100)); + QVERIFY(cifr.waitForFinished(100)); QVERIFY(cifr.start()); - QVERIFY(!cifr.waitForProgress(100)); QVERIFY(!cifr.waitForFinished(100)); QVERIFY(cifr.cancel()); QContactRemoveRequest crr; - crr.setFilter(fil); + crr.setContactIds(mcm.contactIds(fil)); crr.setManager(&mcm); QVERIFY(crr.start()); QVERIFY(crr.cancel()); - QVERIFY(!crr.waitForProgress(100)); - QVERIFY(!crr.waitForFinished(100)); + QVERIFY(crr.waitForFinished(100)); QVERIFY(crr.start()); - QVERIFY(!crr.waitForProgress(100)); QVERIFY(!crr.waitForFinished(100)); QVERIFY(crr.cancel()); @@ -1908,22 +2024,18 @@ csr.setManager(&mcm); QVERIFY(csr.start()); QVERIFY(csr.cancel()); - QVERIFY(!csr.waitForProgress(100)); - QVERIFY(!csr.waitForFinished(100)); + QVERIFY(csr.waitForFinished(100)); QVERIFY(csr.start()); - QVERIFY(!csr.waitForProgress(100)); QVERIFY(!csr.waitForFinished(100)); QVERIFY(csr.cancel()); QContactDetailDefinitionFetchRequest dfr; - dfr.setNames(emptyDNList); + dfr.setDefinitionNames(emptyDNList); dfr.setManager(&mcm); QVERIFY(dfr.start()); QVERIFY(dfr.cancel()); - QVERIFY(!dfr.waitForProgress(100)); - QVERIFY(!dfr.waitForFinished(100)); + QVERIFY(dfr.waitForFinished(100)); QVERIFY(dfr.start()); - QVERIFY(!dfr.waitForProgress(100)); QVERIFY(!dfr.waitForFinished(100)); QVERIFY(dfr.cancel()); @@ -1932,42 +2044,82 @@ dsr.setManager(&mcm); QVERIFY(dsr.start()); QVERIFY(dsr.cancel()); - QVERIFY(!dsr.waitForProgress(100)); - QVERIFY(!dsr.waitForFinished(100)); + QVERIFY(dsr.waitForFinished(100)); QVERIFY(dsr.start()); - QVERIFY(!dsr.waitForProgress(100)); QVERIFY(!dsr.waitForFinished(100)); QVERIFY(dsr.cancel()); QContactDetailDefinitionRemoveRequest drr; - drr.setNames(emptyDNList); + drr.setDefinitionNames(QContactType::TypeContact, emptyDNList); drr.setManager(&mcm); QVERIFY(drr.start()); QVERIFY(drr.cancel()); - QVERIFY(!drr.waitForProgress(100)); - QVERIFY(!drr.waitForFinished(100)); + QVERIFY(drr.waitForFinished(100)); QVERIFY(drr.start()); - QVERIFY(!drr.waitForProgress(100)); QVERIFY(!drr.waitForFinished(100)); QVERIFY(drr.cancel()); } +void tst_QContactAsync::testQuickDestruction() +{ + QFETCH(QString, uri); + + // in this test, we create a manager, fire off a request, and delete the manager, all in quick succession + // this is to test for segfaults etc. + for (int i = 0; i < 10; i++) { + QContactFetchRequest cfr; + QContactManager *cm = prepareModel(uri); + cfr.setManager(cm); + cfr.start(); + delete cm; + } + // in this test, we create a manager, fire off a request, delete the request, then delete the manager, all in quick succession + // this is to test for segfaults, etc. + for (int i = 0; i < 10; i++) { + QContactFetchRequest *cfr = new QContactFetchRequest; + QContactManager *cm = prepareModel(uri); + cfr->setManager(cm); + cfr->start(); + delete cfr; + delete cm; + } + // in this test, we create a manager, fire off a request, delete the manager, then delete the request, all in quick succession + // this is to test for segfaults, etc. + for (int i = 0; i < 10; i++) { + QContactFetchRequest *cfr = new QContactFetchRequest; + QContactManager *cm = prepareModel(uri); + cfr->setManager(cm); + cfr->start(); + delete cm; + delete cfr; + } + // in this test, we create a manager, fire off a request, and delete the request, all in quick succession + // this is to test for segfaults, etc. + QContactManager *cm = prepareModel(uri); + for (int i = 0; i < 10; i++) { + QContactFetchRequest *cfr = new QContactFetchRequest; + cfr->setManager(cm); + cfr->start(); + delete cfr; + } + delete cm; +} + void tst_QContactAsync::threadDelivery() { QFETCH(QString, uri); - QContactManager *cm(0); - QVERIFY(prepareModel(uri, cm)); + QScopedPointer cm(prepareModel(uri)); m_mainThreadId = cm->thread()->currentThreadId(); m_progressSlotThreadId = m_mainThreadId; // now perform a fetch request and check that the progress is delivered to the correct thread. QContactFetchRequest *req = new QContactFetchRequest; - req->setManager(cm); + req->setManager(cm.data()); connect(req, SIGNAL(progress(QContactFetchRequest*,bool)), this, SLOT(progressReceived(QContactFetchRequest*, bool))); req->start(); int totalWaitTime = 0; - while (req->status() != QContactAbstractRequest::Finished) { + while (req->state() != QContactAbstractRequest::FinishedState) { // ensure that the progress signal was delivered to the main thread. QCOMPARE(m_mainThreadId, m_progressSlotThreadId); @@ -1977,7 +2129,6 @@ // break after 30 seconds. if (totalWaitTime > 30000) { delete req; - delete cm; QSKIP("Asynchronous request not complete after 30 seconds!", SkipSingle); } } @@ -1985,7 +2136,6 @@ // ensure that the progress signal was delivered to the main thread. QCOMPARE(m_mainThreadId, m_progressSlotThreadId); delete req; - delete cm; } void tst_QContactAsync::progressReceived(QContactFetchRequest* request, bool appendOnly) @@ -2016,149 +2166,77 @@ } } -bool tst_QContactAsync::prepareModel(const QString &managerUri, QContactManager *&cm) +QContactManager* tst_QContactAsync::prepareModel(const QString& managerUri) { - QList contacts; - QList relationships; - return prepareModel(managerUri, cm, contacts, relationships); -} - -bool tst_QContactAsync::prepareModel(const QString &managerUri, QContactManager *&cm, QList &contacts, QList &relationships) -{ - cm = QContactManager::fromUri(managerUri); + QContactManager* cm = QContactManager::fromUri(managerUri); // XXX TODO: ensure that this is the case: // there should be no contacts in the database. - QList toRemove = cm->contacts(); - foreach (const QContactLocalId& removeId, toRemove) { - if (!cm->removeContact(removeId)) - return false; - } + QList toRemove = cm->contactIds(); + foreach (const QContactLocalId& removeId, toRemove) + cm->removeContact(removeId); - QContact a, b, c, d, e, f; - QContactPhoneNumber n; - n.setNumber("1"); - a.saveDetail(&n); - n.setNumber("2"); - b.saveDetail(&n); - n.setNumber("3"); - c.saveDetail(&n); - n.setNumber("4"); - d.saveDetail(&n); - n.setNumber("5"); - e.saveDetail(&n); - n.setNumber("6"); - f.saveDetail(&n); + QContact a, b, c; + QContactName aNameDetail; + aNameDetail.setFirstName("Aaron"); + aNameDetail.setLastName("Aaronson"); + a.saveDetail(&aNameDetail); + QContactName bNameDetail; + bNameDetail.setFirstName("Bob"); + bNameDetail.setLastName("Aaronsen"); + b.saveDetail(&bNameDetail); + QContactName cNameDetail; + cNameDetail.setFirstName("Borris"); + cNameDetail.setLastName("Aaronsun"); + c.saveDetail(&cNameDetail); + + QContactPhoneNumber phn; + phn.setNumber("0123"); + c.saveDetail(&phn); + phn.setNumber("3456"); + b.saveDetail(&phn); + phn.setNumber("6789"); + a.saveDetail(&phn); QContactUrl url; url.setUrl("http://test.nokia.com"); a.saveDetail(&url); - - a.setType(QContactType::TypeGroup); - b.setType(QContactType::TypeGroup); - c.setType(QContactType::TypeGroup); + + cm->saveContact(&a); + cm->saveContact(&b); + cm->saveContact(&c); - if (!cm->saveContact(&a)) - return false; - if (!cm->saveContact(&b)) - return false; - if (!cm->saveContact(&c)) - return false; - if (!cm->saveContact(&d)) - return false; - if (!cm->saveContact(&e)) - return false; - if (!cm->saveContact(&f)) - return false; - - contacts.append(a); - contacts.append(b); - contacts.append(c); - contacts.append(d); - contacts.append(e); - contacts.append(f); - - if (cm->hasFeature(QContactManager::Relationships)) - { - QStringList supportedRelationshipTypes = cm->supportedRelationshipTypes(); + QContactRelationship arb; + arb.setFirst(a.id()); + arb.setSecond(b.id()); + arb.setRelationshipType(QContactRelationship::HasManager); + cm->saveRelationship(&arb); + + QContactRelationship brc; + brc.setFirst(b.id()); + brc.setSecond(c.id()); + brc.setRelationshipType(QContactRelationship::HasAssistant); + cm->saveRelationship(&brc); - if (cm->hasFeature(QContactManager::ArbitraryRelationshipTypes)) { - supportedRelationshipTypes.insert(0, "some-arbitrary-relationship"); - if (!supportedRelationshipTypes.contains(QContactRelationship::HasManager)) - supportedRelationshipTypes.append(QContactRelationship::HasManager); - if (!supportedRelationshipTypes.contains(QContactRelationship::HasAssistant)) - supportedRelationshipTypes.append(QContactRelationship::HasAssistant); - if (!supportedRelationshipTypes.contains(QContactRelationship::HasSpouse)) - supportedRelationshipTypes.append(QContactRelationship::HasSpouse); - } - - if (supportedRelationshipTypes.count() == 0) - return false; // should not happen - - QContactRelationship adRel; - adRel.setFirst(a.id()); - adRel.setSecond(d.id()); - adRel.setRelationshipType(supportedRelationshipTypes.at(0)); - if (!cm->saveRelationship(&adRel)) - return false; - relationships.append(adRel); - - QContactRelationship aeRel; - aeRel.setFirst(a.id()); - aeRel.setSecond(e.id()); - aeRel.setRelationshipType(supportedRelationshipTypes.at(0)); - if (!cm->saveRelationship(&aeRel)) - return false; - relationships.append(aeRel); - - QContactRelationship beRel; - beRel.setFirst(b.id()); - beRel.setSecond(e.id()); - beRel.setRelationshipType(supportedRelationshipTypes.at(0)); - if (!cm->saveRelationship(&beRel)) - return false; - relationships.append(beRel); - - QContactRelationship ceRel; - ceRel.setFirst(c.id()); - ceRel.setSecond(e.id()); - ceRel.setRelationshipType(supportedRelationshipTypes.at(0)); - if (!cm->saveRelationship(&ceRel)) - return false; - relationships.append(ceRel); - - QContactRelationship cfRel; - cfRel.setFirst(c.id()); - cfRel.setSecond(f.id()); - cfRel.setRelationshipType(supportedRelationshipTypes.at(0)); - if (!cm->saveRelationship(&cfRel)) - return false; - relationships.append(cfRel); - - if (supportedRelationshipTypes.count() > 1) - { - QContactRelationship daRel; - daRel.setFirst(d.id()); - daRel.setSecond(a.id()); - daRel.setRelationshipType(supportedRelationshipTypes.at(1)); - if (!cm->saveRelationship(&daRel)) - return false; - relationships.append(daRel); - } - - if (supportedRelationshipTypes.count() > 2) - { - QContactRelationship adRel2; - adRel2.setFirst(a.id()); - adRel2.setSecond(d.id()); - adRel2.setRelationshipType(supportedRelationshipTypes.at(2)); - if (!cm->saveRelationship(&adRel2)) - return false; - relationships.append(adRel2); - } - } + QContactRelationship cra; + cra.setFirst(c.id()); + cra.setSecond(a.id()); + cra.setRelationshipType(QContactRelationship::HasSpouse); + cm->saveRelationship(&cra); - return true; + QContactRelationship arc; + arc.setFirst(a.id()); + arc.setSecond(c.id()); + arc.setRelationshipType(QContactRelationship::HasAssistant); + cm->saveRelationship(&arc); + + QContactRelationship crb; + crb.setFirst(c.id()); + crb.setSecond(b.id()); + crb.setRelationshipType(QContactRelationship::Is); + cm->saveRelationship(&crb); + + return cm; // TODO: cleanup once test is complete } diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qcontactdetail/tst_qcontactdetail.cpp --- a/qtcontactsmobility/tests/auto/qcontactdetail/tst_qcontactdetail.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qcontactdetail/tst_qcontactdetail.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -110,7 +110,7 @@ QVERIFY(p1.definitionName() == QContactPhoneNumber::DefinitionName); QContactName m1; - m1.setFirst("Bob"); + m1.setFirstName("Bob"); QVERIFY(!m1.isEmpty()); QVERIFY(m1.definitionName() == QContactName::DefinitionName); @@ -154,10 +154,12 @@ QCOMPARE(p2.number(), p1.number()); QCOMPARE(p2.number(), QString("123456")); - p2.setNumber("5678"); + p2.setNumber("5678"); // NOTE: implicitly shared, this has caused a detach so p1 != 2 QVERIFY(p1 != p2); QVERIFY(p1 == f2); QVERIFY(p2 != f2); + QCOMPARE(p2.number(), QString("5678")); + QCOMPARE(p1.number(), QString("123456")); /* Bad assignment */ p2 = m1; // assign a name to a phone number @@ -176,11 +178,12 @@ QVERIFY(m2.isEmpty()); /* Check contexts are considered for equality */ - p2 = p1; + p2 = QContactPhoneNumber(); // new id / detach + p2.setNumber(p1.number()); p2.setContexts(QContactDetail::ContextHome); QVERIFY(p1 != p2); p2.removeValue(QContactDetail::FieldContext); // note, context is a value. - QVERIFY(p1 == p2); + QVERIFY(p1 == p2); // different ids but same values should be equal /* Copy ctor from valid type */ QContactDetail f3(p2); @@ -201,6 +204,7 @@ QVERIFY(p4.isEmpty()); /* Try a reference */ + p1.setNumber("123456"); QContactDetail& ref = p1; QVERIFY(p1.number() == "123456"); QVERIFY(p1.value(QContactPhoneNumber::FieldNumber) == "123456"); @@ -306,7 +310,7 @@ { QContactDetail p; - QCOMPARE(p.values(), QVariantMap()); + QCOMPARE(p.variantValues(), QVariantMap()); QDateTime dt = QDateTime::currentDateTime(); QTime t = dt.time(); @@ -393,13 +397,13 @@ /* Now set everything again */ QVariantMap emptyValues; - QVariantMap values = p.values(); + QVariantMap values = p.variantValues(); QStringList keys = values.keys(); foreach (const QString& key, keys) QVERIFY(p.setValue(key, QVariant())); - QCOMPARE(p.values(), emptyValues); - QVERIFY(p.values().count() == 0); + QCOMPARE(p.variantValues(), emptyValues); + QVERIFY(p.variantValues().count() == 0); QVERIFY(!p.hasValue("string")); QVERIFY(!p.hasValue("date")); QVERIFY(!p.hasValue("datetime")); @@ -483,11 +487,11 @@ QCOMPARE(p.value("stringdate"), ddt); /* Reset again */ - values = p.values(); + values = p.variantValues(); keys = values.keys(); foreach (const QString& key, keys) QVERIFY(p.setValue(key, QVariant())); - QCOMPARE(p.values(), emptyValues); + QCOMPARE(p.variantValues(), emptyValues); /* Check that we can add a null variant */ //QVERIFY(p.setValue("nullvariant", QVariant())); @@ -519,14 +523,14 @@ /* Check adding a null value removes the field */ p.setValue("string", "stringvalue"); - QVERIFY(p.values().contains("string")); + QVERIFY(p.variantValues().contains("string")); QVERIFY(p.value("string") == QString("stringvalue")); p.setValue("string", QVariant()); - QVERIFY(!p.values().contains("string")); + QVERIFY(!p.variantValues().contains("string")); /* Check adding a field whose value is an empty string */ p.setValue("string", ""); - QVERIFY(p.values().contains("string")); + QVERIFY(p.variantValues().contains("string")); QVERIFY(p.value("string") == QString("")); /* Check accessing a missing value */ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qcontactdetaildefinition/tst_qcontactdetaildefinition.cpp --- a/qtcontactsmobility/tests/auto/qcontactdetaildefinition/tst_qcontactdetaildefinition.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qcontactdetaildefinition/tst_qcontactdetaildefinition.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -94,33 +94,29 @@ /* Check the ctor sets sane things */ QVERIFY(def.isEmpty()); QVERIFY(def.name().isEmpty()); - QVERIFY(def.accessConstraint() == QContactDetailDefinition::NoConstraint); QVERIFY(def.fields().isEmpty()); QVERIFY(def.isUnique() == false); /* Set a few things */ - QMap map; - QContactDetailDefinitionField currField; + QMap map; + QContactDetailFieldDefinition currField; currField.setDataType(QVariant::String); map.insert("string", currField); currField.setDataType(QVariant::DateTime); map.insert("datetime", currField); def.setName("Test ID"); - def.setAccessConstraint(QContactDetailDefinition::CreateOnly); def.setUnique(true); def.setFields(map); QVERIFY(def.name() == "Test ID"); QVERIFY(def.isUnique()); - QVERIFY(def.accessConstraint() == QContactDetailDefinition::CreateOnly); QVERIFY(def.fields() == map); QContactDetailDefinition def2(def); QVERIFY(def2.name() == "Test ID"); QVERIFY(def2.isUnique()); - QVERIFY(def2.accessConstraint() == QContactDetailDefinition::CreateOnly); QVERIFY(def2.fields() == map); QContactDetailDefinition def3; @@ -128,7 +124,6 @@ QVERIFY(def3.name() == "Test ID"); QVERIFY(def3.isUnique()); - QVERIFY(def3.accessConstraint() == QContactDetailDefinition::CreateOnly); QVERIFY(def3.fields() == map); /* Make sure they aren't improperly shared */ @@ -158,19 +153,9 @@ def.setUnique(false); QVERIFY(def.isUnique() == false); - /* Access constraints */ - def.setAccessConstraint(QContactDetailDefinition::NoConstraint); - QVERIFY(def.accessConstraint() == QContactDetailDefinition::NoConstraint); - - def.setAccessConstraint(QContactDetailDefinition::ReadOnly); - QVERIFY(def.accessConstraint() == QContactDetailDefinition::ReadOnly); - - def.setAccessConstraint(QContactDetailDefinition::CreateOnly); - QVERIFY(def.accessConstraint() == QContactDetailDefinition::CreateOnly); - /* Type map */ - QMap map; - QContactDetailDefinitionField currField; + QMap map; + QContactDetailFieldDefinition currField; currField.setDataType(QVariant::String); map.insert("string", currField); currField.setDataType(QVariant::DateTime); @@ -179,17 +164,16 @@ def.setFields(map); QVERIFY(def.fields() == map); - def.setFields(QMap()); + def.setFields(QMap()); QVERIFY(def.fields().isEmpty()); - /* Non const accessor */ - def.fields() = map; - QVERIFY(def.fields() == map); - - QMap& rmap = def.fields(); - def.fields().clear(); - - QVERIFY(rmap == def.fields()); + /* Non const accessor - XXX TODO: remove after deprecation transition period. */ + //def.fields() = map; + //QVERIFY(def.fields() == map); + // + //QMap& rmap = def.fields(); + //def.fields().clear(); + //QVERIFY(rmap == def.fields()); } void tst_QContactDetailDefinition::testEmpty() @@ -202,8 +186,8 @@ QVERIFY(!def.isEmpty()); def.setName(QString()); QVERIFY(def.isEmpty()); - QMap fields; - QContactDetailDefinitionField f; + QMap fields; + QContactDetailFieldDefinition f; f.setDataType(QVariant::String); fields.insert("Field", f); def.setFields(fields); @@ -247,21 +231,8 @@ QVERIFY(def1 == def2); QVERIFY(def2 == def1); - /* Access constraint */ - def1.setAccessConstraint(QContactDetailDefinition::ReadOnly); - QVERIFY(def1 != def2); - QVERIFY(def2 != def1); - - def1.setAccessConstraint(QContactDetailDefinition::CreateOnly); - QVERIFY(def1 != def2); - QVERIFY(def2 != def1); - - def2.setAccessConstraint(QContactDetailDefinition::CreateOnly); - QVERIFY(def1 == def2); - QVERIFY(def2 == def1); - /* Test Fields */ - QContactDetailDefinitionField f1, f2; + QContactDetailFieldDefinition f1, f2; QVERIFY(f1 == f2); QVERIFY(f1.allowableValues().count() == 0); QVERIFY(f1.dataType() == QVariant::Invalid); @@ -278,8 +249,8 @@ QVERIFY(f1 == f2); /* Field map */ - QMap fields; - QContactDetailDefinitionField currField; + QMap fields; + QContactDetailFieldDefinition currField; currField.setDataType(QVariant::String); fields.insert("string", currField); currField.setDataType(QVariant::DateTime); @@ -318,8 +289,8 @@ void tst_QContactDetailDefinition::fieldTraits() { - QCOMPARE(sizeof(QContactDetailDefinitionField), sizeof(void *)); - QTypeInfo ti; + QCOMPARE(sizeof(QContactDetailFieldDefinition), sizeof(void *)); + QTypeInfo ti; QVERIFY(ti.isComplex); QVERIFY(!ti.isStatic); QVERIFY(!ti.isLarge); diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qcontactdetails/tst_qcontactdetails.cpp --- a/qtcontactsmobility/tests/auto/qcontactdetails/tst_qcontactdetails.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qcontactdetails/tst_qcontactdetails.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -314,6 +314,7 @@ void tst_QContactDetails::displayLabel() { QContactDisplayLabel d1; + QContact c; QVERIFY(d1.label().isEmpty()); QVERIFY(d1.value(QContactDisplayLabel::FieldLabel).isEmpty()); @@ -321,7 +322,22 @@ QVERIFY(d1.value(QContactDisplayLabel::FieldLabel) == QString("Test")); QVERIFY(d1.label() == QString("Test")); - /* XXX TODO: test property add, update and remove. Special semantics for display label. */ + QContactDisplayLabel d2; + d2.setValue(QContactDisplayLabel::FieldLabel, "Test 2"); + + // test property add [== fail] + QVERIFY(!c.saveDetail(&d2)); + QVERIFY(d2.accessConstraints() & QContactDetail::ReadOnly); + QCOMPARE(c.details(QContactDisplayLabel::DefinitionName).count(), 1); + + // test property update [== fail] + d1 = c.detail(); + QVERIFY(!c.saveDetail(&d1)); + QVERIFY(d1.accessConstraints() & QContactDetail::ReadOnly); + + // test property remove + QVERIFY(!c.removeDetail(&d1)); // cannot remove display label + QCOMPARE(c.details().count(), 1); } void tst_QContactDetails::emailAddress() @@ -429,57 +445,57 @@ void tst_QContactDetails::geolocation() { QContact c; - QContactGeolocation g1, g2; + QContactGeoLocation g1, g2; // test property set g1.setLabel("1234"); QCOMPARE(g1.label(), QString("1234")); - QCOMPARE(g1.value(QContactGeolocation::FieldLabel), QString("1234")); + QCOMPARE(g1.value(QContactGeoLocation::FieldLabel), QString("1234")); g1.setAccuracy(3.2); QCOMPARE(g1.accuracy(), 3.2); - QCOMPARE(g1.variantValue(QContactGeolocation::FieldAccuracy), QVariant(3.2)); + QCOMPARE(g1.variantValue(QContactGeoLocation::FieldAccuracy), QVariant(3.2)); g1.setAltitude(3.3); QCOMPARE(g1.altitude(), 3.3); - QCOMPARE(g1.variantValue(QContactGeolocation::FieldAltitude), QVariant(3.3)); + QCOMPARE(g1.variantValue(QContactGeoLocation::FieldAltitude), QVariant(3.3)); g1.setAltitudeAccuracy(3.4); QCOMPARE(g1.altitudeAccuracy(), 3.4); - QCOMPARE(g1.variantValue(QContactGeolocation::FieldAltitudeAccuracy), QVariant(3.4)); + QCOMPARE(g1.variantValue(QContactGeoLocation::FieldAltitudeAccuracy), QVariant(3.4)); g1.setHeading(3.5); QCOMPARE(g1.heading(), 3.5); - QCOMPARE(g1.variantValue(QContactGeolocation::FieldHeading), QVariant(3.5)); + QCOMPARE(g1.variantValue(QContactGeoLocation::FieldHeading), QVariant(3.5)); g1.setLatitude(3.6); QCOMPARE(g1.latitude(), 3.6); - QCOMPARE(g1.variantValue(QContactGeolocation::FieldLatitude), QVariant(3.6)); + QCOMPARE(g1.variantValue(QContactGeoLocation::FieldLatitude), QVariant(3.6)); g1.setLongitude(3.7); QCOMPARE(g1.longitude(), 3.7); - QCOMPARE(g1.variantValue(QContactGeolocation::FieldLongitude), QVariant(3.7)); + QCOMPARE(g1.variantValue(QContactGeoLocation::FieldLongitude), QVariant(3.7)); QDateTime current = QDateTime::currentDateTime(); g1.setTimestamp(current); QCOMPARE(g1.timestamp(), current); - QCOMPARE(g1.variantValue(QContactGeolocation::FieldTimestamp), QVariant(current)); + QCOMPARE(g1.variantValue(QContactGeoLocation::FieldTimestamp), QVariant(current)); g1.setSpeed(3.8); QCOMPARE(g1.speed(), 3.8); - QCOMPARE(g1.variantValue(QContactGeolocation::FieldSpeed), QVariant(3.8)); + QCOMPARE(g1.variantValue(QContactGeoLocation::FieldSpeed), QVariant(3.8)); // test property add QVERIFY(c.saveDetail(&g1)); - QCOMPARE(c.details(QContactGeolocation::DefinitionName).count(), 1); - QCOMPARE(QContactGeolocation(c.details(QContactGeolocation::DefinitionName).value(0)).label(), g1.label()); + QCOMPARE(c.details(QContactGeoLocation::DefinitionName).count(), 1); + QCOMPARE(QContactGeoLocation(c.details(QContactGeoLocation::DefinitionName).value(0)).label(), g1.label()); // test property update g1.setLabel("12345"); QVERIFY(c.saveDetail(&g1)); - QCOMPARE(c.details(QContactGeolocation::DefinitionName).value(0).value(QContactGeolocation::FieldLabel), QString("12345")); + QCOMPARE(c.details(QContactGeoLocation::DefinitionName).value(0).value(QContactGeoLocation::FieldLabel), QString("12345")); // test property remove QVERIFY(c.removeDetail(&g1)); - QCOMPARE(c.details(QContactGeolocation::DefinitionName).count(), 0); + QCOMPARE(c.details(QContactGeoLocation::DefinitionName).count(), 0); QVERIFY(c.saveDetail(&g2)); - QCOMPARE(c.details(QContactGeolocation::DefinitionName).count(), 1); + QCOMPARE(c.details(QContactGeoLocation::DefinitionName).count(), 1); QVERIFY(c.removeDetail(&g2)); - QCOMPARE(c.details(QContactGeolocation::DefinitionName).count(), 0); + QCOMPARE(c.details(QContactGeoLocation::DefinitionName).count(), 0); QVERIFY(c.removeDetail(&g2) == false); - QCOMPARE(c.details(QContactGeolocation::DefinitionName).count(), 0); + QCOMPARE(c.details(QContactGeoLocation::DefinitionName).count(), 0); } void tst_QContactDetails::guid() @@ -525,21 +541,21 @@ // test property set n1.setPrefix("Dr"); - n1.setFirst("Freddy"); - n1.setMiddle("William Preston"); - n1.setLast("Gumboots"); + n1.setFirstName("Freddy"); + n1.setMiddleName("William Preston"); + n1.setLastName("Gumboots"); n1.setSuffix("Esquire"); QCOMPARE(n1.prefix(), QString("Dr")); - QCOMPARE(n1.first(), QString("Freddy")); - QCOMPARE(n1.middle(), QString("William Preston")); - QCOMPARE(n1.last(), QString("Gumboots")); + QCOMPARE(n1.firstName(), QString("Freddy")); + QCOMPARE(n1.middleName(), QString("William Preston")); + QCOMPARE(n1.lastName(), QString("Gumboots")); QCOMPARE(n1.suffix(), QString("Esquire")); // test property add QVERIFY(c.saveDetail(&n1)); QCOMPARE(c.details(QContactName::DefinitionName).count(), 1); - n2.setFirst("Billy"); - n2.setLast("Galoshes"); + n2.setFirstName("Billy"); + n2.setLastName("Galoshes"); QVERIFY(c.saveDetail(&n2)); QCOMPARE(c.details(QContactName::DefinitionName).count(), 2); @@ -854,14 +870,14 @@ QCOMPARE(c.details(QContactType::DefinitionName).value(0).value(QContactType::FieldType), QString(QLatin1String(QContactType::TypeContact))); // test property remove - QVERIFY(c.removeDetail(&t1)); // cannot remove type - "succeeds" but count remains unchanged + QVERIFY(!c.removeDetail(&t1)); // cannot remove type QCOMPARE(c.details(QContactType::DefinitionName).count(), 1); t2.setType(QContactType::TypeGroup); QVERIFY(c.saveDetail(&t2)); // overwrites t1 QCOMPARE(c.details(QContactType::DefinitionName).count(), 1); - QVERIFY(c.removeDetail(&t2)); // cannot remove type - "succeeds" but count remains unchanged + QVERIFY(!c.removeDetail(&t2)); // cannot remove type - "succeeds" but count remains unchanged QCOMPARE(c.details(QContactType::DefinitionName).count(), 1); - QVERIFY(c.removeDetail(&t2)); // Should still succeed + QVERIFY(!c.removeDetail(&t2)); QCOMPARE(c.details(QContactType::DefinitionName).count(), 1); } diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qcontactfilter/tst_qcontactfilter.cpp --- a/qtcontactsmobility/tests/auto/qcontactfilter/tst_qcontactfilter.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qcontactfilter/tst_qcontactfilter.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -623,27 +623,27 @@ QVERIFY(crf.type() == QContactFilter::RelationshipFilter); - QVERIFY(crf.role() == QContactRelationshipFilter::Either); + QVERIFY(crf.relationshipType() == QString()); - QVERIFY(crf.otherParticipantId() == QContactId()); + QVERIFY(crf.relatedContactId() == QContactId()); QContactId newId; newId.setManagerUri("test"); newId.setLocalId(QContactLocalId(5)); - crf.setOtherParticipantId(newId); - QVERIFY(crf.role() == QContactRelationshipFilter::Either); + crf.setRelatedContactId(newId); + QVERIFY(crf.relationshipType() == QString()); - QVERIFY(crf.otherParticipantId() == newId); + QVERIFY(crf.relatedContactId() == newId); - crf.setRole(QContactRelationshipFilter::First); - QVERIFY(crf.role() == QContactRelationshipFilter::First); + crf.setRelatedContactRole(QContactRelationshipFilter::First); + QVERIFY(crf.relationshipType() == QString()); - QVERIFY(crf.otherParticipantId() == newId); + QVERIFY(crf.relatedContactId() == newId); crf.setRelationshipType(QContactRelationship::HasManager); - QVERIFY(crf.role() == QContactRelationshipFilter::First); + QVERIFY(crf.relationshipType() == QContactRelationship::HasManager); - QVERIFY(crf.otherParticipantId() == newId); + QVERIFY(crf.relatedContactId() == newId); /* Test op= */ QContactFilter f = crf; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qcontactmanager/tst_qcontactmanager.cpp --- a/qtcontactsmobility/tests/auto/qcontactmanager/tst_qcontactmanager.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qcontactmanager/tst_qcontactmanager.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -217,9 +217,9 @@ QContactName n2 = b.detail(QContactName::DefinitionName); // Check the name components in more detail - QCOMPARE(n1.first(), n2.first()); - QCOMPARE(n1.middle(), n2.middle()); - QCOMPARE(n1.last(), n2.last()); + QCOMPARE(n1.firstName(), n2.firstName()); + QCOMPARE(n1.middleName(), n2.middleName()); + QCOMPARE(n1.lastName(), n2.lastName()); QCOMPARE(n1.prefix(), n2.prefix()); QCOMPARE(n1.suffix(), n2.suffix()); QCOMPARE(n1.customLabel(), n2.customLabel()); @@ -248,12 +248,12 @@ bDetails = b.details(); foreach(QContactDetail d, aDetails) { if (d.definitionName() != QContactDisplayLabel::DefinitionName && d.definitionName() != QContactType::DefinitionName) - qDebug() << "A contact had extra detail:" << d.definitionName() << d.values(); + qDebug() << "A contact had extra detail:" << d.definitionName() << d.variantValues(); } // and same for B foreach(QContactDetail d, bDetails) { if (d.definitionName() != QContactDisplayLabel::DefinitionName && d.definitionName() != QContactType::DefinitionName) - qDebug() << "B contact had extra detail:" << d.definitionName() << d.values(); + qDebug() << "B contact had extra detail:" << d.definitionName() << d.variantValues(); } // now test specifically the display label and the type @@ -310,17 +310,17 @@ void tst_QContactManager::dumpContact(const QContact& contact) { QContactManager m; - qDebug() << "Contact: " << contact.id().localId() << "(" << m.synthesizeDisplayLabel(contact) << ")"; + qDebug() << "Contact: " << contact.id().localId() << "(" << m.synthesizedDisplayLabel(contact) << ")"; QList details = contact.details(); foreach(QContactDetail d, details) { qDebug() << " " << d.definitionName() << ":"; - qDebug() << " Vals:" << d.values(); + qDebug() << " Vals:" << d.variantValues(); } } void tst_QContactManager::dumpContacts(QContactManager *cm) { - QList ids = cm->contacts(); + QList ids = cm->contactIds(); qDebug() << "There are" << ids.count() << "contacts in" << cm->managerUri(); @@ -400,9 +400,9 @@ if(nameDef.fields().contains(QContactName::FieldCustomLabel)) { contactName.setCustomLabel(name); } else if(nameDef.fields().contains(QContactName::FieldFirst)) { - contactName.setFirst(name); + contactName.setFirstName(name); } else if(nameDef.fields().contains(QContactName::FieldLast)) { - contactName.setLast(name); + contactName.setLastName(name); } else { // Assume that at least one of the above name fields is supported by the backend QVERIFY(false); @@ -445,12 +445,12 @@ if (good) { /* Good split */ /* Test splitting */ - QVERIFY(QContactManager::splitUri(uri, 0, 0)); // no out parms + QVERIFY(QContactManager::parseUri(uri, 0, 0)); // no out parms // 1 out param - QVERIFY(QContactManager::splitUri(uri, &outmanager, 0)); + QVERIFY(QContactManager::parseUri(uri, &outmanager, 0)); QCOMPARE(manager, outmanager); - QVERIFY(QContactManager::splitUri(uri, 0, &outparameters)); + QVERIFY(QContactManager::parseUri(uri, 0, &outparameters)); QCONTACTMANAGER_REMOVE_VERSIONS_FROM_URI(outparameters); @@ -458,7 +458,7 @@ outmanager.clear(); outparameters.clear(); - QVERIFY(QContactManager::splitUri(uri, &outmanager, &outparameters)); + QVERIFY(QContactManager::parseUri(uri, &outmanager, &outparameters)); QCONTACTMANAGER_REMOVE_VERSIONS_FROM_URI(outparameters); @@ -468,19 +468,19 @@ /* bad splitting */ outmanager.clear(); outparameters.clear(); - QVERIFY(QContactManager::splitUri(uri, 0, 0) == false); - QVERIFY(QContactManager::splitUri(uri, &outmanager, 0) == false); + QVERIFY(QContactManager::parseUri(uri, 0, 0) == false); + QVERIFY(QContactManager::parseUri(uri, &outmanager, 0) == false); QVERIFY(outmanager.isEmpty()); - QVERIFY(QContactManager::splitUri(uri, 0, &outparameters) == false); + QVERIFY(QContactManager::parseUri(uri, 0, &outparameters) == false); QCONTACTMANAGER_REMOVE_VERSIONS_FROM_URI(outparameters); QVERIFY(outparameters.isEmpty()); /* make sure the in parameters don't change with a bad split */ outmanager = manager; outparameters = parameters; - QVERIFY(QContactManager::splitUri(uri, &outmanager, 0) == false); + QVERIFY(QContactManager::parseUri(uri, &outmanager, 0) == false); QCOMPARE(manager, outmanager); - QVERIFY(QContactManager::splitUri(uri, 0, &outparameters) == false); + QVERIFY(QContactManager::parseUri(uri, 0, &outparameters) == false); QCONTACTMANAGER_REMOVE_VERSIONS_FROM_URI(outparameters); QCOMPARE(parameters, outparameters); } @@ -586,7 +586,7 @@ } } -Q_DECLARE_METATYPE(QVariant); +Q_DECLARE_METATYPE(QVariant) void tst_QContactManager::doDumpSchema() { @@ -644,8 +644,8 @@ QContact alice; QContactName na; - na.setFirst("Alice"); - na.setLast("inWonderland"); + na.setFirstName("Alice"); + na.setLastName("inWonderland"); alice.saveDetail(&na); QContactPhoneNumber ph; @@ -654,12 +654,12 @@ ph.setSubTypes(QStringList("Mobile")); alice.saveDetail(&ph); - int currCount = cm->contacts().count(); + int currCount = cm->contactIds().count(); QVERIFY(cm->saveContact(&alice)); QVERIFY(cm->error() == QContactManager::NoError); QVERIFY(alice.id() != QContactId()); - QCOMPARE(cm->contacts().count(), currCount+1); + QCOMPARE(cm->contactIds().count(), currCount+1); QContact added = cm->contact(alice.id().localId()); QVERIFY(added.id() != QContactId()); @@ -694,24 +694,21 @@ QMap defmap = cm->detailDefinitions(); QList defs = defmap.values(); foreach (const QContactDetailDefinition def, defs) { - // if the definition is read only, we cannot create details of the definition, so skip it. + + // Leave these warnings here - might need an API for this if (def.accessConstraint() == QContactDetailDefinition::ReadOnly) { continue; } // otherwise, create a new detail of the given type and save it to the contact QContactDetail det(def.name()); - QMap fieldmap = def.fields(); + QMap fieldmap = def.fields(); QStringList fieldKeys = fieldmap.keys(); foreach (const QString& fieldKey, fieldKeys) { // get the field, and check to see that it's not constrained. - QContactDetailDefinitionField currentField = fieldmap.value(fieldKey); - if (currentField.accessConstraint() == QContactDetailDefinitionField::ReadOnly) { - // we cannot write to this field. - continue; - } - - // we can write to this field. attempt to create a worthy value + QContactDetailFieldDefinition currentField = fieldmap.value(fieldKey); + + // Attempt to create a worthy value if (!currentField.allowableValues().isEmpty()) { // we want to save a value that will be accepted. if (currentField.dataType() == QVariant::StringList) @@ -802,8 +799,8 @@ /* Save a new contact first */ QContact alice; QContactName na; - na.setFirst("Alice"); - na.setLast("inWonderland"); + na.setFirstName("Alice"); + na.setLastName("inWonderland"); alice.saveDetail(&na); QContactPhoneNumber ph; @@ -816,19 +813,19 @@ QVERIFY(cm->saveContact(&alice)); QVERIFY(cm->error() == QContactManager::NoError); - QList ids = cm->contacts(); + QList ids = cm->contactIds(); for(int i = 0; i < ids.count(); i++) { QContact current = cm->contact(ids.at(i)); QContactName nc = current.detail(QContactName::DefinitionName); - if (nc.first() == "Alice" && nc.last() == "inWonderland") { - nc.setMiddle("Fictional"); + if (nc.firstName() == "Alice" && nc.lastName() == "inWonderland") { + nc.setMiddleName("Fictional"); current.saveDetail(&nc); QVERIFY(cm->saveContact(¤t)); QVERIFY(cm->error() == QContactManager::NoError); QContact updated = cm->contact(ids.at(i)); QContactName cn = updated.detail(QContactName::DefinitionName); - QCOMPARE(cn.middle(), nc.middle()); + QCOMPARE(cn.middleName(), nc.middleName()); didUpdate = true; break; } @@ -863,8 +860,8 @@ /* Save a new contact first */ QContact alice; QContactName na; - na.setFirst("Alice"); - na.setLast("inWonderland"); + na.setFirstName("Alice"); + na.setLastName("inWonderland"); alice.saveDetail(&na); QContactPhoneNumber ph; @@ -878,15 +875,15 @@ QVERIFY(cm->error() == QContactManager::NoError); bool atLeastOne = false; - QList ids = cm->contacts(); + QList ids = cm->contactIds(); for(int i = 0; i < ids.count(); i++) { QContact current = cm->contact(ids.at(i)); QContactName nc = current.detail(QContactName::DefinitionName); - if (nc.first() == "Alice" && nc.last() == "inWonderland") { - int currCount = cm->contacts().count(); + if (nc.firstName() == "Alice" && nc.lastName() == "inWonderland") { + int currCount = cm->contactIds().count(); atLeastOne = cm->removeContact(current.id().localId()); QVERIFY(atLeastOne); - QCOMPARE(cm->contacts().count(), currCount - 1); + QCOMPARE(cm->contactIds().count(), currCount - 1); } } @@ -899,40 +896,37 @@ QScopedPointer cm(QContactManager::fromUri(uri)); /* First test null pointer operations */ - QVERIFY(cm->saveContacts(0).count() == 0); + QVERIFY(!cm->saveContacts(0, 0)); QVERIFY(cm->error() == QContactManager::BadArgumentError); - QVERIFY(cm->removeContacts(0).count() == 0); + QVERIFY(!cm->removeContacts(0, 0)); QVERIFY(cm->error() == QContactManager::BadArgumentError); /* Now add 3 contacts, all valid */ QContact a; QContactName na; - na.setFirst("XXXXXX Albert"); + na.setFirstName("XXXXXX Albert"); a.saveDetail(&na); QContact b; QContactName nb; - nb.setFirst("XXXXXX Bob"); + nb.setFirstName("XXXXXX Bob"); b.saveDetail(&nb); QContact c; QContactName nc; - nc.setFirst("XXXXXX Carol"); + nc.setFirstName("XXXXXX Carol"); c.saveDetail(&nc); QList contacts; contacts << a << b << c; - QList errors; - - errors = cm->saveContacts(&contacts); - + QMap errorMap; + // Add one dummy error to test if the errors are reset + errorMap.insert(0, QContactManager::NoError); + QVERIFY(cm->saveContacts(&contacts, &errorMap)); QVERIFY(cm->error() == QContactManager::NoError); - QVERIFY(errors.count() == 3); - QVERIFY(errors.at(0) == QContactManager::NoError); - QVERIFY(errors.at(1) == QContactManager::NoError); - QVERIFY(errors.at(2) == QContactManager::NoError); + QVERIFY(errorMap.count() == 0); /* Make sure our contacts got updated too */ QVERIFY(contacts.count() == 3); @@ -962,12 +956,9 @@ number.setNumber("34567"); QVERIFY(contacts[2].saveDetail(&number)); - errors = cm->saveContacts(&contacts); + QVERIFY(cm->saveContacts(&contacts, &errorMap)); QVERIFY(cm->error() == QContactManager::NoError); - QVERIFY(errors.count() == 3); - QVERIFY(errors.at(0) == QContactManager::NoError); - QVERIFY(errors.at(1) == QContactManager::NoError); - QVERIFY(errors.at(2) == QContactManager::NoError); + QVERIFY(errorMap.count() == 0); /* Retrieve them and check them again */ a = cm->contact(contacts.at(0).id().localId()); @@ -989,12 +980,9 @@ QList ids; QContactLocalId removedIdForLater = b.id().localId(); ids << a.id().localId() << b.id().localId() << c.id().localId(); - errors = cm->removeContacts(&ids); - QVERIFY(errors.count() == 3); + QVERIFY(cm->removeContacts(&ids, &errorMap)); + QVERIFY(errorMap.count() == 0); QVERIFY(cm->error() == QContactManager::NoError); - QVERIFY(errors.at(0) == QContactManager::NoError); - QVERIFY(errors.at(1) == QContactManager::NoError); - QVERIFY(errors.at(2) == QContactManager::NoError); /* Make sure all the ids are now 0 */ QVERIFY(ids.count() == 3); @@ -1016,12 +1004,12 @@ /* Now try removing with all invalid ids (e.g. the ones we just removed) */ ids.clear(); ids << a.id().localId() << b.id().localId() << c.id().localId(); - errors = cm->removeContacts(&ids); + QVERIFY(!cm->removeContacts(&ids, &errorMap)); QVERIFY(cm->error() == QContactManager::DoesNotExistError); - QVERIFY(errors.count() == 3); - QVERIFY(errors.at(0) == QContactManager::DoesNotExistError); - QVERIFY(errors.at(1) == QContactManager::DoesNotExistError); - QVERIFY(errors.at(2) == QContactManager::DoesNotExistError); + QVERIFY(errorMap.count() == 3); + QVERIFY(errorMap.values().at(0) == QContactManager::DoesNotExistError); + QVERIFY(errorMap.values().at(1) == QContactManager::DoesNotExistError); + QVERIFY(errorMap.values().at(2) == QContactManager::DoesNotExistError); /* Try adding some new ones again, this time one with an error */ contacts.clear(); @@ -1035,36 +1023,39 @@ b.saveDetail(&bad); contacts << a << b << c; - errors = cm->saveContacts(&contacts); + QVERIFY(!cm->saveContacts(&contacts, &errorMap)); /* We can't really say what the error will be.. maybe bad argument, maybe invalid detail */ QVERIFY(cm->error() != QContactManager::NoError); - QVERIFY(errors.count() == 3); /* It's permissible to fail all the adds, or to add the successful ones */ - if (errors.at(0) == QContactManager::NoError) { + QVERIFY(errorMap.count() > 0); + QVERIFY(errorMap.count() <= 3); + + // A might have gone through + if (errorMap.keys().contains(0)) { + QVERIFY(errorMap.value(0) != QContactManager::NoError); + QVERIFY(contacts.at(0).id() == QContactId()); + } else { QVERIFY(contacts.at(0).id() != QContactId()); - } else { - QVERIFY(contacts.at(0).id() == QContactId()); } - /* B should definitely have failed */ - QVERIFY(errors.at(1) == QContactManager::InvalidDetailError); + + // B should have failed + QVERIFY(errorMap.value(1) == QContactManager::InvalidDetailError); QVERIFY(contacts.at(1).id() == QContactId()); - /* C might have gone through */ - if (errors.at(2) == QContactManager::NoError) { + // C might have gone through + if (errorMap.keys().contains(2)) { + QVERIFY(errorMap.value(2) != QContactManager::NoError); + QVERIFY(contacts.at(2).id() == QContactId()); + } else { QVERIFY(contacts.at(2).id() != QContactId()); - } else { - QVERIFY(contacts.at(2).id() == QContactId()); } /* Fix up B and re save it */ QVERIFY(contacts[1].removeDetail(&bad)); - errors = cm->saveContacts(&contacts); - QVERIFY(errors.count() == 3); + QVERIFY(cm->saveContacts(&contacts, &errorMap)); + QVERIFY(errorMap.count() == 0); QVERIFY(cm->error() == QContactManager::NoError); - QVERIFY(errors.at(0) == QContactManager::NoError); - QVERIFY(errors.at(1) == QContactManager::NoError); - QVERIFY(errors.at(2) == QContactManager::NoError); /* Now delete 3 items, but with one bad argument */ ids.clear(); @@ -1072,26 +1063,31 @@ ids << removedIdForLater; ids << contacts.at(2).id().localId(); - errors = cm->removeContacts(&ids); - QVERIFY(errors.count() == 3); + QVERIFY(!cm->removeContacts(&ids, &errorMap)); QVERIFY(cm->error() != QContactManager::NoError); /* Again, the backend has the choice of either removing the successful ones, or not */ - if (errors.at(0) == QContactManager::NoError) { - QVERIFY(ids.at(0) == 0); + QVERIFY(errorMap.count() > 0); + QVERIFY(errorMap.count() <= 3); + + // A might have gone through + if (errorMap.keys().contains(0)) { + QVERIFY(errorMap.value(0) != QContactManager::NoError); + QVERIFY(contacts.at(0).id() == QContactId()); } else { - QVERIFY(ids.at(0) != 0); + QVERIFY(contacts.at(0).id() != QContactId()); } /* B should definitely have failed */ - QVERIFY(errors.at(1) == QContactManager::DoesNotExistError); + QVERIFY(errorMap.value(1) == QContactManager::DoesNotExistError); QVERIFY(ids.at(1) == removedIdForLater); - /* C might have gone through */ - if (errors.at(2) == QContactManager::NoError) { - QVERIFY(ids.at(2) == 0); + // A might have gone through + if (errorMap.keys().contains(2)) { + QVERIFY(errorMap.value(2) != QContactManager::NoError); + QVERIFY(contacts.at(2).id() == QContactId()); } else { - QVERIFY(ids.at(2) != 0); + QVERIFY(contacts.at(2).id() != QContactId()); } } @@ -1100,29 +1096,29 @@ /* Create an invalid manager */ QContactManager manager("this should never work"); QVERIFY(manager.managerName() == "invalid"); - QVERIFY(manager.implementationVersion() == 0); + QVERIFY(manager.managerVersion() == 0); /* also, test the other ctor behaviour is sane also */ QContactManager anotherManager("this should never work", 15); QVERIFY(anotherManager.managerName() == "invalid"); - QVERIFY(anotherManager.implementationVersion() == 0); + QVERIFY(anotherManager.managerVersion() == 0); /* Now test that all the operations fail */ - QVERIFY(manager.contacts().count() == 0); + QVERIFY(manager.contactIds().count() == 0); QVERIFY(manager.error() == QContactManager::NotSupportedError); QContact foo; QContactName nf; - nf.setLast("Lastname"); + nf.setLastName("Lastname"); foo.saveDetail(&nf); - QVERIFY(manager.synthesizeDisplayLabel(foo).isEmpty()); + QVERIFY(manager.synthesizedDisplayLabel(foo).isEmpty()); QVERIFY(manager.error() == QContactManager::NotSupportedError); QVERIFY(manager.saveContact(&foo) == false); QVERIFY(manager.error() == QContactManager::NotSupportedError); QVERIFY(foo.id() == QContactId()); - QVERIFY(manager.contacts().count() == 0); + QVERIFY(manager.contactIds().count() == 0); QVERIFY(manager.contact(foo.id().localId()).id() == QContactId()); QVERIFY(manager.contact(foo.id().localId()).isEmpty()); @@ -1131,36 +1127,45 @@ QVERIFY(manager.removeContact(foo.id().localId()) == false); QVERIFY(manager.error() == QContactManager::NotSupportedError); - QVERIFY(manager.saveContacts(0) == QList()); + QMap errorMap; + errorMap.insert(0, QContactManager::NoError); + QVERIFY(!manager.saveContacts(0, &errorMap)); + QVERIFY(errorMap.count() == 0); QVERIFY(manager.error() == QContactManager::BadArgumentError); /* filters */ QContactFilter f; // matches everything QContactDetailFilter df; df.setDetailDefinitionName(QContactDisplayLabel::DefinitionName, QContactDisplayLabel::FieldLabel); - QVERIFY(manager.contacts(QContactFilter()).count() == 0); + QVERIFY(manager.contactIds(QContactFilter()).count() == 0); QVERIFY(manager.error() == QContactManager::NotSupportedError); - QVERIFY(manager.contacts(df).count() == 0); + QVERIFY(manager.contactIds(df).count() == 0); QVERIFY(manager.error() == QContactManager::NotSupportedError); - QVERIFY(manager.contacts(f | f).count() == 0); + QVERIFY(manager.contactIds(f | f).count() == 0); QVERIFY(manager.error() == QContactManager::NotSupportedError); - QVERIFY(manager.contacts(df | df).count() == 0); + QVERIFY(manager.contactIds(df | df).count() == 0); QVERIFY(manager.error() == QContactManager::NotSupportedError); - QVERIFY(manager.filterSupported(f) == false); - QVERIFY(manager.filterSupported(df) == false); + QVERIFY(manager.isFilterSupported(f) == false); + QVERIFY(manager.isFilterSupported(df) == false); QList list; list << foo; - QVERIFY(manager.saveContacts(&list) == (QList() << QContactManager::NotSupportedError)); + + QVERIFY(!manager.saveContacts(&list, &errorMap)); + QVERIFY(errorMap.count() == 1); + QVERIFY(errorMap.value(0) == QContactManager::NotSupportedError); QVERIFY(manager.error() == QContactManager::NotSupportedError); - QVERIFY(manager.removeContacts(0) == QList()); + QVERIFY(!manager.removeContacts(0, &errorMap)); + QVERIFY(errorMap.count() == 0); QVERIFY(manager.error() == QContactManager::BadArgumentError); QList idlist; idlist << foo.id().localId(); - QVERIFY(manager.removeContacts(&idlist) == (QList() << QContactManager::NotSupportedError)); + QVERIFY(!manager.removeContacts(&idlist, &errorMap)); + QVERIFY(errorMap.count() == 1); + QVERIFY(errorMap.value(0) == QContactManager::NotSupportedError); QVERIFY(manager.error() == QContactManager::NotSupportedError); /* Detail definitions */ @@ -1168,11 +1173,10 @@ QVERIFY(manager.error() == QContactManager::NotSupportedError || manager.error() == QContactManager::InvalidContactTypeError); QContactDetailDefinition def; - def.setAccessConstraint(QContactDetailDefinition::CreateOnly); def.setUnique(true); def.setName("new field"); - QMap fields; - QContactDetailDefinitionField currField; + QMap fields; + QContactDetailFieldDefinition currField; currField.setDataType(QVariant::String); fields.insert("value", currField); def.setFields(fields); @@ -1244,15 +1248,15 @@ // add a contact to each of m1, m2, m3 QContact c; QContactName nc; - nc.setFirst("John"); - nc.setLast("Civilian"); + nc.setFirstName("John"); + nc.setLastName("Civilian"); c.saveDetail(&nc); m1.saveContact(&c); c.setId(QContactId()); QContact c2; QContactName nc2 = c2.detail(QContactName::DefinitionName); c2 = c; - nc2.setMiddle("Public"); + nc2.setMiddleName("Public"); c2.saveDetail(&nc2); m2.saveContact(&c2); // save c2 first; c will be given a higher id m2.saveContact(&c); // save c to m2 @@ -1264,32 +1268,32 @@ /* test that m1 != m2 != m3 and that m3 == m4 */ // check the counts are correct - especially note m4 and m3. - QCOMPARE(m1.contacts().count(), 1); - QCOMPARE(m2.contacts().count(), 2); - QCOMPARE(m3.contacts().count(), 1); - QCOMPARE(m4.contacts().count(), 1); - QCOMPARE(m5.contacts().count(), 0); + QCOMPARE(m1.contactIds().count(), 1); + QCOMPARE(m2.contactIds().count(), 2); + QCOMPARE(m3.contactIds().count(), 1); + QCOMPARE(m4.contactIds().count(), 1); + QCOMPARE(m5.contactIds().count(), 0); // remove c2 from m2 - ensure that this doesn't affect any other manager. m2.removeContact(c2.id().localId()); - QCOMPARE(m1.contacts().count(), 1); - QCOMPARE(m2.contacts().count(), 1); - QCOMPARE(m3.contacts().count(), 1); - QCOMPARE(m4.contacts().count(), 1); - QCOMPARE(m5.contacts().count(), 0); + QCOMPARE(m1.contactIds().count(), 1); + QCOMPARE(m2.contactIds().count(), 1); + QCOMPARE(m3.contactIds().count(), 1); + QCOMPARE(m4.contactIds().count(), 1); + QCOMPARE(m5.contactIds().count(), 0); // check that the contacts contained within are different. // note that in the m1->m2 case, only the id will be different! - QVERIFY(m1.contact(m1.contacts().at(0)) != m2.contact(m2.contacts().at(0))); - QVERIFY(m1.contact(m1.contacts().at(0)) != m3.contact(m3.contacts().at(0))); - QVERIFY(m2.contact(m2.contacts().at(0)) != m3.contact(m3.contacts().at(0))); - QVERIFY(m3.contact(m3.contacts().at(0)) == m4.contact(m4.contacts().at(0))); + QVERIFY(m1.contact(m1.contactIds().at(0)) != m2.contact(m2.contactIds().at(0))); + QVERIFY(m1.contact(m1.contactIds().at(0)) != m3.contact(m3.contactIds().at(0))); + QVERIFY(m2.contact(m2.contactIds().at(0)) != m3.contact(m3.contactIds().at(0))); + QVERIFY(m3.contact(m3.contactIds().at(0)) == m4.contact(m4.contactIds().at(0))); // now, we should be able to remove from m4, and have m3 empty QVERIFY(m4.removeContact(c.id().localId())); - QCOMPARE(m3.contacts().count(), 0); - QCOMPARE(m4.contacts().count(), 0); - QCOMPARE(m5.contacts().count(), 0); + QCOMPARE(m3.contactIds().count(), 0); + QCOMPARE(m4.contactIds().count(), 0); + QCOMPARE(m5.contactIds().count(), 0); } void tst_QContactManager::nameSynthesis_data() @@ -1534,15 +1538,15 @@ QContactOrganization org, org2; name.setPrefix(prefix); - name.setFirst(first); - name.setMiddle(middle); - name.setLast(last); + name.setFirstName(first); + name.setMiddleName(middle); + name.setLastName(last); name.setSuffix(suffix); name2.setPrefix(secondprefix); - name2.setFirst(secondfirst); - name2.setMiddle(secondmiddle); - name2.setLast(secondlast); + name2.setFirstName(secondfirst); + name2.setMiddleName(secondmiddle); + name2.setLastName(secondlast); name2.setSuffix(secondsuffix); org.setName(company); @@ -1558,7 +1562,7 @@ c.saveDetail(&org2); // Finally! - QCOMPARE(cm.synthesizeDisplayLabel(c), expected); + QCOMPARE(cm.synthesizedDisplayLabel(c), expected); } void tst_QContactManager::contactValidation() @@ -1576,8 +1580,8 @@ * 4) a unique create only detail */ QContactDetailDefinition uniqueDef; - QMap fields; - QContactDetailDefinitionField field; + QMap fields; + QContactDetailFieldDefinition field; field.setDataType(QVariant::String); fields.insert("value", field); @@ -1596,27 +1600,6 @@ QVERIFY(cm->saveDetailDefinition(restrictedDef)); - QContactDetailDefinition createOnlyDef; - createOnlyDef.setName("CreateOnlyDetail"); - createOnlyDef.setAccessConstraint(QContactDetailDefinition::CreateOnly); - fields.clear(); - field.setAllowableValues(QList()); - fields.insert("value", field); - createOnlyDef.setFields(fields); - - QVERIFY(cm->saveDetailDefinition(createOnlyDef)); - - QContactDetailDefinition createOnlyUniqueDef; - createOnlyUniqueDef.setName("CreateOnlyUniqueDetail"); - createOnlyUniqueDef.setAccessConstraint(QContactDetailDefinition::CreateOnly); - createOnlyUniqueDef.setUnique(true); - fields.clear(); - field.allowableValues().clear(); - fields.insert("value", field); - createOnlyUniqueDef.setFields(fields); - - QVERIFY(cm->saveDetailDefinition(createOnlyUniqueDef)); - // first, test an invalid definition QContactDetail d1 = QContactDetail("UnknownDefinition"); d1.setValue("test", "test"); @@ -1681,40 +1664,6 @@ QVERIFY(cm->saveContact(&c)); QCOMPARE(cm->error(), QContactManager::NoError); c.removeDetail(&d7); - - /* Test a write once detail */ - QContactDetail d8 = QContactDetail("CreateOnlyDetail"); - d8.setValue("value", "First value"); - c.saveDetail(&d8); - - QVERIFY(cm->saveContact(&c)); - QCOMPARE(cm->error(), QContactManager::NoError); - - /* Changing or adding some other detail should also be fine, and resaving it */ - QContactPhoneNumber p1; - p1.setNumber("123467"); - c.saveDetail(&p1); - QVERIFY(cm->saveContact(&c)); - QCOMPARE(cm->error(), QContactManager::NoError); - - /* Adding a second detail should be fine */ - QContactDetail d9 = QContactDetail("CreateOnlyDetail"); - d9.setValue("value", "Second value"); - c.saveDetail(&d9); - QVERIFY(cm->saveContact(&c)); - QCOMPARE(cm->error(), QContactManager::NoError); - - /* Changing a value should fail */ - d8.setValue("value", "Third value"); - c.saveDetail(&d8); - - QVERIFY(!cm->saveContact(&c)); - QCOMPARE(cm->error(), QContactManager::DetailAccessError); - - c.removeDetail(&d8); - /* Removing a create only should also fail */ - QVERIFY(!cm->saveContact(&c)); - QCOMPARE(cm->error(), QContactManager::DetailAccessError); } void tst_QContactManager::signalEmission() @@ -1744,7 +1693,7 @@ // verify add emits signal added QContactName nc; - nc.setFirst("John"); + nc.setFirstName("John"); c.saveDetail(&nc); m1->saveContact(&c); addSigCount += 1; @@ -1755,7 +1704,7 @@ temp = QContactLocalId(args.at(0).value()); // verify save modified emits signal changed - nc.setLast("Citizen"); + nc.setLastName("Citizen"); c.saveDetail(&nc); m1->saveContact(&c); modSigCount += 1; @@ -1777,8 +1726,8 @@ // verify multiple adds works as advertised QContact c2, c3; QContactName nc2, nc3; - nc2.setFirst("Mark"); - nc3.setFirst("Garry"); + nc2.setFirstName("Mark"); + nc3.setFirstName("Garry"); c2.saveDetail(&nc2); c3.saveDetail(&nc3); QVERIFY(!m1->saveContact(&c)); // saving contact with nonexistent id fails @@ -1790,12 +1739,12 @@ QTRY_COMPARE(spyCA.count(), addSigCount); // verify multiple modifies works as advertised - nc2.setLast("M."); + nc2.setLastName("M."); c2.saveDetail(&nc2); QVERIFY(m1->saveContact(&c2)); modSigCount += 1; nc2.setPrefix("Mr."); - nc3.setLast("G."); + nc3.setLastName("G."); c2.saveDetail(&nc2); c3.saveDetail(&nc3); QVERIFY(m1->saveContact(&c2)); @@ -1823,7 +1772,8 @@ c2.setId(QContactId()); c3.setId(QContactId()); batchAdd << c << c2 << c3; - m1->saveContacts(&batchAdd); + QMap errorMap; + QVERIFY(m1->saveContacts(&batchAdd, &errorMap)); QVERIFY(batchAdd.count() == 3); c = batchAdd.at(0); @@ -1851,14 +1801,14 @@ batchAdd.clear(); batchAdd << c << c2 << c3; - m1->saveContacts(&batchAdd); + QVERIFY(m1->saveContacts(&batchAdd, &errorMap)); sigids.clear(); QTRY_WAIT( while(spyCM.size() > 0) {sigids += spyCM.takeFirst().at(0).value >(); }, sigids.contains(c.localId()) && sigids.contains(c2.localId()) && sigids.contains(c3.localId())); /* Batch removes */ batchRemove << c.id().localId() << c2.id().localId() << c3.id().localId(); - m1->removeContacts(&batchRemove); + QVERIFY(m1->removeContacts(&batchRemove, &errorMap)); sigids.clear(); QTRY_WAIT( while(spyCR.size() > 0) {sigids += spyCR.takeFirst().at(0).value >(); }, sigids.contains(c.localId()) && sigids.contains(c2.localId()) && sigids.contains(c3.localId())); @@ -1904,7 +1854,7 @@ QVERIFY(m2.error() == QContactManager::NoError); /* Cause an error on the other ones and check the first is not affected */ - m2.saveContacts(0); + m2.saveContacts(0, 0); QVERIFY(m1.error() == QContactManager::DoesNotExistError); QVERIFY(m2.error() == QContactManager::BadArgumentError); @@ -1992,8 +1942,8 @@ /* Try to make a credible definition */ QContactDetailDefinition newDef; - QContactDetailDefinitionField field; - QMap fields; + QContactDetailFieldDefinition field; + QMap fields; field.setDataType(cm->supportedDataTypes().value(0)); fields.insert("New Value", field); newDef.setName("New Definition"); @@ -2012,8 +1962,6 @@ fields.insert("Restricted value", field); allowedDef.setFields(fields); - /* XXX A create only definition */ - /* Many invalid definitions */ QContactDetailDefinition noIdDef; noIdDef.setFields(fields); @@ -2021,21 +1969,16 @@ QContactDetailDefinition noFieldsDef; noFieldsDef.setName("No fields"); - QContactDetailDefinition readOnlyDef; - readOnlyDef.setName("Read only"); - readOnlyDef.setAccessConstraint(QContactDetailDefinition::ReadOnly); - readOnlyDef.setFields(fields); - QContactDetailDefinition invalidFieldKeyDef; invalidFieldKeyDef.setName("Invalid field key"); - QMap badfields; + QMap badfields; badfields.insert(QString(), field); invalidFieldKeyDef.setFields(badfields); QContactDetailDefinition invalidFieldTypeDef; invalidFieldTypeDef.setName("Invalid field type"); badfields.clear(); - QContactDetailDefinitionField badfield; + QContactDetailFieldDefinition badfield; badfield.setDataType((QVariant::Type) qMetaTypeId()); badfields.insert("Bad type", badfield); invalidFieldTypeDef.setFields(badfields); @@ -2067,9 +2010,6 @@ QVERIFY(cm->saveDetailDefinition(noFieldsDef) == false); QVERIFY(cm->error() == QContactManager::BadArgumentError); - QVERIFY(cm->saveDetailDefinition(readOnlyDef) == false); - QVERIFY(cm->error() == QContactManager::BadArgumentError); - QVERIFY(cm->saveDetailDefinition(invalidFieldKeyDef) == false); QVERIFY(cm->error() == QContactManager::BadArgumentError); @@ -2095,7 +2035,7 @@ QVERIFY(def == newDef); /* Update it */ - QMap newFields = def.fields(); + QMap newFields = def.fields(); newFields.insert("Another new value", field); newDef.setFields(newFields); @@ -2160,7 +2100,7 @@ QVERIFY(d.displayLabel().isEmpty()); QVERIFY(d.saveDetail(&name)); - QString synth = cm->synthesizeDisplayLabel(d); + QString synth = cm->synthesizedDisplayLabel(d); /* * The display label is not updated until you save the contact. @@ -2366,11 +2306,14 @@ QFETCH(QString, uri); QScopedPointer cm(QContactManager::fromUri(uri)); + if (!cm->hasFeature(QContactManager::DetailOrdering)) + QSKIP("Skipping: This manager does not support detail ordering!", SkipSingle); + QContact a; //phone numbers QContactDetailDefinition d = cm->detailDefinition(QContactPhoneNumber::DefinitionName, QContactType::TypeContact); - QContactDetailDefinitionField supportedContexts = d.fields().value(QContactDetail::FieldContext); + QContactDetailFieldDefinition supportedContexts = d.fields().value(QContactDetail::FieldContext); QString contextOther = QContactDetail::ContextOther; if (!supportedContexts.allowableValues().contains(contextOther)) { contextOther = QString(); @@ -2959,9 +2902,9 @@ QContactDetailFilter groupFilter; groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup))); - QVERIFY(cm->contacts(groupFilter).contains(g1.localId())); - QVERIFY(cm->contacts(groupFilter).contains(g2.localId())); - QVERIFY(!cm->contacts(groupFilter).contains(c.localId())); + QVERIFY(cm->contactIds(groupFilter).contains(g1.localId())); + QVERIFY(cm->contactIds(groupFilter).contains(g2.localId())); + QVERIFY(!cm->contactIds(groupFilter).contains(c.localId())); QList sortOrders; QContactSortOrder byPhoneNumber; @@ -2969,7 +2912,7 @@ sortOrders.append(byPhoneNumber); // and ensure that sorting works properly with typed contacts also - QList sortedIds = cm->contacts(groupFilter, sortOrders); + QList sortedIds = cm->contactIds(groupFilter, sortOrders); QVERIFY(sortedIds.indexOf(g2.localId()) < sortedIds.indexOf(g1.localId())); cm->removeContact(g1.localId()); diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qcontactmanagerdataholder.h --- a/qtcontactsmobility/tests/auto/qcontactmanagerdataholder.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qcontactmanagerdataholder.h Fri Apr 16 14:53:18 2010 +0300 @@ -76,12 +76,13 @@ QContactManager* cm = QContactManager::fromUri(mgrUri); if (cm) { QList contacts; - foreach (const QContactLocalId id, cm->contacts()) { + foreach (const QContactLocalId id, cm->contactIds()) { contacts.push_back(cm->contact(id)); } savedContacts.insert(cm->managerName(),contacts); - QList ids = cm->contacts(); - cm->removeContacts(&ids); + QList ids = cm->contactIds(); + QMap errorMap; + cm->removeContacts(&ids, &errorMap); delete cm; } } diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qcontactmanagerfiltering/tst_qcontactmanagerfiltering.cpp --- a/qtcontactsmobility/tests/auto/qcontactmanagerfiltering/tst_qcontactmanagerfiltering.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qcontactmanagerfiltering/tst_qcontactmanagerfiltering.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -96,9 +96,10 @@ QPair definitionAndField(QContactManager *cm, QVariant::Type type, bool *nativelyFilterable); QList prepareModel(QContactManager* cm); // add the standard contacts + QString convertIds(QList allIds, QList ids); // convert back to "abcd" - - QMap contactAId; + QContact createContact(QContactManager* cm, QString type, QString name); + QMap > > defAndFieldNamesForTypePerManager; QMultiMap contactsAddedToManagers; QMultiMap detailDefinitionsAddedToManagers; @@ -254,8 +255,11 @@ QString prefixname = QContactName::FieldPrefix; QString suffixname = QContactName::FieldSuffix; QString nickname = QContactNickname::DefinitionName; + QString nicknameField = QContactNickname::FieldNickname; QString emailaddr = QContactEmailAddress::DefinitionName; QString emailfield = QContactEmailAddress::FieldEmailAddress; + QString phonenumber = QContactPhoneNumber::DefinitionName; + QString number = QContactPhoneNumber::FieldNumber; for (int i = 0; i < managers.size(); i++) { QContactManager *manager = managers.at(i); @@ -296,16 +300,32 @@ newMRow("Name == Aaron, fixed, case sensitive", manager) << manager << name << firstname << QVariant("Aaron") << (int)(Qt::MatchFixedString | Qt::MatchCaseSensitive) << "a"; newMRow("Name == aaron, fixed, case sensitive", manager) << manager << name << firstname << QVariant("aaron") << (int)(Qt::MatchFixedString | Qt::MatchCaseSensitive) << es; - // middle name, prefix, suffix, nickname + // middle name newMRow("MName == Arne", manager) << manager << name << middlename << QVariant("Arne") << (int)(Qt::MatchContains) << "a"; + + // prefix newMRow("Prefix == Sir", manager) << manager << name << prefixname << QVariant("Sir") << (int)(Qt::MatchContains) << "a"; + + // prefix newMRow("Suffix == Dr.", manager) << manager << name << suffixname << QVariant("Dr.") << (int)(Qt::MatchContains) << "a"; - newMRow("Nickname == Sir Aaron", manager) << manager << nickname << es << QVariant("Sir Aaron") << (int)(Qt::MatchContains) << "a"; + + // nickname + newMRow("Nickname detail exists", manager) << manager << nickname << es << QVariant() << 0 << "ab"; + newMRow("Nickname == Aaron, contains", manager) << manager << nickname << nicknameField << QVariant("Aaron") << (int)(Qt::MatchContains) << "a"; // email newMRow("Email == Aaron@Aaronson.com", manager) << manager << emailaddr << emailfield << QVariant("Aaron@Aaronson.com") << 0 << "a"; newMRow("Email == Aaron@Aaronsen.com", manager) << manager << emailaddr << emailfield << QVariant("Aaron@Aaronsen.com") << 0 << es; - + + // phone number + newMRow("Phone number detail exists", manager) << manager << phonenumber << es << QVariant("") << 0 << "ab"; + newMRow("Phone number = 555-1212", manager) << manager << phonenumber << number << QVariant("555-1212") << (int) QContactFilter::MatchExactly << "a"; + newMRow("Phone number = 34, contains", manager) << manager << phonenumber << number << QVariant("34") << (int) QContactFilter::MatchContains << "b"; + newMRow("Phone number = 555, starts with", manager) << manager << phonenumber << number << QVariant("555") << (int) QContactFilter::MatchStartsWith << "ab"; + newMRow("Phone number = 1212, ends with", manager) << manager << phonenumber << number << QVariant("1212") << (int) QContactFilter::MatchEndsWith << "a"; + newMRow("Phone number = 555-1212, match phone number", manager) << manager << phonenumber << number << QVariant("555-1212") << (int) QContactFilter::MatchPhoneNumber << "a"; + newMRow("Phone number = 555, keypad collation", manager) << manager << phonenumber << number << QVariant("555") << (int) QContactFilter::MatchKeypadCollation << "ab"; + /* Converting other types to strings */ QPair defAndFieldNames = defAndFieldNamesForTypePerManager.value(manager).value("Integer"); if (!defAndFieldNames.first.isEmpty() && !defAndFieldNames.second.isEmpty()) { @@ -340,10 +360,10 @@ if (cm->managerName() == "memory") { /* At this point, since we're using memory, assume the filter isn't really supported */ - QVERIFY(cm->filterSupported(df) == false); + QVERIFY(cm->isFilterSupported(df) == false); } - ids = cm->contacts(df); + ids = cm->contactIds(df); QString output = convertIds(contacts, ids); QEXPECT_FAIL("integer == 20", "Not sure if this should pass or fail", Continue); @@ -608,10 +628,10 @@ if (cm->managerName() == "memory") { /* At this point, since we're using memory, assume the filter isn't really supported */ - QVERIFY(cm->filterSupported(df) == false); + QVERIFY(cm->isFilterSupported(df) == false); } - ids = cm->contacts(df); + ids = cm->contactIds(df); QString output = convertIds(contacts, ids); QCOMPARE_UNSORTED(output, expected); @@ -791,9 +811,9 @@ if (cm->managerName() == "memory") { /* At this point, since we're using memory, assume the filter isn't really supported */ - QVERIFY(cm->filterSupported(drf) == false); + QVERIFY(cm->isFilterSupported(drf) == false); } - ids = cm->contacts(drf); + ids = cm->contactIds(drf); QString output = convertIds(contacts, ids); QCOMPARE_UNSORTED(output, expected); @@ -1232,7 +1252,7 @@ QList contacts = contactsAddedToManagers.values(cm); QList ids; - ids = cm->contacts(resultFilter); + ids = cm->contactIds(resultFilter); QString output = convertIds(contacts, ids); QCOMPARE_UNSORTED(output, expected); @@ -1675,7 +1695,7 @@ QList contacts = contactsAddedToManagers.values(cm); QList ids; - ids = cm->contacts(resultFilter); + ids = cm->contactIds(resultFilter); QString output = convertIds(contacts, ids); QCOMPARE_UNSORTED(output, expected); @@ -1688,75 +1708,163 @@ void tst_QContactManagerFiltering::relationshipFiltering_data() { QTest::addColumn("cm"); - QTest::addColumn("role"); + QTest::addColumn("relatedContactRole"); QTest::addColumn("relationshipType"); - QTest::addColumn("otherLocalId"); + QTest::addColumn("relatedContactLocalId"); QTest::addColumn("otherManagerUri"); QTest::addColumn("expected"); for (int i = 0; i < managers.size(); i++) { QContactManager *manager = managers.at(i); - // match any contact that plays the "first" role in a "Has Assistant" relationship with ANY OTHER CONTACT - QTest::newRow("RF-1") << manager << static_cast(QContactRelationshipFilter::First) << QString(QLatin1String(QContactRelationship::HasAssistant)) << static_cast(0) << QString() << "ad"; - - // match any contact that plays the "second" role in a "Has Assistant" relationship with ANY OTHER CONTACT - QTest::newRow("RF-2") << manager << static_cast(QContactRelationshipFilter::Second) << QString(QLatin1String(QContactRelationship::HasAssistant)) << static_cast(0) << QString() << "abc"; - - // match any contact that plays any role in a "Has Assistant" relationship with ANY OTHER CONTACT - QTest::newRow("RF-3") << manager << static_cast(QContactRelationshipFilter::Either) << QString(QLatin1String(QContactRelationship::HasAssistant)) << static_cast(0) << QString() << "abcd"; - - // match any contact that plays the "first" role in a "Has Assistant" relationship with contact-A - QTest::newRow("RF-4") << manager << static_cast(QContactRelationshipFilter::First) << QString(QLatin1String(QContactRelationship::HasAssistant)) << static_cast(contactAId.value(manager).localId()) << contactAId.value(manager).managerUri() << "d"; - - // match any contact that plays the "second" role in a "Has Assistant" relationship with contact-A - QTest::newRow("RF-5") << manager << static_cast(QContactRelationshipFilter::Second) << QString(QLatin1String(QContactRelationship::HasAssistant)) << static_cast(contactAId.value(manager).localId()) << contactAId.value(manager).managerUri() << "bc"; - - // match any contact that plays any role in a "Has Assistant" relationship with contact-A - QTest::newRow("RF-6") << manager << static_cast(QContactRelationshipFilter::Either) << QString(QLatin1String(QContactRelationship::HasAssistant)) << static_cast(contactAId.value(manager).localId()) << contactAId.value(manager).managerUri() << "bcd"; - - // match any contact that plays the "first" role in any relationship with contact-A - QTest::newRow("RF-7") << manager << static_cast(QContactRelationshipFilter::First) << QString() << static_cast(contactAId.value(manager).localId()) << contactAId.value(manager).managerUri() << "d"; - - // match any contact that plays the "second" role in any relationship with contact-A - QTest::newRow("RF-8") << manager << static_cast(QContactRelationshipFilter::Second) << QString() << static_cast(contactAId.value(manager).localId()) << contactAId.value(manager).managerUri() << "bce"; - - // match any contact that plays any role in any relationship with contact-A - QTest::newRow("RF-9") << manager << static_cast(QContactRelationshipFilter::Either) << QString() << static_cast(contactAId.value(manager).localId()) << contactAId.value(manager).managerUri() << "bcde"; + // HasMember + QTest::newRow("RF-1") << manager << static_cast(QContactRelationshipFilter::Second) << QString(QLatin1String(QContactRelationship::HasMember)) << static_cast(0) << QString() << "a"; + QTest::newRow("RF-2") << manager << static_cast(QContactRelationshipFilter::First) << QString(QLatin1String(QContactRelationship::HasMember)) << static_cast(0) << QString() << "b"; + QTest::newRow("RF-3") << manager << static_cast(QContactRelationshipFilter::Either) << QString(QLatin1String(QContactRelationship::HasMember)) << static_cast(0) << QString() << "ab"; + + // match any contact that has an assistant + QTest::newRow("RF-4") << manager << static_cast(QContactRelationshipFilter::Second) << QString(QLatin1String(QContactRelationship::HasAssistant)) << static_cast(0) << QString() << "a"; + // match any contact that is an assistant + QTest::newRow("RF-5") << manager << static_cast(QContactRelationshipFilter::First) << QString(QLatin1String(QContactRelationship::HasAssistant)) << static_cast(0) << QString() << "b"; + // match any contact that has an assistant or is an assistant + QTest::newRow("RF-6") << manager << static_cast(QContactRelationshipFilter::Either) << QString(QLatin1String(QContactRelationship::HasAssistant)) << static_cast(0) << QString() << "ab"; + + // IsSameAs + QTest::newRow("RF-7") << manager << static_cast(QContactRelationshipFilter::Second) << QString(QLatin1String(QContactRelationship::IsSameAs)) << static_cast(0) << QString() << "a"; + QTest::newRow("RF-8") << manager << static_cast(QContactRelationshipFilter::First) << QString(QLatin1String(QContactRelationship::IsSameAs)) << static_cast(0) << QString() << "b"; + QTest::newRow("RF-9") << manager << static_cast(QContactRelationshipFilter::Either) << QString(QLatin1String(QContactRelationship::IsSameAs)) << static_cast(0) << QString() << "ab"; + + // Aggregates + QTest::newRow("RF-10") << manager << static_cast(QContactRelationshipFilter::Second) << QString(QLatin1String(QContactRelationship::Aggregates)) << static_cast(0) << QString() << "a"; + QTest::newRow("RF-11") << manager << static_cast(QContactRelationshipFilter::First) << QString(QLatin1String(QContactRelationship::Aggregates)) << static_cast(0) << QString() << "b"; + QTest::newRow("RF-12") << manager << static_cast(QContactRelationshipFilter::Either) << QString(QLatin1String(QContactRelationship::Aggregates)) << static_cast(0) << QString() << "ab"; + + // HasManager + QTest::newRow("RF-13") << manager << static_cast(QContactRelationshipFilter::Second) << QString(QLatin1String(QContactRelationship::HasManager)) << static_cast(0) << QString() << "a"; + QTest::newRow("RF-14") << manager << static_cast(QContactRelationshipFilter::First) << QString(QLatin1String(QContactRelationship::HasManager)) << static_cast(0) << QString() << "b"; + QTest::newRow("RF-15") << manager << static_cast(QContactRelationshipFilter::Either) << QString(QLatin1String(QContactRelationship::HasManager)) << static_cast(0) << QString() << "ab"; + + // HasSpouse + QTest::newRow("RF-16") << manager << static_cast(QContactRelationshipFilter::Second) << QString(QLatin1String(QContactRelationship::HasSpouse)) << static_cast(0) << QString() << "a"; + QTest::newRow("RF-17") << manager << static_cast(QContactRelationshipFilter::First) << QString(QLatin1String(QContactRelationship::HasSpouse)) << static_cast(0) << QString() << "b"; + QTest::newRow("RF-18") << manager << static_cast(QContactRelationshipFilter::Either) << QString(QLatin1String(QContactRelationship::HasSpouse)) << static_cast(0) << QString() << "ab"; + + // Unknown relationship + QTest::newRow("RF-19") << manager << static_cast(QContactRelationshipFilter::Second) << QString(QLatin1String("UnknownRelationship")) << static_cast(0) << QString() << ""; + QTest::newRow("RF-20") << manager << static_cast(QContactRelationshipFilter::First) << QString(QLatin1String("UnknownRelationship")) << static_cast(0) << QString() << ""; + QTest::newRow("RF-21") << manager << static_cast(QContactRelationshipFilter::Either) << QString(QLatin1String("UnknownRelationship")) << static_cast(0) << QString() << ""; + + // match any contact that is the related contact in a relationship with contact-A + //QTest::newRow("RF-19") << manager << static_cast(QContactRelationshipFilter::Second) << QString() << static_cast(contactAId.value(manager).localId()) << contactAId.value(manager).managerUri() << "h"; + // match any contact has contact-A as the related contact + //QTest::newRow("RF-20") << manager << static_cast(QContactRelationshipFilter::First) << QString() << static_cast(contactAId.value(manager).localId()) << contactAId.value(manager).managerUri() << "i"; + // match any contact that has any relationship with contact-A + //QTest::newRow("RF-21") << manager << static_cast(QContactRelationshipFilter::Either) << QString() << static_cast(contactAId.value(manager).localId()) << contactAId.value(manager).managerUri() << "hi"; } } +QContact tst_QContactManagerFiltering::createContact(QContactManager* cm, QString type, QString name) +{ + QContact contact; + contact.setType(type); + QContactName contactName; + QContactDetailDefinition detailDefinition = cm->detailDefinition(QContactName::DefinitionName, type); + detailDefinition.removeField(QContactDetail::FieldContext); + foreach(QString fieldKey, detailDefinition.fields().keys()) { + contactName.setValue(fieldKey, name); + } + contact.saveDetail(&contactName); + cm->saveContact(&contact); + return contact; +} + void tst_QContactManagerFiltering::relationshipFiltering() { QFETCH(QContactManager*, cm); - QFETCH(int, role); + QFETCH(int, relatedContactRole); QFETCH(QString, relationshipType); - QFETCH(unsigned int, otherLocalId); + QFETCH(unsigned int, relatedContactLocalId); QFETCH(QString, otherManagerUri); QFETCH(QString, expected); - // first, build the other participant id properly. - QContactId otherParticipantId; - otherParticipantId.setLocalId(QContactLocalId(otherLocalId)); - otherParticipantId.setManagerUri(otherManagerUri); - - // then, construct our filter. + // TODO: A little re-factoring could be used to make the test case more readable + + // 1. Create contacts to be used in relationship testing + QContact contactA; + if(relationshipType == QContactRelationship::HasMember) { + // Change contact type to group as this is required at least by symbian backend + // TODO: should it be possible to query this constraint from the backend? + contactA = createContact(cm, QContactType::TypeGroup, "ContactA"); + } else { + contactA = createContact(cm, QContactType::TypeContact, "ContactA"); + } + QContact contactB = createContact(cm, QContactType::TypeContact, "ContactB"); + + // 2. Create the relationship between the contacts + QContactId firstId; + firstId.setLocalId(contactA.localId()); + firstId.setManagerUri(contactA.id().managerUri()); + QContactId secondId; + secondId.setLocalId(contactB.localId()); + secondId.setManagerUri(contactB.id().managerUri()); + + QContactRelationship h2i; + h2i.setFirst(firstId); + h2i.setSecond(secondId); + h2i.setRelationshipType(relationshipType); + // save and check error code + bool succeeded = false; + if((cm->hasFeature(QContactManager::Relationships) + && cm->supportedRelationshipTypes().contains(relationshipType)) + || cm->hasFeature(QContactManager::ArbitraryRelationshipTypes)) { + succeeded = true; + QVERIFY(cm->saveRelationship(&h2i)); + QCOMPARE(cm->error(), QContactManager::NoError); + } else { + QVERIFY(!cm->saveRelationship(&h2i)); + QCOMPARE(cm->error(), QContactManager::NotSupportedError); + } + + // 3. Construct the filter + QContactId relatedContactId; + relatedContactId.setLocalId(relatedContactLocalId); + relatedContactId.setManagerUri(otherManagerUri); + QContactRelationshipFilter crf; - crf.setRole(static_cast(role)); + crf.setRelatedContactRole(static_cast(relatedContactRole)); crf.setRelationshipType(relationshipType); - crf.setOtherParticipantId(otherParticipantId); - - // grab our results - QList contacts = contactsAddedToManagers.values(cm); - QList ids; - ids = cm->contacts(crf); - - // and compare. + crf.setRelatedContactId(relatedContactId); + + // 4. Grab the filtering results + QList contacts; + contacts.append(contactA.localId()); + contacts.append(contactB.localId()); + QList ids = cm->contactIds(crf); QString output = convertIds(contacts, ids); - if (cm->hasFeature(QContactManager::Relationships)) { + + // 5. Remove the created relationship and contacts + if(succeeded) { + // Check that an existing relationship can be removed + QVERIFY(cm->removeRelationship(h2i)); + QCOMPARE(cm->error(), QContactManager::NoError); + } else { + // Check that non-existing relationship cannot be removed + QVERIFY(!cm->removeRelationship(h2i)); + //TODO: what is the expected error code? + //QCOMPARE(cm->error(), QContactManager::DoesNotExistError); + } + foreach (const QContactLocalId& cid, contacts) { + cm->removeContact(cid); + } + + // 6. Verify the filtering result + if (!cm->hasFeature(QContactManager::Relationships)) { + QSKIP("Manager does not support relationships; skipping relationship filtering", SkipSingle); + } else if(relationshipType.isEmpty() + || cm->supportedRelationshipTypes().contains(relationshipType)) { QCOMPARE_UNSORTED(output, expected); } else { - QSKIP("Manager does not support relationships; skipping relationship filtering", SkipSingle); + QSKIP("Manager does not support relationship type; skipping", SkipSingle); } } @@ -1822,7 +1930,7 @@ if (setbp) s.setBlankPolicy(blankpolicy); - ids = cm->contacts(s); + ids = cm->contactIds(s); QString output = convertIds(contacts, ids); // It's possible to get some contacts back in an arbitrary order (since we single sort) @@ -1845,7 +1953,7 @@ QContactDetailFilter presenceName; presenceName.setDetailDefinitionName(QContactName::DefinitionName); - ids = cm->contacts(presenceName, s); + ids = cm->contactIds(presenceName, s); output = convertIds(contacts, ids); @@ -1984,7 +2092,7 @@ if (secondsort) sortOrders.append(ss); - QList ids = cm->contacts(sortOrders); + QList ids = cm->contactIds(sortOrders); QString output = convertIds(contacts, ids); // Just like the single sort test, we might get some contacts back in indeterminate order @@ -2154,7 +2262,7 @@ af.setValue(value); af.setVendor(vendorName, version); - QList ids = cm->contacts(af); + QList ids = cm->contactIds(af); QList contacts = contactsAddedToManagers.values(cm); QString output = convertIds(contacts, ids); @@ -2219,7 +2327,7 @@ idf.setIds(ids); /* Retrieve contacts matching the filter, and compare (unsorted) output */ - ids = cm->contacts(idf); + ids = cm->contactIds(idf); QString output = convertIds(contacts, ids); QCOMPARE_UNSORTED(output, expected); } @@ -2240,14 +2348,14 @@ QList contacts = contactsAddedToManagers.values(cm); QContactInvalidFilter f; // invalid - QList ids = cm->contacts(f); + QList ids = cm->contactIds(f); QVERIFY(ids.count() == 0); // Try unions/intersections of invalids too - ids = cm->contacts(f | f); + ids = cm->contactIds(f | f); QVERIFY(ids.count() == 0); - ids = cm->contacts(f & f); + ids = cm->contactIds(f & f); QVERIFY(ids.count() == 0); } @@ -2267,18 +2375,18 @@ QList contacts = contactsAddedToManagers.values(cm); QContactFilter f; // default = permissive - QList ids = cm->contacts(f); + QList ids = cm->contactIds(f); QVERIFY(ids.count() == contacts.size()); QString output = convertIds(contacts, ids); QString expected = convertIds(contacts, contacts); // :) QCOMPARE(output, expected); // Try unions/intersections of defaults - ids = cm->contacts(f | f); + ids = cm->contactIds(f | f); output = convertIds(contacts, ids); QCOMPARE_UNSORTED(output, expected); - ids = cm->contacts(f & f); + ids = cm->contactIds(f & f); output = convertIds(contacts, ids); QCOMPARE_UNSORTED(output, expected); } @@ -2366,7 +2474,7 @@ QContactChangeLogFilter clf((QContactChangeLogFilter::EventType)eventType); clf.setSince(since); - ids = cm->contacts(clf); + ids = cm->contactIds(clf); QString output = convertIds(contacts, ids); QCOMPARE(output, expected); // unsorted? or sorted? @@ -2389,8 +2497,8 @@ // check the current definition. QContactDetailDefinition def = allDefs.value(defName); - // if unique or read/create only, we cannot use this definition. - if (def.isUnique() || def.accessConstraint() != QContactDetailDefinition::NoConstraint) { + // if unique, we cannot use this definition. + if (def.isUnique()) { continue; } @@ -2398,12 +2506,12 @@ // we only consider the definition if it only has a SINGLE FIELD, and // if that field is of the required type. This avoids nasty presence test // failures which aren't. - QMap allFields = def.fields(); + QMap allFields = def.fields(); QList fNames = allFields.keys(); if (fNames.size() > 1) break; foreach (const QString& fName, fNames) { - QContactDetailDefinitionField field = allFields.value(fName); + QContactDetailFieldDefinition field = allFields.value(fName); if (field.dataType() == type) { // this field of the current definition is of the required type. definitionName = defName; @@ -2413,7 +2521,7 @@ // step two: check to see whether the definition/field is natively filterable QContactDetailFilter filter; filter.setDetailDefinitionName(definitionName, fieldName); - bool isNativelyFilterable = cm->filterSupported(filter); + bool isNativelyFilterable = cm->isFilterSupported(filter); if (isNativelyFilterable) { // we've found the optimal definition + field for our test. @@ -2446,12 +2554,11 @@ // build a definition that matches the criteria. QContactDetailDefinition generatedDefinition; generatedDefinition.setName(generatedDefinitionName); - QContactDetailDefinitionField generatedField; + QContactDetailFieldDefinition generatedField; generatedField.setDataType(type); - QMap fields; + QMap fields; fields.insert("generatedField", generatedField); generatedDefinition.setFields(fields); - generatedDefinition.setAccessConstraint(QContactDetailDefinition::NoConstraint); generatedDefinition.setUnique(false); // attempt to save it to the manager. @@ -2596,9 +2703,9 @@ QContactDetail uintt(definitionDetails.value("UInt").first); QContactDetail charr(definitionDetails.value("Char").first); - name.setFirst("Aaron"); - name.setLast("Aaronson"); - name.setMiddle("Arne"); + name.setFirstName("Aaron"); + name.setLastName("Aaronson"); + name.setMiddleName("Arne"); name.setPrefix("Sir"); name.setSuffix("Dr."); QContactNickname nick; @@ -2634,8 +2741,9 @@ a.saveDetail(&time); name = QContactName(); - name.setFirst("Bob"); - name.setLast("Aaronsen"); + name.setFirstName("Bob"); + name.setLastName("Aaronsen"); + nick.setNickname("Sir Bob"); number.setNumber("555-3456"); string.setValue(definitionDetails.value("String").second, "Bob Aaronsen"); integer.setValue(definitionDetails.value("Integer").second, 20); @@ -2648,6 +2756,7 @@ charr.setValue(definitionDetails.value("Char").second, QVariant(QChar('b'))); b.saveDetail(&name); + b.saveDetail(&nick); b.saveDetail(&number); if (!definitionDetails.value("String").first.isEmpty() && !definitionDetails.value("String").second.isEmpty()) b.saveDetail(&string); @@ -2668,8 +2777,8 @@ if (!definitionDetails.value("Char").first.isEmpty() && !definitionDetails.value("Char").second.isEmpty()) b.saveDetail(&charr); - name.setFirst("Boris"); - name.setLast("Aaronsun"); + name.setFirstName("Boris"); + name.setLastName("Aaronsun"); string.setValue(definitionDetails.value("String").second, "Boris Aaronsun"); integer.setValue(definitionDetails.value("Integer").second, -20); datetime.setValue(definitionDetails.value("DateTime").second, QDateTime(QDate(2009, 06, 29), QTime(16, 54, 17, 0))); @@ -2694,8 +2803,8 @@ if (!definitionDetails.value("Char").first.isEmpty() && !definitionDetails.value("Char").second.isEmpty()) c.saveDetail(&charr); - name.setFirst("Dennis"); - name.setLast("FitzMacintyre"); + name.setFirstName("Dennis"); + name.setLastName("FitzMacintyre"); string.setValue(definitionDetails.value("String").second, "Dennis FitzMacintyre"); dubble.setValue(definitionDetails.value("Double").second, -128.0); llong.setValue(definitionDetails.value("LongLong").second, (qlonglong)-14000000000LL); @@ -2715,7 +2824,7 @@ d.saveDetail(&date); qDebug() << "Generating contacts with different timestamps, please wait.."; - int originalContactCount = cm->contacts().count(); + int originalContactCount = cm->contactIds().count(); bool successfulSave = cm->saveContact(&a); Q_ASSERT(successfulSave); QTest::qSleep(napTime); @@ -2732,15 +2841,19 @@ /* Now add some contacts specifically for multisorting */ QContact e,f,g; QContactName n; - n.setFirst("John"); - n.setLast("Smithee"); + n.setFirstName("John"); + n.setLastName("Smithee"); string.setValue(definitionDetails.value("String").second, ""); if (!definitionDetails.value("String").first.isEmpty() && !definitionDetails.value("String").second.isEmpty()) e.saveDetail(&string); e.saveDetail(&n); - n.setLast("Smithey"); + n = QContactName(); + n.setFirstName("John"); + n.setLastName("Smithey"); f.saveDetail(&n); - n.setLast("Smithy"); + n = QContactName(); + n.setFirstName("John"); + n.setLastName("Smithy"); g.saveDetail(&n); successfulSave = cm->saveContact(&e); Q_ASSERT(successfulSave); @@ -2749,7 +2862,7 @@ successfulSave = cm->saveContact(&g); Q_ASSERT(successfulSave); originalContactCount += 7; - Q_ASSERT(cm->contacts().count() == originalContactCount); + Q_ASSERT(cm->contactIds().count() == originalContactCount); /* Ensure the last modified times are different */ QTest::qSleep(napTime); @@ -2769,50 +2882,6 @@ cm->saveContact(&a); QTest::qSleep(napTime); - /* Create some relationships between contacts if possible */ - if (cm->hasFeature(QContactManager::Relationships)) { - QContactRelationship a2b; - a2b.setFirst(a.id()); - a2b.setSecond(b.id()); - a2b.setRelationshipType(QContactRelationship::HasAssistant); - - QContactRelationship a2c; - a2c.setFirst(a.id()); - a2c.setSecond(c.id()); - a2c.setRelationshipType(QContactRelationship::HasAssistant); - - QContactRelationship b2c; - b2c.setFirst(b.id()); - b2c.setSecond(c.id()); - b2c.setRelationshipType(QContactRelationship::HasSpouse); - - QContactRelationship d2a; - d2a.setFirst(d.id()); - d2a.setSecond(a.id()); - d2a.setRelationshipType(QContactRelationship::HasAssistant); - - QContactRelationship a2e; - a2e.setFirst(a.id()); - a2e.setSecond(e.id()); - a2e.setRelationshipType(QContactRelationship::HasSpouse); - - // now for a "negative test" - the "either/any/withContactA" test shouldn't match this! - QContactRelationship d2nonexistent; - QContactId nonexistentId; - nonexistentId.setLocalId(a.localId()); // despite having the same local id - nonexistentId.setManagerUri("nonexistent-manager-uri"); // the manager uri is different - d2nonexistent.setFirst(d.id()); - d2nonexistent.setSecond(nonexistentId); - d2nonexistent.setRelationshipType(QContactRelationship::HasSpouse); - - cm->saveRelationship(&a2b); - cm->saveRelationship(&a2c); - cm->saveRelationship(&b2c); - cm->saveRelationship(&d2a); - cm->saveRelationship(&a2e); - cm->saveRelationship(&d2nonexistent); - } - /* Add our newly saved contacts to our internal list of added contacts */ contactsAddedToManagers.insert(cm, g.id().localId()); contactsAddedToManagers.insert(cm, f.id().localId()); @@ -2831,9 +2900,6 @@ f = cm->contact(f.id().localId()); g = cm->contact(g.id().localId()); - /* And cache the contactAId for this manager */ - contactAId.insert(cm, a.id()); - QList list; if (!a.isEmpty()) list << a.id().localId(); @@ -2849,6 +2915,7 @@ list << f.id().localId(); if (!g.isEmpty()) list << g.id().localId(); + return list; } @@ -2864,9 +2931,9 @@ QContactName n2 = b.detail(QContactName::DefinitionName); // Check the name components in more detail - QCOMPARE(n1.first(), n2.first()); - QCOMPARE(n1.middle(), n2.middle()); - QCOMPARE(n1.last(), n2.last()); + QCOMPARE(n1.firstName(), n2.firstName()); + QCOMPARE(n1.middleName(), n2.middleName()); + QCOMPARE(n1.lastName(), n2.lastName()); QCOMPARE(n1.prefix(), n2.prefix()); QCOMPARE(n1.suffix(), n2.suffix()); QCOMPARE(n1.customLabel(), n2.customLabel()); @@ -2895,12 +2962,12 @@ bDetails = b.details(); foreach(QContactDetail d, aDetails) { if (d.definitionName() != QContactDisplayLabel::DefinitionName) - qDebug() << "A contact had extra detail:" << d.definitionName() << d.values(); + qDebug() << "A contact had extra detail:" << d.definitionName() << d.variantValues(); } // and same for B foreach(QContactDetail d, bDetails) { if (d.definitionName() != QContactDisplayLabel::DefinitionName) - qDebug() << "B contact had extra detail:" << d.definitionName() << d.values(); + qDebug() << "B contact had extra detail:" << d.definitionName() << d.variantValues(); } QCOMPARE(b, a); @@ -2949,18 +3016,18 @@ void tst_QContactManagerFiltering::dumpContact(const QContact& contact) { QContactManager m; - qDebug() << "Contact: " << contact.id().localId() << "(" << m.synthesizeDisplayLabel(contact) << ")"; + qDebug() << "Contact: " << contact.id().localId() << "(" << m.synthesizedDisplayLabel(contact) << ")"; QList details = contact.details(); foreach(QContactDetail d, details) { qDebug() << " " << d.definitionName() << ":"; - qDebug() << " Vals:" << d.values(); + qDebug() << " Vals:" << d.variantValues(); } } void tst_QContactManagerFiltering::dumpContacts() { QContactManager m; - QList ids = m.contacts(); + QList ids = m.contactIds(); foreach(QContactLocalId id, ids) { QContact c = m.contact(id); @@ -2979,6 +3046,7 @@ QContactActionDescriptor actionDescriptor() const { return QContactActionDescriptor("Number", "IntegerCo", 5); } QVariantMap metadata() const {return QVariantMap();} + QVariantMap metaData() const {return QVariantMap();} QContactFilter contactFilter(const QVariant& value) const { @@ -3019,6 +3087,7 @@ QContactActionDescriptor actionDescriptor() const { return QContactActionDescriptor("PhoneNumber", "PhoneNumberCo", 4); } QVariantMap metadata() const {return QVariantMap();} + QVariantMap metaData() const {return QVariantMap();} QContactFilter contactFilter(const QVariant& value) const { @@ -3058,6 +3127,7 @@ QContactActionDescriptor actionDescriptor() const { return QContactActionDescriptor("Date", "DateCo", 9); } QVariantMap metadata() const {return QVariantMap();} + QVariantMap metaData() const {return QVariantMap();} QContactFilter contactFilter(const QVariant& value) const { @@ -3097,6 +3167,7 @@ QContactActionDescriptor actionDescriptor() const { return QContactActionDescriptor("Number", "NumberCo", 42); } QVariantMap metadata() const {return QVariantMap();} + QVariantMap metaData() const {return QVariantMap();} QContactFilter contactFilter(const QVariant& value) const { @@ -3152,6 +3223,7 @@ QContactActionDescriptor actionDescriptor() const { return QContactActionDescriptor("Boolean", "BooleanCo", 3); } QVariantMap metadata() const {return QVariantMap();} + QVariantMap metaData() const {return QVariantMap();} QContactFilter contactFilter(const QVariant& value) const { @@ -3196,6 +3268,7 @@ QContactActionDescriptor actionDescriptor() const { return QContactActionDescriptor("Recursive", "RecursiveCo", 3); } QVariantMap metadata() const {return QVariantMap();} + QVariantMap metaData() const {return QVariantMap();} QContactFilter contactFilter(const QVariant& value) const { @@ -3396,3 +3469,4 @@ QTEST_MAIN(tst_QContactManagerFiltering) #include "tst_qcontactmanagerfiltering.moc" +#include "qcontactmanager.h" diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qcontactmanagerplugins/dummyplugin/dummyplugin.cpp --- a/qtcontactsmobility/tests/auto/qcontactmanagerplugins/dummyplugin/dummyplugin.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qcontactmanagerplugins/dummyplugin/dummyplugin.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -68,6 +68,7 @@ /* Contacts - Accessors and Mutators */ QList contacts(QContactManager::Error& error) const; QContact contact(const QContactLocalId& contactId, QContactManager::Error& error) const; + QContact contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions, QContactManager::Error& error) const; bool saveContact(QContact* contact, bool batch, QContactManager::Error& error); bool removeContact(const QContactLocalId& contactId, bool batch, QContactManager::Error& error); @@ -160,6 +161,14 @@ return QContact(); } +QContact DummyEngine::contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions, QContactManager::Error& error) const +{ + Q_UNUSED(contactId); + Q_UNUSED(definitionRestrictions); + error = QContactManager::DoesNotExistError; + return QContact(); +} + bool DummyEngine::saveContact(QContact* contact, bool batch, QContactManager::Error& error) { // ensure that the contact's details conform to their definitions diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qvcard21writer/qvcard21writer.pro --- a/qtcontactsmobility/tests/auto/qvcard21writer/qvcard21writer.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qvcard21writer/qvcard21writer.pro Fri Apr 16 14:53:18 2010 +0300 @@ -4,7 +4,7 @@ CONFIG+=testcase include(../../../common.pri) -DEFINES += BUILD_QTVERSIT QT_ASCII_CAST_WARNINGS +DEFINES += QT_ASCII_CAST_WARNINGS DEPENDPATH += . INCLUDEPATH += \ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qvcard21writer/ut_qvcard21writer.cpp --- a/qtcontactsmobility/tests/auto/qvcard21writer/ut_qvcard21writer.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qvcard21writer/ut_qvcard21writer.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -42,25 +42,20 @@ #include "ut_qvcard21writer.h" #include "qvcard21writer_p.h" #include "qversitproperty.h" +#include "qversitdocument.h" #include #include +#include + +// This says "NOKIA" in Katakana +const QString KATAKANA_NOKIA(QString::fromUtf8("\xe3\x83\x8e\xe3\x82\xad\xe3\x82\xa2")); QTM_USE_NAMESPACE - -class MyQVCard21Writer : public QVCard21Writer -{ -public: - // expose some protected functions as public - QByteArray encodeVersitProperty(const QVersitProperty& property) {return QVCard21Writer::encodeVersitProperty(property);} - QByteArray encodeParameters(const QMultiHash& parameters) const {return QVCard21Writer::encodeParameters(parameters);} - bool quotedPrintableEncode(const QVersitProperty& property, QByteArray& value) const {return QVCard21Writer::quotedPrintableEncode(property, value);} - QByteArray encodeGroupsAndName(const QVersitProperty& property) const {return QVCard21Writer::encodeGroupsAndName(property);} -}; - void UT_QVCard21Writer::init() { - mWriter = new MyQVCard21Writer; + mWriter = new QVCard21Writer; + mWriter->setCodec(QTextCodec::codecForName("ISO_8859-1")); } void UT_QVCard21Writer::cleanup() @@ -70,33 +65,49 @@ void UT_QVCard21Writer::testEncodeVersitProperty() { + QByteArray encodedProperty; + QBuffer buffer(&encodedProperty); + mWriter->setDevice(&buffer); + buffer.open(QIODevice::WriteOnly); + // No parameters QByteArray expectedResult = "FN:John Citizen\r\n"; QVersitProperty property; property.setName(QString::fromAscii("FN")); - property.setValue(QByteArray("John Citizen")); - QCOMPARE(mWriter->encodeVersitProperty(property), expectedResult); + property.setValue(QString::fromAscii("John Citizen")); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); // With parameter(s). No special characters in the value. // -> No need to Quoted-Printable encode the value. + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedProperty.clear(); + buffer.open(QIODevice::WriteOnly); expectedResult = "TEL;HOME:123\r\n"; - property.setName(QString::fromAscii("TEL")); - property.setValue(QByteArray("123")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("HOME")); - QByteArray encodedProperty = mWriter->encodeVersitProperty(property); - QCOMPARE(QString::fromAscii(encodedProperty), QString::fromAscii(expectedResult)); - QCOMPARE(mWriter->encodeVersitProperty(property), expectedResult); + property.setValue(QString::fromAscii("123")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("HOME")); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); // With parameter(s). Special characters in the value. // -> The value needs to be Quoted-Printable encoded. + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedProperty.clear(); + buffer.open(QIODevice::WriteOnly); expectedResult = "EMAIL;HOME;ENCODING=QUOTED-PRINTABLE:john.citizen=40example.com\r\n"; property.setName(QString::fromAscii("EMAIL")); - property.setValue(QByteArray("john.citizen@example.com")); - QCOMPARE(QString::fromAscii(mWriter->encodeVersitProperty(property)), - QString::fromAscii(expectedResult)); + property.setValue(QString::fromAscii("john.citizen@example.com")); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); // AGENT property with parameter + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedProperty.clear(); + buffer.open(QIODevice::WriteOnly); expectedResult = "AGENT;X-PARAMETER=VALUE:\r\n\ BEGIN:VCARD\r\n\ @@ -106,114 +117,229 @@ \r\n"; property.setParameters(QMultiHash()); property.setName(QString::fromAscii("AGENT")); - property.setValue(QByteArray()); - property.addParameter(QString::fromAscii("X-PARAMETER"),QString::fromAscii("VALUE")); + property.setValue(QString()); + property.insertParameter(QString::fromAscii("X-PARAMETER"),QString::fromAscii("VALUE")); QVersitDocument document; QVersitProperty embeddedProperty; embeddedProperty.setName(QString(QString::fromAscii("FN"))); - embeddedProperty.setValue(QByteArray("Secret Agent")); + embeddedProperty.setValue(QString::fromAscii("Secret Agent")); document.addProperty(embeddedProperty); - property.setEmbeddedDocument(document); - QCOMPARE(mWriter->encodeVersitProperty(property), expectedResult); + property.setValue(QVariant::fromValue(document)); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); // Value is base64 encoded. // Check that the extra folding and the line break are added - QByteArray value = QByteArray("value").toBase64(); - expectedResult = "Springfield.HOUSE.PHOTO;ENCODING=BASE64:\r\n " + value + "\r\n\r\n"; + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedProperty.clear(); + buffer.open(QIODevice::WriteOnly); + QByteArray value("value"); + expectedResult = "Springfield.HOUSE.PHOTO;ENCODING=BASE64:\r\n " + value.toBase64() + "\r\n\r\n"; QStringList groups(QString::fromAscii("Springfield")); groups.append(QString::fromAscii("HOUSE")); property.setGroups(groups); property.setParameters(QMultiHash()); property.setName(QString::fromAscii("PHOTO")); property.setValue(value); - property.addParameter(QString::fromAscii("ENCODING"),QString::fromAscii("BASE64")); - QCOMPARE(QString::fromAscii(mWriter->encodeVersitProperty(property).data()), - QString::fromAscii(expectedResult.data())); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); + + // Characters other than ASCII: + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedProperty.clear(); + buffer.open(QIODevice::WriteOnly); + expectedResult = "ORG;CHARSET=UTF-8:" + KATAKANA_NOKIA.toUtf8() + "\r\n"; + property = QVersitProperty(); + property.setName(QLatin1String("ORG")); + property.setValue(KATAKANA_NOKIA); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); + // In Shift-JIS codec. + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedProperty.clear(); + buffer.open(QIODevice::WriteOnly); + QTextCodec* jisCodec = QTextCodec::codecForName("Shift-JIS"); + expectedResult = jisCodec->fromUnicode( + QLatin1String("ORG:") + KATAKANA_NOKIA + QLatin1String("\r\n")); + property = QVersitProperty(); + property.setName(QLatin1String("ORG")); + property.setValue(KATAKANA_NOKIA); + mWriter->setCodec(jisCodec); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); + + // CHARSET and QUOTED-PRINTABLE + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedProperty.clear(); + buffer.open(QIODevice::WriteOnly); + expectedResult = "EMAIL;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:john=40" + + KATAKANA_NOKIA.toUtf8() + ".com\r\n"; + property = QVersitProperty(); + property.setName(QLatin1String("EMAIL")); + property.setValue(QString::fromAscii("john@%1.com").arg(KATAKANA_NOKIA)); + mWriter->setCodec(QTextCodec::codecForName("ISO_8859-1")); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); } void UT_QVCard21Writer::testEncodeParameters() { + QByteArray encodedParameters; + QBuffer buffer(&encodedParameters); + mWriter->setDevice(&buffer); + buffer.open(QIODevice::WriteOnly); + QString typeParameterName(QString::fromAscii("TYPE")); QString encodingParameterName(QString::fromAscii("ENCODING")); // No parameters QMultiHash parameters; - QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)), - QString()); + mWriter->encodeParameters(parameters); + QCOMPARE(encodedParameters, QByteArray("")); // One TYPE parameter + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedParameters.clear(); + buffer.open(QIODevice::WriteOnly); parameters.insert(typeParameterName,QString::fromAscii("HOME")); - QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)), - QString::fromAscii(";HOME")); + mWriter->encodeParameters(parameters); + QCOMPARE(encodedParameters, QByteArray(";HOME")); // Two TYPE parameters + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedParameters.clear(); + buffer.open(QIODevice::WriteOnly); parameters.insert(typeParameterName,QString::fromAscii("VOICE")); - QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)), - QString::fromAscii(";VOICE;HOME")); + mWriter->encodeParameters(parameters); + QCOMPARE(encodedParameters, QByteArray(";VOICE;HOME")); // One ENCODING parameter + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedParameters.clear(); + buffer.open(QIODevice::WriteOnly); parameters.clear(); parameters.insert(encodingParameterName,QString::fromAscii("8BIT")); - QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)), - QString::fromAscii(";ENCODING=8BIT")); + mWriter->encodeParameters(parameters); + QCOMPARE(encodedParameters, QByteArray(";ENCODING=8BIT")); // Two parameters + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedParameters.clear(); + buffer.open(QIODevice::WriteOnly); parameters.insert(QString::fromAscii("X-PARAM"),QString::fromAscii("VALUE")); - QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)), - QString::fromAscii(";X-PARAM=VALUE;ENCODING=8BIT")); -} - -void UT_QVCard21Writer::testQuotedPrintableEncode() -{ - QByteArray encodedValue; - - // The property doesn't contain ENCODING parameter, - // no special characters in the encodedValue -> no need to use Quoted-Printable encode - QVersitProperty property; - property.setName(QString::fromAscii("N")); - property.setValue(QByteArray("Citizen;John")); - QVERIFY(!mWriter->quotedPrintableEncode(property,encodedValue)); - QVERIFY(encodedValue == property.value()); - - // The property doesn't contain ENCODING parameter, - // special characters in the encodedValue -> needs to be Quoted-Printable encoded - property.setName(QString::fromAscii("EMAIL")); - property.setValue(QByteArray("john.citizen@example.com")); - QVERIFY(mWriter->quotedPrintableEncode(property,encodedValue)); - QCOMPARE(QString::fromAscii(encodedValue), QString::fromAscii("john.citizen=40example.com")); - - // The property contains ENCODING parameter - // -> Value should not be Quoted-Printable encoded - property.setName(QString::fromAscii("PHOTO")); - property.setValue(QByteArray("the data").toBase64()); - property.addParameter(QString::fromAscii("ENCODING"),QString::fromAscii("BASE64")); - QVERIFY(!mWriter->quotedPrintableEncode(property,encodedValue)); - QVERIFY(encodedValue == property.value()); + mWriter->encodeParameters(parameters); + QCOMPARE(encodedParameters, QByteArray(";X-PARAM=VALUE;ENCODING=8BIT")); } void UT_QVCard21Writer::testEncodeGroupsAndName() { QVersitProperty property; + QByteArray result; + QBuffer buffer(&result); + mWriter->setDevice(&buffer); + buffer.open(QIODevice::WriteOnly); // No groups + property.setName(QString::fromAscii("name")); - QByteArray result("NAME"); - QCOMPARE(mWriter->encodeGroupsAndName(property),result); + QByteArray expected("NAME"); + mWriter->encodeGroupsAndName(property); + QCOMPARE(result, expected); // One group + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + result.clear(); + buffer.open(QIODevice::WriteOnly); property.setGroups(QStringList(QString::fromAscii("group"))); - result = "group.NAME"; - QCOMPARE(mWriter->encodeGroupsAndName(property),result); + expected = "group.NAME"; + mWriter->encodeGroupsAndName(property); + QCOMPARE(result, expected); // Two groups + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + result.clear(); + buffer.open(QIODevice::WriteOnly); QStringList groups(QString::fromAscii("group1")); groups.append(QString::fromAscii("group2")); property.setGroups(groups); - result = "group1.group2.NAME"; - QCOMPARE(mWriter->encodeGroupsAndName(property),result); + expected = "group1.group2.NAME"; + mWriter->encodeGroupsAndName(property); + QCOMPARE(result, expected); } +void UT_QVCard21Writer::testQuotedPrintableEncode() +{ + QByteArray encodedBytes; + + // Nothing to encode + QString nothingToEncode(QLatin1String("nothing to encode")); + QVERIFY(!mWriter->quotedPrintableEncode(nothingToEncode)); + + // Special characters + QString inputOutput(QLatin1String("\n")); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=0A")); + inputOutput = QLatin1String("\r"); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=0D")); + inputOutput = QLatin1String("!"); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=21")); + inputOutput = QLatin1String("\""); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=22")); + inputOutput = QLatin1String("#"); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=23")); + inputOutput = QLatin1String("$"); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=24")); + inputOutput = QLatin1String("="); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=3D")); + inputOutput = QLatin1String("@"); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=40")); + inputOutput = QLatin1String("["); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=5B")); + inputOutput = QLatin1String("\\"); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=5C")); + inputOutput = QLatin1String("]"); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=5D")); + inputOutput = QLatin1String("^"); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=5E")); + inputOutput = QLatin1String("`"); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=60")); + inputOutput = QLatin1String("{"); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=7B")); + inputOutput = QLatin1String("|"); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=7C")); + inputOutput = QLatin1String("}"); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=7D")); + inputOutput = QLatin1String("~"); + QVERIFY(mWriter->quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QLatin1String("=7E")); +} + QTEST_MAIN(UT_QVCard21Writer) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qvcard21writer/ut_qvcard21writer.h --- a/qtcontactsmobility/tests/auto/qvcard21writer/ut_qvcard21writer.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qvcard21writer/ut_qvcard21writer.h Fri Apr 16 14:53:18 2010 +0300 @@ -47,12 +47,10 @@ QTM_BEGIN_NAMESPACE +class QVCard21Writer; QTM_END_NAMESPACE -class MyQVCard21Writer; - QTM_USE_NAMESPACE - class UT_QVCard21Writer : public QObject { Q_OBJECT @@ -64,11 +62,11 @@ void testEncodeVersitProperty(); void testEncodeParameters(); + void testEncodeGroupsAndName(); void testQuotedPrintableEncode(); - void testEncodeGroupsAndName(); private: // Data - MyQVCard21Writer* mWriter; + QVCard21Writer* mWriter; }; #endif // UT_QVCARD21WRITER_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qvcard30writer/qvcard30writer.pro --- a/qtcontactsmobility/tests/auto/qvcard30writer/qvcard30writer.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qvcard30writer/qvcard30writer.pro Fri Apr 16 14:53:18 2010 +0300 @@ -4,7 +4,7 @@ CONFIG+=testcase include(../../../common.pri) -DEFINES += BUILD_QTVERSIT QT_ASCII_CAST_WARNINGS +DEFINES += QT_ASCII_CAST_WARNINGS DEPENDPATH += . INCLUDEPATH += \ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qvcard30writer/ut_qvcard30writer.cpp --- a/qtcontactsmobility/tests/auto/qvcard30writer/ut_qvcard30writer.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qvcard30writer/ut_qvcard30writer.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -41,25 +41,21 @@ #include "ut_qvcard30writer.h" #include "qvcard30writer_p.h" +#include "qversitdocument.h" #include "qversitproperty.h" #include #include - -QTM_BEGIN_NAMESPACE +#include -class MyQVCard30Writer : public QVCard30Writer { -public: - QByteArray encodeVersitProperty(const QVersitProperty& property) {return QVCard30Writer::encodeVersitProperty(property);} - QByteArray encodeParameters(const QMultiHash& parameters) const {return QVCard30Writer::encodeParameters(parameters);} -}; - -QTM_END_NAMESPACE +// This says "NOKIA" in Katakana encoded with UTF-8 +const QString KATAKANA_NOKIA(QString::fromUtf8("\xe3\x83\x8e\xe3\x82\xad\xe3\x82\xa2")); QTM_USE_NAMESPACE void UT_QVCard30Writer::init() { - mWriter = new MyQVCard30Writer; + mWriter = new QVCard30Writer; + mWriter->setCodec(QTextCodec::codecForName("UTF-8")); } void UT_QVCard30Writer::cleanup() @@ -69,96 +65,174 @@ void UT_QVCard30Writer::testEncodeVersitProperty() { + QByteArray encodedProperty; + QBuffer buffer(&encodedProperty); + mWriter->setDevice(&buffer); + buffer.open(QIODevice::WriteOnly); + // No parameters - QString expectedResult = QString::fromAscii("FN:John Citizen\r\n"); + QByteArray expectedResult = "FN:John Citizen\r\n"; QVersitProperty property; property.setName(QString::fromAscii("FN")); - property.setValue(QByteArray("John Citizen")); - QByteArray encodedProperty = mWriter->encodeVersitProperty(property); - QCOMPARE(QString::fromAscii(encodedProperty), expectedResult); + property.setValue(QString::fromAscii("John Citizen")); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); // With parameter(s) - expectedResult = QString::fromAscii("TEL;TYPE=HOME:123\r\n"); + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedProperty.clear(); + buffer.open(QIODevice::WriteOnly); + expectedResult = "TEL;TYPE=HOME:123\r\n"; property.setName(QString::fromAscii("TEL")); - property.setValue(QByteArray("123")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("HOME")); - encodedProperty = mWriter->encodeVersitProperty(property); - QCOMPARE(QString::fromAscii(encodedProperty), expectedResult); + property.setValue(QString::fromAscii("123")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("HOME")); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); // Convert X-NICKNAME to NICKNAME - expectedResult = QString::fromAscii("NICKNAME:Jack\r\n"); + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedProperty.clear(); + buffer.open(QIODevice::WriteOnly); + expectedResult = "NICKNAME:Jack\r\n"; property.setParameters(QMultiHash()); property.setName(QString::fromAscii("X-NICKNAME")); - property.setValue(QByteArray("Jack")); - encodedProperty = mWriter->encodeVersitProperty(property); - QCOMPARE(QString::fromAscii(encodedProperty), expectedResult); + property.setValue(QString::fromAscii("Jack")); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); // Convert X-IMPP to IMPP - expectedResult = QString::fromAscii("IMPP:msn:msn-address\r\n"); + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedProperty.clear(); + buffer.open(QIODevice::WriteOnly); + expectedResult = "IMPP:msn:msn-address\r\n"; property.setParameters(QMultiHash()); property.setName(QString::fromAscii("X-IMPP")); - property.setValue(QByteArray("msn:msn-address")); - encodedProperty = mWriter->encodeVersitProperty(property); - QCOMPARE(QString::fromAscii(encodedProperty), expectedResult); + property.setValue(QString::fromAscii("msn:msn-address")); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); // AGENT property - expectedResult = - QString::fromAscii( - "AGENT:BEGIN:VCARD\\nVERSION:3.0\\nFN:Secret Agent\\nEND:VCARD\\n\r\n"); + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedProperty.clear(); + buffer.open(QIODevice::WriteOnly); + expectedResult = "AGENT:BEGIN:VCARD\\nVERSION:3.0\\nFN:Secret Agent\\nEND:VCARD\\n\r\n"; property.setName(QString::fromAscii("AGENT")); - property.setValue(QByteArray()); + property.setValue(QString()); QVersitDocument document; QVersitProperty embeddedProperty; embeddedProperty.setName(QString(QString::fromAscii("FN"))); - embeddedProperty.setValue(QByteArray("Secret Agent")); + embeddedProperty.setValue(QString::fromAscii("Secret Agent")); document.addProperty(embeddedProperty); - property.setEmbeddedDocument(document); - encodedProperty = mWriter->encodeVersitProperty(property); - QCOMPARE(QString::fromAscii(encodedProperty), expectedResult); + property.setValue(QVariant::fromValue(document)); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); + + // Value is base64 encoded. + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedProperty.clear(); + buffer.open(QIODevice::WriteOnly); + QByteArray value("value"); + expectedResult = "Springfield.HOUSE.PHOTO;ENCODING=B:" + value.toBase64() + "\r\n"; + QStringList groups(QString::fromAscii("Springfield")); + groups.append(QString::fromAscii("HOUSE")); + property.setGroups(groups); + property.setParameters(QMultiHash()); + property.setName(QString::fromAscii("PHOTO")); + property.setValue(value); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); + + // Characters other than ASCII: + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedProperty.clear(); + buffer.open(QIODevice::WriteOnly); + expectedResult = "ORG:" + KATAKANA_NOKIA.toUtf8() + "\r\n"; + property = QVersitProperty(); + property.setName(QLatin1String("ORG")); + property.setValue(KATAKANA_NOKIA); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); + + // No CHARSET and QUOTED-PRINTABLE parameters + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedProperty.clear(); + buffer.open(QIODevice::WriteOnly); + expectedResult = "EMAIL:john@" + KATAKANA_NOKIA.toUtf8() + ".com\r\n"; + property = QVersitProperty(); + property.setName(QLatin1String("EMAIL")); + property.setValue(QString::fromAscii("john@%1.com").arg(KATAKANA_NOKIA)); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); } void UT_QVCard30Writer::testEncodeParameters() { + QByteArray encodedParameters; + QBuffer buffer(&encodedParameters); + mWriter->setDevice(&buffer); + buffer.open(QIODevice::WriteOnly); + QString typeParameterName(QString::fromAscii("TYPE")); QString encodingParameterName(QString::fromAscii("ENCODING")); // No parameters QMultiHash parameters; - QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)), - QString()); + mWriter->encodeParameters(parameters); + QCOMPARE(encodedParameters, QByteArray("")); // One TYPE parameter parameters.insert(typeParameterName,QString::fromAscii("HOME")); - QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)), - QString::fromAscii(";TYPE=HOME")); + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedParameters.clear(); + buffer.open(QIODevice::WriteOnly); + mWriter->encodeParameters(parameters); + QCOMPARE(encodedParameters, QByteArray(";TYPE=HOME")); // Two TYPE parameters parameters.insert(typeParameterName,QString::fromAscii("VOICE")); - QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)), - QString::fromAscii(";TYPE=VOICE,HOME")); + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedParameters.clear(); + buffer.open(QIODevice::WriteOnly); + mWriter->encodeParameters(parameters); + QCOMPARE(encodedParameters, QByteArray(";TYPE=VOICE,HOME")); // One ENCODING parameter parameters.clear(); parameters.insert(encodingParameterName,QString::fromAscii("8BIT")); - QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)), - QString::fromAscii(";ENCODING=8BIT")); + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedParameters.clear(); + buffer.open(QIODevice::WriteOnly); + mWriter->encodeParameters(parameters); + QCOMPARE(encodedParameters, QByteArray(";ENCODING=8BIT")); // Two parameters parameters.insert(QString::fromAscii("X-PARAM"),QString::fromAscii("VALUE")); - QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)), - QString::fromAscii(";X-PARAM=VALUE;ENCODING=8BIT")); + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedParameters.clear(); + buffer.open(QIODevice::WriteOnly); + mWriter->encodeParameters(parameters); + QCOMPARE(encodedParameters, QByteArray(";X-PARAM=VALUE;ENCODING=8BIT")); // Parameter with characters that require backslash escaping parameters.clear(); parameters.insert(QString::fromAscii("X-P;ARAM"),QString::fromAscii("VA,LUE")); - QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)), - QString::fromAscii(";X-P\\;ARAM=VA\\,LUE")); - - // ENCODING=BASE64 converted to ENCODING=B - parameters.clear(); - parameters.insert(encodingParameterName,QString::fromAscii("BASE64")); - QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)), - QString::fromAscii(";ENCODING=B")); + mWriter->writeCrlf(); // so it doesn't start folding + buffer.close(); + encodedParameters.clear(); + buffer.open(QIODevice::WriteOnly); + mWriter->encodeParameters(parameters); + QCOMPARE(encodedParameters, QByteArray(";X-P\\;ARAM=VA\\,LUE")); } QTEST_MAIN(UT_QVCard30Writer) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qvcard30writer/ut_qvcard30writer.h --- a/qtcontactsmobility/tests/auto/qvcard30writer/ut_qvcard30writer.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qvcard30writer/ut_qvcard30writer.h Fri Apr 16 14:53:18 2010 +0300 @@ -47,7 +47,7 @@ QTM_BEGIN_NAMESPACE -class MyQVCard30Writer; +class QVCard30Writer; QTM_END_NAMESPACE QTM_USE_NAMESPACE @@ -65,7 +65,7 @@ void testEncodeParameters(); private: // Data - MyQVCard30Writer* mWriter; + QVCard30Writer* mWriter; }; #endif // UT_QVCARD30WRITER_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/qversit.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversit/qversit.pro Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,32 @@ +QT += testlib +TEMPLATE = app +TARGET = tst_qversit + +wince* { + DEFINES+= TESTDATA_DIR=\\\".\\\" +}else:!symbian { + DEFINES += TESTDATA_DIR=\\\"$$PWD/\\\" +} + +CONFIG += testcase +include(../../../common.pri) +DEFINES += QT_ASCII_CAST_WARNINGS +DEPENDPATH += . +INCLUDEPATH += . \ + ../../ \ + ../../../src/versit \ + ../../../src/contacts \ + ../../../src/contacts/details \ + ../../../src/contacts/requests \ + ../../../src/contacts/filters +HEADERS += ut_qversit.h +SOURCES += ut_qversit.cpp +CONFIG += mobility +MOBILITY = contacts \ + versit +symbian: { + TARGET.CAPABILITY = ALL \ + -TCB + LIBS += -lws32 \ + -lbafl +} diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/testdata/AAB4/MultipleAll.vcf Binary file qtcontactsmobility/tests/auto/qversit/testdata/AAB4/MultipleAll.vcf has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/testdata/AAB4/MultipleAscii.vcf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversit/testdata/AAB4/MultipleAscii.vcf Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,3599 @@ +BEGIN:VCARD +VERSION:3.0 +N:;;;; +FN:Apple Computer Inc. +ORG:Apple Computer Inc.; +TEL;type=MAIN;type=pref:1-800-MY-APPLE +item1.ADR;type=WORK;type=pref:;;1 Infinite Loop;Cupertino;CA;95014;United States +item1.X-ABADR:us +item2.URL;type=pref:http\://www.apple.com +item2.X-ABLabel:_$!!$_ +PHOTO;BASE64: + TU0AKgAAAyiAP+BQOCQWDQeEQmFQuGQ2HQ+IRGJROKRWLReMRmNRuOR2PR+QSGRSOPPyTOZ1OxjM + 1pLZfsVtuBxySaTWHvF5vVkNBqqlZrlTrFbqqfthvOKbUmlQN4PN6L1jMugrep1NZLtguR0uul12 + RvZ8PhhstoVWhWZbr5jsywPivW+PzFxqhZUCz3ehz9st+Z3C/Rp6vd8MFks60Whis1ovd8vm/4+L + ul2O5YrpgYehMBkM2mvTIZ+LOJzOm0ZVgM5qtmcvbQa1+696PZ76vXv2Eu14PJmNNsNNtN7JO7a0 + yncF2u9423Wx+TPx0ZNlNFqrthslar5iddiLxispmtRsc93Pl9PuB7Xyvt3vJ575vVBlrVesOrsF + ZLxgy5i2NoN1xnMxjHOWiLVmWaRrFcW5eroXDMKooS6FyV5cF8zRmmubpwG4cJyJWaT6wjB0HKIX + MLHUdx4QGhbcHk7hlREvEYQeW8GQZGUbxioTtHIdB1uHFTVl4YkXxzGccSNIsjyUvDCGdALlubAx + rSXJEqypK8ilyYRjq1HzXs+2seHWWBcl/LErSTNM0TWtBcGCYzjnjFR/vEY5nGnG01TPPc9KFCZf + NEdM5oGaBrm27U+TZPtFUYYhmGi9NBoEX61xJRNL0WtBWFsXijKRSSB0RTNR0ZTBbvqcrJVAgb61 + NV1SPkYZ1OPVaBNNV9S1JGRZl4YTxVqf9eGFXFiTVBJem8cZz2BIRlTzXNoWLGcIu+bFgTsacyTN + XVuWjWDsTjUBsG6cLqGTaV0LxBhkulJ8VRY3ZsRDbt02hEl4uU1zXnAcpz21euAQgur+Vmd7ltW+ + GA29ha0F0YZkTmaRsG5eeGXpi9GSlOb1nnYWFXrTZeYLUDUGzj+MRknZq0jSSnHrNxjZPi0qvrE8 + U2AgVknOVZaF1mUzp8XL3ZwgramgaxtZ/btHGjfOiIKtsLaVRhbmAYtw6ehacHrqVFwZhxkSlQpt + 2qtRmUtReYHOdZ26yiLAnwaOJvqVZal2+5g5VLrYnu9LauatrxXi7RWwVvF445t3FcXxnG8dx/Ic + jyXJ8pyvLIIgIAANAQAAAwAAAAEAMAAAAQEAAwAAAAEAMAAAAQIAAwAAAAMAAAPKAQMAAwAAAAEA + BQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARUAAwAAAAEAAwAAARYABAAAAAEAAADjARcABAAA + AAEAAAMgARoABQAAAAEAAAPQARsABQAAAAEAAAPYARwAAwAAAAEAAQAAASgAAwAAAAEAAgAAAAAA + AAAIAAgACAAK/IAAACcQAAr8gAAAJxA= +X-ABShowAs:COMPANY +X-ABUID:C5C50103-C86C-40BB-8864-909A089EB390\:ABPerson +END:VCARD +BEGIN:VCARD +VERSION:3.0 +N:Lastname;Firstname;;; +FN:Firstname Lastname +ORG:Company; +EMAIL;type=INTERNET;type=WORK;type=pref:work@email +item1.EMAIL;type=INTERNET:other email +item1.X-ABLabel:_$!!$_ +item2.EMAIL;type=INTERNET:custom@email +item2.X-ABLabel:custom email label +TEL;type=WORK;type=pref:work phone +TEL;type=WORK:work phone 2 +TEL;type=CELL:mobile phone +TEL;type=WORK;type=FAX:work fax +item3.TEL:other phone +item3.X-ABLabel:_$!!$_ +item4.TEL:custom phone +item4.X-ABLabel:custom label +item5.ADR;type=WORK;type=pref:;;Work Address;Work City;Work State;Work ZIP;Work Country +item5.X-ABADR:us +X-AIM;type=WORK;type=pref:workaim +X-JABBER;type=HOME;type=pref:Jabber +X-JABBER;type=WORK:workjabber +item6.X-MSN;type=pref:othermsn +item6.X-ABLabel:_$!!$_ +X-YAHOO;type=HOME;type=pref:homeyahoo +X-ICQ;type=WORK;type=pref:workicq +PHOTO;BASE64: + TU0AKgADAAhIMyBIMyBIMidELiNDKxc/KBVAKRY/KBVALBZGMRpIMx5KNSBKNylOOixPOSdIMiFD + LxhEMBlEKxlFLBo6LBY5KxU5JQ47Jw87KhU+LRdELh9IMiNNNSlQOSxVPi5ROytPOS1POS1PODFT + OzRKQDA9MyRHKRZJKxdJMyJOOCZKOCVFMiBAMyVAMyVAMydFOCtMQDVHPDFFNyU/MSA8LyFGOSpP + QC5WRzRQPzBJOSo8MiM4Lh8/LyFVRDReTEVlU0xnT0FkTT9hT0NjUUVhSTxdRjlJNSBDLxpHNy5T + QTlYQzJMNydUOSVVOiZRNyNOMyBKLBpIKhhDLxpFMRxGMRxFMBtOPihQQCpMOSZHNCJMNSJWPytW + QTNWQTNTPjFKNypMMiJNMyNTQTNcSjxiT0ZfTURYRS9MOSRUQC9bRzVbSjhNPStHOCY/MB9ENR5K + PCRYQThXQDdROy5POSxGOiVEOCNKOy1TQzRNPS9AMSREMCRHMydELyBJNCVDLxhFMRpJNyZEMSFF + MSRALSA5LB48LyFGOjhOQT9VSUBYTURTQzdNPTFJOylDNCM/Mx83Kxc6LyhEOTFRRj5XTERYRz5J + OTBBMSNMOyxOOi9OOi9KMy9MNDBENSxFNy1IODJMOzVMRTxTTENUSj5GPTFGNylGNylAOSo8NCZG + LytROjVQPjVTQDhNQDxOQT1OPixJOihFNC9JOTNJPz5KQD9YRUlfTFBcSUxFMzU9JBpGLCJINzdR + Pz9aRkhcSEpOOzlFMjBIOTpaSUpeTElcSUdROTRNNDBDLSJDLSJBLRpELxxOOChQOipTOzRWPjhW + RT9UQz1POjVNODNJMi5IMS1NPDdYR0FfSUFNODBBLy1RPjxWQ0NOOzs9JyE+KCJALCVBLSZIMiNH + MSI9Lhk/MBtOOSlVPy9YQThcRTtbQzdVPTFUOS1WOy9VPylRPCZMNSk+KR1FMCtQOzVPOy5MOCtR + OCVWPClcQTBUOilHOCRGNyNKNSRGMSBHMh1UPihPNCFGLBlKNSZPOipMMiREKx0/JhJAJxNEKhZH + LRhIMBxNNCBQOB9NNBxHNylKOixJNSlEMCRHMR5KNCFGMB0/Khc8KQ88KQ9GKBZKLBpGMB1BLBlF + LxxKNCFHOi1PQTRXRDJWQzFQQCxMPChWOzBYPTJTQTVKOi5HKhtKLR5NOidNOidJPCxFOChDNSZE + NydDLyJDLyJMPC5PPzFNNSlIMSU7MSE7MSFKOylURDFWPzNTPDBFLyNFLyM3MCVEPTFaTkZhVU1i + UEBkU0NfTkViUEdcUUNXTT5INSNALhxOOi1XQzVbRTRQOytYOzFcPjRYQTFTPCxQNCVNMSJKNChM + NSlFMCFDLh9OPS5XRjdNOSxJNSlJOiRTQyxWRjpRQTVPPy1KOylBLiFEMCNQPzlfTkdjU09eTkpX + QzRNOStMSDVVUT5bSUBQPzdIOig8Lh1GMiVVQDJdPzVaPDJROytUPS1KOitIOClIPzVMQzlIOSs9 + LiFKNChMNSlKNCFKNCFBLxtHNCBNPC5EMyZFMB89KRg+LyE9LiA7NS9AOzRRRj5aTkZRRzlKQDJD + PS43MSM9Kh4+Kx88LCZDMixRRUNVSEZMOjhDMS9HLSVQNS1UPTNTPDJQPDFJNSs9NCk/NytBNy9G + OzNEQztJSEBORTlFPDBBMSNBMSM7My47My5BMStGNS9MQDVQRTpVRj5TRDxMPjFFOCtGMiZGMiZF + MjJKODhNRUFPR0RJPjM+MylFLiVKMypNOzVXRT9cTE1XR0hFNTI8LSo9MzBPRUFWSUdUR0VNOS5H + MylEMCM/LB9BLRZMNx9UPi5VPy9VQzpTQDhROjNNNS9MMSdOMylNNTJONzNTQDteTEZVQDNFMSVF + Ny1TRDpTPjNHMyk9Jxs+KBxFKxhJLxxQMiFRMyJDMyVIOSpVQDNWQTRXQTpXQTpYQTFUPS1TPS1W + QDBVPTFQOS1KMydDLCBNNTFTOzdJOi5GNytOOixXQzRaRDNPOipQOylTPStOOChVPi5cRDdfRzpb + PCpPMSBQNyRUOidIMBo6Iw9DJg9FKBFGKhZOMRxPOSdROylNOSNOOiRHNylOPS9MNSZNNydONCRP + NSVMMxtMMxtFMRhFMRhMMCFMMCFKNSJJNCFJNCFKNSJNOS5VQDVWSDtTRThNRTJHPy1MPC5OPjBN + PjdGODBBLCBAKx9UPS1WPy9KQDBEOipGNyhHOClMMSlGLCRQOi5aQzdTOzRONzBFMCFELyBHMiNU + Pi5WRTdTQTNHLhxEKxlDLSJJMyhUSEBYTUVhVkdfVUZfT0BjU0RfUEZeT0VQPzFDMiVJPC1QQzNW + RTlWRTlVQz1aR0FdRT5YQDpUPS1TPCxMPCpNPStEMCZGMihTPDBeRztcRDdROi1HOCpWRjheTENc + SUBFOjE8MSlBLiFGMiVMQDVXTEBnTU1lTExhRTpWOzBQSTNaUzxTTEFIQThEMyU+LiBNNy1WPzVe + QDdYOzFcRjVbRTRUPzFPOy1NRDpKQThGNyVENCNTPDBUPTFQOyVOOSNPOCxTOy9TPTVNODBILCU/ + JB0/KxxDLh9BMyxBMyxTPTVXQTpPPzFRQTNIPzM4LyRDKR9FKyFELypPOjRWRUhUQ0ZMNy9FMClB + KyJPOC5VQzxUQTtNOzRBMCo/MiZAMyc9MTFFOTlMRD5ORkBOPjBHOCpALSBALSBGNCxEMipDMipE + MytQPjVWRDtaRTpRPTJJOixFNShBMSNBMSNBMChJOC9UPTxTPDtOOi1MOCtQOSxVPTBQPjxWREFW + QUZVQEVIOjI4KiM3JiRNOzlWTU5KQUNONy1MNCtIMx5FMBtMMiBYPitRQTVWRjpXRj1RQDhROjBO + Ny1QODFTOjNPODNXPztfT0BfT0BKPS4/MiRJNDBYQz5WPytKNCE5JxY8KhhGMhdPOx9UPSlVPipT + Oy9XPzNTQzdWRjpRQDRKOi5WOzBWOzBYQTVeRztUQz1MOzU+LyQ9LiNJMypMNSxMOy1OPS9URDhR + QTVPPTRINy5KOylMPCpTQDpcSUNkU0NUQzNKNSRDLh1PNyBPNyA/Lg4+LQ0+KA87JQ1BLBlIMh9K + NCFROydNNyVJMyJGNB5MOiNMMx9ONSFPOSdOOCZIOSNHOCJNNyNPOSVVPi5UPS1TPyxTPyxRPCpO + OSdJNC1WQDldTD1YRzlURDhOPjJFOytHPS1QOSxTOy5POCtPOCtPQC5QQS9VPjFNNypJOSpMOyxN + Ny1GMCdIMS5cREBYQDpTOzRNNydJMyRGMSJMNydUQzdWRTlVOi5XPDBNNyVGMB9JOTBaSD9qVlRq + VlRkVEdjU0ZhUUpfUElTQTxHNzFANS5MQDlWSUdYTElUSUhVSklcSkRcSkRcRzxUPzRROytTPCxK + NChNNypUQTleTENTQzdMPDBIQDFRSTpbTERaSkNRQTVENCk/MSA+MB9RPTBeSTxaT05dU1FcSURW + RD5USkBaUEZWRz9KPDRAMSBDMyJKNS5UPjddQzFeRDJdRjpcRTlXQzhRPTJOPjJNPTFMOy1RQDJT + PTVTPTVXQDRYQTVQPC9TPjFMQDhJPjVHMiM+KhtBLRhELxpFMB1JNCFJPC1QQzNMQzpPRj1QQTtH + OTJAKh5AKh5ALzFPPT9XRERPPDxFNSRDMyJFMRxNOSNYPDlXOzhROTRONTFHMylINCpAMixDNC5J + ODFQPjhTRDxHOTFAKBpFLB5GMCVFLyRELSdMNC5OPDVWRD1OQDNJPC9BOCc+NCRELyhFMClEMyhG + NSpKOi5PPjJROi5YQDReSDhYQzJTQzdTQzdYPz9VPDxGNys5Kh83JyJJOTNNRUFGPjtQOjBQOjBI + Mh9HMR5QOjBbRDpWREFYRkRYSDxURDhXQTxVPzpNOzlQPjxWRT9aSENcTj1YSjpNODNNODNOPDVO + PDVOOSdGMSBBKRdNMyFRPS9TPjBTPjNTPjNVOi9XPDFURTtPQDdFOCg/MiNONzNXPzxbTEVdTkdW + RDtJOC88LRw7LBtFLiNJMidQNS1cQDhUQzpOPTRHNzBEMy1ENDVJOjtaRkpiTlNaSTdMPCpIMyJB + LRxPPi9NPC1DNRY7LhA7Kgo8Kws/LBZALRZKNSJOOSVMMx1ELBZALBlNOCRNOChKNSZKNSJMNyNJ + OiRHOCJNOStPOy1QPC9RPTBOPTRNPDNPPjBNPC5KOixTQTNYRTNXRDJMPi9KPS5JOixMPC5NNSlQ + OSxOOCxTPDBMQTFKQDBQPzBHNyhGMiZJNSlKNCtGMCdHLzFXPkBaR0BUQTtPOihMNyVJNCFIMyBJ + OTJVRD1VQS5QPSpMNyNIMyBHMSZVPjJfTUpjUE5kT0FkT0FeU0lcUEdaPD1QMzRAMCNJOStUREBb + SkdVTENVTENdTUBcTD9XSTxVRzpOPS5PPi9IOCpMOy1PQz5dUExPQy9EOCVEPCtNRTNeU0laTkVT + PjBKNylBMSNDMiRMOyxXRjdYSk1cTlBaSENYR0FUSUZbUE1aRkpKODw+LiBAMCJHOCxPPzNVRDVb + STtcRD9bQz5UQzpPPjVMNSxKNCtQPjVUQTlRQTVURDhVRDVUQzRPPzNQQDRKPzdDOC9HMh88KBY/ + LBZBLhdJOCFNOyRGPC5JPzFFPjVNRj1ORzFJQy1JNSlDLyNBMi9MPDlTQDpNOzRHOCJHOCJMOCJP + OyVVPjRVPjRTOzFROjBKOCNBLxs8LSBAMSRHNS9NOzROPzVIOjBHMiFHMiFBLCBFLyNJMyhNNytP + OzBVQDVKQTVHPjJFOi9DOC1GNSpEMyhHMyZHMyZJOitRQTJbSD9iT0ZaSkRTRD1NPzBKPS5OPDNN + OzJEMCY9KiA+LCpINTNKOjFIOC9KMy9MNDBENCdENCdMNzJaRD9YRkZXRUVWRERUQUFUPjlPOjRN + PD9OPUBTQD5RPz1VRTdNPS9HMCRIMSVHOi1HOi1GNyNFNSJJLxhRNx9XQDNVPjFTOzdTOzdRPS9a + RTdWSDtKPTA/MRw5KxZQOjteR0hcUUNWTD1TQzdOPjJGMyM9KxtEKiJPNCxYRUVjT09YR0FAMCs4 + Khk3KRg5LypMQTxbST1bST1RQTVJOi5GMhc+KxFKNyxNOS5HMxo8KRE8KBA8KBA+KxZALRhJNR5N + OSFMNyFGMRw9LBZFMx1HMydFMSVNOStPOy1HNyhGNSdFNSpGNytJOS1KOi5EOS5ANStKOi5JOS1M + PTdMPTdKOitMOyxIOSpGNyhFNSpFNSpFNClMOy9MPC5OPjBNPzJOQDNIOyxFOClEMyhHNytNNytO + OCxIMjFPOThTRkRQREFPRTdKQDJJOStJOStMOzRQPzlPQTROQDNNOzJHNS1GNB5HNR9YRkBeTEZd + R0FdR0FiUUFhUEBeRDRONCZGLytKMy9MPztYTEdVSUBVSUBdTUleTkpYSUNVRj9NPTFOPjJDNSlK + PTBUQURjUFNYRkBNOzVHOTFRQztbU1FRSUhOPDVJODFJMyJMNSQ+LyFJOitaT0BbUEFbSUBaSD9d + TEVhT0hdRz9NODA8Lhs+MB1EOS5KPzRURTtaSkBcSEZbR0VQRTxGOzJBKydJMi5UQzdUQzdVRzpV + RzpQQDFTQzNVRDtXRj1KQTVDOi5JMRlAKRJALhJINRhQOydRPChKPDJJOzFIPTJMQDVNRTJMRDFK + OTBBMCg/MSpHOTFPOzBPOzBFNSBJOiRPOy1UPzFWRD5QPjlXPzlWPjhRPSVGMhs+LRc/LhhEMixJ + ODFKOjNKOjNFNShDMyZBMSREMyZDMyZHOCpMPi5PQTFRQDpKOjNKOjRHNzFFNy9DNC1ENCdGNylP + PjVaSD9bTk5bTk5JRTpDPjNDOC8/NCxGOSxDNSlALh5BLx9HNytHNytINzBKOTJHNS9HNS9ENS4/ + MSo3LSxNQ0FbSUBXRj1WRT9UQz1QOjBOOC5OPDdRPzpRQzxTRD1TQzdMPDBMNSpHMSZAMR5FNSJI + NB9TPihVPixeRzRiT0hYRj9VPTdUPDVTQzdXRztPQz4/My89KSRBLShTSEVdU09aR0FUQTxPPzxJ + OjdKNSQ/Kxo9Ky1VQURbSEZVQ0BIOCwyIxgvIBg6KiI8MjFPRURjSkdbQz9TPCxAKxw0Ig88KRVN + MSBTNyVPNRpKMRZFKhA/JQw/KBNGLhhJNB9NOCJHOCQ6KxgzJg83KRE+KRZGMB1HOCJGNyFGNylF + NShBMic+LyRHMylGMig8LR8+LyFDMiRHNyhNODNQOzdOOi1MOCtHMSBIMiE/LyQ+LiM+NCVBOChD + OypDOypMPCpKOylGMyE/LRtBMiFKOylKOylHOCZNOSxJNSlKOy9QQDRPRDlIPTJOOCtMNSlKOixN + PC5OOi1POy5OPTRIOC9NNSpJMidVMSxcODJVRDheTUBYUUVVTkFXSTlNPy9BOCc8MiJIPTJXTEBN + R0NIQz5TTUpTTUpcSEZPPDpTPTVXQTpQOzNMNy9QPjVbSD9YRj1NOzJIOjBYST9aUUxVTUdQQCxJ + OiZGOCBGOCA4LiE+NCdJPzxMQT5aR0FeTEZkVFNdTUxURzNFOSY/MBs4KRU9MCFIOytbR0VdSUdX + RERTPz9IOS1HOCxAKyJKNCtVRTlhUERaTDxVRzhTRTRWSDhbSj5bSj5URDVMPC5FMxs/LhZKNx9W + QSlbRjhdSDpRRzlGPC5NOzRRPzlQRT1OQztPOjRDLik9Lhk7LBdGMSJMNydINChRPTBWQDlVPzhU + QTtTQDpQPTtRPjxQOi5NNytFMBs+KhY4KRxAMSRGOC5HOS9BMiVAMSRAMSA+Lx45KhxGNyhJPC9K + PTBPOjJTPTVNPDVGNS9HNytAMCU+MClJOzNUSD9YTURWRT5KOjM7LCE+LyRAMR4/MB1INCdJNShO + PS9KOixENSxDNCtFNCxFNCxBMiFBMiFFNCk9LSI0Ly09ODVWRD5XRT9TQTtRQDpPOjJJNC1BLiJG + MiZPOjVRPDhMNzFMNzFFMiA7KRcxIxM+Lx5PODFcRD1lT0dhSkNaSTtHOCpEOCVNQC1MRjdRTDxN + RDo+NSw9LitGNzNRR0RRR0RRQztQQTpPQTRHOi1ELxY9KRFEMCZWQTdTQTtNPDVILx8/Jxc6JBk+ + KB1FLjNYQEZYTUFIPTJHMh88KBY9LBZRPyhRNyFQNSBWORlTNRZGLg9AKQtFLBRHLhZNLyBTNCVH + OSc9Lx40JQs5KQ89KBlELh8/MRw/MRxIOSVMPChGNSo7KyBALBtALBs6Kxg9LhtHMCRONypMNzJO + OTRRPTJRPTJINB9GMh08LyE+MSNBNSNHOyhGPCtHPSxOOypKOCdGMx8/LRlAMCJHNyhNOidOOyhK + OitHNyhGNylNPS9QOS9XPzVVPi5ROytVPipTPChPPCtTPy5PPzFMPC5IOClIOClILyFJMCJJPC9U + RjlfTkVhT0ZYTUFVST5DPy86Nyc+MyxOQztKRUBMRkFRSkFWT0ZVSERMPztHPDNQRTxRQDpIODFQ + QDRYSDxVPTdMNC5IOy5XSTxXU0hWUUdWQTdTPjNHOipIOys8MSk+Mys+Mi5MPztaR0dfTU1pUVNk + TU5VRzhGOSo+MBs3KRU+MiBPQy9cSUdVQ0BPQDlKPDRFNShENCdFLiNPOCxaTUpeUU9RSkFORz5O + QDNVRzpaTD5XSTxbRjtRPTJBOSNHPihRRDRXSTpWSUVXSkZQQzVOQDNNOzJQPjVRQDpPPjhPPClD + MB4/KxZIMx5GNSpFNClJNC9RPDdVSUBaTkVUQzxNPDVFOTRKPjpKPDRHOTE+LRc6KRRIMyJKNSRE + NS5BMyxIMyRFMCFBLRY9KRM5KhlGNyVMPC5MPC5OPDNOPDNJOi5BMidFMSVGMiZENztPQUZXSEBT + RDxJOiw7LB85Jxc9KxtELiNNNytQQzVQQzVOPTdNPDVHMydEMCREMCREMCRDLyNALSE9Kxs+LBw8 + LSI/MCVHOzdOQT1VQ0BPPTtFMytALydBMSZEMyhINzRHNTNENCdAMSQ9KxkyIRAyJR47LSZRPDhf + SUVbT0ZWSkFMPjE3Kh49MCRKPTBTQTVUQzdJOTA+LiZAMydBNChKPzhTRz9OQzpJPjVPPi9QPzBI + OSVAMR5ENSxQQThNPjdGODBEMhxBMBpAKiZAKiZMOjxXRUdRQTVENCk/MSA8Lh0/MiZMPjFUMyVa + OSpiQCZdPCJWQCZUPiRPNB1KMBlPLR5cOSlTPS1FMCFAKRJAKRI8KBRELxpFMh5FMh5NPStOPixA + NCI0KRc9JhE+JxJAKBZAKBZGKx5MMCNMNSpUPTFOPS5HNyg7Lxk1KhU6Jxs8KR1DMyVJOitDPCdI + QSxKOyxIOSpGMCQ9KBxDLyJGMiVJOSpNPC1IPjBDOStGNSdFNCZMNzFTPThUPzJVQDNVRDRQPzBV + PixVPixOPi9KOyxJOiRIOSNFOSZANCI8MiVIPjBbSEFhTkdWSkFUSD9HPjREOzE9OS5FQDVORTtQ + Rz1VRUFaSUZWRT5PPjhOPjJQQDRQPzFQPzFKQzFUTDpbPjlMMCtAOCxMQzdQT0lTUUxYPzxWPTpN + NzVQOjlNODNELys7LSRJOzFeRUlkSk9eSk9aRkpKRUA9ODM9MCQ4Kx9ENyhQQzNXTkRQRz1GPCxD + OSlGNCxEMipFLyRTPDBYTkpcUU5UR0NQRD9QPjlXRT9cSUNYRj9URTtOPzVFOi9MQDVXR0ZdTUxb + TkxXSkhMPTNHOS9KOjNKOjNOPTFIOCxALh4+LBxFMSRNOStIOCxBMSZGMSpQOzNQSkRbVU5NRDtB + OTBGNTBFNC9GNS9FNC48MB44LBpGOSpGOSo7Mio3LiY8LRw8LRw8KhY9Kxc9LR9IOClQPC5RPS9O + PDNKOTBENydBNCVDLSRHMShBNzpKP0NUSTtMQTM/OCc1Lh44KRs6Kx0/LylJOTJRPzlOPDVINChD + LyNBKx9ELSFDMB4+LBo/KR4/KR45KhY6KxZBLR5FMCFJPjNRRjtVQT9KODVELSpAKic8Myg8MyhB + Myo9LyY9MCI6LR81IxYzIRU1JiBAMCpPPDxaRkZWTDtJPy9GMCU6JRo6LCZJOzRUPTNTPDJKMydH + MCRIMyROOSlTQTVTQTVRPS9QPC5GOSFGOSE9LiA3KBo+MSVNPzJNPixDNCM9KRM7JxE7JCBGLipR + PDdPOjRPOS1GMCU4KBs5KRw/Li5NOztHLh5WPCthRTBlSTRjTDlbRDFPOyVBLhlKMh5ROSRWOS9W + OS9MMiBFLBpEMRZFMhdFNSBJOiROPzlNPjhNNyVFLx5DKxdELBhBLBk/KhdFMCFNOChMOShNOilO + PixIOSc+LBg8KhY7IxI8JBM3JRJDMBxIMyJOOSdbQC9VOypMMiBBKRdBLCBDLSFJNDBOOTRJQCxA + OCRFMiA+LBpBMSRKOixQPDFXQzhUQTxVQz1dRz9cRj5WRjFTQy5OOypINSVIOSNENB89MCQ8LyNH + Oj5URkpQST9TTEFURTtJOzFENClKOy9QPzlUQzxXREFbR0VURDhPPzNNOSxPOy5UPS1TPCxKQDJR + RzlVPTdQOTJJODJTQDtRTkpQTUlVRD5OPThPOTpPOTpMOTdDMC43LSA6MCNNP0FcTlBdSkhXRUNJ + PTk9MS07MSI1LB0+Mi5JPTlWRTlTQTVKOixGNShKNTFHMi5GMSxXQTxbSURfTkhRQzxOPzlNOzRT + QDpXPzxdRUFYRkRUQT9KOjRQPzpYTEleUU9cSkVXRkBIOCk/LyFJLydOMytNNy1IMilALSFFMSVN + NTJPODRKOjRAMCtFLipMNDBVSU1dUVVTQTxHNzFMMCtEKSRAKyI/KiE4MB8/OCZPQTJIOyw8LSAz + JRg3Khs3Khs4Khk5Kxo7KB5INCpQOTVXPzxKOjFJOTBHOitAMyU9LShAMCtMOjhXRUNeTElNOzlA + Lh49Kxs9Kh0/LB9MNC5QOTJMNzFGMSxELx5ALBtALBtIMyJGMCE+KRo7JRk7JRk7JhY+KRhMNyVP + OihRQTNVRTdTQDtHNTA8LyE3Khw8Jxs8Jxs7KhM4JxA7KBI7KBI4JA07Jw83KRY+MB1HNS9TQDpU + QT9INzRIKiBAIxlBMSRNPC5VOi9PNCpELyA+Khs/LCJKNyxOPDNNOzJNOStGMiVEMhpBMBg/LR0+ + LBxBMiFGNyVMMx1IMBpFKRZDJxVFLyBMNSZOPS5KOitJMS1BKiY4JRk9Kh5EMCRHMydGLhZTOiFh + STRnTzpnSkFeQzpNNyo/Kh5ALxdEMhpVOypcQTBWOS5ILCJKNx9JNR5NNydQOipNPDVPPjhNMidG + LCFHLB1GKxxAKRZFLRlFKyBNMidMNydTPS1UOyJQOB9GMSA+Khk9JQw5IQk7IAs+Iw5FMRpNOSFe + QTFdQDBRQyY/MRY4Jg06KA8+LyxBMi9FNyU/MSBELxw+KhdBKxJGLxZIOClQPzBPPjJRQDRXRT9X + RT9WRz1VRjxTQTNJOStGOCZBMyJALSA6Jxo+MytMQDhQST9VTkRYQztMNy9BMSlHNy5NOjpUQEBU + QTtUQTtaQzdUPTFJOC9NOzJUPzJRPTBOPy1TRDFRPi1QPSxNOzVTQDtaTU1TRkZNQD5BNTNJMS1I + MCxBMic7LCE5MBs/NyFTRz9VSUFcRURTPDtGNSo+LiM7LCE9LiM/MiZFOCtMOShMOShJNCVOOSlM + Oy9FNClDLilVPzpTRUxURk1JPT1DNzdENSRDNCNHNTNRPz1TQTtRQDpJOzRJOzRQPT9cSEpVSEhR + RUVGMh1EMBtMMCFQNCVINSM+LBo+KRhFLx5ROy9VPjJNPTFENCk9LCdJODJVR05YSlFWQDlHMitJ + LB8/IxYzHw84IxM3LiVGPTNUPzROOi8+KRg1IRE6JRk9KBw6LBc4KhY8JiBGLylTOjdWPTpQOS1O + NytKNClGMCVELyhELyhUOz1iSEpaSENGNTBDLhY8KBA/KBVIMBxTOShROCdMMiBJMB5MMx1MMx1K + NSZPOipKNClELiM8KRw5Jhk5KxhIOiZWRTVUQzNVPTdVPTdMOzJEMys8KhYzIg8+JhU+JhVDKA8/ + JQxFKQpBJgdBKhVDKxZBLBlOOCRNODBVPzhKOTlGNDQ+Khs+KhtKMR9QNyRQOTJJMixBLCM6JRw9 + KBxIMiZGNSdGNSdHMydINChDNyQ+MiA/LRs+LBpHMCVHMCVGLyNGLyNBJxhFKhtDLSRGMCdJNC9M + NzFHMCVGLyQ6JBk7JRo8Kho/LR0+KhlOOSdYRzhfTj5lTUldRUFOOCxBLCE7LhY/MhlUPTBcRThW + PzVOOC5TNyVVOSdXOi9UNyxQPC9RPTBJNCVALB1KLR5KLR5DKxRAKRJAKh9HMCVQNyRXPSpcQSdW + PCJJOiRENB9EKxFAKA8+KxE1Iwo8JxtROy5bRDdfSDtbTDlHOSc7Kw83Jws9Lh0+Lx5FMiJGMyND + LhY9KRE8JQ8/KBFFNyVKPCpMNyNOOSVPOzBUPzRTRz9TRz9UQzRQPzFKOylENCNFLiJAKh5DMyJN + PStVRj9aSkRVQ0BKOTdDMiRDMiRHMydMOCtOOi9UPzRXQDdXQDdIOCxGNSpNOS5QPDFQQC5URDFR + QDJRQDJOPj9OPj9USkxRSElORTlDOi5DLR5NNydENx85LBY1LB8/NShWRERVQ0NYQz5QOzc/MB87 + LBs9KxlALhw8LyA9MCFIMyRMNydINSVNOilOOyZGMx9DOC1JPjNOQEVTRUlNPTFFNSo9MRtANB5H + OCpPPzFPQTJNPzBMPTdJOzRKPDVTRD1RRUNRRUNHMylKNyxPOCxMNClENyg7LiA6Kxg+LxxHOCxM + PDBHOS9DNCs/MStMPTdaSExbSU1YRDVNOStHLxs7JBEyIxY4KBo7MzBKQz9QPzNFNCk7IRE8IhJF + KBdJLBtGLhZELBVELh1IMiFQNS1UOTBQOjBMNSxONy1NNSxHMylMOC1XRERdSUlUPzJFMSU+Kw89 + Kg9FMSVUPzJYRDlWQTdUPSlUPSlPOSdQOihQOzNRPDRKMiw9JiA5JxY8KhhFPDBRSDxcSj5VRDhR + Oi5POCxFNyNBMyA8Khg5JxZBKhNBKhNJLxpMMRxJNRhDLxNGLR9ILyFNOCRWQCxYQTRXQDNNOzVI + NzFDLhdELxhOOSdRPCpMOShHNCRELx46JhY8JxhDLR5FNCdHNylMOCtNOSxIOiZENSJBLRw8KBc+ + KRZAKxg+KRpGMCFDKxdELBg/KiFHMShVOi9XPDFQNyZKMSE/Khs6JRY4JRhDLyI6JRNHMR5RPS9e + STthSkVbRT9POiZHMh8/LRNBLxVOOi1YRDdYQDNROi1PMyZRNShWOjRUODJQPSxQPSxOOyZHNCBH + LxlKMhxGMRxBLRg+KxFDLxVHMR5WPytcRjVXQTFGPi1KQzFMOCBFMRpEMBY6Jw47KRdRPitfSD5n + T0VlTkRXQDdFMxk4Jw88Iw9AJxNIMBxNNCBHMBVBKxA9JQ5AKBBDLhtIMyBHMSVKNChHNS9KOTJR + PzlOPDVUPzJTPjFRPS9OOixPNClGLCFELyhPOjJXR0hYSElRRUVMPz9ANydANydEMyVHNyhROy9a + QzdaQzlXQDdPOy5JNSlNNypQOi1RQTJWRjdbRT1YQztRQDtOPThORkBTSkVYSDlNPS5JLxhPNB1K + Nx1INBs7Mh87Mh9TQTlRQDhTPChPOSVMMx9IMBxALBk+Khc9Lhk/MBtPOSdUPStPQC5TRDFWQDlP + OjJIOSpGNyhQPj5VQ0NUOzdONTFBMSNBMSNKNTFUPjpTQTlPPjVOPTdIODFDOTNHPThOQDNPQTRJ + OzNNPjdRPDRNODBBMiE9Lh04KRs6Kx09LiFHOCpGOSpHOitJODJRPzpWRT5VRD1XQzVTPjFKNCND + LRw/Khc9KBY+NzNKQz9QQDRBMic/Iw1EJxBJLRZVOCBROB5KMRhFLRlMMx9POCtUPC9QQDRMPDBI + OjJFNy9HOitJPC1QRz5RSD9OPTRAMCg7KhVINyBWRTlaSDxXRj1VRDtUPzFPOy1IOyxOQDFPPThP + PThKMy1AKiQ6JxFEMBlTST9aUEZcSj5UQzdMNydJNCVNNyNKNCE/KxxELyBNNB5MMx1POSdTPCpR + OClNMyVIMyJKNSRUPzJbRjlYQztUPjdMOjFKOTBMMx1UOyRbQC1aPyxQOjBIMilDMCA9Kxs+KR5B + LCFHMSBNNyVTPCpROylPOiZNOCRIMBxBKhY4KRU6KxZELBhTOiVQPSpINSNHMiFQOylYPCxaPS1Q + OipFLyA6JRM3IhA8IxhMMSZBKBRJLxpWQDBfSTliTT5dSDpVPipOOCRJMBdDKhJNNC5YPzlcRThX + QDNXPSxQNyZVOC5VOC5NPC5PPjBRQStNPSdMNx9NOCBOOCRPOSVHMhtDLhdGMSpUPjdbQzxYQDpU + PTNVPjRTPy5KOCdNNRtJMhhKMhxVPCVeTEVjUElfTUdaR0FNPSlAMR4/JQ5AJg9IMRdTOyBJNRpD + LxVBKBJEKhRFLB5MMiREMCNEMCNHMSZMNSpPODFPODFTQTVVRDhYQS1WPytROytFLyBFMSdPOzBX + QD9YQUBWQ0VPPD5FNCdEMyZGNyVKOylOPzVURTtXRj9YR0BWRjhIOStENSJJOydRQDRaSDxhTD5c + RzpWRz1MPTNQPzdcSkFeSTxYRDdUOilUOilQOydNOCRPPCtINSVRQTNNPS9QOipTPCxXPSxUOilN + MyFILx1HMh1IMx5TPyxTPyxWSkFWSkFWQDlPOjJENSRHOSdUPzRXQzhPPzFIOStBMidAMSZNNTFY + QDxUQzpQPzdOPTFMOy9GNS1KOjFKQzNKQzNWQTdXQzhRQDROPTFMNSJFLxxBLBk8JxU/LCBHMydH + NylKOixOOC5ROzFRRDRPQTJOPjJPPzNMOCJJNSBMMx9HLxtJOTJOPTdNPS5DMyU+LAxHNBNPPylX + RzBUPipOOSVMMiJKMSFOOixUPzFXQTpRPDRMOjNHNS9IOjJNPjdOREBOREBOPjBBMiU8MyBGPSlW + Rz9WRz9VRj5OPzhQQDFPPzBUPTNVPjRVPTdTOzRMLh9GKRo1LRhIPylYUUdTTEFWPzNTPDBPOSdU + PStUPC9QOSxMMR5NMh9OOx9PPCBRPTBRPTBJNSlGMiZNNytOOCxUPjlcRkBXPzlTOzRKNyxMOC1O + OixaRTddRTldRTlYPDdMMCtALRg8KRU8JhpGLyNNNypUPTBaQzJaQzJWQzFRPi1HMBZBKxI4KRw1 + JxpGNyhXRzhXQTFQOytXQC5aQzBdQzFVOypHMCRDLCA9JBI6IQ9FKyFQNStOMBhYOiFcRDdhSDtd + TDxVRDRRPi1NOilKNSJGMR5JLCpOMC5POjRTPThXQDBQOipQOihROylNPDBPPjJUQzNUQzNQPSpQ + PSpTPjFTPjFNPSdFNSBMNCtTOzFWRD1WRD1UPTFVPjJPQDdOPzVRPitTPyxRPitVQS5fUUReUENj + TUdeSENJPjNFOi9DLhdBLRZTPihYRC1RPitMOSZIMBhHLxdFLyNIMiY/MCI+LyE/MCJDMyVFOjFH + PDNWRTleTUBdTTVURC1RPilGMx9GMiZOOi1QPzlRQDpRPzlTQDpHOipENydIOiZPQCxYQDRfRzth + SUhjTEpVSERKPjpIOSpKOyxQRjhXTT5dT0FXSTxUQzpMOzJTPDJhST9hTkdaR0BUQTlTQDhUQzNR + QDFPPTdJODFOPTRQPzdQQDFVRTVdTThWRjFaQzBMNSRJMCBONCRORDNORDNPSkBNSD5PQy9IPClA + MSNRQTJaRTpYRDlRRzlKQDJJNStINCpPOjRbRT9URjVRRDNOQDFMPi9GNShHNylKQTVORTlbST1a + SDxRQzBNPixHNyhEMyVFKRVFKRVAKxhPOSVROylPOSdQOytOOSlMPCpQQC5WQTRXQzVPPSZPPSZM + PChGNyNKNCtPOS9MOCtKNypINSFWQy1aT0BYTj9WPzJROy5ONypQOSxPPzFURDVURjdPQTJIOjJF + Ny9INzFINzFQPTtTPz1OPipOPipTRDFYSTdTRzxPRDlUQzpTQTlYRDdXQzVaQzlXQDdWRDtUQTlA + Lxk5KBNHPDFYTUFcUEdVSUBRQS9NPStTQzdVRTlWQDlRPDRQOipPOSlQPidQPidOPS9IOCpKMydM + NChONy1POC5WQDxcRkFUPzRNOS5JNzROOzlOOztUQEBWRD1WRD1TPjFBLiJBLRhALBdBLx9KOCdU + PjdbRT1cSj5YRztVQDNNOSw/LBQ4JQ4yJhc5LB1NRjpVTkFRQDRNPDBYQTVYQTVTPjFDLyM9KRY/ + Kxg5Jg86Jw9DLyVOOi9PMyJXOylbRjleSTxaRDxOOTFHMydGMiZHMSVELiJAKh48JhpBKiZTOjVU + QC9VQTBOPixMPCpKNypNOSxOPjBPPzFOPjBPPzFNRDpKQThNPStOPixPOyVUPylVQzpVQzpRPzdQ + PjVPQDpPQDpQQTpOPzhIQC9ORjRcSUNkUUpdUExYTEdORjRHPy5FPCRBOSFPPzFXRzlVRTdRQTNU + PStROylNOilGMyNDMCA+LBw/MB1JOiZRPTBUPzJeTUdhT0leVEVdU0RXSDNNPipEOixEOixRPDRV + PzhVQDVRPTJFOCtGOSxKPTBWSDtfSD5jTEFdSkpdSkpTRkZGOjpGNS1QPzdbTEReT0dYUUdQST9K + QThJQDdOPzlRQzxhTkdbSEFbRT9hSkVYTj9RRzlWQ0NKODhDMiVQPzFNSD5UT0VaTkVWSkFUQzM+ + LiBELSFONypQRjhWTD1YRj9XRT5IPytAOCRHNS1VQzpYRkBWRD5RR0RJPzxIPTJFOi9JPjdcUEhc + SkFRQDhIPzNIPzNIOSpGNyhGOzJQRTxcSkVYR0FQQThMPTNHNylJOStGLBZEKhREMBdQPCJXQTFU + Pi5TPy5UQC9NPC5HNylKOTBPPTRUPzRVQDVOPTdFNC5HNzBKOjNNOzJNOzJQPzlfTkdfUEhbTERW + RTVQPzBTPjNXQzhYRDdeSTxUSTtUSTtKOjNFNC5IMS1IMS1JPjVQRTxTQzRbSjxiTkxjT01UQzxM + OzRPRDxUSEBXTERTRz9RPzlRPzlWRkNOPjtJMidHMCVXRUdeTE5YSUNURT5QQDJPPzFURjlURjlU + RT5NPjhPOjRMNzFPOzBOOi9QOi1JMydOOCRROydPOSxPOSxTPDtQOjlJODJFMy5HNDRJNzdMNTdV + Pj9aQ0FWPz5TOC1NMihPMSBQMiFNOStRPS9bRENbRENQQDJJOixFMSVDLyNAKRI7JA4/LyJNPC5V + Rj9TRD1ROi5POCxXPzJTOy5JKxZBJA9AJxFBKBI+JQ9ILhdTPS1UPi5KOylTQzBVRDtVRDtTPjBE + MCNBLCBBLCA+Khk/Kxo+KA89Jw9ALB1IMyRJQTJMRDROPTdIODFENCFGNyNJNCVIMyRHNylNPC5J + PjNHPDFOOixRPS9KPCpNPixTQzRURDVQPzBMOyxJOzNMPTVQPzlRQDpHPjJHPjJWSkNcUEhYVElP + SkBKQDBGPCxFPCZFPCZNQzRTSDpRRzVMQTBXQSlTPSVMOyxFNCZHMh1MNyFIOSNRQStVRDhUQzdb + TEVcTUZaUEdYT0ZUSTtRRzlMPChNPSlJOTBPPjVOPi9KOyxEOipEOipMQDhUSD9bSEZWREFXRT9W + RD5UPzJKNyo/MiRTRTVeU0paTkZUSEBQRT1OPzVOPzVGPDdJPzpXR0ZWRkVbSEFeTEVaTkZUSEBX + SEFFNzA4Lh9HPS1USEBbT0deSkpYRUVUPDA8JhtFKhtVOSlaQ0FaQ0FXQzhQPDFIOStJOixIODFW + RT5YRUNVQT9WRkdTQ0RKQDtIPjlGPj1VTUxcTD1PPzFNPjRKPDJHOCpFNShGOzBQRTpaSUhVRURM + PjFIOy5JOSpJOSpIMBxHLxtINSVVQTBWRTlXRjpUQTtUQTtMQTNFOy1JPC1MPi9QQDRRQTVOPTRJ + OTBEOipEOipQPjhTQDpURENaSUhbSkdVRUFQPzNOPTFVPTFYQDRbRjleSTxaSEFXRj9NPTFDMyhF + NClJOS1JPjdMQDlVRD5hT0lpT09eRUVNOzROPDVVR0laTE5VSUFQRT1PPjVVRDtWRT5NPDVJNDBM + NzJYQztXQTpRPzdTQDhRPDdRPDdVQDJVQDJTQDpKOTJNNTJMNDFKNylKNylNOCZNOCZPOSdOOCZP + OCxPOCxTOy5ONypKNCtNNy1HNS9HNS9EMCNPOy1PPTdNOzRTOCxTOCxbPCphQS9YRDlRPTJTQTxT + QTxNOidBLx1FKxZILhlGLxRKMxdTPDBXQDRWPjpTOzdONCRPNSVPOCtKMydILRNFKhBBKRdGLRtF + MCFOOSlXQzVdSDtINChTPjFXQS9YQzBRPSdEMBs5JhA6JxFBLBlDLRpELBhDKxdBLCBIMiZIPDhQ + RD9TPThIMy4+LxxFNSJJMyJIMiFDLSFELiJJNStMOC1NOChPOipKPChJOydRQDhRQDhNOzJGNCxB + MSZFNClRPi1RPi1NOS5KNyxQRT1YTUVbUEpPRT9GPSlDOiZGNSdHNyhNOzVTQDtTQDhTQDhWQy9R + PitMPDBKOy9MOCtUPzJRPzdXRTxTQ0RRQUNVSEZaTUpaTkVWSkFVRjxWRz1QPzBJOSpEOipHPS1H + PjRDOjBGNyhDMyVPPz5aSUhaRkhTP0FRPjxRPjxPOSVIMh9EMi1XRT9XTlFWTVBQQTtOPzlHPDFJ + PjNGOzBFOi9TRkRRRUNaSkRXSEFWSkFXTENUSkFFPDM1MyZAPjBaRk1hTVRiSUZaQT5OOC4+KSBB + LiRYRDlbRENaQ0FUQTtOPDVQOSxTOy5JPjVTRz5VQT9RPjxPPT9QPkBHPzxGPjtKQD9VSklbSEFR + PzlTQTNRQDJGPTFBOS1KPjpVSERcSkRVRD1PPzFPPzFOPS9JOStGMB1IMh9NOSxbRjlXTENVSUBU + RENWRkVOPjtIOTVFOTdJPTtTQTlUQzpQPzNMOy9DOC1ANStNPT5UREVTRkZVSEhYRkRUQT9QPzBO + PS5UOzdWPTlWQDxdR0NbSEZWREFOPDdHNTBGNS1JOTBJODJQPjlaRk1hTVRiSklTPDtKOTdOPDpW + SEpYSk1VRj9TRD1WQDlaRDxTQTNOPS9MOy9OPTFVPixUPStUOS1TOCxVOjFaPjVWPy1VPixNPC5H + NylFMiJGMyNJOixKOy1OPy1QQS9QQC5OPixNNSxPOC5WPShVPCdTPC9ROy5FNCdEMyY/LB9JNShN + PDBOPTFVPTFWPjJjQDdjQDdVPTNPOC5RQDFPPi9ONR1NNBxPNyBYPyhRPCxVPy9UPTBQOi1QNSpQ + NSpaPS1aPS1TPCxMNSZPNyBPNyBNOidOOyhNPC5PPjBaQzlfSD5GMSBPOihaQCtcQy1YPyhTOiM+ + LRQ5KA9FLRlMMx9JNB9IMx5EKx1KMSNPOjJaRDxTPjNFMSdEMR9INSNNNSpIMSY9LCQ/LiZIMSVN + NSlKOCVKOCVFOSZIPClOPzVNPjRJOyM/MRo7KBI4JQ9ALB1FMCFJMyJHMSBFPztTTUhYTEdPQz5K + PitANCJELx5GMSBPOy5VQDNVPy9YQzJVQDVOOi9NNy1NNy1ROjVWPjpTQD5UQT9PQ0NPQ0NRQDtU + Qz1XRjpaSDxWRjhVRTdTQzdKOy9FNyVFNyVEOzI/Ny5BMyJAMiFKOzpaSUhaQT1ONzJJOi5KOy9J + NyZHNCRELyhUPjdbTU9bTU9NRDtHPjVANS1EOTA/Ny5EOzJXPj5VPDxUQTtTQDpVRD5bSUReTElR + Pz1BNy5EOTBYQUBiSklcRkFUPjpMMCNGKx5JOS1WRTlQRD9OQT1OPTFNPDBNNS9QOTJUPjlWQDtT + PTVRPDRMNTdPOTpHPjRKQThNQDxUR0NaRkZaRkZaST1YSDxERjo7PTFJPTlPQz5eRz1YQThWQTNV + QDJRPS9QPC5KNSJOOSVPQTRYSj1VUEZTTkRWRkdWRkdOPThGNTBIODJTQTxYSDxTQzdOOypJNyZE + Myg9LSJGNzNQQD1XRTxWRDtbRTJYQzBXQzVTPjFNNytNNytTPDtcRURcSUxXRUdNOzJHNS1JNShJ + NShMMzNcQ0NiUFZfTlRRPDhHMi5JPTlUR0NYRkZWRERYRDlaRTpdRz9fSUFXQDdQOjBROy5TPC9W + PjFVPTBdQzNbQDFiQDFhPzBbQDFYPi9VQDNNOSw+LRY9LBVROydWPytYRDVWQTNUQzNPPi9ROi5Y + QDRdRTlbQzdUPTNOOC5FNSRBMiFAKBpGLR9QNStTOC1WPjRaQThlRUddPT9MNzJNODNROy9POS1R + PCxdRzdfTj5hTz9dRjlVPjFRPi1TPy5UQC9WQzFiSERdRD9bQzVTOy5UPixWQC5bRTRaRDNRQTVX + RztdR0FWQDtDLhZPOiBbQC9eRDJcQCxYPSlJNCM/KxpBLRhPOiRNPC1GNSdGMx9GMx9VPjFcRThR + QDFFNCZHNR9OPCVPOCtIMSVBLR5DLh9EMCNKNylOOyhRPitMRDRGPi9KQz1MRD5NPiZDNB0+Jg09 + JQw5KBM9LBZELx5DLh1HPDRRRj5XSEBVRj5QPzNFNClDLhtIMyBOOypUQC9TPyxRPitTPDBKNClG + MihKNyxOPDpRPz1VQT9QPTtMPDBOPjJHPDRFOjJPPTtPPTtaRTpbRjtURDFQQC5GOSpFOClBMyxA + Mis8MiM7MSJQPj5aR0dWQTRMOCtIOSdKOylJOi5HOCw+MSNQQzNRTEdTTUhWRTxPPjVGOC5AMilB + OS9EOzFROjNQOTJPPTRPPTRYQDpaQTtRR0RKQD1BOzI+OC9OPzlXSEFRRDdKPTBJNyRINSNTQDhY + Rj1TRz9NQTpHPDNGOzJIMy9MNzJPPTdVQzxUSThNQzFGODBFNy9JOTBKOjFNPDdVRD5aRkZhTU1X + TUdWTEZGQz0/PDdHPDRNQTpWRjpURDhXRjpWRTlPQTJHOitKNypWQTRbTERbTERWUE5RTElTRkFT + RkFKQTlAOC9KOjRXRkBdTD9WRTlMPC1JOitGLyNDLCBJNyZTPy5URDhXRztiTT5fSjxeRjlXPzJI + OCpKOixNPDdUQz1cTEhVRUFKOTBEMipJNSlKNypWOTpiREVlUVFdSUlHNTBEMi1NPT5YSElcSkFW + RTxbST1eTUBjTUdeSENYQThQOjBUPi5XQTFbRT1dRz9jSj5jSj5dTD9XRjpdRD9dRD9YRDlQPDE9 + Kxs6KBhPOihYQzBYRzhVRDRURTJRQzBTPjNeST5iT0ZdSkFOQDNDNSlGMSBALBs8JBY8JBZELSJN + NSpXQTpeSEBhSERVPTlFNCdGNShKPDVPQDpXRj1fTkVlU01eTEZUPzRMOC1WQTNdSDpXTT5YTj9j + UEldSkRXQDdWPzVOPi9VRTVhST9YQThHMydVQDNYQTVQOi5BKhNONR1cRi9eSDFYRTFTPyxKNyFH + Mx5FMBlPOiJMPi9JPC1GOSpFOClQQDRYSDxURTBGOCRHNCBNOiVNOidINSM+LBhDMBxELx5HMiFQ + OihYQS9URDRPPzBQRz5WTURNRC9BOSVAJxE/JhA8Jg4+KA8/Kxg9KRY+NC9MQTxWRz9VRj5QPC5H + MyZALhpGMx9JOStPPjBOPS5MOyxQOi5KNClDLh1NOCZMOy9OPTFUQzdPPjJJOStJOStIMjFIMjFJ + ODFOPDVVQzpXRTxYSDVURDFHPS9EOixJNSlHMydFNClFNClMPztQRD9VQDJOOixKOitPPi9OPixN + PStENyhNPzBHRztOTkFaSkNTRDxKOjFAMChKNypOOi1JOS1NPDBPPzNNPTFTQTVVRDhOQDNNPzJH + PjRBOS9HPjVRSD9NQzFJPy5MOyxQPzBTQTtaSEFVRD1OPTdMQTFHPS1GMCVMNSpEPDlQSEVbUUdP + RjxGOSxBNChDNzJGOjVHPDRRRj5cUEdhVUxaTUpUR0VNPDNIOC9FPjVHQDhVSUFUSEBURT1TRDxV + PzpQOzVGPjtQSEVVTkVXUEdaT05YTk1bRjtVQDVPPjVBMSlPPTdbSEFkTEdaQT1RPzdQPjVJMiZH + MCROOi1WQTRXRkBbSURhUUpeT0haSkNRQztNOStOOixQPzlXRj9cT01RRUNDNC5FNzBDOC9FOjFQ + PkBVQ0VaTUpNQD5FNC5JOTJMQTxQRkBXSTxWSDtWTUNdVElfTE5XREZJPjdIPTVUQzdaSDxbSj5c + TD9dSkFeTENXRzlTQzRiREdoSU1aRkRKODU6Kx04KRtJPC9TRThcSjxYRzlTQzNURDRcRkBeSENf + SURfSURRRDRGOSpONCZGLR87JxM5JRFBLCNMNSxXRj1bSUBbRjtQPDE9NCE5MB09OipHRDNXRUNe + TElfR0RROjdJOS1JOS1WREFeTElfTUpeTEleTENaRz5RPTJRPTJNQTpWSkNYRj1PPTRHMSVNNypJ + OStIOCpAKRJONR1eQTFoSjpeSDVXQS9VPylRPCZKNx9RPSVQQDROPjJGOSpGOSpKPTBVRzpVRi9I + OiRFNx9GOCBMNyFGMRxBLBtAKxpELxxHMh9UOTBdQTlPRjpORTlORTlWTUBWTDtNQzJQMiNHKhs+ + KxVALRZGLR1GLR0/LyRMOy9TQzdXRztVQSxKOCNMOShNOilVQDVVQDVbPzdWOzJQPC9POy5IMh9D + LRpGMiVPOy1OQDFIOyxGNS0+LiY8MiU8MiVHOSNOPylVRDhcSj5jSkBiST9PQDdJOzFKOixFNCdI + MilMNSxIPDpOQT9UQC9OOypKOy1PPzFQOi5POS1IOClOPS5NSDtNSDtXRUVVQ0NKPzRBNyxHNytN + PDBKOixKOixRQDJRQDJXRzhYSDlVQDNVQDNNQC1GOidIOS1TQzdXRjdVRDRUQTlUQTlUQzxcSkRU + RjlRRDdPRTRNQzJJOStMOy1JRD9TTUhWUElMRj9OOixKNyk3MSM4MiRHPThTSENcU0hcU0hcUEdT + Rz5JPjNBNyw/Ny1GPTNMREBTSkdWTUBQRztUQzpNPDNJPENWSE9aUEZVTEFaTU1eUVFdSkFMOjFE + NClDMyhPQDpeT0hqUFBcQ0NVPztbRUBQPzBGNSdJOTNPPjlPRUFYTkphUUpeT0hUTEZIQDtKOTBM + OjFUQUFXRUVPSD9KRDtDMStBMCpEMytIOC9JODpKOTtTPz9QPT1OOi1KNypMOzJVRDteTUBeTUBb + UUdeVUpYQUBQOjlKOjRMOzVVPzhdRz9cTkBeUENkTkhcRkBUQC1WQy9iUFRfTlFUQEVHNDk9LSJD + MidJPzFRRzlWTD1USTtJQDhNRDtVSEhXSkpdRkVbRENRQDpKOjNPPCdNOiVIMxw6JhBBLCNTPDJc + RzpbRjlWRTdJOStBMyBAMh9IOy5WSDtfTE5dSUxVQTBHNCQ/MiZPQTRaQ0RdRkddREZTOjxROTJO + NS9KNypTPjFWRkVURENXQDNTPC9MMRxILhlHMydMOCtFLhVONxxcRDdkTD5bRjtVQDVTPjBRPS9T + PjNTPjNWPzVUPTNMOCpFMSREMipMOjFXQTFPOipMNyNMNyNKNCVDLR5AKxhDLRpFLxxHMR5ROTRb + QT1URT5MPTdIOCxUQzdUTUNPSD5PPCdKOCNKNxtMOBxONCRNMyNJMilONy1QPzlXRj9PPzBNPS5N + PDBQPzNTQzdRQTVXPzNTOy9RPCxPOipJMidBKyBBMiFKOylOPS5MOyxIOClAMCI7Mh84LxxAMiFK + PCpXQTxeSENkTEdkTEdPQDlPQDlPPThMOjRJMi9IMS5FOTROQT1RQDFRQDFKQC9JPy5RPS9OOixI + PTVHPDRIPzNPRjpMRj9IQzxKPDVGODFHOS9KPDJKOixQPzFUQzNVRDRWSDtaTD5YRj1QPjVMPC5I + OStTOy5YQDNYSDpYSDpWRz9VRj5WRT5eTUZaSUZUREBNRDtJQDhKOjNKOjNORUZRSElTTENMRTxM + PypEOCM+NSI8MyA+NC9PRT9aTU1fU1NYTExNQEBKPDJFNy1ANStBNyxNOzlXRUNYTUFUSD1TRThO + QDNVQEVaRUlYTElWSUdXTE1dUVNdTUxMPDtDMiVFNCdKRUBWUExiUEdVRDtUQz1WRT9NPixFNyVE + MyZJOStPQURdT1FjU1RiUVNVSEZJPTtHOTFMPTVUQURVQ0VRRUVJPT1FLyNGMCRHNS1JOC9FNC5G + NS9OPTRKOjFGMiVGMiVINzBUQTtfT0xiUU5jU1FcTEpPPTRGNCxEMyZJOStYQz1hSkVhUUpeT0he + Rj9WPjhOPThYR0FfU05XSkZQPjVHNS1ILShJLilOPjJXRztWRjhRQTNKOyxOPi9WSUVWSUVYRUNV + QT9QPzNOPTFNPSlMPChEMR09KxdBMiRMPC1VRTlQQDROPTRHNy5EMyhEMyhMPz9YTExiTkxUQD5I + NyBBMBpGNytOPjJXQD9XQD9TOC9NMipIMSZHMCVFMClMNy9RPzlTQDpTPStJNCM/KRBBKxJJNSlT + PjFFMBlTPSVYSDVfTzxRQDhIOC9IOCpMOy1NPDNPPjVTQDpTQDpJOihDMyJBLiJGMiZQNSpQNSpR + NyNQNSJKNylFMSQ8KRU9KhY/Kh9FLyRMOTdYRUNVST5JPjNDLidQOzNOR0dOR0dQQzVPQTRQOylT + PStVPytUPipOOixRPS9RRDdPQTRPQTFQQzJTPjNVQDVWRTdRQDJUPSlTPChQPC9NOSxKOitGNSdB + MiFHOCZKOydJOiZPOSxKNChDMB5BLx0/MCNHOCpWRD1fTUZjUUVhT0NPPjVPPjVPPjlJOTNFMiBE + MR9FNSdQQDFURDVVRTdTRThQQzVUQzNKOitIPTJGOzBMPTVQQTpIRDpHQzlJOzFFNy1KOixIOCpP + Oy5XQzVXSEBaSkNaTkZYTUVVRzhNPzBMPC1MPC1VRDRdTDxeTURcSkFVRj9XSEFWRkNcTEhdSkhX + RUNOQT1MPztOPzlMPTdRQUBURENRQUNUREVPQTRNPzJMOSRHNCA/MiRURjddUUlhVU1RSUZIQD1K + PChJOydDNyA+MhxJOTNYR0FdUUlYTUVUSTtQRjhYR0FbSURWTEhUSUZVTlBYUVRXTE1KP0BENCdF + NShJQzpUTURcSkVVRD5VSUBVSUBOPixGNyU+MB1FNyNVRUZlVVZlVVZYSElUOztQODhJODJMOjRO + PDpRPz1UPTxNNzVINCdNOStOPy1PQC5HNR9FMx1FNyVDNCNENCE/MB1GNzVTQ0FbTk5hVFRfTExW + Q0NIOjBBMyo/MShKPDJdSU5jT1RnT1NcRUhROjVROjVRR0RaT0xiTEZWQDtNOilINSVILiNILiNT + PTVbRT1VQDVQPDFRPTBUPzJXR0ZRQUBQOzNTPTVKOitJOSpKNS5IMyxDLh1ELx5AMydHOi1QPzBR + QDFRPz1FMzFGMiZINChPQDpYSUNYRDlINCpFMBtDLhlJOitMPC1WQDxUPjpNOS5KNyxFNSJDMyBE + MyVFNCZIOStMPC5OPTRJOTBALBlIMyBeRjxpUEZJMyBbRC9bT0ZaTkVQRDA9MR8zJhI8LhlJOStQ + PzFUQTlUQTlNPS9FNSg/LCA9Kh5GKxxVOSlUPylVQCpVPipOOCRFMx1BMBpFNSdFNSdIPTRUSD9U + SkBORTtHMCpELSdKPzhPRDxTQTlVRDtVQDNYRDdaQzVXQDNJQDdGPTNKPzRMQDVOQDFPQTJWPzJY + QTRaQzJVPi5TPCxUPS1QPSxNOilJPC1FOClFMB1HMh9HNyhNPC1QOi1POSxPNSVONCRHNCJKOCVX + Rj1hT0ZeT0dbTERTQzdURDhPP0BNPT5EMyY+LiFENyhPQTJWRz9bTERYTUVPRDxOQDFDNSdGOC5G + OC5OPThQPzpPRDxOQztKOjRGNTBJNStNOS5XPjhfRj9aT0lYTkhVSEhVSEhORDNMQTFOPS9UQzRY + SEdiUVBdTUlXR0RKQDtNQz1XTUdfVU9fTUpWREFQPzlRQDpOPzVKPDJRPDdUPjlTQD5VQ0BYPz9V + PDxUPS1ROytMOzRbSUNaTU1YTExPRjpMQzdRPCxOOSlAMyQ+MSJJRD9YU05hUE9YSEdVSUBUSD9c + SkVfTkhYTkpVSkdYTU5XTE1bTk5NQEBFOCtHOi1OQztUSEBORTlPRjpWTUBVTD9PPzFGNylAMSNK + OyxeSkpoVFRfT1BTQ0RRNDVPMjNHNDJJNzRNPDdTQTxNODBIMyxFNClPPjJaSDpVRDVNOR9BLhZA + LB1ELyBHMCdELSREOjlPRURYTk1dU1FaR0lRP0FJOTJBMStHODlXR0hjTlNkT1RfQ0BUODVQOTJW + PjhTSkdWTkpYQztNODBPODNKMy9MNSlNNypXPDFaPjNVPTBTOy5UPjdTPTVMOzJHNy5HMSJJMyRH + Mh9HMh9ALSFDLyM8LRpDMyBHOSFHOSFTOy5XPzJPPi9GNSdFMSVMOCtQQDRPPzNJOyc+MB1MMiBR + OCVRPS9RPS9RPzpNOzVKMixJMStJMiZHMCRINSVKOCdJOi5IOS1OOi1POy5POThdRkVoUE9qU1FM + NyVcRjNdSkVeTEZURDFENCM6KBU4JhM8KhhEMR9TOzRbQzxJPy5ANyZDMRs4JxI7JhdKNCVWRjda + STpaRC9XQS1QPSFKOBxMOyxKOitNPjdRQztUR0NTRkFMNC5BKyVINy5KOTBQQDJURDVaQzdeRzta + SDpVRDVGPzU/OS9JOzFMPTNNPTFPPzNVPjJaQzdYRTNUQC9XQC5QOihMNyVNOCZIOSpFNSdIMyBN + OCRVPjFYQTRWQTNTPjBMPChKOydOOi1XQzVdUUZdUUZWUEBPSTpQQzJTRTRPQDpNPjhENyg9MCJD + MStTQDpVT0pWUExUUE1HREBGPi0+NyZDMyhHOCxKPDVPQDpTPz1PPDpKOjFFNCxBMSlJOTBUQzxd + TEVXVExPTERPRURUSUhPPTRINy5FNSpVRTlaTk9eU1RUR0NNQDxBOjRHPzpXTUddU01cSkVVRD5U + PDlTOzhJPjVJPjVQPjhPPTdOPzlQQTtUQT9RPz1OPDdOPDdNQEBYTExYSElXR0hPPjJOPTFQPzFM + Oy0/NCo8MSdDPj9WUVNfUVRXSUxQR0hRSElYTU5eU1RVT0hOSEFPRT9QRkBWSkNMQDlFNC5GNS9M + PDtMPDtKPzhMQDlVRTlVRTlRQDRHNytEMyVQPzBdSUliTk5YSEdNPTxOOC5IMilFNSpFNSpIOS1N + PTFKOjFHNy4/OzFJRTtRRj5TRz9QOydJNCFMNSRQOihQOCNMMx9JODhVQ0NbSEpcSUxXPzxQOTVH + OTJDNC5FOTdTRkRfSExfSExfQz9cPzxdRT5eRj9WSUdUR0VNOSxJNSlRNyxaPjNbRDNaQzJcRTRa + QzJWOS5VOC1VPTNUPDJMOShJNyZJNyZMOShMOSRINSFHMCdHMCdGMCVMNSpTPS1UPi5YPi9WPC1R + Oy5MNSlIMyBMNyNNPC1KOitHOCJIOSNRPitUQC1eRDRbQDFOPTFJOS1HMitGMSpIMStHMCpKNypO + Oi1OPjJNPTFTPjFTPjFXPkNiSE1kT1RlUFVNOStdSDpVSUFVSUFUQC9KOCdELRQ+KA85KxU6LBZP + OjRYQz1PPytJOiZENBI4KQk5KBNDMRtVPzpfSURbRjlaRThTQy5PPytRPi1QPSxPPi9RQDFUPjla + RD5QPzFHNylFMSQ/LB9HOCxKOy9XQDdeRz1aUEZRSD5JPy5HPSxNNytMNSpIOCpPPjBRQDJXRjha + Rz5WRDtcRjNUPixMNyNOOSVHOCZIOSdMPSlPQCxXRj1cSkFXTT5USTtORjdIQDFRQztURT1WSkNe + U0pWTjxPRzVEPTNJQzlKPzhJPjc9OCk1MCJDMTFYRkZbVVBWUExQTEFIRDpIPClDNyRHMiNPOipQ + PjVTQDhOPDpMOjhFOytDOSlFNCxHNy5QREFYTElTTUZMRj9HQEBNRkZHPDNEOTBENDFWRkNhVFRe + UVFQQD1KOzhHOTFOPzhRUEhVVExVSEhOQUFOODtPOTxIPTRKPzdNPjdNPjdNPjhNPjhNQDxJPTlO + PDpPPTtOPDpWREFaSEFUQzxQPzFUQzRURTJNPixENypAMydGPUNWTVNeUU9XSkhMRUdNRkhVSUpe + U1RWT0VMRTtMPTNOPzVHQDdAOjA/LydBMSlHNTVGNDRINy5KOTBPQDdQQThTPjBOOixMNzFUPjlU + RENVRURRQDtJOTNHMydHMydHOCZFNSRIOS1OPjJNPzJJPC9KPjpOQT1WREFVQ0BURDhTQzdXRjda + SDlaRjJWQy9NPTpRQT5URENOPj1OPDNJOC89NSdAOSpGPjlNRT9VRUFaSUZoT0xnTkpkU0xfTkdf + TUZYRj9MOyxPPi9bSUNhT0heVUheVUhiUERdTD9dRTheRjlUPDBTOy9IOClNPC1cPDJnRjxeQTNX + Oy1KNyxEMCZEMy1IODFQPjVXRTxaRz5UQTlRPDdMNzFHNCJFMiBKOitMOyxRPS9QPC5URTtbTEFh + Tz9bSTpTQTVIOCxEMyZDMiVJNSlINChNPDBQPzNUPjdTPTVXQTFaRDNTQENYRkhjT01kUE5FNSRP + Py1URDhWRjpPPytNPSlFMx1FMx08MRk+MxtMNy9QOzNQPSpPPClEORU5Lgw7JhRHMR5XQDdfSD5W + Sj9USD1URjlRRDdPQTFNPy9KPS5JPC1TPThVPzpKQThHPjRGNyhBMiRBLx1EMR9OOi9XQzhaTUpa + TUpRRTFOQS5KOCVBLx1FMRxNOSNQQDRWRjpdTENcSkFeSjlYRTNTOSZGLRtBLx1INSNOQDNQQzVc + SUlaR0dUREBPPzxIQDtJQTxJPzxUSUZbT0ReU0dMSjdGRTE+OCxEPTFHPDRIPTVFOi8+Myk6NDBO + SERbTkxXSkhTQTtMOzRHOis/MiRAMiFOPy1RPzlMOjNJODJINzFBOis9NSdHNytKOi5UR0NbTkla + RD9TPTlNPTxNPTxFNCxEMytBODdVSkldUVVbT1NNPTxFNTRAPDJIRDpRUE1UU09PQ0BGOjhGMzFK + ODVOPTRQPzdKPDVHOTJFOjJIPTVMOzVOPThHPThIPjlOPThWRT9YRztTQTVUQTlaRz5VSUBUSD9O + PDpDMS9JQERXTlFcUEhTRz9MQDlNQTpQRERbTk5UT0RJRTpMOy9KOi5BMiVBMiVALydBMChEMyhD + MidENyhJPC1MPi9OQDFQQDFOPi9OPDdQPjlQPzlRQDpMPDBJOi5DMiVGNShJOixIOStJPjdNQTpQ + QTtOPzlMPTdRQzxXRUVXRUVWSkNXTERcTEhdTUldSkVcSURbQz5aQT1RQDhPPjVNPixGOCY8MiI/ + NSVKPDVTRD1QRkBYTkhnVldnVldkVU5eT0hfT0NcTD9XSD5fUEZoVFhlUVZrWFNtWlRfU1BXSkhc + Sj5aSDxVPy9RPCxKNylUPzFXRT5jUElaRD5MNzFPNzBNNC5JNC9RPDdYR0BhT0hYTElPQ0BNOzRI + NzBBMidGNytGNylJOixVRDtdTENiUVBhUE9XSTpURjdVPjRPOS9KNylFMSRMOShNOilPPTdTQDpU + PDVUPDVXQDRUPTFKOzxTQ0RhT0llVE5ELx5GMSBJMyhNNytNOSxPOy5JNShGMiVEMR1FMh5JMiZO + NypROi1TOy5JOCFFMx1BMSNGNSdQPzdbSUBWSkFWSkFVRj5TRDxMRDRHPzBFNy1FNy1GOzNKPzhM + QzlMQzlHPjREOzFDNSc/MiQ/NSZPRTRdSkVeTEZURDVNPS9IOClBMSM/KxNBLRVJOi5VRTldTkRe + T0VfUURbTT9POiJJNB1OMx5KMBtNPC5XRjhfTkVUQzpMOy1NPC5HPjVIPzdOQUFXSkpbTkxcT01T + ST9MQzlBMyBENSJFOCtENypFNSpFNSpGNzNVRUFTRkZVSEhROzpMNTRINTNFMjBEMytOPTRMOjhF + MzFGMS1GMS1AMilBMypMNSpROy9VRj9aSkRUPDVPODFMOy1MOy1ENyhBNCZFPztXUU1XUU9QSkhJ + OC9EMipAOTNORkBYTkpYTkpKQTU+NSpIMStNNS9MOzRNPDVNPS9KOy1OPS9QPzFTPTlRPDhJPTlH + OzdNPDVWRT5XRTxYRj1aSD9cSkFXTUlPRUFFODw9MDRIPT5USElWSUlOQUFJPTlHOzdMPDtVRURc + TUNXSD5UPipKNSJHMSZIMidIMSVJMiZEMSFEMSFGNCxOPDNRQzlWRz1VRTlURDhTPjNQPDFPPzNQ + QDRQQDJOPjBMNy9POjJUPjlUPjlTRUdURkhQQD1NPTpKOzhOPjtUREVWRkdXSkZVSERVSEZXSkhY + TEdbTklfSDxdRjpXRztRQTVNPy9HOipGNyhDMyVMOzJYRz5XTkReVUpkWlZiV1ReUFNXSUxcSkFe + TURjU1FjU1FqU1ZuVlpvVlNtVFBbTklXSkZfTURbSD9RPTBPOy5RPDRcRj5YTURbT0ZVPztMNzJR + OzFMNSxJNzRRPjxVQ0NaR0dVRj5PQDlIOy5BNChBLSlJNDBINzFUQTxdSU5hTVFjTUhbRUBRPi1T + Py5aQThROjBOOChKNCVMNSlQOi1QPjVRPzdRPi1QPSxROzFQOjBKOjNUQzxhVFRfU1NBKhVBKhVA + LBY/KxVJMB5PNSNHMxpHMxpGMR5HMh9GMCRMNSlTNStYOzBPPCtNOilPOy5TPjFUQTlfTUReTUdc + SkVYR0FWRT9ORkVGPj1DOC89MipANDBHOzdQPzlTQTtOPzlNPjhDPDA+OCxAMydMPjFXRT9cSURW + RTdQPzFJPSpEOCU+LRQ9LBNANCJRRTFiUU5kVFBhVE9bTklWRjFNPSlNOCBHMhtKOjNWRT5bT0dP + RDxGPi1BOilFOytEOipOPTdWRT5UR0VcT01WSkNPRDxMNydIMyREMSFEMSFDMyBGNyNNPDBTQTVQ + RD9UR0NJPC9ENypFNC9FNC9KNTFMNzJJNC9IMy5FMSdFMSdAMCJEMyVKNCtNNy1URDhYSDxUQC1R + PitMPyxMPyxAPjNAPjNKRkVWUVBVUUxKR0FGMSpHMitEOjdOREBaSEFXRj9OPzVGOC5GMihFMSdA + OC5IPzVPQC5RQzBVRDVTQTNPPT1JODhGPTRGPTRJOjtPP0BYRj1eTENhT0lfTkhXTUlMQT5ALy06 + KSdDOTVOREBRRUNMPz1GQDpAOzRIPT5PREVbSUBWRTxYRDVQPC5OOixOOixQOS1ONytHNyhKOitK + ODVOOzlXRT5fTUZaSD9RQDhOOTNNODJNPTFQQDRTPTVRPDRUPTxROzpPPDxRPj5YRUdYRUdTQz9O + PjtJPTtKPjxOQT1PQz5USD1QRTpQQD1RQT5UR0dYTExWSkFYTURYSEdPPz5PPz5KOzpBNy5ANS1P + PzxfT0xeWEhfWklkVlhfUVRWSUVNQDxRQT5WRkNjUEpoVU9qVlZuWlpkUUxaR0FURDhdTUBjTUdc + RkBUPDVVPTdaRD9dR0NbSEFaR0BaQzVYQTRRQDJNPC5HOCxRQTVVQ0NXRUVTQDpMOjNMNSxFLyZD + LCFJMidNOz1eTE5jT1RfTFBYRDlTPjNRQDFWRTVcRD9ROjVRNytUOS1aQzJbRDNUQzRUQzRRPCxR + PCxROy5OOCtKOTdYRkReUFNbTU9EKRhAJhY+JQ88Iw4/Jw9FLBRELxpFMBtHMhtHMhtGMyFGMyFP + NCpXPDFNPTFMPDBUPzFXQzRXSD5eT0VfUEhcTUVVSUFUSEBOSERKRUBBODI6MCs/NC1BNy9HNy5K + OjFHPDFNQTdKQThIPzVMOzJIOC9PPkFWRUhaQTtaQTtTPyxMOSZQNyRILx1BMSRRQDJfTExqVlZi + VVVbTk5aST1QQDROOSlOOSlOPzlRQzxXTENTRz5MQTNFOy08Mys5MChDMzBQQD1RR0FWTEZUSEBT + Rz9QPzlJOTJBMBpBMBpAMh9FNyNOPTFOPTFPPTtQPjxGOzJBNy4+NS09NCxANStGOzBQOjBPOS9I + MyRDLh8+LSU/LiZDLyVFMSdRRDdVRzpWRjNVRTJMQzlIPzVFOzVIPjlNQUNVSUpYU05VT0pEMyhE + MyhDOTNHPThUQzxTQTtNPy9FOCg/NSg8MiU6NStFQDVOSDlXUUFaUEdUSkFJQzc9NytBOitDOyw/ + NTJDOTVQRz5bUUheU1RXTE1RQDtGNTA/KR4+KB0/OCdMRDJPQDpOPzlFPzlAOzRHPDRNQTpUR0dV + SEhVRURWRkVRQTVTQzdTQzNOPi9MPSdGOCJPOjVWQDxbR0dlUVFaTU1MPz9IOCpJOStNPzBQQzNX + QDdaQzlXQTpTPTVNOzlRPz1TQDtVQz1PPjJNPDBNPDVPPjhNQDxNQDxQPzlRQDpTQDhVQzpVR0xX + SU5TT0xYVVFYUE9NRURUQUFPPT1KOy1IOStWRERnVFRjVUdcTkBUR0NOQT1DOi4/NytJOT5VREln + VFRoVVVnU1NfTExRQTNJOixUSD1cUEVkTEdcRD9XPzVfRz1eRkFcRD9dRT5bQzxdRz9fSUFTRTVM + Pi9KPTBWSDtYRUVXRERTOzdONzJQNSpOMyhIMSVPOCtUQTxdSkVYRz5RQDhPQTFURjVXRzhVRTVV + PjJNNytXOytdQDBiRDlhQzhaQzBXQC5WPShWPShRPTBQPC9OPTdaSEFdTkdYSUNKNCNELh1DKxdA + KRY/KxZBLRhFMB9HMiFINSFHNCBJNB9MNyFQOSxUPC9PQDlOPzhPPjhRQDpXTERYTUVXUEdWT0ZU + TUNQST9WSj9RRjtGOSw1KR08KRxALSBFOClGOSpOPTRTQTlRQDpOPTdRPzdNOzJOOzlTPz1XQzhX + QzhYQTVTPDBRPSdMOCJFMSVPOy5dUE5nWldiVlpeU1ZbSENWRD5ROy9UPTFPPzxTQz9TTENTTENV + Qz1QPjlDODA5LidDLhtMNyNOPTdTQTtQRz5PRj1NQDxHOzdJMydNNypOOSlQOytQPzdNPDNPPTdO + PDVJOS1GNSpDMipEMytAMSNKOyxVPy1YQzBUPS1JMyRBKx9BKx9ALSBHMyZORztRSj5YT0NYT0NR + RUBHOzdKOTtKOTtJOT5VRElcSUlaR0dKPDJENSxENSxKPDJMPTdPQDpHPzxDOzhDOyxAOSpBNTNT + RkRaTUpdUE5cU0lXTkVNRDpGPTNGOSxENyo7MTBBODdMR0hYVFVcU1RRSElJPC8+MSVAKBZEKxlF + OCtRRDdPPjlPPjlGOjhHOzlMOzVHNzFJPj9PREVUQEdXREpORkBORkBUSEBWSkNQPzBJOSpUPTxh + SUhjT09lUVFUQz1HNzFKPDJQQThYRzthT0NeTENcSUBWRT5MOzRFPDNKQTlPRDlRRjtQQzNNPzBQ + PjlPPThNOzlPPTtPPTtPPTtQPjlUQTxRREZVR0lRSk1WT1FYTVBTR0pVRD5TQTxPOS9OOC5YSk1j + VVdYTEdPQz5NOzRNOzRHOi1HOi1QPT1hTU1jVVpkVltcSUxRP0FPPjhQPzlUSkBbUUdhTEBdSD1k + SD9pTURhSkVeSENdSUdYRUNeSU5lUFVXRj9OPTdTRD1dTkdeTElaR0VWPjRROjBNNSxKMypJNC9Q + OzVQPjxRPz1QPzNVRDhdTDxfTj5VSjpKQDBNNyVPOSdXQDRcRTlbRDhcRTlVRTJWRjNcRjVbRTRU + RDRTQzNRPTJXQzhcSURbSENTOy9KMyhHMx5GMh1HLxlHLxlGMSJKNSZOOSdRPCpUOilUOilUPS1Y + QTFTPDJQOjBOPzVOPzVYR0FaSENbTkxaTUpXTkRWTUNeTENaRz5KPCg6LBk/KxZGMRxFOCtFOCtQ + PC5TPjBRQDhPPjVOPDVMOjNKOTJOPDVQQS9URTJTRDFOPy1DRS1DRS1NPDVQPzlbTU9kVlhjVVdd + T1FaSUhXR0ZXQDRUPTFOPTdRQDpORz5UTURUSD9OQzpHQDRDPDBDNyBDNyBMOyxKOitMPTNPQDdO + QztKPzhQPDFRPTJROjBWPjRTQDpPPTdOPjBMPC5GOidANCJFMSRDLyI7MyJIQC5XRzheTj5VRTdM + PC5JMCJILyFDMB5INSNWRz9eT0dbUE1YTkpVRUFIOTVDOTNFOzVMOjpUQUFQREFUR0VMPC5HOCpM + NSxROzFMOzRRQDpPPz5MPDtIODJEMy5IOThVRURVSkVbUEpeVE5bUEpQQTpPQDlKPDJDNCs8LSpD + MzBOQ0RYTU5YT1BNREVKOitFNCZBLRpGMR5JQDdUSkBPPjlNPDdEODNEODNINzBHNS9BOjdHPzxM + QEROQ0ZRRUNTRkRRSElUSkxTQTtJOTJOR0dYUVFnUVZfSk9PPDxGMzNOQENYSk1dUExiVVBjU09c + TEhTQTlJOTBFOzVNQz1ORTxRSD9PRzhMRDRKPjpMPztPPTtRPz1OPj1MPDtKOzxMPD1TQENVQ0VR + SUZQSEVTQ0RTQ0RVRD5TQTxGPjlIQDtaSE5fTlReR0hVPj9MOTdOOzlIOS1KOy9QP0VfTlRcVVda + U1VXRUVPPT1PPjVTQTlaR0BcSUNjSj5tVEd1VVB0VE9pT0hfRj9eRUBhR0NpTVZuUVtUQzxJOTJN + REVbUVNcVFNWTk1XRTxQPjVKOjFBMSlGLylMNC5HOTFKPDRVRj5hUUlnVU5iUElbRT1VPzhOOSNT + PSdcPTljRD9eRz1fSD5bRjtcRzxjTkBhTD5dTDxaSDlPOjJRPDRYRkRYRkRXQTpQOzNMOSRHNCBP + NyBVPCVOOixPOy1MPStMPStTPCxXQDBcQDRkSDxVRDhNPDBMOzJKOjFPQDpRQzxWSUlaTU1dUUlY + TUVaTkZWSkNJQCxBOSVAMRxHOCJKOy1NPS9UPzFUPzFQPzdOPTRIOjBJOzFOOypTPy5QQzNVRzhY + TDhVSDRPRzVPRzVQPjxTQD5XSUxdT1FeT0hdTkdbTklVSERWPjhROjNMOy1OPS9RPzlXRT5USkBP + RjxJRDJKRTNEOCU/MyFDNB9DNB9JOixOPjBNPjRMPTNNPDVOPTdOODdPOThMQDlOQztRRDNKPS1J + OSpJOSpMNSlDLSE/OClJQTJaSENiUEpcSUNUQTtKMyc+KBxDLCFQOS1XSUxdT1FcTlBYSk1OPzVD + NCtHOitJPC1MOzROPTdRQDpRQDpURDhRQTVXQzVWQTRTQDhRPzdWQDxQOzdOOzlFMjBHOTJNPjhV + QzxbSEFXSkhTRkRIQTlJQzo/Ois9OCk6Lyg/NC1OQ0RYTU5XR0ZQQD9NOSxMOCtMNydQOytRR0ZP + RURJOzFMPTNQPjVOPDNJOi5HOCxHOS9JOzFJOjdNPTpORD5VSkVYT1NQR0pMPD1MPD1TTUpcVlRo + UFRdRklNPT5JOjtORk1YUFdeVVZeVVZYSk1URkhPPTdKOTJJOjlTQ0FVRj5bTERUSD9OQzpQPzlR + QDpQPzlNPDVJNzdKODhKOTdOPDpQPTtUQD5TQTtNPDVTPDtUPTxTP0RQPUFFPD1IP0BWRU1YR09U + R0VNQD5JOTJOPTdKOjFKOjFKP0NUSExYU05XUU1VRj9OPzlOPjBRQTNVRDtdTENjUE5qV1V1XVxv + V1ZkTEFeRjxeSERqVE9yWlhqU1FNPDBMOy9NSElaVVZeVlNYUE1TRDxRQztTPCxPOSlMNSlKNChR + OzFbRDpdSk1lU1ViT09XRUVaQzlVPjRMNSZVPi5dPjxjREFiSEFlTEVdSkFhTkVkT0RfSj9jSj1Y + QDNNOS5POzBXRj9YR0BcPzpcPzpVPjFQOi1UPzJXQzVVRDRUQzNRQS9QQC5VQTBWQzFeRjliSTxR + RDRKPS5MMiRJMCJIOCxMOy9PPzxYSEVeTEZjUEphUE1fT0xMQTFFOytIOSdJOihMOy9PPjJQPzFT + QTNHPjRDOjBFOi9JPjNPOSxXQDNVRj5dTkZdVEpXTkVXRj1VRDtVRUFWRkNVSklaT05bSklYSEdW + SUdRRUNQQD9JOjlDOStBOCpGNCxOPDNPRjxMQzlIPTRGOzJDNSc+MSNALxdJOB9NPSlOPipOQDNI + Oy5JOi5MPDBKODhHNDRKOTdQPjxPPjBOPS9JOixHOCpNNypHMSVEMipWRDtYTElbTkxaSENVRD5N + OS4/LCJIMStUPDVXSVBbTVRcSE1VQUZMOzJKOjFFOy1IPjBNOzVOPDdUPjpQOzdQPzpcSkViUEpj + UUxfTz9YSDlQPjVHNS1JNC9JNC9DNC1GODBPPjVVRDtTRkFMPztEPDlEPDlBOy8/OS07MidAOCxN + PTpVRUFbRT9VPzpXPzNVPTFQPzFTQTNXSkhPQ0BHNylMOy1VPTNWPjRFPDJBOS9DOShFOypJOi5O + PjJUREVWRkdUR0dPQ0NPPDpUQD5eVE5fVU9kUU9RPz1IOz1IOz1PSE1YUVZaUFFRSElQQD1MPDlK + OTJMOjNIPzdPRj1eTURlVEpTTD9MRTlMQDhJPjVMOyxJOSpNODBPOjJQPzdRQDhTQTlVRDtTQDpO + PDVMOjNMOjNPPDpPPDpIPTVMQDlTRUlURkpQRT1OQztRQDRQPzNOPjJOPjJOPTdYR0BeU0lbT0ZX + SEBNPjdMPTVPQDlTSENcUUxnW1xoXF1vVl5nTlZaQTtWPjhaSExrWl1rWFteTE5NPjdKPDRPRU1d + U1tlVVRcTEpWRDtXRTxUQzdOPTFGNCxJOC9KOTtWREZbSEhfTU1dRkVWPz5aRDxQOzNHNytUQzdc + Qz5aQDxdRUBcRD9WRz9YSUFlTkRoUEZlRz1TNSxGMSpKNS5XQEFYQUNcQDRfRDhaRDNWQDBWRTdc + SjxYSDpVRTdTRTVRRDRWRTdXRjhhSTxlTkBWRz9MPTVKLyBILR5ALRhEMBtNPDVRQDpYRkRjUE5n + VlNlVVFbRT1OOTFKNxtPOx9UQC9YRTNYQThXQDdJQTJBOitBMidJOi5QPDFbRjteTUdlVE5hVlNa + T0xVR0lNP0FQQD9TQ0FPQ0NYTExbSklYSEdWRTxUQzpOPzlHOTJBMyxBMyw/MSpDNC1GOzNGOzNI + OCxEMyhBMyBENSJHMh9MNyNQQDJVRTdNPy9HOipKOCVNOidFNShAMSRJOC9RPzdTPjNVQDVMPCpJ + OihHMydKNypJOTJcSkRXT0xQSEVYQDpWPjhOOCtIMiZTPjNYRDlaTk9YTU5YQz5TPTlIOCxMOy9J + OzFJOzFJOzNHOTFMOTdOOzlJPj9aTk9qWFxoVlpiU0haSkBOPixENCNHMSZHMSZEMyVIOClTQTJY + RzhXRTxPPTRHPjJFPDBGOSpDNSdBMyJFNyVJOjdTQz9fR0BeRj9dTUBcTD9XSTpXSTpXTT5NQzRJ + NC1QOzNVPjRUPTNFOi9ANStHPS1KQDBOPTRQPzdUQURYRkhURENRQUBPRT9WTEZcVFBdVVFbUUdJ + QDdFOTlKPj5URkpVR0xUREVOPj9JODFGNC5KOjRKOjRJREFQSkheVFBjWFVVT0pKRUBJPjVIPTRK + Oy1MPC5TQDpTQDpVRD5XRkBYRz5aSD9UQTtPPTdOPDVJODFFNzBIOjNHOS9JOzFTP0ZXREpWRT5W + RT5aRDxbRT1aRThYRDdaRjRhTTtcUEhbT0daSkROPzlOPDVRPzlWTEpcUVBnV2FpWmNtU1ViSEpP + PjhRQDpbSU1nVVhkVFBYSEVTQENUQURcSFFkUFpkUE5cSEZURTJVRjNTQzdOPjJFNzBHOTJOPj1R + QUBaR0FbSENWRD5TQDtUQTlPPTRMOCtVQDNbQzlYQDdXQTxVPzpQPzdXRj1iTk5hTU1hQDVPMCZD + LCFJMidUPjpRPDhYQTFdRjVbRjtcRzxbST1eTUBdSkFaRz5YRDVXQzRYRDldSD1hT0NjUUVdTEVU + QzxOOChFLyA9LiBAMSNHNS9NOzRVQT9hTUpjVlFcT0pcSDdPPCtOOSVVPytbRDphST9bR0VWQ0BP + QDdKPDJGNShIOCpRQDJaSDpkUVFnVFRjUFNbSEpQRT1FOjJFNC9HNzFGOC5RQzlaRkZcSEhYQDpW + PjhTPjNJNStBLCNFLyY8LCE9LSJBLCBFLyNJMydIMiY9MR89MR9EMixHNS9VRD1bSUNQQDFIOSpF + MB9HMiFFMx1HNR9JOCFVQytYQy5aRC9TPjBMOCpDNSlHOi1PPjlaSENWTUNNRDpTPDJROzFVQDNY + RDdWRz1URTtcUU5YTkpUPjdJNC1JODFMOjNOPzVKPDJHOi1HOi1OOTNJNC9FOzpUSUhkVl1nWF9i + VVBbTklTPypMOSRMOCJINB9FNSpMPDBcTUNfUEZaTkVTRz5JPSpFOSZHMyZHMyZNNydNNydJOzFU + RTtdUE5dUE5WUExWUExaTUhdUExWTEhMQT5PNzBXPjhWQDlTPTVNPDdJOTNTQTlVRDtRPzdRPzdP + RDtTRz5RRj5QRT1RRUVXSkpcVFNYUE9aST1MPDBNOzRMOjNJQEFKQUNPPjVNPDNOPS9MOy1NOjhO + OzlVQ0VbSEpfT1BjU1RfVExUSEBOPDNPPTRTPThTPThRRj1QRTxUR0NTRkFTRkFUR0NWRT5PPjhI + NzFHNTBBMy1IOjNJOTJMOzRWQUZXQ0ddRkVfSEddSkFdSkFfSUReSENcSUBdSkFhT0ldTEZfTElV + QT9PPjhQPzlUR0VcT01oU1poU1piSEVbQT5ROTlXPj5aTlFhVVhiUElbSUNWQ0VcSEpfSk9iTVFh + TkhaR0FUPzJXQzVTOzFMNCs/MSpGODBVPztYQz5cRD1aQTtUQzpUQzpXQDRROy9XPS5cQTJcQTJd + QzNYQDpYQDpXRT9fTUdiUEdWRTxVOStKLyJDLCFFLiNMNTdQOjtVRTJbSjhdSThdSTheTENfTURe + SEBcRj5aSDxcSj5aRD5eSENfTkdiUElhUERYSDxNPC1BMSM9LSJGNSpANStDOC1NOzRVQzxeTkpf + T0xbTTxQQzJPRTdPRTdWRDtbSD9eRkFaQT1TQzdQQDRKOi5JOS1NQD5WSUdeUVFcT09cTEpXR0ZX + QDRROy9HOipENydHNylRQDJYR0BdTEVURDhQQDRVPTBKMydMMCNGKx4/KxZELxpKMR9MMiBOOChO + OChFNSc/MCJAMCVPPjJVSUBcUEdVSjpKQDBIMyJJNCNINB9OOiRTRC9aSjVfTkFfTkFORDVDOStD + MyhDMyhKPzhYTUVYSDxURDhRPCxWQDBbSEFhTkdeU0pcUEhfVExcUEhbRzVRPi1QPC9POy5MQDhM + QDhPOzBNOS5MOjNGNC5INTxWQ0leUFdfUVhhU1VeUFNdRz9XQTpPQTJGOSpEOzJKQTliVldfVFVX + UU1MRkFFPSs9NSREMCZHMylJNyZNOilNPjdWRz9iUVNfT1BXTk9XTk9YSEddTUxaTkVQRTxWQTdb + RjtYRkROPDpNODNPOjVUSD9TRz5UQzpVRDtORz5QSUBORkBPR0FVSEZVSEZcSUdbSEZaSENOPThN + Ny1NNy1MPDlNPTpPPzNRQTVRQTNQQDJNOz1NOz1VO0FbQEdfTFNkUFdnUEpYQz1KPDJMPTNQOjlV + Pj1VRUFTQz9OQzpNQTlQSkhTTUpTQDpNOzRHMitFMClHMi1MNzFMOjNMOjNWQ0lVQUhWRERbSEhd + TUleTkpeTUdcSkVeTElfTUpdTU5YSEldTUxXR0ZUQD5QPTtWQ0deSk9iUFRhT1NcRkFUPjpUOzdb + QT1eSlFjT1ZkUE5fTElYQz5aRD9bSEpeTE5kTEhbQz9TQTVUQzdUPjdMNy9GODBNPjdbQz9YQD1b + Qz9cREBXRT5UQTtXPzlVPTdfRDhiRjpfSj1kT0FeSERhSkZkTkhlT0lnUUZdSD1MOCJHMx5JLyRO + MyhPNzNUOzhRQy5VRjFcRjNhSjhcSkRcSkRYRz5VRDtTRz5WSkFbSD9eTENfUEZhUUddUUhVSUBT + Qy5KOydFLyNDLSE/LydAMChFNCdPPjBQREFbTkxaTkVXTENVSUFVSUFdRT5dRT5dRjxaQzlbRT1Y + QztNOStKNylMPD1OPj9TSEVTSEVXSD5VRjxTQyxOPihMPC5MPC5WOy9dQTVeSENiTEZaST1WRjpR + Oy5NNypKMh5DKxdJNB1RPCRPPClRPitUPzJWQTRPPi9MOyxFMiBUQC1XTENcUEdVSUFMQDlJPSpG + OidIOiZMPSlcSkFjUUhlTk1lTk1VRDtPPjVJOitENCZFQDdQTEFcSjtYRzhfSD5nT0VhUFFfT1Bf + U1BcT01hVUxdUUhYTj9TSDpRRDRRRDRWPjhXPzlYQThUPTNNOS5JNStKOTlTQEBRR0RVSkdeUU9h + VFFlTk1hSUhRTEdEPjo/NzhIP0BfVldaUFFTSklTSklMPi89MCJAMSBBMiFGNSpMOy9QPjxeTEli + VVNdUE5YU05TTUhYUE9eVlVeVE5RR0FYRkZeTExRSElEOzxDMzBKOzhXR0hWRkdYR0FaSENPSUdP + SUdTRkFUR0NXR0RXR0RMRkFNR0NOQ0RHPD1DMipDMipINzBMOjNTPTVbRT1UQzxUQzxNRDpEOzFI + OTpNPT5YRUliTlNcTUZPQDpHNS1BMChINzFOPDdNPjhKPDVKPDRRQztORENPRURGPCw8MiNELSFF + LiJKNCVQOipPPThNOzVOPj9PP0BOQENTRUdbR0dcSEhhTU9iTlBiUVNfT1BYRUlXREhPR0RQSEVT + Qz9NPTpORUhYT1NeUFVcTlNTRz9OQztWQDtXQTxaSE5fTlReSk9fTFBcSUdXRUNTRUlaTFBfSUFY + QztYQztYQztURjlKPTBNOzROPDVcRD9dRUBbRENcRURWPT1TOjpVPTdWPjhVRjxcTUNpU05rVVBu + UE5rTkxoTk5qUFBoU0deST5QPCZINB9VOC1fQTddRT5TOzRQOylWQC5bRzNiTjpfTkdcSkRbRT9X + QTxTRDxTRDxWRz9cTUVcT0pdUExbSEZWREFfQTdhQzhYQTFNNydBLhZDLxZPOSdROylQPjhbSEFd + SkhbSEZXR0ZaSUhdSkVfTUdeTUZXRj9QPjhQPjhOOCtQOi1PPTdOPDVRPzlUQTtYSDpVRTdTQzNR + QTJOPjJQQDRXQDdbRDpdSkRfTUZfVEpbT0ZKQzFJQTBKOitBMSNNPipWRzJcTDlbSjheTURaSD9V + RTdURDVPPCtTPy5YRztfTkFWRT9MOzVGOCZFNyVIOCxVRDhcUU5iV1RkVFBiUU5YRz5NPDNEMR9D + MB5AOC9ORTxbSUBeTURfVlpiWFxhVVhYTVBYSElYSElYUEpXT0lcT0pXSkZdRz9kTkZeUENfUURb + TERXSEBbRT1RPDRQPjVRPzdORz5TTENbUUdiWE5tXF1kVFVWT09GPz9BOjlNRUReUU9bTkxWSUVX + SkZMPjFDNSk+MBtAMh1GNShRQDJWRUhfTlFbU01XT0lWTkpWTkpcU1RfVldeVlVWTk1eSk9hTVFW + TEhKQD1GMzhRPkNRRUNQREFRR0FRR0FPR0ZNRURMREBNRUFQRkBRR0FKRUBJRD9KPjpGOjVIOC9H + Ny5OPjJURDhaR0BiT0hcTEpRQUBIOy5GOSxIPzVMQzlWQ0dcSE1KQz9DOzhFMys8KyNBMidGNytM + Oy9OPTFOOzlRPjxKOTc/LixDLhs9KRZFLyBJMyRGNyhKOyxOPDdNOzVOPTdOPTdNQz1ORD5YRUNb + R0VeSVBlUFdjTlVjTlVXRUVWRERTRkFWSUVVQ0BTQD5TR0hXTE1YSk9YSk9bQTtWPTdRPzlTQDpW + Q0lhTVReTVViUFhYSElUREVVREdWRUheRj9aQTtcSUNcSUNYRj1OPDNNNC5QODFXRUNaR0VWRD1R + PzlNOjhINTNNNTJROjdWQUZjTlNqU1ZrVFdrU1hkTFFbSEhjUFBiUERWRTlTPjBdSDprTkhvUUxh + TEBPOzBQPSxXRDJaSDpiUEFkU0lfTkVcRj5YQztTQTJPPi9URTtYST9bTkleUU1aTUhTRkFYRDdX + QzVUQzxQPzlNOR9QPCJQOytTPS1WQDtcRkBUR0NUR0NVRURbSklaTUpcT01bSEpXRUdQPzFIOCpM + NydNOChQOTRTOzdQPzdTQTlURjdURjdWSkFUSD9RQDhQPzdURDhXRzthT0hkU0xfU05cT0pUSEBO + QztFPDBFPDBMRTtQST9cTUNbTEFiUUViUUVdTz5cTj1XRjdRQDFfR0NjSkZUQzpJOTBFLyRGMCVK + Oy9aST1bVFRiW1teVVZbUVNVSEZFOTdHMx5FMRw6LyhIPTVWSEpdT1FbWl5VVFhcTEpWRkVKRDpN + RjxaSkNcTUVcT0pYTEdfSUVoUU1eVE5fVU9eTExXRUVRQzlNPjRVPzhTPTVKQz1UTEZfT0xpWFVl + X1thW1ZWU09EQD0+OC5HQDdUTEpTSklYRkBaR0FOPixKOylFNyFFNyFENS5RQztXTlFXTlFYUE9W + Tk1XUFBUTU1dUVNeU1ReU1ZcUFRfU1BbTkxRSkFFPjVIOThRQUBRSD9PRj1TRkFTRkFNRUFKQz9N + Q0FRR0ZUSEBUSEBQQThPQDdOPTRMOzJKPDJJOzFUR0NbTkldTUxfT05XSEBMPTVFNy1GOC5JPjdN + QTpQRT1OQztMQDVEOS5AMiE9Lx48LyBBNCVJOitJOitNOzJOPDNJNCVDLh9EMBtINB9HOSFMPSVE + PypBPShKPDRMPTVTPThXQTxVRj5RQztbSEZcSUddSU5dSU5hSFBjSlNbSEFXRT5VQ0BUQT9TPz1U + QD5XRUNbSEZbSEZaR0VYQztWQDlUQzpUQzpUQ0ZaSExaTFBcTlNXR0hVRUZYQUNaQ0RcRzxcRzxf + TEliTkxYRj1INy5BMypKPDJUR0VbTkxbRT9TPThIOy5GOSxGNSpOPTFXRkBiUEpqVlRqVlRlTlFd + RkldSk1hTlBdSkRXRT5bSENkUUxrUFNlSk1dRjVUPS1UPzJXQzVXRj1hT0ZnU1NkUFBaSENTQTxR + QDJPPjBTRDpYST9bSUNhT0heTk9WRkdQQTpRQztQQD1UREBYQzJVPy9UPjdUPjdUQD5VQT9PRUFR + R0RaQ0ZfSExeSk1iTlBdSkFYRj1QPzNKOi5KOitIOClNPC1TQTJQQTpRQztVRjxbTEFdTEVeTUZa + SENUQz1RQzlVRjxdTEVjUUpfU05fU05bTEVTRD1HPSxMQTBRSD5USkBYTUFaTkNiUERhT0NdTkRa + SkBTQzNRQTJeTUBdTD9aR0BKOTJGLyRHMCVGODBaSkNbVFZfWFtaU1NXUFBQSENAOTNHMiFBLRw3 + LCVIPTVVSkVeVE5WV1BRU0xVRD1RQDpGQzBJRjNRQzxWR0BXSkhVSEZhTVFkUFVfUVRkVlheUU9V + SEZNPDVOPTdRPz1PPTtIRDlOST5eTk9rW1xkX2NeWl1VT0pBPDhDNCNMPStUSD9VSUBaSD9aSD9T + QzRQQDJPQTRKPTBGOjVQRD9VT01VT01VTUxTSklUTEpRSUhUTEpUTEpYTVBXTE9aUEdVTENVRTlM + PDBMQDlTRz9XTENXTENRRj5RRj5QRkBORD5QQD9WRkVdSkhfTUpTRThPQTROPDxMOjpMPDtURENb + TU9eUFNiUVBaSUhOPTFMOy9MOjFNOzJQOzNQOzNKPzdHPDNBNCVAMyQ/MB0/MB1DMidHNytKOy1N + PS9TPDJROzFPOihPOihPOSxPOSxNPC5RQDJKQzNKQzNPQDpOPzlVPztWQDxUQz1WRT9cSkVdTEZk + TkljTUhhTU9hTU9WSUlUR0dWRkNTQz9PPjJNPDBWQ0NbR0deRkNdRUFWRD1aR0BXRztTQzdPQDlT + RDxYRkZbSEhfSUVaRD9UQTxRPzpWRTxhT0ZtVlFqVE9aRDxIMyxHPDRMQDlYTExdUFBhSERTOzdJ + NyJMOSRKNSRQOylYRj9hTkdqVE5oUUxcSURTQDtaSENdTEZbSEhaR0deTEVjUEllTkReRz1YQTFX + QDBTQTJRQDFTSEdcUVBfU1BeUU9UREBKOzhPPjBRQDJPPjJQPzNXREFjT01eU0pTRz9PQ0BMPz1Q + QD9VRUReTkFdTUBbSkdVRUFTQTtNPDVPPzFURDVaQT1fR0NhTU1hTU1iUElaSEFOQzpPRDtQQDFO + Pi9URDVVRTdXRj9bSUNdUUhfVEpfVExfVExbSUNTQTtPRDlXTEBaTkNiVkpeU0pfVExYSUFPQDlI + PylHPihQQThURTtXTENXTENhUEFeTj9aSENYR0FRQDhWRTxbTkleUU1dTD9RQDROOi1EMCQ/OS9R + SkBbVVBdV1NYTElWSUdMRTtDPDJEMSE8Kho0KxtEOilUSUZeVFBVSklRR0ZTQDtRPzpOQzhQRTpO + QzpRRj1VSUFUSEBXSUxcTlBaTUpiVVNdU09USUZUQzpRQDhPPzFNPS9FPjJHQDRXTE1fVFVnXGRe + VFxRTUFDPjNQPCZXQyxXRzldTT5bTEFaSkBURDhRQTVRQDRPPjJQPzlTQTtTSUBXTkVTSklRSUhR + RUBUR0NRRj5PRDxPRURVSklYTUVVSUFRPzdRPzdJRD9UTkldUExcT0pPRDxOQztQP0NRQERUREVY + SElYUE1YUE1XTUlMQT5OOzlPPDpKPjpaTUhiVVVhVFRbSU1KOj1JNCVJNCVPPCtQPSxVPTBUPC9J + OTBHNy4+LyI/MCNBLBtGMB9JNShOOixMOyxQPzBYOzNaPDRWOS9aPDJTPDBUPTFTQDtUQTxQQThQ + QThRQzxQQTtRQztPQDlQQD9VRURXSkpbTk5kTkZjTUVlTE5lTE5WTEpUSUhVRj9PQDpKOTNNOzVX + RUVaR0dbQz5YQDxYRj1bSD9bSURVRD5TQTxYR0FbSklYSEddRz9YQztPPDpUQD5bTklnWlVoVU5k + UUpdRjpPOS1RQDRXRjpcUUxfVU9cTD9TQzdOOSdQOylOOCRNNyNUQD5jT01kUU9cSUdXQEFTPD1Y + QztXQTpRQDhVRDtYST9dTkRhTkhaR0FhST9qU0hRQDRNPDBNSD5RTUNYUEpTSkVQPjhHNS9KNChP + OSxKPTBHOi1QPjxaR0VYTUVPRDxOOCxIMidINzFPPThXTkVeVUxYT1BUSkxVRzpNPzJPPjJRQDRT + Qz9UREBWSkFYTURdU0BYTjxNSDtNSDtRRDRRRDRYST9dTkRiSEhhR0ddUExfU05dVlZbVFRaTk9U + SElXRj9hT0hcUEViVkpdTkRXSD5WPjhTOzREOilGPCtIQTlPSD9VRD5XRkBaT0BcUUNcSUdbSEZY + QUNcRUZaVFFeWFZfVUZRRzlPQTJHOitBPi5PTDtcVUxbVEpXRj1QPzdKOy1ENCdEMR87KRc4LxxE + OydRRkdfVFVVSEZOQT9NPDNOPTRVPj1WPz5NRDtPRj1RRjtPRDlJRD1QSkRYUE1hWFVbU1FTSklO + QT9OQT9VRDtRQDhMQTxNQz1XSU5eUFVkXWJdVltTRzxMQDVdRzdkTj1cVERfV0deTUZaSEFQRTxO + QzpQSDlRSTpURT1QQTpUR0NYTEdTTENORz5NPjdQQTpPPzNPPzNQRkNUSUZWSkFVSUBRRjtPRDlH + RkBUU01dU09YTkpRQDpKOjNNPT5RQUNNQz9XTUlbTkxcT01aSUZKOzhGNSpJOS1KP0NfVFdiWFxb + UVVRQDpDMixINChJNSlTQzROPjBRPi1NOilFMCFALB1FLRlHLxtELhtJMyBKOylOPixQPC5TPjBX + QDRYQTVUPTFVPjJWPzNVPjJTQDpUQTtOQztMQDlPPjhQPzlOQT1OQT1TQz9WRkNVSUpXTE1iUEph + T0ldUE5eUU9bTk5aTU1YRkZRPz9OPzlNPjhdREZeRUdaRD5XQTxcSEZeSkhWRkNUREBaRkRcSEZW + TEpUSUhYR0FTQTxONThXPkBdUE5kV1VnT05jTEpaRTpRPTJRQzxYSUNiVkpjV0xcTD9YSDxNOCRE + LxxDMyJGNyVORD5dU01hT0hcSkRUPjdOOTFTOy9WPjJOPTRRQDhYRj1cSUBaR0VYRkRlUVRtWFtO + PDVINzBNPDBVRDhXTENXTENaQT1PODNJMydHMSVGOidIPClGPTFUSj5USD9OQzpQNyhMMiRGMCFM + NSZXRUNeTElXTE1WSkxQRjRIPi1HNy5IOC9KOTNRPzpURDRWRjdVTjhUTTdPSThNRzVURjlYSj1a + TUpbTkxfTU9aR0leTkpjU09aV1ZYVlVYT1BRSElWTEheVFBdVlZdVlZXTEBJPjNNPC5JOStFOClH + OitOPzVQQThUQzpaSD9XTERbT0deTEldSkhVQUhYRUxcU1RiWFpbV09NSUFQQDJMPC5IQThTTEFa + UEdXTkVKRC5BOyZIOSVHOCRFNBhAMBU9LiNJOi5RRUVWSUlTRDpKPDJHPS9HPS9QQTtPQDpMQzdP + RjpQQThNPjRFPThPR0FYUVFfWFhcVlRTTUpTQ0FXR0ZTRz5OQzpQRz5KQTlMRkRWUE5iWlhcVFNY + SDxcTD9eTUZqWFFfVVFdU09iU0xbTEVXRj1XRj1YT0NbUUVUTUBMRTlTSENWTEZRSD9ORTxNPDdN + PDdHPjJJQDRQRkNTSEVaSENeTUdbTEVRQzxOST9XU0hYTUVVSUFNQTlDOC9NPTpTQz9MREBPR0RT + SkdWTkpdTENUQzpRPTJQPDFXQ05iTVhhVFRVSEhOOSdGMSBIOStOPjBVRDtRQDhOPi9IOSpELyA/ + KxxBLRhELxpBMBZKOR5OPS5TQTJUPjdWQDlXRztaST1WRDtTQDhXQzVVQDNYRj1TQDhJPjNFOi9D + ODBGOzNMQDlNQTpRQzxVRj9RRUBYTEdeUU9fU1BfU05eUU1bT1BbT1BcSUlVQ0NUQTxVQz1iSEVj + SUZhSEVfR0ReSkpdSUlWRD5aR0FfTkhbSURWREFVQ0BRQDtOPThFMjRTP0FeSlFlUVhkUE5dSUdR + QDRPPjJWQ0NcSEhlWlBjV05cSkFTQTlIMh9FLxxJMydQOi1XRT5fTUZbSj5YSDxJPy5EOilOOSlR + PCxVPzhaRDxbQz5bQz5XREZcSEpiVFtfUVhGODFDNC5IOCpNPC5QRjhQRjhbQUFWPT1KOi5GNSpD + NSZHOipNPjRQQThTQzdWRjpTPjFMOCtMMiJPNSVTPz1XREFWTURTSUBaRjROOypDOiZAOCRROytU + PS1VPy9WQDBVSjlVSjlYST9XSD5URjlURjlWTEZbUEpeTkpcTEhcT0pbTklWVU9aWFNaUFRQR0pR + RkdYTU5aVVRVUE9TQzRJOixENB9DMx5IMiZIMiZPOy1WQTNVPzhWQDlXREheSk9aUFFXTk9NQEBO + QUFWTVBcU1ZWTkpKQz9POzBMOC1MRD5TSkVfUElYSUNMRS9DPCdQPSpWQy9PPylOPihIOjJNPjdX + RTxYRj1TQzNJOitEPCtHPy5PRTdTSDpMRDJKQzFKQTlIPzdGPj1QSEdWVFdcWl1cTlBWSEpPR0ZR + SUhGPzdJQzpMPTVJOzNJRD9TTUhkWlZdU09bT0dkWFBjWltnXV5hVVhbT1NfT05dTUxfUEheT0dc + U0hbUUdbTEVYSUNUR0VXSkhVSUFMQDlMQDlJPjdHPjRJQDdPQ0BVSEZdSkhoVVNVUEVKRjtWRz1W + Rz1VRj5RQztGOzJEOTBKOTdOPDpMQT5NQz9XTUdfVU9dUUZYTUFRQDpQPzlXSVBdT1ZcSkRQPzlH + Mh1NOCJPPjVbSUBXTERPRDxJOC9EMio7Kx03Jxk+JxRELBhJMypXQDdYRj1WRDtUPjpXQT1eTUZf + TkddTD9bST1dRT5cRD1dRT5WPjhQOylNOCZIOClHNyhHPDRKPzhQPzlRQDpRQztYSUFWSUdYTElf + U05hVE9dVFVbUVNdSU5XREhVRj9QQTtYRkZeTExlTk9jTE1bSEhUQUFVQ0BbSEZdSkVYRkBTQDhU + QTlRQTVMPDBHMDVYQEZnUVhqVVxhTkdcSUNUPzRRPTJVQ0NeTExiU0piU0pdTD9TQTVOOypQPSxR + PTJVQDVfRkNiSEVaSENcSkVTQTVNPDBNQC1OQS5XSEBeT0dpVEZjTkBdQ0VcQURbSU9dTFFTPyxN + OidPOCtTOy5RPzlVQzxVRDtWRTxPPjhKOjNGOzBGOzBOQDNKPTBTQTlVRDtQPzNNPDBMNydPOipQ + PjhVQzxaRkRWQ0BTQTlKOjFGOSxFOCtOOypUQC9XRDJYRTNURjVTRTRXRkBaSENaSkBVRjxVSUBa + TkVcUUxdU01dVEpbUUhcVk9eWFFcU1RPRkdRQUBWRkVXSkZbTklVQTBPPCtINB1FMRpJMyBHMR5J + OS1UQzdWQTdYRDlWRT9fTkhfV1RaUU5QQTtKPDVXSUxdT1FYSEVQQD1PPjJNPDBOREBRR0RcTE1a + SUpURjlTRThVRzpYSj1bSj5bSj5UQTlQPjVURDhQQDROPjJMPDBBOCpIPjBOQzhXTEBXRjhRQDJT + Rz9MQDlJQERPRklWUE5cVlRfT0xdTUlWUExaVE9QRz5IPzdIOjJIOjJMRUdRSk1eVVZbUVNbU1Fk + XFtqXmJnW15eVFNYTk1eUVFiVVViVVNjVlRdU01bUEpeTkpbSkdUSUZWTEhRSkBNRjxRQzxOPzlM + PDlKOzhQRz1aUEZhVlBlW1VWT0ZMRTxRQTVTQzdURT5QQTtKPDRKPDRFNy1IOjBKOzpJOjlUSUhf + VVRcUVBVSklNQz1MQTxQRkVWTEpYSj1RRDdOQDBRRDNVSEZbTkxTTENJQzpJNyZALh49KBdBLBtB + LRVFMBdNNzVaQ0FbR0VUQD5TPTlYQz5eTE5iT1FjTkBhTD5YRz5XRj1XRj9TQTtXOjBUNy1JOStA + MCNAMilJOzFQPjVVQzpXRj1XRj1VRUZcTE1jVlRnWldiVk5eU0pbUE9TSEdUQT9RPz1OQ0ZXTE9j + U1RiUVNhSkZdR0NdSUxeSk1dR0FXQTxTQzdQQDRVQDVPOzBINzlXRUdoT1VoT1VWRz9PQDlPPjlO + PThNPjhXSEFcTUNbTEFdRz9RPDRKOi5OPTFPPjhWRT5iSkxlTk9dSUxdSUxVPzhNODBMQzlWTUNl + VkxqW1BpVk1jUEdaR0FUQTxcSEheSkpYRTFbRzNYQTVXQDRROjBQOS9QPzFTQTNQPzBQPzBNQzRJ + PzFJPy5FOypKPTBOQDNPPzNMPDBPPCdPPCdPQTFTRTRYRkBWRD5QPzlJOTJNNy1OOC5MOjFWRDth + T0ZcSkFRRDRTRTVUREBXR0RVTkVUTURWRz9YSUFXTUdbUEpaUUxcVE5dVU9eVlBeV05RSkFUQzpU + QzpcSkFfTkVcSjtWRTVPQC5KPCpMOiFJOB9MPTNURTtWRDtVQzpRQzlcTUNeVlNcVFBRRDdHOi1Q + RERXSkpbR0VaRkRTRDpQQThOQztOQztUR0NXSkZUSEBWSkNbTEFdTkRXTERbT0dXSD5MPTNRQzBW + RzRIQTVDPDBDOStJPzFTRz9aTkZcTUVURT1WRkNQQD1ORD5USURXTERaTkZbTkxeUU9XUFBbVFRV + SUFJPjdJOzNHOTFNPD9dTE9jV1tjV1teWl1kX2NoXmRiWF5cT0pUR0NYTU5hVVZhU1dhU1deU0lb + T0ZbUE9YTk1TSklTSklPRDxPRDxMQzdGPTFIOTpHODlNSj5YVkliXFVhW1RaSD9OPTRPPTRTQDhT + RDpQQThPQDdNPjRKPDJJOzFEOixDOStMPDlaSUZUTU9PSEpKQz1FPThMPDlPPzxVRD1UQzxRRjtb + T0RWUExUTklWRz9QQTpQOipDLR47JRk8JhpJNSBUPylWRTxYRz5cSUBUQTlQQDRTQzddTFFkU1hf + U05bTklPR0FPR0FaSkRaSkRbRDdUPTBMPCpENCNFOy1MQTNYQztcRj5YSUFVRj5RR0ZVSkliUU5l + VVFnVlNjU09dU01VSkVTRkFTRkFVR0lbTU9hVFRiVVVlUEVlUEVdTkdbTEVaRz5RPzdUPzRXQzha + QzlTPDJQNzdaPz9hR0NfRkFaRDxVPzhQPT1KODhFNy1KPDJYSj1YSj1bQzxYQDpQOi1VPjFUQT9a + R0VfTkdiUElfTUZhTkdWQTNPOy1QRD9bTklqU1RrVFVlTExfRkZYRUVXREReTEZfTUdhT0ZhT0ZX + UU9XUU9VQz1MOjRKOixKOixTPjNWQTdRRzlUSTtMRTlGPzNHOipJPCxPPzFPPzFPQTFNPy9RRDNW + SDhVSERUR0NRQztKPDRKNSJKNSJMOTlWQ0NfT0xlVVFdTEVaSEFTQDtUQTxUSURUSURVSUFTRz9K + SUFOTUVVTE1WTU5eTk1fT05dUUhVSUBTRDxRQztXRjpfTkFiUEBhTz9cTUNXSD5URjlNPzJPRTNY + TjxfUEZVRjxURTtXSD5dU01fVU9XSTxENypJOzRVRj9fTj9jUUNeU0laTkVRRj5IPTVHPzBTSjtd + UUhbT0ZiU0piU0phUUpeT0hXTzxRSTdTRzxbT0RQTTxFQTFEOS5IPTJXT0lcVE5bTkxUR0VURT1M + PTVPPzxTQz9RR0RYTkpYU1BeWFZdWFdXU1FVRD1MOzRKQTVEOy9KPzdTRz5WTU5cU1RdU1tlW2Nn + VVthT1VTQTtQPzlWSE9dT1ZcU1RbUVNaUEdWTURQSkhWUE5WSkNQRT1ORD5NQz1JQzpBOzI/NC1B + Ny9NSUZdWlZnX19dVlZWRT5PPjhQRT1VSUFRSD5NRDpOQzpOQzpRPTBKNypBNR9GOiNKOjRUQz1R + RUVRRUVKQDtANzFINzBOPDVWRkNbSkdfT0xnVlNfU1BXSkhaRThWQTRRPSdKNyFBMh1GNyFUQzdY + RztYSUFURT1VRjxURTtPPjBWRTdeTVBoVlpiUU5iUU5USUZTSEVXSkhYTElbST1PPjJJOSpKOitU + RT1VRj5WRDtbSD9XSEFWR0BURkhWSEpcTlBdT1FjU1RkVFVfTU1WRERWRz9aSkNbSEpeTE5dUFBh + VFRjUUpeTUZdTUlYSEVYSDxVRTldRjxjTEFfSDVbRDFWQTdUPzRbRT9dR0FfRkFYPztNMipNMipM + OjFQPjVWRTdYRzlXQDRaQzddQDtdQDteRkNkTEhjT09lUVFjTkBhTD5VRTBTQy5bSEZcSUdhTUpi + TkxdSUdXREFWPz5cRURdSkFiT0ZhTk5eTExUVFRUVFRYRkRRPz1KOixOPS9RPi1WQzFbSUBbSUBa + ST1OPjJJOylHOSdMOy1TQTNWRjhVRTdXRj1XRj1bSURaSENXRzlQQDJPOyFOOiBNODBUPjdbTkll + WFRqVE9kTklXRT9UQTxVQ0BTQD5PQURPQURIQ0BJREFRRkdUSEleSERcRkFYR0BWRT5RQztTRDxU + RDhXRzteTUZiUElhVUxdUUhdTkZWRz9VSjxhVkdnVklcTD9RSDxTST1hTkdkUUpdSDpKNylJNDBb + RUBdUExkV1NjXF5cVVdTSEdDOThAOShPRzVkU0llVEpnVlNqWlZoVFRiTk5bTklcT0pbT1BfVFVd + V0dPSTpHPzBNRTVWTU5cU1RYSUNQQTtNOzRQPjhNPjROPzVKP0BUSEldVlhfWFteVlNXT0xRQTNK + Oy1FPS5FPS5GPjlIQDtPR0ZXT05bUE9jWFddU09TSEVIPzVJQDdbSU1nVVhdUVNbT1BUR0dUR0dW + SUlbTk5XSD5OPzVRQTVPPzNGQTc+Oi9BNChIOy5RSkpeV1dnX2JbVFZTRThQQzVaTk9bT1BWREFT + QD5VPzhWQDlVQS5JNyRJNCFPOiZQPDFUPzRRQDhQPzdNPjdJOzNPODRROjdaSExjUVVkUFVjT1Re + SERaRD9WRD1VQzxQQCxNPSlJPy5NQzFbSURbSURaSkRXSEFVST5TRzxOPjJXRztkU1ZpV1trVFNl + Tk1RQztRQztUSUhRR0ZTQTtNPDVNOzJRPzdaRkRXREFURDhWRjpUR0NUR0NWRUhcSk5eSk9iTlNk + U1ZlVFdeT0hURT5YRkBcSURbSEheTExiUFRiUFRhVU1cUEhjUElfTUZYRj9dSkRpUEZnTkRdTTpY + SDVXRj1YRz5aSENcSkVdSUdaRkROOixJNShTOzRWPjhYQTVbRDhXQDRcRTllRz9kRj5jTUVnUEhp + VVdlUVRjTUdfSURYQztXQTpXRUVcSUleTUdaSENcQz5YPztVPztcRkFlTExpT09WTEZaT0leUFNd + T1FcSUNXRT5VPy9RPCxNPC1VRDReTUdeTUdeTUZTQTtJPCxGOSlMPC1URDRVRjxVRjxXSD5VRjxW + SkNYTUVYSj1XSTxaRC9VPytRQzBRQzBaSkNhUUltUVFuU1NkTEhiSUZXRj1VRDtQQD9NPTxJPjdN + QTpTQD5WREFVSjxVSjxXTTxXTTxfSDxcRTlWRDtWRDtaR0BeTEVlVVFiUU5dVVFYUE1YT0VhV01t + W1RhT0hWRz9RQztjUElkUUpYSTdHOSdJNSlbRjlcUU5jWFVkXGNaUVhQRTxBNy5IOCpaSDpjW1pq + YmFpW11rXV9jVlRfU1BaTk9bT1BfTlZoVl5jWFVWTEhTQTtYR0BfUVRhU1VWRz9IOjJIOSpPPzBJ + OzFMPTNNQz1ORD5aUFFbUVNbT0dUSEBNPjRNPjRHPDFEOS5AOjBGPzVVQT9dSUdhVlBjWFNYT0VN + RDpDQDRIRjpYUVFeV1deTk1bSklRPkNWQ0dhSkZfSUVYRzhUQzNXRjdWRTVRRDNMPi5EMytKOjFP + TUxXVVRfWlVUTklOQDNURjlcUFFaTk9bSENWRD5XQTpbRT1TQzNNPS5QQDFRQTJQPzdPPjVOPTFN + PDBNPC1NPC1JNC1QOzNeSkpiTk5dRkdbREVVPzpVPzpVPztXQT1XRzlRQTNTQzRWRjhdTkddTkdd + TUlaSUZcTUZcTUZXR0RYSEVoVlxpV11vVVVlTExQQzVOQDNPRj1KQTlOPDVNOzRPPjJUQzdbRT9b + RT9RRj1QRTxQREFUR0VYTExaTU1fTU9lU1VkVlhhU1VhUE1YSEVfRkhjSUxdSkpfTU1dU1FfVVRh + WFVdVVFbU0NYUEBcSURdSkVrUU5oTkpaSTtWRjhWRz9bTEReTEVfTUZbT0dXTERWQTdUPzRRPTJU + PzRbRDhcRTlYRj1eTENkTkhkTkhiVk5hVU1iVVNfU1BcTE1aSUpVRDtUQzpQRkBPRT9XSEBWRz9T + QzRPPzFQPjlVQz1iSE1kSk9bTEFhUUdfUEldTkdcTkBbTT9XSTpNPzBQQC5VRTJbSEZcSUdbTEVT + RD1PPjJNPDBPQy9VSDRVST5XTEBUTUBRSj5YRj1cSUBeTUdeTUddSDtWQTRRRzVRRzVXSEBaSkNe + TExfTU1iT1FiT1FbTklQRD9MQDlJPjdIPjBHPS9KPTBXSTxWUURWUURbT0RcUEVdTkdbTEVaSkBW + Rz1aSEFcSkRfU05iVVBjVlRbTkxTSUBeVUxnVlVhUE9WRz9WRz9bT0daTkZWRjhIOStBOSFTSTBe + UFNjVVdeW1dQTUlPQy9IPClFPDJdVElnV2FwYWprXWJoWl5iVVNcT01fT05cTEpfUVRoWlxdVlZT + TExPRT9QRkBYTk1eVFNYTURMQDhHOi1OQDNOPDdNOzVBPzRIRjtTTEFXUEZdTT5XRzlTQDhOPDNE + PTQ9Ny4+OytHRDNVRUZaSUpbVFZbVFZVTEFGPTNKRUBTTUhWT09WT09VSERQRD9MQUBTSEdcSkRa + SEFURTtWRz1jUEpfTUdbTT1PQTJENCdJOixNSUFXVExdTkRURTtIQDFRSTpcVVVXUFBRQzlQQThR + RzlWTD1QSDlQSDlVRjxXSD5YST9URTtPOy5OOi1NPS5NPS5JOzNQQTpYSUFVRj5PPzFQQDJKQThK + QThVQzpaRz5YSDxYSDxdTENfTkVkU0xkU0xeU0paTkZaSUpXR0hYRkRaR0VhTVRlUVhjUVVfTlFX + RzhQQDFRQDJOPS9POS9QOjBQPzNUQzdTQTNUQzROQzpQRTxWSUVXSkZXTUxXTUxeUVFiVVVjVVdi + VFZdUFBaTU1iSkxlTk9hTU9lUVRbUVNjWltqWlZkVFBdTDxbSTpeSERjTUhpT1FlTE5WRjhVRTdb + TEFcTUNeTENeTENcSkFdTENdRjpWPzNVPjFXQDNkTEFqUUdlU01jUEpnU1NjT09eVFNdU1FcT0pY + TEdbSklXR0ZTRDxOPzhUQTlWRDtlST5oTEBlSjdbQC1OOSlUPi5bQUZiSE1eU0peU0pdU0RiV0hl + WlBfVEpYUEpQSENPPzBQQDFbSEpdSk1dTkZVRj5QQD1MPDlTRTRVRzdXU0hYVElUTUBPSDxTRTVW + SDlbU01cVE5cTUNURTtQRTxTRz5PRT9PRT9VRUFaSUZaTFBbTVFXT0xQSEVJQTxEPDdJOzFJOzFM + PztUR0NaT0xaT0xVT0pVT0pYTEddUExcUEVXTEBcSj5cSj5YTkhbUEphT0ldTEZVSUFfVExkWlRe + VE5XRj1eTURPSUdKRUNHPjVFPDNHPy5YUD5nVlVpWFdjWFNdU01ORTtHPjRHPD1fVFVuXF9zYWRy + ZGRpXFxeWltTTk9VSkleVFNeVVZhV1hbTkxRRUNJQTBIQC9TSUBYT0ZYTEdQRD9OPTdUQzxVQUFK + ODhBOy9NRjpbU0NcVERfTkVXRj1NPDdJOTNAOC48Myo/NTJMQT5UTU9YUVRbVldVUFFFREA9PDlK + RERTTExXTUdUSURQRz1NRDpNQz9RR0RVTENQRz5PRUFVSkdiVVVhVFRaVERKRTVDOyxEPC1WRz1e + T0VbTEFTRDpJQDRWTUBcW1dTUU5RRjtRRjtWTD1aT0BaUT9aUT9eUU1fU05XUEdRSkFPPzFNPS9Q + PzdQPzdNQD5OQT9RRzlORDVNPihOPylNQzRRRzlYST9cTUNdTENfTkVkUU9nVFFlVVFnVlNdV1BW + UElYSEdVRURXSEBWRz9eR0phSU1cSE9dSVBcSjtcSjtfSURVPzpTPjFPOy5OPDNRPzdXRTxVQzpQ + RTpRRjtbSEhdSkpYTk1aT05hVFFiVVNiVFhjVVpdUE5bTkxfTUphTkxbSklcTEpjUVppV19rVFNo + UE9hSD5lTUNqU1FqU1FlTlFdRklWQTdWQTdaRz5eTENeTUdaSENeTT1bSTpRRDNMPi5TPjBeSTtr + VkpuWE1pUVBoUE9iT0laR0FdSkheTElfUEldTkdaSENVRD5TQTVPPjJdRD1fRj9rT0RyVUlqTkFf + RDhVQDVXQzheSERhSkZiTlNlUVZhVE9oW1ZpYVtlXVdfWFhUTU1KQzNNRTVeTE5hTlBdUUhWSkFT + QTtRQDpRRDNURjVTTk1XU1FbT0ZUSD9NRjBORzFRTEdbVVBeVUpVTEFQQTtURT5ORTxPRj1URjlV + RzpXRkBbSURVTkVRSkFMQzdHPjJFOjFIPTRPRDxVSUFcTEhaSUZRTUNTTkRUSTtaT0BcUEVcUEVa + TkVYTURaTUhaTUheTUdaSENRSElbUVNhWFVdVVFjUEljUElPRkdHPj9OPzhMPTVMQzldVEloXF1k + WFphVUxeU0lPSD5DPDJKOzxdTU5lXVpqYl5nX19jXFxYWFtNTU9OR0lcVVdfVlpcU1ZVRTlMPDBD + PCVIQSpTRz5VSUBUSEBQRT1RQDtQPzpQPkBNOz1DOi5RSDxYVElfW1BhVU1aTkZGPzNBOy8/MiRE + NyhFOzhJPzxVUFFaVVZXU1RKRkdDPzhAPTVQRD9WSUVXSEFVRj9OSERMRkFKQz1RSURYTUVVSUFR + R0FaT0lhV1hiWFpaWFBKSUFJPy9IPi5WRD1hTkdfTUpcSUdPSUVYU05eXVVRUEhQST1PSDxbUD9c + UUBeU0leU0lfU1BcT01aSkNWRz9QQzNURjdUQz1VRD5RQT5TQz9TRDpURTtTQzNRQTJWR0BbTEVe + TVBeTVBhUE9lVVRqWltqWltpXV5lWltfWldYU1BaR0VWREFeTEVaR0BaQ0FaQ0FdRklfSExhT0hi + UElcTUVVRj5NPTFIOS1KPTBRRDdYRz5bSUBXTERYTUVbSEhdSkpbSkdbSkdbTk5cT09hT1NhT1Ni + UU5bSkddSk1aR0lUR0VUR0VlVFprWl9oU1dnUVZnTUhqUExqV1doVVVfSElbREVWQDtUPjlVQ0Bb + SEZfTUdbSENYSUFURT1TRDpRQzlVRDtiUEdqWk1qWk1lT0pkTklcTUVURT1cSUxdSk1kUU9hTkxf + Sj9aRTpRPi1UQC9cSURlU01uVldrVFVhT0NaSDxTQTlVRDtbSENcSURjUFNoVVdoV1hrW1xnWF1l + V1xfUVRVR0lNRC9RSDNdTEZhT0leTURaSD9VRDtTQTlRRDRURjdQTkNWVEhdTkRYST9QSDdNRTNR + Rj5dUUljUUpcSkRKPjxMPz1MQzdPRjpRSDxRSDxYSDxbSj5WT0ZRSkFNRUFJQT5FPChGPSlNRDpR + SD5YT0VWTUNPRjpORTlPRjxTST9dT0FfUURXUEdTTENbSURcSkVYSEdVRURQSEVVTUlcVE5dVU9h + UE9hUE9TRkZNQEBRPDhRPDhUSUheVFNpXFxjVlZbSUNcSkRWTURNRDtMPD1XR0hdV1VqZGJlZGFf + XltdXldPUElPRkdaUFFlVVRfT05QRy5IPydGOiVOQSxURjlQQzVVRD1TQTtXQTpRPDROPzhJOzNF + PzlOSEFcVlRnYV5iXV5aVVZJQDhFPDNGMihINCpJOzROPzlTR0pYTVBTSUpKQUNHPThFOzVPPjhV + RD1WQ0BaRkRUR0dQRERPRT9VSkVcTEpdTUxWTkpaUU5kWlZnXFhnVlNXR0ROPzVVRjxeTUZiUElk + UE5jT01WTU5bUVNhW1hXUU9XSD5cTUNdVElfVkxeU0pcUEheT0hhUUpeTT1XRjdaRThdSDtbRjtW + QTdQPzlVRD1USD9TRz5TRDpVRjxbSEhcSUleTk9iUVNhVFRnWlpqXGNuX2drXWRpW2JlW1pdU1FY + Rz5eTURhTkdcSUNaRTpUPzRYRDdiTT9nVE1lU0xiT0haR0BPOy5NOSxOPjBWRjhfTkFjUUVdSkFa + Rz5YRUNbR0VbR0VbR0VaSExYR0peSk9bR0xbSEZXRUNbSENXRT9QQTpYSUFeUVFhVFRjU1RhUFFd + TEZkU01tXFhlVVFhR0daQEBQPjlWRD5WSUVdUExoUUlkTkZVRURURENXRUNWREFaR0FkUUxiV0Ze + VENhTkVdSkFTQzdPPzNUQEBbR0djUUpfTkdfRz1aQThVPjFUPTBYSEliUVNoVVVkUVFdRzJWQCxP + PTRTQDhcRURfSEdkUFdjT1ZlWFhpXFxqWFxqWFxnVFFYRkRTQTJTQTJbSUReTUdkU0RiUEFdTENX + Rj1UPjdXQTpTTEFUTUNeT0VaSkBTRTVPQTJWRTxeTURlU01fTUdPQDlKPDRKQzNORjdRSDxVTD9Y + Tj1YTj1YUUhXUEdVTEFORTtJPCxMPi5USD9XTENaTkVaTkVMRjdKRTVOQzpPRDtbSkdbSkdbTkxY + TElWSUVVSERVQ0BTQD5QRkBXTUdbWlRbWlReUU9eUU9RQzxOPzlNPjdKPDRTSklfV1ZfWlNcVk9W + TkpXT0xbTklXSkZQRkNVSkdhVVtpXWNlX1tjXVhcXVhTVE9ORkVUTEplTk1hSUhVSjlTSDdWSTVU + RzNbSj5WRjpYRztbST1cRTtUPTNMOjhNOzlNQUVQRUhiWFxpX2NkYmVdW15PQ0BMPz1NOilINSVN + PDdRQDtUSExWSk5VSEZOQT9HPjVFPDNQQTpTRDxYR0FcSkVVRj9VRj9RREZWSEpaTk9dUVNaU1Nb + VFRhW1RiXFVqWFNXRkBQRkNaT0xrWFNrWFNtWFZpVVNcVFNbU1FcVk9bVU5cTD9jU0ZiW1BfWE5b + UUhbUUhnU1BoVFFiUUVeTkFqT09pTk5eST5VQDVTQDhWRDtXTkVWTURUR0NWSUVXSkpUR0dWSUdd + UE5iVlpoXF9rX2VqXmRnU1xpVV5kVFBjU09iU0xhUUpnVE1hTkddSD1WQTddSkRpVk9tXFtnVlVq + TUpdQD5POSVMNSJaR0dnVFRqV1BkUUpcSjxXRjhWQ0BWQ0BbRUBdR0NaRkhaRkhcSE1dSU5hTU1a + RkZUQzxVRD1WRD5YRkBaTU1fU1NeUVFbTk5aTk9lWltrW1xiUVNeQTxaPThWREFaR0VeUU9pXFpp + W01fUURVRjxTRDpVRURTQ0FYRkRiT01hUERYSDxaSDxXRjpPPjBPPjBUQTxeTEZnVE1eTEVYQzJU + Pi5QOjBUPTNXRkleTVBkUU9hTkxfQStWOSNPOjJUPjddQD1iRUFfSlFkT1ZnU1VpVVdqWFxqWFxl + VE1cSkRWRjhPPzFPR0RWTkpjVExnV09hVFFWSUdXPjhWPTdQQDFVRTVbT0ZbT0ZYSj1TRThPRjxW + TUNiT0hkUUpXQzhPOzBQPDFWQTdVSUFbT0dbUUdbUUdbU09aUU5cTEhaSUZTQzNPPzBRRj1XTENY + TUVaTkZOQzpHPDNPPjhQPzlXRkBbSURcSURcSURYQz1YQz1TRD1QQTtWREFeTEleV1peV1piVldb + T1BVRj9JOzRGOzBIPTJVRj9hUUpfXFZeW1VcUU5dU09hU1VdT1FOSEFPSUNiT1pqV2JlWl1kWFxh + WlpWT09NQz9USUZdTUxdTUxcUEhdUUljWlBeVUxfTkhaSENeT0dlVk5eU0lTRz5NPjdNPjdJQERK + QUVfWFtlXmFdW1pbWFdPQDdIOjBMOyxPPi9TQTVRQDRUR0dTRkZORkNKQz9JPjVFOjFRQTVWRjpW + SkFXTENTSUBUSkFQRUZUSElWSE9bTVRcUU5hVlNlW1dkWlZdUUlQRT1USUZdU09pWFVrW1dpWlNj + VE1bUE1eVFBdVU9dVU9WTURlXFNpYV1kXFhaT0xYTkpnWlplWFhkV1VkV1VqVltkUFVdRD1VPDVT + RDxYSUFeT0hbTEVYSUNXSEFWRz9TRDxVRURaSUhlV1xpW19oXmJhV1tbT1BcUFFhUE9hUE9eUU9j + VlRpXFxeUVFYR0FVRD5cT01oW1hqXF5iVFZdRz9RPDRMPjFXSTxkWFpoXF1kV1NXSkZaTD5WSDtP + PTdQPjhURTtVRjxVQUFVQUFVREdYR0paR0lTQENRPzdTQDhWQDtUPjlVSEhhVFRfTUpeTElnUVZq + VVpjUEpTQDtYQDpbQzxeSkhoVFFnVVttW2FpWlNeT0hYQTRXQDNQPzpQPzpWRERdSkpdTkRXSD5a + SDxVRDhPPzFPPzFWRD5dSkVfUEldTkdRQTJQQDFTPjFVQDNbSEpkUVRkUUpdSkRfRTFWPClTOjNa + QDpbQz5eRkFcTEpdTUxfTU9jUFNjV1hlWltjVlFbTklbSjxXRzlbRT1eSEBiUU5nVlNlVVFbSkdY + QztVPzhKPS5OQDFUTURYUUhdTkRcTUNYR0BaSEFTTENYUUhVSjxPRTdOPTdTQTtYSEdfT05cUEha + TkZXTE1VSUpcSUddSkhaSDxRQDRRSTpTSjtQST9TTEFOQzpHPDNOPjJVRTlXRkBbSURcSkVcSkVb + TEFVRjxQRztMQzdQQ0VYSk1eV1paU1VbUE9TSEdTRz5MQDhPPjJJOS1RQDhXRj1cVVVbVFRYTkpc + UU5fVFViVldQSUBNRj1aTk9kWFpkW15lXF9hV1tQR0pIQD9KQ0FcTEpjU1FiVVBjVlFiWFpbUVNa + R0VdSkhdV1NfWlVeWFRaVE9PRjpGPTFBOjRHPzpcTlBrXV9jW1pVTUxRRTFNQC1RQzBRQzBVRTlO + PjJNQDxOQT1NRDtKQTlHPS9FOy1QQDRaST1dTkRcTUNUSkFRSD9MRkRKRUNPRURQRkVRT05bWFdl + XF1fVldaSkNTRDxbTkxnWldlVVRiUVBVUEZVUEZaT0xcUU5cVFNfV1ZhV1toXmJoYWFjXFxcT09Y + TExjV1hjV1hjXFxkXV1kW15dVFdYR0BYR0BeTk9kVFVhUE1aSUZPSD9TTENRRj5OQztRQUBaSUhl + VFpwXmRpXFddUExbSURcSkVaTU1cT09jUVdoVlxlXF9bUVVaR0VWREFXTE1jV1hjWlBeVUxYSDpR + QTNTSEdfVVRpXV5hVVZfT05XR0ZXSD5QQThKOjFNPDNQOzNTPTVWOjhWOjhTPz9TPz9WPjpTOzdR + Oy9POS1WPTdaQDpaRkReSkheTURhT0ZlTk9jTE1hRTxdQTldR0NiTEdhU1VoWlxrV1xzXmNrWlRi + UEpeRjlaQTRQPjhVQzxYRUVcSEhbTT9aTD5aSjVXSDNURC9QQCxYQz5cRkFYTUVXTERXRjdVRDRX + QzVbRjleUVFjVlZcUEVWSj9eRzpaQzVVPjRROzFOQT9VSEZbSEZcSUdaTkVdUUhbV1ReW1dkWlRc + UUxXTENUSD9aRTpfSj9jUEpoVU9nVU9fTkhcSkVVRD5TQDhTQDhXR0RcTEhbTklcT0pdTENdTENU + TUNaU0hQTD5OSTxOQzpPRDtWRUpcSlBeUU1cT0pUTURPSD9XRj9cSkRXRTxTQDhWSDlbTT1YSUFa + SkNUSTtNQzRTQDhVQzpVRj5aSkNVTUlVTUlWSUVVSERRSTpNRTVQREFbTkxaVVRRTUxPR0FMRD5T + RDpRQzlRQTVKOy9PPzNQQDRWT0ZXUEdUTkdaVE1cVVdiW11aT0lQRkBaTlFoXF9nX19oYWFYV1FI + R0FBOjRFPThRSURbU01nVlNoV1RdVVRaUVBYRkRcSUdaVVRcV1ZdWFdYVFNURT1MPTVBOy9DPDBY + TUVpXVVqWlZdTUlQRDBQRDBRRzdUSTlURjdMPi9MPTdNPjhRQzlNPjRGPSdEOyVVRj5eT0dYUEpX + T0lUTklQSkZMRD5JQTxHPzpNRT9PTU5VU1RhWlpbVFRTRkFNQDxVSkldU1FdUUlYTUVVTD9YT0NU + T0VXU0hYUVRcVVdiW11pYmRrXlxnWldXTkRUSkBcT01hVFFkXFtlXVxiXV5bVlddTE9fTlFjV11h + VVteT0dRQztRRj1WSkFTRDxQQTpVRUZeTk9lWl1rX2NlW1pXTUxQQTpURT1aSExbSU1aU1dhWl5p + W2JeUFdWREFUQT9XSkhjVlReV05XUEdORztMRTlPSEhXUFBkVFVeTk9YSEVTQz9TQTVNPDBOPS9O + PS9POCtTOy5VOStWOixQOzNTPTVTPjFPOy5UPTBUPTBaQT1dRUBWSkFXTENbSUNaSEFaR0BbSEFe + RT5jSUNeTkpiUU5jV1hkWFpoW1tpXFxrW1djU09iSjhYQS9OQDNMPjFTRkFVSERWT0NWT0NcTj1W + SDhQPShRPilYQzteSEBbSUNbSUNdRjxeRz1aRD5dR0FaT0lcUUxXRztVRTlaRTpVQDVTQTNQPzFR + RUNbTkxWRkNYSEVYTUFbT0RdVk1hWlBlWFZeUU9YT0VTST9XRjhdTD1YTUVeU0pjU09iUU5dTkdV + Rj9XQTxXQTxVQ0NXRUVbR0xcSE1jTUdnUEpcVUpaU0hUTjxRTDpOSDlNRzhVRURXR0ZYTUVaTkZV + SjpRRzdTRz5WSkFWRT9VRD5aRz5iT0ZcUEhXTERQSUBKRDtQQTtOPzlWREFhTkxdV1NaVE9WSUdW + SUdVRzpTRThUSkFcU0laU1NOR0dPRjxORTtPRDxTRz9YTURWSkFURjdVRzhVTEFYT0VRTkpXVFBa + V1heXF1YVVFQTUlaTU1qXV1iXmRhXWNYVElFQDc4Mx09OSJQSkZcVlFjWFViV1RXT0xbU09YSEVe + TkphVlVfVVRdU09TSEVOQDFOQDE6OSVAPytTTUZiXFVkW1BWTUNMPi9RRDRVRzpWSDtQRC5QRC5I + OStIOStMPTNKPDJFPS5JQTJVTE1dVFVbVldXU1RRSExPRklPRURMQUBGQUNMR0hQTE1aVVZbVlVV + UE9TRThPQTRTSEVcUU5WTU5TSUpUSkFUSkFVTENbUUhWT1RcVVpfW1poY2JnXFZhVlBWTUBRSDxV + SUBfVEpnW15kWFxkWlhdU1FbTU9jVVdnW1xhVVZcSDdWQzFTRTVXSTpRSTdORjNUREVfT1BlXF9p + X2NkU01UQz1KPzhMQDlRQUNcTE1bVlVfW1poV1hhUFFURT1RQztPR0ZVTUxVTUdWTkhUSEBQRT1V + SEhXSkpbSEZVQ0BPPjhMOzRMOy1MOy1QOi5ROy9TOy5WPjFYQyxYQyxPPzFRQTNUPzRTPjNaQThc + RDpfRkFfRkFaST1bSj5YRz5WRTxWRDtdSkFjUEpkUUxhVFFfU1BiVVNfU1BfVVFkWlZpXFpkV1Ve + TT5RQDJJOihOPixURT1XSEBXUEdbVEpjUUNbSTtWQTNWQTNeRkFhSERdSkhdSkhdSkFaRz5VRD1b + SUNbSUBcSkFYRTFYRTFaRTpVQDVTQzNURDRWSUdfU1BQPjVTQDhYSUFbTERdUExiVVBjV1hcUFFX + SkZTRkFURT1WRz9RTEVYU0xhVlBeVE5dSkpWRERTQTxQPzpRQzxURT5aRThbRjlfSUFhSkNbUUdd + VElcU0haUEZQRz5NRDtWSkNaTkZcT0pbTklXSEBWRz9TSkVTSkVXTERXTERhT0loVlBfVkxcU0hT + UEVNSj9PRzhQSDlXRjpiUERkWlRlW1VaUU5RSUZTQDpaR0BWUE5cVlReV1dUTU1RSkBPSD5YT0Zb + UUhkVkheUENfSj1dSDtVTENYT0ZUT05aVVRaV1tbWFxQUE5OTkxbSU1hT1NeW2FfXGJYTVBHPD89 + MyM8MiJNR0NdV1NlWFhkV1dfV1RdVVFiTlNiTlNoVVVjUFBaSD9RQDhQQzVKPTA/PitDQS5NTkdd + XldfWE9QSUBNPjhVRj9eTUZdTEVaSkBRQzlJPC9HOi1JOzRJOzRIPj1QRkVTUFFXVVZcVVdRSk1T + QTlRQDhNQD5NQD5KQDtORD5RR0ZbUE9aU1dRSk9QQzVQQzVTSjtWTj5YTkhWTEZQSENPR0FVSkVV + SkVRTElWUE5dVlhoYWNoXF1fVFVPSDxORztUTklhW1ZqX15oXVxiUU5RQT5UREVeTk9fVVReVFNb + STtdTD1fVEpfVEpVSjpQRjVWREFdSkhbVFReV1daSkROPzlMOjhOPDpRQEZeTVNeVlVhWFdoVVVh + Tk5aRz5XRTxQRz1TST9aTUhXSkZUQz1UQz1aSkRaSkRdTUBYSDxNOSxMOCtFNCdGNShROjBXPzVc + RURhSUhbTERaSkNQRjhQRjhYQztaRDxeRkFkTEdtUVFpTk5fTUZbSEFbQzxYQDpbREVhSUplU1Bl + U1BjU1FjU1FdUExcT0piT01kUU9tW15pV1thT0NRQDRMNSJPOSVRQDpcSkRjV1hpXV5pVVNcSEZf + Sj1hTD5eTEZcSURYTEdXSkZcSUBWRDtRRj1USD9bSD9dSkFaSTRXRzJcRj5aRDxRQDhWRTxaR0Vh + TkxPOy5VQDNYSEVaSUZcUVBfVVRfVldaUFFYTElQREFOPjBOPjBRSD9YT0ZhT0hiUEleTUZYR0BV + RjxOPzVOPi9PPzBWQTNbRjhcTUVaSkNaSkRfUEliUElfTkdPRDxOQztUTUNWT0VfT0xdTUlVRj5U + RT1VTENVTENVTENcU0llVVFnVlNiWlhdVVRVTkVPSD9MRjRNRzVTSjtdVUVfXVFiX1RWVFNKSEdR + PzpYRkBaTk9hVVZkWFpXTE1VST5YTUFdV1NdV1NeV01dVkxiVk1dUUhVTUdVTUdUTkxcVlRbVldY + VFVTU1BJSUdQRUZcUFFiVlpeU1ZaSUhHODc/Lyc/LydJQEFXTk9tWlNtWlNnXV5iWFpcUFReU1Ze + U0laTkVbSjVXRzJVRTdNPS89OCdGQC9UTEhcVFBcUEdVSUBTQDtWRD5hT0hiUElaUEZTST9MPypG + OiVANylGPC5GPT5NREVcUFReU1ZYVElJRTtMPyhMPyhJPjdKPzhNPjhPQDpQSENaUUxbU09TSkdR + QzlURTtUSkBYT0VbVEpYUUhaTkZXTERRSURNRT9OR0dVTk5dVFdlXF9nVVtfTlRMRD5PR0FXUFBf + WFhjW1pjW1pfT1BUREVTR0haTk9iVVNhVFFkTklpU05jW1djW1dbUUhORTxUQzxaSEFbT1BbT1BU + R0NQRD9UQzpXRj1dTUxkVFNlW1piV1ZiV1ReVFBcSUdaR0VYRz5aSD9dTkdaSkRVRj9XSEFdTUBj + U0ZnVUZhT0BVQS5OOyhGOCZIOihRPDdbRT9eTEleTElbSENaR0FXRj9XRj9YSUNaSkRjTlNrVlty + WFVuVVFkU0xcSkRaQTtaQTtjTE1lTk9kVUpkVUphUUdeT0ViUEphT0lkUU9lU1BpV1tpV1tiT0Zc + SUBWPjFROi1UQEdeSlFpV11tW2FnWlpYTExcSUNeTEVeTkpaSUZaSkRXSEFaSUZXR0RaSD9WRTxc + RkFdR0NdSkFdSkFkSkReRT5TQDpYRj9dSU5jT1RPPjBUQzRWREFbSEZhUE1oV1RiV1ZdU1FVTUdO + RkBPQTJMPi9RPzdaRz5bSENdSkVhUERdTUBXTERVSUFRQDFPPi9QRTpYTUFaTUhXSkZbSEZdSkhf + TkhcSkVVRjxURTtWTEZeVE5eVE5YTkhURTtTRDpQRztUSj5XUUpcVk9iVVVpXFxlXF1hV1hdT0FV + RzpORDNPRTROST5cV0xjX1pjX1paWFNJSENTQz9QQD1WT1FfWFtiVVNaTUpdTEZjUUxeV1piW11l + W1doXVpnXV5iWFpUTkdUTkdVT01YU1BhVlVdU1FVTUdPR0FMSENUUEpTTUhTTUhaSD9PPjVENCc/ + MCNBPDhTTUhpWFpwX2FnXWFdVFdVSUpVSUpcUEdYTURfTz9fTz9aSjhTRDFBOCdMQTBVTENbUUhd + TT5XRzlVQzpcSUBbT0ZfVEpdTUlhUE1XRzlNPS9DNyRHOyhHPTxNQ0FbSEhdSkpYT0NKQTVHPy1F + PStIOjBKPDJNPjhPQDpWRkVbSklVTUdTSkVXSEFcTUZdVEpdVEpbVFRbVFReUFNXSUxQRkBMQTxQ + REFTRkRWT09eV1dhU1VbTU9NRURRSUhWT09bVFRhW1ZdV1NeUU1TRkFWRUhdTE9fVExiVk5tWFhu + WlpnXV5nXV5bTEVQQTtOQzpUSD9fTUdhTkhdTkdXSEFXSkhiVVNlW1dlW1diXFdiXFdeXFtaV1Ze + Tk1aSUhcSURdSkVaSkRYSUNUQz1WRT9fT0xuXVpwXlhoVlBhTz9VRDRQPSxRPi1UQz1aSENdSkVe + TEZdRz9aRDxXRT5XRT5WSUdcT01nU1xrV2FuVlVuVlVoWFFfUEldSUljT09qWFxtW15oXFReU0pe + TENfTURkUFBjT09iUVNlVVZkVFNiUVBhTkVdSkFaRTdRPS9PREVWSkxfVFpnW2FiUVBWRkVbSENe + TEZcSkRaSEFXSEFWR0BWREFWREFhRTpdQTdcRD9aQT1eSENlT0lkTEVdRT5RQztXSEBbTU9WSEpJ + Oi5OPjJTQDhYRj1iUEplVE5oWFFlVk9eUU1YTEdNQzFJPy5UPzJbRjlfRDtnSkFbTEFaSkBaT0xW + TEhVQzxUQTtQRkBbUEpfU1NeUVFcT09aTU1YTUVWSkNTSDpTSDpWSUleUVFeVE5YTkhTRDpTRDpN + SDtPSj1YUE1dVVFqVltyXWJrXlxpXFpqVUlkT0RVRjxRQzlRSkpaU1NdW1xhXl9dWE5WUUdRTUFN + SD1RT05fXVxjW1VaUUxaUU5eVlNdVlheV1piWlhnXl1lY2RjYWJWUUdUT0VfU1NeUVFfUVRdT1FQ + TEBRTUFPT0BQUEFcU0lWTURVSUBTRz5PQy9EOCVFPDJWTUNfW1xoY2RoXl9aUFFXRj1XRj1hUUpe + T0hjV05iVk1eT0dTRDxFOCtKPTBTRDxdTkZcTj5XSTpYRDdYRDdXTEBhVUlhUE9iUVBUT0VFQDdH + OitGOSpDPDJGPzVOQzpUSD9YSUFVRj5WSDtPQTRMOyxNPC1QRz5PRj1TSkVRSURXTkRTST9UR0Nd + UExiVVNiVVNbUVVaUFRbT1BVSUpTRkZPQ0NMPztQRD9USUZbUE1dUE5bTkxQSkhOSEZTTExYUVFa + V1ZYVlVkUFBfTExbTEVeT0hbU01cVE5pW11tXmFiXFpXUU9YR0FUQz1TRz5WSkFhUUpjVE1hUUpf + UElnVV1tW2NrXWJvYWVtX1tpXFdjWl1dVFdhTk5hTk5bSURcSkVYTUVaTkZYRkhbSEpoWmFzZGt1 + ZGVvXl9oVkdYRzlYRi5aRy9VQ0NdSkpeTEZeTEZdRT5aQTtXQD9aQ0FbR0xkUFVkU1hkU1hjUFBl + U1NiVVBlWFRpVlhoVVdoXF9jV1tlU01fTUdkSkplTExnUVZoU1dnVlVpWFdnV1BfUElcSUBUQTlR + Pi1QPSxUQzxdTEVpVlhoVVdlTUhhSERaR0FYRkBXRTxXRTxWQ0BWQ0BYPztbQT1nRDtoRTxkSkdk + SkdfTkdfTkdeTj5VRTVVPjRWPzVfRj9YPzlOPDNPPTRRPTJWQTdYTURdUUhhVlBiV1FlVUheTkFR + RzdNQzJXQzRhTD1lUEFpVEVfUEZeT0VdUUlbT0ddTEZfTkhXTUlfVVFnWFtjVVdaUUxVTUdXTUdU + SURPRjxMQzlRRj5cUEhbUE1XTUlWR0BURT5NRjpQST1eTVBjUVVkWlhoXVxqYlxoX1poVU9kUUxa + SkRURT5VTlBYUVRiVlpoXF9jVlFaTUhUSTtWTD1VTUlfV1RjWl1dVFdeVVhfVlpjV1hhVVZdVlZl + Xl5fX11hYV5cUU5YTkpYT1BcU1RbVFRXUFBKSUFNTERTTkRWUUdYUUhXUEdaSUhdTUxVTD9DOi5F + OCtYSj1YXVxfZGNqX15XTUxRRDNVRzdeVE5eVE5jVVdfUVReTElTQD5FOClJPC1TRDxeT0deTEVa + R0BXRjhXRjhcUUNpXk9kWlRhVlBVTkFKRDhKPTBKPTBJPC9KPTBQQzNaTDxeTUZfTkddTEVUQzxM + QzdNRDhTSUBaUEdTTkNOST5USTtVSjxdTkZhUUlXVVZVU1RYTU5YTU5aTUhYTEdVSERNQDxJPTlO + QT1QRD9XSkZUSURTSENKRT5MRj9PRkdQR0hXUFBdVlZfU1BaTUpWSkNTRz9QSkRVT0hkWlRlW1Vk + V1NYTEdVRD1RQDpVRj5eT0deVUxfVk1fU1BfU1BoVFtvW2JyXGFwW19qVlRnU1BiVVVfU1NhT0hf + TkddTUxhUE9eTk1eTk1aR0lcSUxhXF1qZWdwZGVpXV5qVUdlUENkTjtjTTpiSklhSUhjTkBjTkBe + RjxbQzlaQT5cREBXSkpYTExbR0dYRUVbTkleUU1nVlVlVVRjUUxiUEpkVFNiUVBhTkVnVEpnVlNl + VVFnWF1nWF1pW11nWFtlVVFbSkdUPTNQOjBUPTNbRDpYSElhUFFpVlhjUFNkTUNiSkBdRT5cRD1b + RDhbRDhbQz5bQz5fQTplRz9qTUlpTEhkSkpjSUleSkhbR0VXSDNURTBVPjRWPzVVQzpUQTlTQTxR + QDtRPzlTQDpUREVaSUpXT0lbU01kVkhfUURdTUBYSDxVRDtjUUhqXVhrXlplWFRhVE9dUUlfVExc + T0pdUExYUE9hWFdnW15iVlpbUE1VSkdVTENRSD9RRjtOQzhNQzRXTT5cSUdcSUdaR0FUQTxRQztX + SEBeTE5lU1VkWlZpXltqY2NlXl5jV09bT0dWSkNVSUFWTEpdU1FfVldkW1xcVlFaVE9VTEFPRjxP + QURaTE5fVlpnXWFhWlxhWlxkVltiVFhbVlVnYmFoZ2FjYlxdVEleVUpbVVNaVFFXVE5WU01OSEFQ + SkRYTExdUFBcVE5eVlBeUFNhU1VbVU5IQzxDPS5QSjtcXFxjY2NvXl1XR0ZRQzlXSD5lWl9oXGJl + W1pXTUxaR0dVQ0NKOi5NPDBNPzJYSj1dSkhcSUdYTUVaTkZdVVRuZWRpYV1jW1dWT0VTTEFQRTpO + QzhNPDNKOjFTRDxcTUVhVU1iVk5eVFNUSUhJRTtMRz1USUZdU09UTURQSUBNRDtPRj1dTkdjVE1U + U0pRUEhQRkVPRURRSD9RSD9ORztJQzdMPTVOPzhPPzxRQT5NQTpPRDxMQDlOQztRQzxRQzxbTkxd + UE5dUUlYTUVXSkZQRD9OSEFXUUpoWl5kVltkUE5YRUNPRTdRRzlaSkRiU0xeVUxeVUxdVEpeVUxl + Wl9oXGJkWF5jV11jT09fTExYT0VXTkRaTkNaTkNdU09jWFVfTkhYR0FXRUVbSEhbVFZoYWNuYmVn + W15pUVBqU1FpV05kU0lnT0VnT0VoUERiSj5cRDdbQzVaRD5YQz1TRD1URT5VRDhWRTlYTEleUU9o + VFRlUVFeTElhTkxkUVFkUVFkUU9qV1VrW1dtXFhuW11nVFZlWFhkV1djVlFaTUhcQDhbPzdcRD9h + SERdSUlhTU1kVFBiUU5nUEhlT0dlTUhiSUViRjtlST5fRz1iST9hSD5jSkBfR0NkTEdiSUZhSEVd + SUldSUlcTj1XSTlTOzhWPjtXQTpdRz9OPi9QQDFNPjRKPDJMPD1PP0BVREdcSk5jUEpiT0ldTENd + TENbTEVpWlNvYmJwY2NqXV1iVVVaTUpbTkxiUVNfT1BdT1RjVVplWl1hVVhfTU1bSEhVRUFUREBR + Rj5MQDlMPTNURTtcTE1dTU5aSD9XRj1VRD1XRj9cTEpfT05eT0hoWFFrXWJuX2ReWFRQSkZTRDxU + RT1TRz5YTURaTk9jV1hfWldaVFFTTkNKRjtFPz1QSkhbVFZnX2JjW2JjW2JjVVddT1FaU1NlXl5p + YmJiW1tbT0dcUEhdU1FcUVBVTk5WT09PQ0BRRUNUQ0ZXRklTTlFXU1ZdVlZdVlZhXVVTT0dNSUFT + T0dfXV5kYmNpXFdUR0NRREheUFVuX2RpW19dUUlXTERcSkVWRT9NPDNOPTRTSUBWTURWT0VUTUNX + TE1cUFFkWmJqX2hvYWNtXmFcV0lVUENYST9VRjxPPTROPDNRSDxbUUVkXFhnXltfV1FRSURNRDhQ + RztYUE1cVFBUTDxMRDRFPjRKRDpWTEZeVE5aVE9RTEdMRj9HQTtKQDtQRkBQRz5JQDhQQDFPPzBK + OjFMOzJIOC9JOTBHPS9JPzFPPTtTQD5XR0ZbSklWSUdTRkRURENVRURRR0ZdU1FoXGJjV11eTE5Y + RkhTRz5XTENaT0xfVVFdVVRcVFNbUE1cUU5hVF5iVV9eVVhbUVVdSkpYRkZUSEBWSkNaTkNaTkNf + V1ZfV1ZaTUhTRkFTRD1VRj9dVFdpX2NqWFxlVFdoVVdpVlhiWlRfV1FlVE1lVE1qUU5kTEhdSDtX + QzVRQDpTQTtTQTtUQzxURENaSUhaTU1dUFBkTUxjTEpeSjlcSDdhTUplUU9qVlhrV1pqVlRqVlRp + UVBnT05hTk5eTExdT0FWSDtiSUNnTkdpUElnTkdcSkVeTUdhUE9lVVRtVlBtVlBpU01hSkVkQzVp + RzpjRzxkSD1hSEFiSUNcQ0dfRkpkR0RnSUZiTk5lUVFdTD1VRDVWPjhXPzlhSEVrU09OPS5MOyxJ + OTBGNS1HNTVKOTlQPkBVQ0VXR0RbSkdcSkVdTEZhUE1pWFVpXV5rX2FqWltlVVZXT05YUE9eTk1f + T05eTk1jU1FeVVZeVVZcUEhWSkNRRj5QRT1MRD5HPzpMPTVOPzhQQ0dWSE1dTkdWR0BWRD1UQTtX + SU5cTlNXT05dVVRrWl1wXmJcWlhPTUxRQzlNPjRKPS5URjdYTUVfVExeWFZXUU9WSj9PRDlGPDlN + Qz9UTVFfWF1hWlxjXF5dVlhWT1FYVFVkX2FjYWJYVldaTkZaTkZaTU1bTk5QTEpOSUhKPjpHOzdN + RDtNRDtQSkhWUE5eVlViWlhhWlpcVVVTTExXUFBiX2NiX2NlVVZTQ0RWSlBiVlxtXmNnWF1fT0Nc + TD9fTkFeTUBRQDhOPTRUSkFaUEdbT0ZXTENTSkdaUU5jXl1nYmFtY2RuZGVfW01cV0leU0lUSD9R + PzdWRDtbVVNiXFpkX15hXFtdTkZURT1RQzlWRz1dU01cUUxQSDVHPy1KPzdRRj1USURfVU9cU0lV + TENJRD1BPDVJOzRQQTtRQDhUQzpYRztRQDRMOSRKOCNDNyJBNSFEPCpIQC5QQThTRDpTRD1RQzxN + Q0FNQ0FQPj5WRERYTVBiVlplVFpiUFZcSkVYR0FcTUZiU0xiVVNkV1VhVFFbTkxTSEVUSUZUTU1W + T09cUFRaTlFXSkhWSUdYRztcSj5YTEdbTkleV1dfWFhhTUpXREFRQUBaSUhjV1tnW15nVVtoVlxl + U1VnVFZpXFplWFZfU1NfU1NlUVRhTU9XQTxQOzVQPjlUQTxWRDtUQTlVQz1aR0FbT0dbT0diT0le + TEZcRTlbRDhiT0hnVE1qV1prWFtrVFVtVVZqVE9iTEddSUlcSEhcSEhfTExnVFZuW11rXFFhUUdY + R0FYR0FhTU9lUVRpU05oUU1iSj5eRztjRT1kRj5iRj1hRTxdSDtdSDtcQ0dbQUZfSD5jTEFjUFNj + UFNhST9UPTNUOzdcQz5iTlBqVlhMPChHOCRKOi5HNytJNC9POjRKPTBNPzJWRDtbSD9dSkRhTkdh + UFFnVldqXV1pXFxiVVBeUU1bTkxXSkhdTUxhUE9iT0ZkUUhcVFNbU1FRTUFNSD1PPjVQPzdMRTxE + PTRKOjNNPDVPPkFWRUhcTEhcTEhYSUFVRj5WTVBdVFddVVRcVFNjV1tpXWFkXFhWTkpOPS9JOStO + PS9RQDJYTEljVlReWFRYU05fTkVVRDtNPDBUQzdUTEhdVVFiW11iW11dVlhVTlBaU1NkXV1nXl1e + VlVbT0ZbT0ZhUE9bSklPR0FMRD5KPDJMPTNOQDFQQzNTRz9YTUVaUU5eVlNeV1dcVVVUTklbVVBj + WltjWltjU09UREBaTUpkV1VuWlxlUVRlVE1lVE1kVUpjVElXSEFVRj9aTkVdUUhYT0NTST1TRkFa + TUhhWFdrY2JvY2lwZGptYVdjV05bUUhRSD9VRD5hT0llXF9iWFxcWFVUUE1URTtTRDpQRz1YT0Vk + WFBcUEhOQDFFOClRQzxVRj9QSkhcVlReUU9YTElGPjs9NTJFOjFHPDNTQTlcSkFbSTtTQTNOPydJ + OyNDNRxDNRxNPS9XRzleTUBdTD9VRD1PPjhOPj1URENQQ0VURkhWTVBdVFdfU1BdUE5iTUFnUUZo + VVNqV1VtWF1nU1djUE5aR0VQRD9QRD9ORkVTSklYSk1XSUxWTEpWTEpcSkVeTUdYTVBbT1NiVlpj + V1tpUVBiSklUREBRQT5eSkpjT09iVVViVVVjUFBnVFRrV1dnU1NeTVBiUFRjUUxdTEZWPjhPODFR + OzFWPzVaRDxYQztWRD5bSENbTkxdUE5iUU5hUE1dR0NfSUVqV1VvXFpyXlxuW1htU1NqUFBkTVBn + T1NoTlBkSk1hTU9kUFNlV1poWlxpX1VcU0hUSD1TRzxeSERiTEdhST9lTkRoTTtpTjxiSEFfRj9h + ST9hST9eRztdRjpeRUFfRkNeSEBdRz9fTExiTk5eSEBVPzhTPTleSERoVFFqVlRQQCpMPCZNOilH + NCRJNC1OOTFIOSpNPS5TQzNdTT1dSkVfTUdWTk1YUE9iVVVnWlphV05aUEdUREBTQz9TSkdVTUlb + T0ZiVk1iUU5hUE1bTERRQztXRjpXRjpVRjxTRDpRQzlPQDdRQT5WRkNWTkhaUUxdTkdeT0haU1Vf + WFtnW1xqXl9rXWJrXWJhWlBWT0ZRQTNKOy1PPCtRPi1OSEReWFRoW1hhVFFQSkREPjhHPDNKPzdN + SUFTT0deV1dcVVVbU01aUUxcU0llXFNpXFdhVE9bUUVYT0NdVU9XT0lUSD9TRz5MPi5RRDNURDhY + SDxcTEhfT0xeVlNhWFVdVFVYT1BWSkFcUEdhVFFjVlRfTkhWRT9QTUdaVlBiW1tdVlZjVlRtX11q + XVtpXFpbTklaTUhdTkZfUEhaUERPRjpMRzxPSj9iWFxtY2dvZWtyaG5uZWJoX1xnV1BRQzxYRUxp + VVxkW2FhV11VT0hWUElXTTxYTj1cTEhnVlNuW1VhTkhQQCxQQCxTRkFbTkldU09dU09kUFNhTU9I + QDtAOTNGNytKOy9TSUBYT0ZbUEFWTD1TSTRUSjVVRTBQQCxbSUNlVE1hU0VcTkBUQzpUQzpXRkBb + SURYSElXR0hUSkxXTk9YTkpbUE1jV09vY1tuX2JoWlxfVFVaTk9aTUhRRUBUQz1RQDtRQT5TQz9T + R0hWSkxXSU5YSk9YTElaTUpcUFFbT1BjVlRoW1hqWlhkVFNWSkNQRT1WRT9YR0FbT0deU0pjT1Fn + U1VnU1BkUE5hTU1hTU1fTkFXRjpVPjRYQTheRT5fRj9aTkVWSkFWRz9TRDxVSERXSkZcUEhcUEhc + SUdlU1BqXF5qXF5nXFZkWlRlUU9nU1BfTU1kUVFiT0hjUEllTE5tU1VwXV1yXl5yX1ZhT0ZRRzVM + QTBRPzpaR0FlTUhuVVBtVUhqU0ZjSUVdRD9hSEFjSkRaSDxYRztWRD1YRj9bRDpaQzlbSURcSkVb + SD9RPzdUPjpdR0NlU0xlU0xbSTpQPzBRPitOOyhKOy9JOi5IPzNJQDRURT1dTkZeT0hdTkdWSkNY + TUVjUFNnVFZfVVRXTUxYQz1XQTxTRDxURT1cSUdkUU9qVlhpVVdeUU1XSkZbSUBYRz5YT0VdVElf + TUZaR0BXRj1cSkFaSUZbSkdaUUxbU01dVFdjWl1kXWJoYWVvY2dtYWRoW1ZWSUVOQDNJPC9RQy5W + RzJMTURTVEpYV1RbWlZNSklDQD9HPjVKQTlKQz1PR0FcU1ZcU1ZfU05aTUhXVFBaVlNjWlBeVUxe + VUxdVEpcVFBbU09aSkBTRDpNRDhTST1XRj9fTkdeVlNdVVFbVFRbVFRaT0xTSEVRSD9XTkVcUFFc + UFFbTEVWR0BUSkBdVElhV1hhV1heVVtpX2VpW19kVltRTElTTUpXUUFbVUVXVUhKSDxJQzlRSkBa + V1tlY2doYWNqY2VvYWVtXmNiVVVRRUVbR05kUFdfWF1bVFhVTUdYUEpdUUhfVEpdU09kWlZoV1Zd + TUxVST5aTkNfVU9hVlBaT0lYTkhdT1ReUFVQST9GPzVFOClHOitKQz9WTkpfVExdUUlWUURXU0Vb + U0BYUD5dUE5jVlRjU0ZYSDxVRTdYSDphTkViT0ZaTkZXTERRT0RTUEVdU1FlW1pqYWRvZWlnYmFh + XFtaUU5XT0xYTEdVSERTQDtQPjlRQDpPPjhPQDpWR0BbSklcTEpYTk1aT05XTk9bUVNcVFBeVlNk + WFpeU1RbTEVWR0BTQTlRQDhYRj9eTEViTlBfTE5lTUllTUlbSEhaR0dbSEFbSEFaSDxeTUBnT05l + Tk1cUEhWSkNYSj1TRThVRj5YSUFbTERbTERcUVBhVlVjW1pkXFtiXVNdWE5cVFBcVFBfT0xiUU5i + T0ZhTkVcSE9lUVhpWmNvX2l0XVdjTUdUQC1OOyhKPDVTRD1hTkxoVVNiUUNdTT5bQzxWPjhYQztY + QztYQztYQztaQTtbQzxXQTpXQTpeRkFhSEReSTxWQTRTQDtaR0FeTUZeTUZaSkBVRjxYRTNUQC9O + PjBMPC5JQDhKQTlUSUZdU09jU09iUU5aSkNYSUFeTUdiUEpiUU5eTkpfTExVQUFRQztURT1aR0Fk + UUxqVltrV1xiVldeU1RfT05hUE9eWFZjXVtiU0xbTEVbT0ZcUEdbT0RWSj9UUEhUUEhYT1VcU1he + Xl5iYmJoYmpkXmdjWFVWTEhPQTFOQDBRRDRVRzhRTT9XU0VbVkxYVElOST9FQDdHOTJJOzRMPTdU + RT5YTk1aT05bUEpXTUdVT01YU1BiV1FhVlBlVk9oWFFjWFVeVFBTRkRQREFQST9UTUNaTkVhVUxi + WlRcVE5dVVRaUVBYTEdTRkFUSkBaUEZYVFNWUVBXT0lQSENVTD9eVUhlW1doXVpiXV5pZGViVVNY + TElOST5TTkNcVUxeV05YU0xWUElPSUNQSkRWVFddW15iW11rZGdwYmdpW19bT1BVSUpaRkpeSk9c + VVVcVVVcU0ldVEpcVUpcVUpXT05cVFNcVlFbVVBeU1RjV1hkXFteVlVTTENVTkVeU1ZdUVVUTkdQ + SkRIRTRFQTFORkVaUVBfV1FeVlBfWlNeWFFeWFZbVVNdV1VcVlRcU0ZPRjpURTtdTkRkU0xfTkdX + TEBRRjtRSD9USkFaT1dlW2NvZWlqYWRlWFRhVE9fUEhbTERbTERXSEBUQzpRQDhNPDBNPDBTRTha + TD5eTURcSkFcTEpcTEpcT09dUFBcUU5cUU5fVFdaTlFYSEVTQz9NPzJMPjFQPkBbSEpfT0xhUE1f + TUdcSURcRj5cRj5XRj9bSUNdTUliUU5qV1doVVViT09cSUlcSUNYRj9XSEFbTEVdTUleTkpfU1Nf + U1NkWlhnXFtfWlNdV1BaUVBaUVBhTlBjUFNiT0lhTkhhTFBnUVZkWmdvZHJtXF1eTk9RRCtKPSVK + OTJWRD1iUU5kVFBiUUNcTD1dRjxXQDdbRDhYQTVbQz5bQz5bSEFYRj9aRThaRThdRUFfR0RXSDVT + RDFQPzNYRztdSkFfTURaSkNWRz9VRDhTQTVQPzdOPTRJPC1MPi9TRz5fVEprWFhnVFRaTUhTRkFX + SkhaTUpaT0laT0lcT01YTElYSUNVRj9YSEVkVFBnXWNlXGJkWlhiV1ZjU09kVFBhWFdjW1pkW1Bj + Wk9iWlZeVlNdVElWTUNNSj5NSj5PTEZPTEZWV1BdXlddYmNbX2FiVVVaTU1RQTNVRTdUSTtYTj9d + U0FeVENYVEhWUUZRSDxEOy9IOSdKOylMPz1QREFXSkpcT09YVElVUEZOTEBWVEhfV1RfV1RoW1ht + X11lXl5cVVVRSkFIQTlUSUReVE5jVlRjVlRlW1djWFVhWFdYUE9XTERVSUFaUERjWk1iWFpdVFVd + TUlYSEVWTURiWE9lYWRqZWllYV9bVlVaTDxVRzhKSDxUUUVhW1RhW1RdVVRdVVRXSD5VRjxWTU5Y + T1BeWltoY2RpZ2heXF1dUExTRkFTRD1bTEVXUEZbVElkVFBiUU5eU0lcUEdTSklVTUxbUE9fVVRj + V1hlWltdV1BVT0hTSUBWTUReTEleTElUTEZWTkhRTEdQSkZWTU5fVldiVVNhVFFjV09kWFBkWlRe + VE5dVlZbVFRaU0lKRDtUSkFcU0lhVU1aTkZWRTxTQTlRPzpVQz1UUVNeXF1pX2NnXWFkVFNiUVBa + T0lbUEpcT0pXSkZVST5QRTpTQTJWRTVeUU9fU1BjUFBbSEhYRUVYRUVXRUNYRkRXTERXTERXTUdV + SkVaSkNURT1NQTdNQTdPQ0BVSEZhTUpeSkhhSkZeSERbRjhbRjhUSD9YTURjV05qXlVnVFFjUE5f + TUpdSkhfTElbR0VYQz1aRD5aR0BeTEVhTU1lUVFnVlVnVlViVk1fVEpdTUxaSUheSk1fTE5eTEZh + TkhlT0pqVE9pV11yX2VqX15eVFNcTDRURC1VPTdbQzxeTEZhTkhlTz5kTj1jSUNlTEVoU0VeSTxc + Rj5dRz9bSD9aRz5bRjtaRTpWRDtXRTxTPS1RPCxROi5XPzNdSD1hTEBaSkNaSkNXRzlTQzRTQDpP + PTdPOy5POy5TRThdT0FpV1tpV1thVE9XSkZVSkVWTEZXTE1YTU5cSkRdTEVeTk1cTEpdT1FjVVdj + XF5jXF5jV1hkWFplVVRnVlVoV1hpWFpjWFVlW1dkWFxkWFxfVVRaT05USkFPRj1ORTxRSD9UUEhc + WFBfXV5fXV5nVldbSkxYRTNdSThhU0VlV0lhXlNfXVFaVk5WU0pTTDFHQCdUPSlaQy5QSDlRSTpY + TUVcUEhaUU5cVFBUTURXUEdfXFhkYV1nZGNnZGNnXltcVFBPSTpIQzNWSUdkV1VkWFpqXl9hXFti + XVxfVVRYTk1YTUVbT0dfV1ZlXVxpXl1lW1phU1dbTVFVTE1dVFVpY2ltZ21oYWFdVlZcSkFUQzpK + RjtUT0RdXFhhX1xhWlxYUVRXRj1VRDtRRUVYTExdWl9lYmhoZG1dWmJXTkVORTxPRj1XTkVfVEpl + WlBrWlRpV1FiVVBYTEdTRDpYST9eUU9iVVNkWFphVVZeU0lVSUBWSDtYSj1hT0lhT0laTk9YTU5W + T1FWT1FeU1RkWFpfVU9hVlBkXVRlXlVoVVNiT01bT1BfVFVaUUxVTUdVUUlYVU1eVFNaT05TRkRT + RkRXRTxVQzpeVFNnXFtpYmJlXl5hVFFaTUpXVE5cWFNYUUdVTkRXTkFXTkFcSUdiT01kW2FiWF5k + VFBeTkpXRT5VQzxVRj9XSEFVSkVVSkVYTEdXSkZcSUNXRT5VRjxRQzlRQzlYST9oU0doU0dkU0Zd + TD9TRC9URTBRSj5bVEdkXVRkXVRpV1BjUUpdTUlhUE1dSkVXRT9aQThbQzlcSEZfTElhTUpkUE5j + VE1jVE1iUEpiUEpfTUdbSENcTEpcTEpeTExkUVFoVU9uW1VtW150YmV1Y2ltW2FrVkddSDpUPTBV + PjFXR0RkVFBuW1R3Y1x0YV5wXVt0XE5pUURfSURbRT9bRT9cRkBWQDtXQTxYRDlUPzRPNSVTOShU + OitbQDFdRz9eSEBkTkZiTERcSjxVRDVaQzlWPzVQOydOOSVTQTJdTDxnWldoW1hpWlFhUUlWSkFR + Rj1VSERaTUhhT0ZhT0ZdTU5dTU5YT1BdVFVlWltlWlthVFRhVFRjU1FlVVRnVlVnVlVjWFVjWFVn + VVhpV1tiVVVdUFBYRkhWREZOSkdNSUZOSkdaVlNfXV5jYWJkV1NeUU1fT0BkVEVnVlNpWFVqX15l + W1pbVElbVElcTj1dTz5qU0FqU0FdU0FcUUBbUUhbUUhfVFVhVVZbT0ZcUEdeXVdpaGJpaWdnZ2Rn + WlVjVlFWTUNPRjxaSExtW15qYmlpYWheYV9aXFtfVVFaT0xdTkdlVk9kW1xoXl9jXl1cV1ZdVFdY + T1NUT1BbVldrZGltZWppXV5hVVZaTUhVSERJRzxUUUZfW1piXVxfXltWVVFVTD9NRDhORTtbUUdf + W15lYWRkXGNcVFtVTUxIQD9JQzpQSUBeVlBqYlxtX1tqXVhhWlBXUEdTQzNXRzhdV1VfWldnXFtk + WlhiVERYSjtWTUBcU0ZlVE5oVlBcUVBaT05aTE5dT1FdVFVhV1hhXVdhXVdfXlhfXlhiT0lcSURe + TExiT09fT05nVlVnXVNnXVNhVFFcT01VUEZUT0VYST9XSD5lV1xrXWJtYWJlWltbU1FXT05cV1Zf + W1pdVklXUERWT0NVTkFcT09kV1djXGFiW19fVVFbUE1XRztWRjpXRTxYRj1VRUFUREBVRURbSklj + UElcSUNaRThVQDNQRkBdU01oW1ZrXlpiWlRbU01XRzlURDVWTEhiV1RlW1pkWlhoUUliTEReTkpi + UU5fSj9VQDVaQTVeRjphTkhkUUxiT0hhTkdcT01iVVNnU1NkUFBcSURaR0FcTEhiUU5hUE9nVlVq + V1FrWFNtWFtwXF5zXmNvW19qWE9dTENaPy5hRjRkUVF1YmJ1ZGV1ZGV3Y2F1Yl9zYlNnVkdeTEZW + RD5WQDlVPzhXOTRUNTFWOCpTNCdFMB9QOylVPjFXQDNfSDxfSDxiUUVhUERjTD9iSj5jTj9aRTdU + RC1PPylaSDpfTj9nWldlWFZoWFBoWFBcTUNVRjxaTD5cTkBjU09jU09dUVVcUFRWUExcVlFjW1dh + WFViVVBeUU1iU0xiU0xjVlRlWFZlWlFhVU1lWFZlWFZiVk5cUEhVSkdQRkNHR0dFRUVERkVRVFNe + WltkX2FkXFZjW1VoXVxqX15tXmFqXF5vXVdrWlRlWlBoXFNfV1ZjW1pyYV1yYV1pXltlW1djWFNe + VE5fWFtdVlhUTEZbU01pXl11amlpaWtkZGdYVU9bV1FUVEhKSj9USk5jWl1rYmhpX2VeXl5YWFhV + UE9VUE9eVE5kWlRkXV1nX19eW1dXVFBdWFdUT05VUE9cV1ZpYmRoYWNhV1hVTE1QSkZWUExRR0FR + R0FUU01cW1VfXFZbV1FeT0dVRj5QRkBbUEpiVFhlV1xjVVddT1FcTEpOPj1JPz5USUhjXFxqY2Nk + YmFcWlhhVlBWTEZVRj5YSUFcWlhiX15nXV5kW1xfVEhjV0xiV1RqX1xkY19jYl5eWFFQSkRVRUFc + TEhXT05eVlVlV1xrXWJvZGNnXFtcTD1YSDpcSURhTkhdU01kWlRoYl1nYVxnWlpfU1NaVE1YU0xY + T0ZcU0loWl5qXGFhXFtcV1ZaT0lbUEpeV1dhWlpeVlBWTkhYTkhaT0liUFZhT1VdVFViWFpeVFNY + Tk1YTj9VSjxeSEBeSEBVQz1UQTxVSEZbTkxnT05jTEpWRjpURDhaTFBlV1xtZWhtZWhtX19kV1dY + TURUSD9eUFNnWFtuW11qV1pkUUxjUEpkUVFjUFBdTD9aSDxfSj9jTkNqVE9qVE9oT0NjSj5YR0pc + Sk5cT01eUU9dTEVbSUNdSUdhTUpdUExjVlFkWFBnW1NqV1drWFhqWFxqWFxkV1VeUU9pUUdyWk9v + Y2R0aGlzYl5yYV1tYlxuY11uXlRdTkRdRD9YPztNOilQPSxQOihMNSRIMh9JMyBTPCxbRDNeSDhd + RzdkT0BoU0RfTkViUEdjUUVhT0NlVEdfTkFbTT9XSTxeT0hhUUpiVVNlWFZlXlRoYVZnWEpfUURi + Sj5kTUBiUFRpV1teWltcV1hcVUxeV05iWlRiWlRdVVRXT05YTkheVE5dVU9fV1FeV05bVEphV01i + WE5nV01fUEZYTkhUSURJSENHRkBOQ0ZWSk5fVFVlWltnXV5qYWJtY2dpX2NpX2FlXF1nXVBnXVBr + Xl5tX19nX2RqY2hpYmdqY2hnX2RjXGFiVlpdUVVeVFxfVV1aT05hVlVnWF1zZGlrZ2pjXmJcUU5d + U09YUEpUTEZWT1FjXF5qYmlkXGNcV1hXU1RWT1FWT1FaVFFfWldhWlpiW1taVE9YU05aUFFXTk9V + UU5cWFVlXl5jXFxdV1NRTEdPR0FUTEZOQztPRDxUTkdeWFFeV05dVk1OSkNOSkNQTUlTT0xjT1Rl + UVZfVU9WTEZNRUFHPzxGPDtPRURaUVhkXGNlXF9fVlpcUFFXTE1TSklRSUhfW15qZWllXmFdVlhh + VlNjWFVeV1ptZWhyaWVqYl5hT0ZRQDhOQT1QRD9TSEdVSkldVV5nXmhqYWJeVVZaUERUSj5WRz9b + TERdUExjVlFhYWFhYWFkWF5eU1hdUFBdUFBdSkhfTUpjVlZjVlZeVE5dU01dUUldUUlcVVddVlhd + UUlYTUVaT0lbUEpeUVFeUVFeUU1iVVBYUE1WTkpcTUNfUEZjUUxcSkVTRz5QRTxVR0ldT1FiUU5f + T0xaSEFVRD1USk5lXF9vaGpqY2VpXltcUU5VRj5YSUFkVFBtXFhrWFZoVVNhTk5eTExkUE5iTkxi + SkBhST9eSkhiTkxqU1ZqU1ZkTEhiSUZdSUdeSkheTEleTElbTEVeT0hiTEZhSkVeT0dnV09nV09l + Vk5nVE5pVlBnVVhnVVhjVVdjVVdvXFxzX19zYmNwX2FuXFVuXFVuY11tYlxrXU9cTkBYQTRTPC9K + NCNNNyVOOCRPOSVONypTOy5dRTtkTEFlUEVoU0doVU9kUUxiTUFkT0RkTEVlTUZjU09hUE1hVE9b + TkldUE5fU1BdT1RjVVpkXFhrY19tXFhkVFBkVUpjVEllVFdtW15pXFxjVlZiVVBiVVBjWl9lXGJk + VlhYSk1YTEdaTUhcU0heVUpeVlBdVU9iVk5jV09oVVVoVVViVk5eU0pUT0VPSkBTSEdVSklYVVFh + XVpjXmJlYWRtYWdoXGJoXVplW1dkXFhpYV1qYWJpX2FoXWVpXmdlYmhkYWdoYWNhWlxaVVZXU1Rk + VV5kVV5fVlpeVVhlWl1wZGhpZ2heXF1eT0haSkRaTkZaTkZYU05jXVhnY2lfXGJfUVRaTE5YTElb + TkxbVVBaVE9hV1hhV1heVVZdVFVWT09cVVVWUVVaVVhjWl1lXF9eWk9QTEFOSTxOSTxOQzpQRTxX + TUdiV1FhVlNcUU5MRkRPSUdUSUhRR0ZeTk9jU1ReUD9URjVOQzhJPjNNPTxQQD9WSk5fVFdiVVNf + U1BYRkRcSUdRSkpVTk5fW1xpZGVqXF5hU1VaUVBdVVRfWFtwaWtwa2FnYldcSDRTPyxIQDFMRDRM + QTxNQz1UUFhjX2hkW15aUFRYTURVSUBRRjtVST5eTExoVVVoXmJhV1teUFNbTU9YTElXSkhaR0dc + SUldUUlfVExfVVFdU09bUE9hVlViWFxhV1teTExbSEhdTUxiUVBdTkdeT0hhUE1eTkpdT0FdT0Ff + TkVjUUhiVVBfU05aT0xWTEhcSUxeTE5hVE9jVlFdT0FaTD5YUE9kXFtwZGhtYWRrWFZdSkhVRj5c + TUVnVlVtXFtoV1hjU1RaTkZXTERfTEliTkxiSUVeRkFdRkVjTEpnUVtnUVtlUVFeSkpiTERfSUFc + SUddSkhdUFBdUFBfTEliTkxfTU1iT09jUEpjUEphTkhiT0ljUE5jUE5oVVdrWFtyXV90X2JvW1hr + V1VuVlVtVVRwWlRrVU9oU0VbRjlXQTpRPDRQNyZWPCtaQzJbRDNcRTtdRjxhSkZkTklrVFdzW15y + V1xvVVpfSUFfSUFfTUdhTkhcT09cT09eTk9XR0hYSEdXR0ZUTEpaUVBjV1htYWJuX2JnWFtnXFhq + X1xnXWNoXmRnWF1jVVpiVFZkVlhkW2FpX2VqV1VeTEleTURaSD9WSkFcUEddUUhfVEplWFRlWFRp + WFpoV1hiWlheVlVXT0xUTEhYTk1XTUxUU0pXVk5jW1pjW1plWFZkV1ViV1RiV1RhVlVoXVxoYWFf + WFhhVVheU1ZjV1thVVhfVlpbUVVUUVNTUFFeU1hlWl9fV2FdVV5jX2hnY2tuaW1lYWRcUEhTRz9d + UE5hVFFjWlBnXVRpYmdkXWJjVVdbTU9YTk1XTUxcU1RdVFVqX15pXl1kXV9bVFZWUE5WUE5WUE5b + VVNlXF1lXF1oW1hXSkhUSkFORTxPRjxaUEZiT01lU1BfVFdbT1NRQUNTQ0RQREROQUFYTUVdUUld + TjlVRjFURDRPPzBJOzNKPDRVSkVYTkheUU1aTUhXRkBXRkBVSUBYTURbVFRpYmJlXFNbUUhXTUdd + U01eXF9raW1waWlkXV1YRDlVQDVQPzNTQTVQPjhUQTtXU1ZhXF9jWFdbUE9RSD9ORTxVRDtcSkFi + UEpnVU9kV1VfU1BXTERVSUFTRkFVSERXTERXTERaTUpeUU9iV1FhVlBiV1RkWlZpV1tpV1tjU09e + TkpfU1BfU1BcTUVcTUViUEpeTUdeTENfTURlVVRpWFdjWFVjWFVeVlNXT0xaSkRbTEVdV1BdV1Bd + TkdYSUNcUFRhVVhqXV1qXV1nVU5eTUZWSUVhVE9uX2JqXF5oV1ZiUVBYTURYTUReTEVhTkdkT0Rd + SD1cRURjTEpiTlNjT1RhT0ZeTURiSUNhSEFaR0FfTUdkVU5iU0xhTkheTEZdTEZcSkVeTURfTkVh + UE9hUE9jT09iTk5nT1BqU1RvVFRyVlZrUVFrUVFtU1NqUFBoT0VqUUdnUUZiTUFfRztdRTlfQzRi + RTdfRzpiSTxjSkZiSUVeSk1lUVRtVVh7Y2d7YV1wVlNfTkhdTEZYRj1bSD9bTkxaTUpdSkpWRERU + RT5WR0BVTUxWTk1iVFhpW19uYmhtYWdlXVxnXl1jW2RhWGJhVVheU1ZbU01fV1FnXV5qYWJrXFRj + VExhTkVcSUBYSUNXSEFaSEFeTUZoVVduW11nW2FkWF5cVVVYUVFaTkZWSkNbTEVbTEVbVkxeWk9o + XVxhVlVfU1NfU1NdU01eVE5kVltpW19qXF5cTlBeTkpeTkpfUVRhU1VbUE1TSEVTTUhTTUhXUU9d + V1VcU1RbUVNiW11jXF5qYWJlXF1hV01YT0VhVE9kV1NnYldnYldpYV1rY19kXlxeWFZRT05OTEpY + TVNoXGJrYmVuZGhiXVxYVFNUUEpVUUxdUExkV1NqYlxoX1poW1ZeUU1cTD9QQDRPSDxYUUVkVFBk + VFBfU1BbTkxVTENORTxPPT9RP0FWSkFdUUhnU0BkUD5iUEFcSjxKQTVJQDRWTD1aT0BbUUdXTkRX + TERTRz9WSDtWSDtYTVBkWFxhWFVXT0xaSkNdTkZkYWloZG1oY2JeWlhbSTtaSDpaQTRaQTRUQzRW + RTdbTU9iVFZfVExXTERQQzVTRThcTUNjVElpV1FoVlBeVlBcVE5WT0VTTEFWRz9WRz9USEBWSkNf + U1BoW1htX11rXlxjWltiWFppV1tqWFxqXlVjV05fVk1eVUxcSkRbSUNdTUxcTEpfTElnU1BqWltr + W1xiV1RfVVFdUUlaTkZUSj5WTUBdV1BbVU5aUEZVTEFaSE5kU1hlXVplXVppVlRhTkxXT05eVlVl + XF1lXF1nV09hUUlYTUVYTUVjT09lUVFnU1BiTkxiSklkTUxjUEpfTUdfTz9iUUFkTkZiTEReTEVj + UElkU01jUUxiUEddTENaSEFdTEVfU05lWFRkW1FaUEdhSEVhSEVdSkVhTkhrUUprUUpnTUhnTUhr + TEdtTUhoTEBtUEVuVUpuVUptUERvU0ZtVUdqU0VjTkNlUEVjSkdhSEVhTVFlUVZqVVpuWF1yVFBn + SUZfU05XSkZVQzpXRTxbSURaSENWSj9USD1TQTxUQz1QSUlVTk5eV1plXmFpX2FqYWJkYmFlY2Jl + XWlfV2NjVlRhVFFdVU9fV1FjXFxnX19tXFtoV1ZjWFNdU01aTkZVSUFXRT9dSkVdT1FkVlhiW1tb + VFRUTkxUTkxaT0xaT0xiTkxnU1BkWlZlW1dkXV1bVFRWTk1XT05bT0deU0pjV1hpXV5lXVpYUE1Y + TEdbTklYUEpXT0lUTURQSUBUSEBVSUFTTUpXUU9aUU5XT0xbVFRdVlZoW1hrXlxoXVpkWlZjW1pk + XFtiWlhkXFtkXFhoX1xjZF9iY15XUEZRSkBRSExfVlptZWpwaW5kYVtcWFNWUUdTTkRlVVRqWlhu + ZWJtZGFqYl5kXFhhT0hUQzxUTEZfV1FjW1dkXFhhVlNcUU5aVUlNSD1VRD1PPjhVTUdcVE5rX1Rq + XlNnXVNfVkxTTT1QSjteU0ljV05fVkxaUEZTTUZQSkRVRzhXSTpUTEpcVFNdV1VbVVNbTklfU05q + ZWdlYWJqXVhjVlFiUUNiUUNjUUFiUEBYSjpTRTRcSUdhTkxaTkZRRj5VRD1dTEVoXl9rYmNpX1Zo + XlViWlZhWFVdWE5YVElbTERWRz9USkBWTUNlXF9vZWlvZWttY2loXF1hVVZhWF9nXmVtZGFlXVpk + VU1fUEhfTURdSkFWTURbUUhdU09lW1dpXFxqXV1lWFRdUExdTkdYSUNTSUBaUEdfVVRdU1FcTUZY + SUNcTE1nVldoYl9kXlxkUU9dSkhYSk9eUFVeVVheVVhfUEZeT0VdTEVeTUZlUVFjT09fTUdhTkhk + SkZlTEdnUEhpU0pqW1NpWlFvV1ZrVFNkUE5iTkxfT05jU1FkVUpeT0VeTUZnVU5pV11uXGJpXl1f + VVRfTkVcSkFhSEFkTEVlUEVoU0dkTTxlTj1tTkNzVEhuVkxyWk96X1iAZV5+Y197YV10YVduW1Fp + VlBiT0liSUZeRkNdSUxeSk1jSU5kSk9lTT9hSDtcUVBWTEpYRDlWQTdWRkVWRkVPSD9NRj1RQzxR + QzxQRkBUSURRT05dW1pjXl9oY2RjYWJkYmNiWFxcU1ZeVFBfVVFcVFBdVVFiW1tkXV1vXl1wX15p + YV1iWlZdVEpWTURbTERhUUlYU0xeWFFbWlRVVE5TSkdPR0RRTUxXU1FkV1dqXV1nX2JpYmRnY19d + WlZTT0lOSkVTTUpYU1BhWlxnX2JkW1xeVVZeUVFcT09WTkhRSURVSkVUSURVSEZWSUdXTUxWTEpX + SkhYTElbUE9hVlVtWlxtWlxiW11nX2JkXV1iW1tiWlheVlVbVVNfWldbW11dXV9bVEpYUUhXUU9h + W1hrZ2pqZWldXlpcXVhcWFNRTkhaVFFkXlxnZGhraW1uaW1iXWFnU1NkUFBYVVFkYV1oYWFnX19j + W1pdVVRaU1NTTExbSklWRkVXVVhkYmVqaGlraWpraF9hXVVWU0FXVENlW1VlW1ViWlRXT0lRTkhU + UEpeT0VhUUdVTUlbU09hV1tdVFdWU01YVU9dUVVkWFxjVlRkV1VoYVRoYVRvX1VpWk9XTzxTSjhd + TkddTkdaT0xaT0xYTExnWlpuaG5rZWtkXlxeWFZeWFZiXFphW1ZbVVBaUUxNRT9USURdU01lY2dt + am5vZ25oX2djV11iVlxjXWVlX2htY2RpX2FuVlVrVFNjUUxcSkVUSElYTU5jVVxrXWRuYmNoXF1h + VU1dUUleTUdaSENdR0FlT0loVFZoVFZjTEphSUhcUFFlWltnXl1hWFdpUElkTEViUFZoVlxlWFhd + UFBeTENcSUBaST1eTkFhT0lfTkhjSkZjSkZjUEdqV05uXldtXVZwXmJuXF93XmJtVVhpUE1pUE1i + TkxlUU9kVU5kVU5kU0llVEptXF1rW1xlWFRhVE9WTURUSkFdTEZhT0lkU0xlVE1rU0x1XFV/YVuE + ZV+EamWEamV+amR9aWN7Z2l4Y2VyXlxtWldtU05jSUVdRTlYQDRaQT1cRD9eRUBjSUVkTTxhSTlk + UE5eSkheST5YRDlYTElXSkhPRUFQRkNRQztQQTpURTtVRjxTTUpfWldnXGRlW2NjWl9nXWNkV1dh + VFReTk9fT1BdU1FfVVRjWltnXV5vXWFyX2NpYVtkXFZjWFNhVlBlVEpoVk1bVU5cVk9dVlZWT09W + TEpVSklTTk9XU1ReVVhlXF9pXmdpXmdlZGFhX1xTVEpISUBRRklYTVBYWFtfX2JfXV5YVlddVlZb + VFRXUEdORz5MRzxKRjtQRkBTSENRTElRTElTTUhRTEdWTU5bUVNlVVRqWlhiWlhoX15kXV1cVVVW + T0ZVTkVXU1RXU1RcVVphWl5eU1ReU1RfV1ZtZGNvaGprZGdkXFthWFdaV1ZPTUxaVFFjXVtoaGpp + aWtnZGheXF9fWlVeWFRfWlVpY15oYWFlXl5dV1NcVlFWTVBXTlFYTkhYTkhfXV5raWprZ2hpZGVi + XFpdV1VfU05iVVBnXFhpXltjW1pbU1FYTkheVE5eV01hWk9cUVBbUE9dUVVdUVVbVVBaVE9YTk1h + VlVfWFhkXV1zZWNwY2FuZFtjWlBhUEReTkFdVElYT0VWSkxXTE1bT1BlWltnX2RlXmNoW1tjVlZc + WltbWFphVlNfVVFbT0RVST5WTURkW1FyZWlyZWltY2dkW15iVFtjVVxcWGFfXGRrYmVrYmVyYWJq + WltdUE5VSEZVREdcSk5jW2dqYm5wYmRpW11iUElfTkdfTURiT0ZeTUddTEZiT01jUE5kUU9nVFFj + Wl1jWl1jW1ddVVFoVU5pVk9pVFhqVVpnU1VhTU9iSj5eRztcTD9hUEReT0hiU0xkUUxpVlBrW1py + YV90Z2d0Z2d1YWh1YWh5YWJuVldtVEdtVEdoUU1pU05lVVFnVlNoVkdqWElrW1poV1ZnVU9hT0lU + TEpVTUxUTEpUTEphUE1pWFVyXl53Y2N+ZWl+ZWl7aGV9aWd+ZWd+ZWd+aG14YmdzXFZrVU9lTkFe + RztfRTViRzhlTUNlTUNfSDteRzpdRTldRTliT0hcSUNbSUBYRz5bTEVbTEVYRkZVQ0NRQDtTQTxO + Rz1TTEFVTUxcVFNhU1dkVltjWltnXV5oW1hhVFFcUFRXTE9aTlFdUVVjVVdoWlxuX2JyY2VpW11o + WlxpXltkWlZvXl1zYmFdW1pYVlVcVFNaUVBVTUxQSEdQSkZVT0pUTEphWFdkYmVlY2dkYmVfXWFX + VExKRz9RQzxWR0BOTEpcWlhaX1pTWFNYVU9YVU9VTkVORz5PRDlPRDlKRDpKRDpORkNORkNMRUVK + RERQSkhWUE5eVE5nXFZlXVdlXVdiVk1XTENXTT5aT0BbUVNbUVNfVldeVVZfU1teUVpcUFZvY2lu + aW1oY2doXF1lWltfWFtcVVdeWl1fW15oZWlua29oYWFiW1tdVVRhWFdhWlxnX2JpX2NjWl1hVlVb + UE9XTE1dUVNYU0xWUElfX11oaGVkYmNfXV5hWFNeVlBdU09kWlZyZWlzZ2pjYV9VU1FYU05fWlVi + X2NkYmVeVFBbUE1YT0ZbUUhaVE1VT0hUSURWTEZbW1tiYmJwZGhvY2dnYVpdV1BeU0phVU1kWkpe + VEVaR0VaR0VVSklfVVRnXFhkWlZnV1BiU0xjUVVfTlFbUUVXTkFbU0NiWkljW1dpYV1yZWltYWRi + W11eV1pbVFZcVVddVlthWl5oXmJrYmVrY2JjW1peU0pWSkNUR0NaTUhiWmNrY21vXl9pWFpkVFBl + VVFoV1RoV1RhUFFcTE1dUUlfVExlWFZoW1heV1dfWFhlWFhiVVVnWldpXFpnWFtlV1phVFFeUU9n + TkdnTkdlVEdoVkllWFZjVlRjVlRpXFpuZGhwZ2p0X2lyXWdvW19vW19uXFNnVUxrVkprVkpqV1Fo + VU9qV1VnVFFrVkpwW09pWFpqWltnVU9dTEZTSUBUSkFTST9aUEZjUVVwXmJ4ZGd3Y2V3Yl93Yl90 + ZF11ZV55ZGd6ZWh5ZGdvW11tVlFpU05fSDteRzplTUNrU0hpVEhkT0RbSTtYRzldRjpeRztfUEhd + TkZeTURdTENhUE1dTUlfTUdbSENWREFWREFNSD5RTUNUSkBXTkRXTERbT0diWE9tY1pqYl5jW1dh + WlxbVFZYT1NYT1NbUVNiWFprX2FwZGVzXmVvW2JqYWJrYmN1aGhzZWVrX2NkWFxiVFZfUVRXT05P + R0ZRSD9TSUBPR0FUTEZaU1VhWlxjW2RdVV5aTUhRRUBWSTNQRC5JRzxQTkNWVlRUVFFhT1NhT1Nf + UEZcTUNTSDpPRTdQRz1PRjxQRTxNQTlKQUNKQUNRR0ZdU1FbWFdjYV9nZGhdW15eVUxVTENWTEhd + U09fVlpfVlpdVlZdVlZeU1hfVFpcU1ZqYWRoZGphXWNfVlphV1tiW11dVlhbVldfW1xpZ2hoZWdn + XV5eVVZaT0xaT0xaUU5hWFVoXl9iWFpjVlRbTkxbR0xdSU5TTExVTk5fX19paWlhYV5aWldfV1Rc + VFBhWlpnX19wZ2huZGVfXVxVU1FVTk5kXV1tZ21qZGpeUU1YTEdYT0ZbUUhXU0hTTkRPSUNTTUZa + V1tnZGhrYmNoXl9dVEpeVUxeWlhnYmFrXlpbTklTQTtTQTtVSkVcUUxjWFVlW1diWlZhWFViVVNc + T01WVEhcWk5nY19pZWJrZ2hvamtrY2plXWReW1VXVE5XU0dcV0xiV1FjWFNjV1hrX2FwY2NtX19j + XFNYUUhWTEZiV1FuYmVuYmVyZF9rXlppXltqX1xoXVxkWlhhVU1dUUlfVVRlW1poXl9lXF1fV1Re + VlNkWE9nW1FpX2NrYmVlWFhfU1NjVlRkV1VoUE9qU1FtWlNyXlduYV5nWldkWlhrYV9uZGVtY2Rq + V1plU1VkU1hpV11qXVtqXVtyXl5yXl5uWlxpVVdoVVNpVlRuW1VvXFZpW2JiVFtdTkdRQzxNQTpT + Rz9eTENnVEptXFt0Y2J5ZGd0X2JuXVpuXVpwX1x1ZGF5ZGRyXV1pVlhnVFZrVU1tVk5fSUFiTERi + TUFkT0RiUUNcTD1bST1YRzthTEBnUUZdUUleU0pjUEliT0hhUE1hUE1fT1BfT1BaSENaSENTSENV + SkVUSUhXTUxYTU5cUFFoXVxuY2JqYWJnXV5iXVxbVlVcVFNbU1FWVFVeXF1qYWRuZGhzYmNwX2Fu + YmNzZ2h0amtwZ2hzX19tWlppVlRhTkxbT0dYTUVRSD9RSD9QRztTST1WSkxeU1RhVVhfVFdcUEhY + TUVVSUBUSD9NRjpKRDhRTEVTTUZcTEpfT05hU0ViVEZbUUhUSkFUR0VVSEZXR0ZVRURUSUZQRkNR + R0ZeVFNiXGJqZGpoZGpcWF5VVFBWVVFeV1peV1pkWFxjV1taU1VbVFZfVFVfVFViVlxnW2FlYWRi + XWFdVFVdVFVeV1pYUVRVVVVaWlplYmhkYWdeXF9UUVVPTkpRUE1cT0pfU05jWltjWltjW1pcVFNj + T09iTk5PSkxaVVZiX2NnZGhdWlRXVE5aVFFcVlRiXVxlYV9rY2pkXGNdVlZYUVFbUE9lW1pvYmJu + YWFfVEpbT0ZhVUlhVUlaUEdWTURPSj9TTkNfW1pkX15lXVdhWFNYTkhcUUxYVlpoZWlpYVtXT0lW + SDhXSTlXTkFdVEdhXFtlYV9oYWFnX19hV1hcU1RaVlNhXVpqaGlraWpybXBybXBqZGppY2ljW1VY + UEpbVEpjXFNlXlViW1FhWFNlXVdyX2N3ZGhtXmFfUVRcT01lWFZtXmFuX2JvZGNvZGNtYWJrX2Fn + XFtiV1ZkVUpiU0hjWl1qYWRpX2VlXGJfW1BbVkxjW1dtZGF0aGttYWRkVFNfT05jVVdjVVdnVldr + W1x1ZGV4Z2hyZ2VuY2JrYmNtY2RtY1piWE9fUElhUUpjVlZpXFxvXF5rWFtvWl5vWl5nVU9lVE5j + UE5oVVNpV1tuXF9pW19iVFhcT0pVSERVRj9XSEFjT01lUU9tXFtuXVxwV1BrU0xuVU5yWFFtWlRv + XFZuW1FpVk1lVVFoV1RrWFZnVFFdTTpeTjtlUENlUENiUUViUUVhUERjU0ZpWFVpWFVfT0xfT0xi + UEliUElkVFBkVFBiUVNeTk9cU0lbUUhiT01hTkxeTkpfT0xaTlFdUVVtYWRvY2drYmVrYmVnYV5e + WFZdV1BdV1BeV1pjXF5nX2JqY2VoXl9lXF1oYl9vaWdza25vaGprW1poV1ZjVlFcT0pcUUxdU01Q + TEFRTUNaTUhbTklXTE1bT1BYTU5YTU5eVE5eVE5YU0xXUUpUSTtTSDpXRj1bSUBYT0NaUERaV0pe + XE9cV1ZWUVBQSkhOSEZUSEBRRj5USD1TRzxVRj5fUEhhWF9nXmVeWlhWUVBPT01UVFFcVVdcVVde + U1RdUVNVSkdXTUlaUVBbU1FdVFdhV1tiWFxoXmJcVVVYUVFUU01NTEZWU09VUU5eV1xkXWJhWlxX + UFNNSklQTk1fT1BiUVNoWlxqXF5lX11hW1heUU9eUU9WTEpfVVRjXVtjXVtfU05XSkZTTk9YVFVe + WlhkX15jWl1iWFxeWFZbVVNbUVViWFxwZGVuYmNdV1NcVlFpYV1jW1dhTkxcSUdXSEFaSkReW1Nj + X1djXE9dVklVT0hVT0haV1ZkYmFpXVRcUEddTENjUUhnVU9qWFNiW19kXWJqX2hrYWljXF5dVlhb + VVNfWldtZG5uZW90a3hzandvZG1uY2trW1dkVFBoWlxrXV9nYV5jXVtfWldoYl90am5zaW1uWldi + TkxbT1NhVVhuYmV0aGtwYmRuX2JwX15qWlhjWFNeVE5jVE1oWFFrYmV0am5qXmJiVlpfVU9nXFZt + Y2d0am51ZGVtXF1cUEhcUEhhVVhfVFdhV11rYmh1aW14a294a21yZWdyZ2VtYmFlXFNfVk1dUUlj + V09uXVpvXltrXlxqXVttWF9oVFtiUEpkU01nVE5kUUxoVlpvXWFtWlxnVFZkTkZdRz9aSDpYRzlc + SkVfTkhlU1BlU1BqUUptVE1vVU5zWFFuVU5tVE1qWExpV0puXVxtXFtwVlhrUVRjTkBjTkBnUURq + VUdrUU1tU05rVFNyWlh1X2RzXWJfTU1dSkpdTkZfUEhiT01kUU9nU1NjT09bU09YUE1eUU9eUU9j + U1FlVVRkVFVpWFpnX2JrZGdqZGpoYmhlXVphWFVeVlNfV1RhVFRoW1tkX2NnYmVlXF1jWltiXFpo + Yl9tZ21uaG5pXltiV1RjWFdfVVRYT1BaUFFaU0lYUUhYUUhYUUhdTUlYSEVVRDhaSDxcUU5nXFhl + XF1kW1xhUUleT0ddTENeTURfVkxbUUdYV1FeXVdfW1xXU1RORkBHPzpRQzlQQThTRz5XTENNR0BO + SEFWTVNiWF5hVlBVSkVNTEhPTkpYUVRXUFNQRkBQRkBORTlQRztMRz1OST9UTEpYUE9eWlheWlhd + VVFYUE1RSkFORz5USUZVSkdaU1NbVFRfWFhcVVVVTUlQSEVaTUpeUU9jW1dlXVpqXVtoW1hcUUxc + UUxaT0lWTEZiVVNiVVNhUFFdTU5UTkxWUE5aUFFeVVZqWFNpV1FqW1RiU0xcVVdfWFtvZWluZGhe + XF1kYmNoaGhcXFxWTEhOREBWR0BbTEVfWFhjXFxuYVxpXFdeWk9aVUpeWlhkX15rXlpnWlVnV1Br + XFVtXFtlVVRdWFpjXl9qX2hoXWVnVldiUVNaUUxeVlBnYmVtaGttZGtqYmlwZ21zaW9uYWFtX19p + YmdrZGlqXmRnW2FkXWJtZWpzanJzanJkXVRTTENYTVBoXF9uZGpyaG5uZWRtZGNwX15uXVxtXVZn + V1BiWlhqYmFza25waWtkWlhbUE9YU05fWlVkY2hlZGlrYV1jWFVjU1FlVVRhU1dfUVZkVV5rXGVy + ZWt3anB1aWpwZGVuX2JqXF5pWFVoV1RpWFVpWFVrW1pvXl1tX11uYV5tWF1oVFhjSkZfR0NeSERf + SUVjUFBuW1twWlFpU0plST5eQzhXQzVbRjlWRjpbSj5pUExrU05uV09zXFR1Ylx1Ylx1Xlh1Xlhw + XVdtWlRnU1duWl5zWFtuVFZkUUpkUUprU05vVlFrUVFtU1NuVlVvV1ZvXFpwXVthTUpYRUNcSUNh + TkddUExhVE9fU1BeUU9hUE1eTkpcTlBcTlBiTlNkUFVnVVhtW15jX2VqZ21yZWtuYmhpXFpiVVNd + VVFYUE1hTlBqV1ppX2VtY2lkW1xkW1xnW15tYWRoZGpraG5uZV9oX1piXlteW1dfT1BbSkxfTUpj + UE5jU0ZlVUhhUERbSj5XRzJXRzJbVVBnYVxoXmRpX2VkV1ViVVNkWFBoXFRqXVhfU05cVVVdVlZc + U1RTSUpPQDlKPDRRQTVRQTVQRkBUSURURT1VRj5WSkxfVFVfVExWSkNVSkdXTUlbVVNXUU9RSD5R + SD5NRDtJQDhKQTlRSD9PSkBTTkReVFBcUU5YV1FVVE5UT0VPSkBTSEdYTk1cUVBcUVBfUVRkVlhY + UUhTTENjUUhlVEpoXVpuY19lXVxiWlheVUxbUUhcT0pUR0NdU09iV1RdV1NdV1NbUUhaUEddTUlk + VFBqWlZvXltvXVdpV1FdWlZbV1RkXGNrY2pjYV9tamlubmtiYl9VTkFNRjpRSD5bUUdnXWNtY2l1 + amlwZWRpXltjWFVeV1phWlxuX2JrXV9vYmJzZWVyYV9pWFdkWFxtYWRoY2RnYmNlWFZhVFFlVk9r + XFVpX2NvZWlqY2VoYWNuZ2lyam1taGtuaW1uZW1tZGtlWl1kWFxoXWpuY3BvZ3BuZW9iW1FVTkVd + UFBrXl5yY2hwYmdtYmFtYmFqX15tYmFtXFhrW1dkW15oXmJvZWtnXWNjT01eSkhfV1RoX1xyZG1v + YmpqWlZoV1RiVFZkVlhhU1diVFhpW2JvYWhyam1za250aGlpXV5oVlpkU1ZlU1BqV1VvXFpuW1hr + W1xvXl9uYmVtYWRpWFVfT0xbSD9VQzpVRDtYRz5eTE5kUVRlVE5fTkhfRDhdQTVaQT5cREBcRkBk + TkhqV1FzX1p6ZWN7Z2R0Z2JyZF9vXFxwXV1yXl5rWFhqU1FqU1FuV1NqVE9lU0loVUxtVFBrU09q + UFBoTk5tVE9zWlVwWlFuV09hTkhYRkBYRj9bSEFeTkpfT0xdVVRdVVRiUU5iUU5eVFBeVFBeUFVe + UFViV1ZqX15rYWltYmprYWlnXGRkXFhhWFVfU05bTkldU09kWlZoYWFtZWVpXl1oXVxnW15tYWRo + Z2tqaW5tamtraWpnZWpdXGFiVVBaTUhfT0xlVVFnV1BkVU5jVExjVExbU0BcVEFiW11qY2VyaGtw + Z2poX1xiWlZoWl5tXmNrYV1lW1deV1dcVVVTT0xNSUZNQTpIPTVQQThURTtYR0BbSUNVRjxWRz1U + TklYU05cVFNVTUxYSk1bTU9eW1NaVk5USD9PRDtMQTxKQDtOPThTQTxORz1TTEFXTUdaT0ldU1Fa + T05VSkdUSUZWUExaVE9iV1ZhVlVeVlBeVlBcWk5aV0xeW1NlYlprYmVuZGhlXF9fVlpYU0xYU0xX + UEdTTENcT0pqXVhrZWFjXVhfVU9aT0laSkNnV09lY2dqaGttY2RrYmNlXmFeV1poYWVqY2hrZ2p0 + b3N0b3BqZWdaVUlOST5RR0FdU01lYmpva3R3bXB0am5oYWFiW1tcWl1cWl1lXmNoYWVzaHBwZW5w + YmdoWl5lXmFrZGdqZWdlYWJkW15iWFxlXF1oXl9wY2tvYmpoYWVpYmdraW1wbnJta3Bram9vaGpt + ZWhlX1hiXFVlXGJrYmhqY2VlXmFcVUxWT0ZdU01oXVdoXF1pXV5pX2FrYmNwZGVwZGVoW1hlWFZn + W15rX2NyYWJpWFpkUUhnVEpoXmJtY2d1aHBuYWlqV1VqV1VjVlZkV1djVVpnWF1oX2tuZXJ3b3J1 + bnB5ZWNnVFFjU1FiUVBpVlRwXVtzYmNvXl9uXVpvXltoXl9oXl9lVk5WRz9UQzdUQzdTQzdaST1f + TUdhTkhfTUdbSENbRjlYRDdcREBfR0RdSkhlU1ByXmF4ZGd6ZWh5ZGdwXlhyX1pyXWJ3Ymd1YmJo + VVVhUUpfUElnVlVnVlVrWlBqWE9pV1BkU0xeSENiTEZoT0hzWlNvWFNrVU9jT01cSEZaSD9cSkFf + T1BiUVNfUVReUFNfU05jVlFfV1ReVlNeVlVdVVRfVVFkWlZoXWhrYWtrYWlpXmdnXFtkWlhjV09h + VU1fWlNiXFVlXl5pYmJuY19vZGFtXmNqXGFqY2Vyam1wcHBwcHBqaGdjYV9nV1BfUElbU09kXFht + Yl5oXVplXVpiWlZfWlNfWlNlXF9wZ2p3am53am5uZV9qYlxqX15qX15rYV1qX1xiYVtcW1VWTURJ + QDhJPjVIPTRMQzpRSD9fVURkWkhfVEhcUEVUUVBXVVRdVU9aUUxXSkZbTklWVlRYWFZcTUNURTtI + QC5IQC5JPCxPQTFVSjxXTT5aSkReT0hbSkdYSEVVSklXTUxYU05eWFRjVlRhVFFeVlBeVlBaVlNf + XFhiYmJpaWlwaHRwaHRpW11jVVdaU0lcVUxaVE1RTEVaVFxoYmpuaWhkX15kXFheVlNcVk9pY1xv + c3ltcHdvZG1vZG1qZ2NiXlthXFtpZGNoZ25zcnl3a3RtYmpeXE9WVEdTUEViX1RvZ250a3N4a21z + Z2hlYV9jXl1eW1deW1djXF5uZ2l0aXJyZ29yY2hnWF1lXmFqY2VqZGpnYWdnXGRnXGRkYWtoZG9u + ZW9vZ3BvYm1wY25rZWtwanBtaXJuanNzaHNwZXBpY15iXFdjV1hjV1hiWFpdVFVdVEpXTkVbUUVk + W05nXFttYmFzZ2p1aW11aW9vY2lkWFBiVk5pXWNvY2luZV9qYlxpYV1pYV1yaGtuZGhvXl9oV1hn + VU9oVlBnXVRlXFNnWF1rXWJtZHByaXVuaGVqZGJrW1dlVVFhVlNkWlZtX19vYmJvXFxlU1NiVVNk + V1VuXV5qWltoU0VbRjlXQzhWQTdaRTdjTj9jUEdlU0ljSkdfR0RaQzdbRDhbSTthT0BfTkhnVU9v + Xlt1ZGF0YWFvXFxuWlp1YWF+a3J6aG53YWVqVVpfUEleT0hkU1hvXWN1ZGF0Y19qXE5dT0FcREBi + SUZrVU93X1p0W1ZuVVBjVE1eT0hfTkViUEdnVlVnVlVeUU9eUU9hUUpiU0xfVU9fVU9fVVRfVVRa + VFFcVlRfV15iWmFqXmJpXWFnWlpoW1tiV1ZfVVRcVVViW1tlXmFrZGdraWpraWpqYWdnXWNqY2Vu + Z2lzbWp1b21yaWhvZ2VpXltkWlZnXFtpXl1pYV1rY19lYWRkX2NpYV1lXVpkW1xpX2Fza2t0bW1t + Z2JtZ2JtZ2RpY2FtZGFrY19uaGNpY15fVEhRRjtQQDFOPi9KQDtUSURfXVxlY2JkYVhdWlFTUUxa + WFNiVVBdUExcT09bTk5UVFFaWldeU0lbT0ZMRDJMRDJRQzlURTtaSkRdTkdeTEldSkhYTURVSUBT + SENYTkhbUVNeVVZiV1ZhVlVcVFBdVVFVVFBcW1dlZGtwb3dzaHBuY2tkU01dTEZXSkZYTEdcUVBa + T05bVV1pY2trZWtkXmRnW15iVlpcW1dta2h1dHlwb3RtZWprZGlpZGNfW1pfV1RoX1xkZGdtbW90 + amtpX2FdVlZWT09aVlNkYV1vaGpwaWttY2doXmJfXV5eXF1iWlZkXFhqX2h1anN6bnR3anBwYmRl + V1pjWl1rYmVqZG1lX2hhV11iWF5kXGNoX2dtZ21vaW9wYWppWmNjW2JnXmVuY25tYm1nZHJnZHJr + YmNlXF1iW11iW11eWFZUTkxXTkVaUEdeWFRrZWFzZ2h3amt7bnl3aXRzZ21rX2VkV1dqXV11Z2tz + ZGluZWRvZ2VqZWdoY2RuZGhtY2dpWFVnVlNkV1VnWldrYV1qX1xqXGFvYWVzX2pzX2pwZGVrX2Fo + XFRjV09hVlNjWFVrXlxpXFpnU1BeSkhbSkdhUE1tWFtrV1pqU0hjTEFfSj1dSDtoT0htVE1vXltq + WlZkTklfSUVcRzlaRTdWRjphUERiT09tWlpwX2F0Y2RyXV1rV1dvXWF5Z2p+am13Y2VvW1hnU1Bk + UUxlU01qVl9yXWd0YV5uW1hoUUBdRzdkRkdvUFFrVFNzW1p0W1dtVFBhUUpfUEldVVFhWFVnWFtn + WFtjV09fVExdUUheU0ldU01dU01bTk5XSkpWTkpTSkdYTkhbUEpeU1RiVldiVVVlWFhiVVVcT09Y + U05eWFRkWFxwZGhqZ21pZWtoYWVpYmdqZWdqZWdvY2d1aW1vZ2VuZWRpYV1qYl5rYV9pXl1pY15q + ZF9uYmNtYWJqXVtqXVtnYVpqZF1wa210b3BzbWp0bmtva2hraGRqY2NuZ2d0am5tY2dkWlRcUUxb + UD9cUUBPTEZUUEpfX19kZGRpZGNeWlhWT0ZYUUhdUUldUUlaUU5XT0xYUEpcVE5fWE5cVUpVST5U + SD1WSkNcUEheVFBfVVFjT01dSUdTST1ORTlVSUBbT0ZiV1RkWlZjVlRkV1VVT0pWUExXV1dfX19o + Z25ta3N0bW9rZGdlU1BYRkRaR0dfTU1fVU9YTkhjXF5uZ2lqZG1eWGFnW15jV1tdWlRybmh3dHhw + bnJqYmtoX2loY2RiXV5fWFhiW1tlYmhuanBuZ2diW1tYU0xUTkdbVlViXVxoaGpjY2VlX1tiXFdd + W1pbWFdkV1dtX19ya3R3cHl6cHdvZWtnW1xeU1RhV11oXmRiXmdbV19aUFFaUFFfVVRjWFdnYWdr + ZWtqXmJjV1tiVldjV1hlXmNpYmdnZW1kY2ptY2lqYWdlYl5eW1dWU01PTEZWTk1kXFtyaXN6cnt5 + b3N3bXB5a3R3aXJ0Z29tX2hqXl9uYmN1aHB0Z290aGtwZGhqY2VnX2JtY2duZGhtXFhpWFVuXVpy + YV1yX2N0YmVuYmhyZWtyY2hzZGl1Yl9zX11oVk9hT0hkTklpU05oTk5qUFBlTkReRz1bST1jUUVo + VVdnVFZoUFFnT1BnT0VrVEl3XFx5Xl55ZGduWlxiUEFbSTtXRjpbST1bSUNkU0xkV1dpXFx4Y2Vz + XmFtWFZwXFp0Ymh6aG57aW10YmVrV1doVFRoTk5pT09pVVptWF1yWFVoT0xkSDFeQyxlRkRuTkxp + T1FqUFNnU1BiTkxcT0pYTEdfT1BkVFVeXF9fXWFfWldaVFFaTkZYTUVcUEhaTkZXSkZXSkZWTUNR + SD5XRUNbSEZlT0lqVE5pV1FqWFNhVE9cT0pUTkdXUUpfWFhnX19qYmltZGtuY2ttYmptZWhuZ2lu + Z2tyam9ybWtvamlqYWJrYmNuY2JwZWRvZWduZGV4Z2h4Z2hqX1pnXFZiXFdlX1tqZWlzbnJ5cnd3 + b3R3bXBwZ2pqXV1yZGR9cHR5bXBrYV1lW1dhVUliVkpcVk9YU0xeXF1nZGVlX11WUE5XTUdYTkhY + TEdYTEdUTkdUTkdTTExVTk5dU01bUEpXTERdUUlkV1dnWlpnYV5fWldjU09cTEhYTURTRz5VSUBi + Vk1jW1dlXVppXFdhVE9WTkhaUUxaWlxjY2VpZ2hua21paWdhYV5kUVFbSEhVSkdbUE1iV1RhVlNv + Y2dyZWliW11cVVdYT1BkW1xtYWd5bXN3b3Ryam9lXF9iWFxjW2JiWmFeWlhcV1ZiWFxpX2NjXVha + VE9cUEheU0peVVZjWltpYmdnX2RoXl9nXV5oX1xhWFViWFplXF1vZ3BwaHJzZGdpW11fVVFbUE1c + UFRnW15kX2NcV1tYTkhWTEZXT0lcVE5kW2FlXGJfWldeWFZhVVhiVlpnW15pXWFoX2dpYWh1Y2t1 + Y2tuYmNnW1xiV1RcUU5hVE9zZWF5coB7dIN6cHR4bnJ9bXd4aHJzZW5pXGRqXGFuX2RwYWpzY210 + aGlwZGVqYWJqYWJrXWJtXmNqXF5vYWN4ZWl+a29yY2hrXWJkXWJlXmNpW2JuX2dtW1VnVU9nUEhi + TERjSkRkTEVoTkppT0xpU0pnUEhnV09nV09vV1ZwWFdoVVVjUFBnTklrU05uXF90YmV6YmFyWlhl + VEdhT0NjUEdjUEdlTkRoUEZqWFNwXlh0W1dzWlZtVVR0XFt1YWV3Ymd3Yl9yXVtnVU5hT0hcSURd + SkVjTUhnUExnTklnTklvUEZzVEl4VEp6Vk1zVk1pTURfTUdeTEZlTUZiSUNhTUplUU9hV11jWl9f + VFpXTFFWTEZWTEZaU0lbVEpYUEpWTkhTSUBRSD9YR0FcSkVhVFFnWldrY19nXltpWFVhUE1YTU5d + UVNfVV1lW2NoXmJrYmVuZGptY2lvY2RzZ2h0anB0anBzaW9vZWtrZGduZ2l3ZWd5aGl3aG10ZWpy + ZWdvY2RlW1plW1pjW1pnXl1raG5wbXN0cHl4dH13b3RqY2hrYV9vZGN5bXN5bXNzYmFpWFdfWlVc + VlFcW1VbWlRjXl9nYmNkW1FcU0lbTkliVVBhVlBYTkheT0hdTkdYSk1WSEpbSEhbSEhWTEZYTkho + XGJuYmhrZ2pjXmJfVVRfVVRcVE5VTUdjUFBqV1dtXmNzZGlnZ2RdXVtXVFBXVFBbWl5hX2RoYl9z + bWptamllY2JhWFNcVE5eUU1eUU1cUVBhVlVkX2NpZGhfU1BaTUpcTEpnVlVtX210Z3R5bXByZWlf + V1FeVlBfVFdfVFdfV1FdVU9iVVBpXFdoX1piWlRqV1dlU1NnWlprXl5yX2NwXmJrX2NvY2dqY2Nk + XV1fWFtiW11qZG1rZW5pYmJfWFhUT0VTTkRYUEpeVlBfWldhW1hcVE5WTkhXT0xaUU5fWFtkXV9l + XVxkXFtkV1dkV1dfWFhkXV1nXWFuZGhvZG1vZG1uYmhoXGJkVlhfUVRhVlVyZ2V3cHt+eIN9cHd6 + bnR+bnh5aXNyYmtnV2FlWl1uYmVuZW9waHJwaGdzamlvYl9rXlxpX2NoXmJtYmp4bXV6bnJ4a29v + YWNlV1pfU1BlWFZiVVNlWFZqWExnVUhrUU1pT0pqT09uU1NzXmF1YWN3X1pzXFZvXFpyXlx1XGJz + Wl9tVlBlT0lfUEllVk9yXGF0XmN3XVpvVlNqUE1pT0xlT0doUUlpUUdvV01wXVZ1YltyXV1tWFhl + U1BnVFFtWF10X2RzWlVyWFRlVEdeTUBfSUFeSEBlTEdrUU1vVVVzWFh7X2J/Y2WDaGN7YVxuVkxt + VUpoTkllTEdhTkheTEZcSURfTUdlU11kUVxfUVZXSU5YST9aSkBdVEphV05dVEpYT0ZRSDxPRjpX + SEBXSEBdTE9qWFxwZ21qYWdkWFpdUVNaTlFeU1ZcVVdhWlxnXl1pYV9qY2NpYmJpX2NtY2duZW1u + ZW1rYmVrYmVrZGduZ2lyaG50anB0amt0amt0amtuZGVrXWJrXWJoYl9lX11uaHBzbXVycHp3dX93 + a3RtYmpkXlxnYV5ybW5ybW5yZF9lWFRjWFddU1FbWFdeXFtrZWtnYWdkWFBkWFBhWFVoX1xiWFpc + U1RdUExdUExdU1FXTUxcSUNcSUNVTEFXTkRkWmRrYWtpZ2pfXWFeWFZfWldnXFtYTk1hT1VvXWN4 + b3l6cntvbXBhXmJdUUldUUlWV1NVVlFhXl1qaGduY2JrYV9kWlRjWFNlWlFeU0pVTENcU0liWmFi + WmFcT0pTRkFVSEheUVFjXGFoYWVvZG1tYmpkXlpcVlFeUU1cT0pdVEpbUUhcTEhlVVFuYmNyZWdy + ZGJwY2FyY2VzZGdoX15qYmFkXV9vaGpoZWdlY2RhXF9dWFxjYWRpZ2plZWNfX11bVkxXU0hYTk1Y + Tk1fTFBkUFVdUExdUExWTk1XT05cVVpiW19oXGJnW2FkWFxhVVhdVFViWFpjXF5pYmRvaG1waW5v + ZWlpX2NkV1VjVlRqVl15ZGt5cHp6cnt4b3lzanR7a3h3Z3NqWGFlVFxnXWFtY2dvYm1zZXBwZ2hu + ZGVoXVplW1dpXWFuYmV5a3d7bnl5bW5zZ2hoW1ZhVE9lVE5oVlBjU09pWFVvXFZvXFZwWFpvV1hy + WGF3XWV6ZHB9Z3N7Z2R1YV50YWF1YmJ4X2FvV1hkTEVfR0BhUFFqWlt3YWV0XmN0V05qTkVpUE1q + UU5oVU9qV1FtW1V3ZF51aGhyZGRtXFtnVlVlT0dpU0prWFhvXFxwXlduXFVtW0xpV0hiTERfSUFn + TkpwV1R7X2t/Y2+CaG6EanCCbW19aGh4XVpzWFVyVUluUUZoV1hhUFFaSUZdTUliUFhjUVpiVVNa + TUpYTjxbUD5eVFBfVVFdVEpeVUxWSUdYTElYTU5YTU5hUFFqWlttYmptYmpjXl1bVlVRTEdPSUVU + TUNYUUdeVlBkXFZkX15nYmFpYmRqY2VpXmdtYmpwYmdtXmNrX2FrX2FtaGluaWp0bXJ1bnNybW5u + aWpvZG1yZ29waW5uZ2tuaW1ybXBranJycHh4bnJrYmVkXV9jXF5qaGdtamlvaF5lXlVdWlRXVE5a + U1ViW11oZG1oZG1pXl1tYmFzZGd1Z2lpYV1iWlZnXFhoXVpiV1ZcUVBbT0ZcUEdcTUVdTkZfWl9o + YmhrZ2pjXmJoVlprWl1rW1pfT05hVlV3a2p4cHN4cHNzbm1kX15hT0ldTEZVT01bVVNjV1tqXmJt + Y2RrYmNtY2RvZWdwY15jVlFVTEFVTEFbU1peVl1VTE1RSElNR0VXUU9aUFRkW15uX2dwYmlpZGhj + XmJdWFdbVlVcT01cT01fT05tXFtwZ2p3bXB5bXB1aW15am96a3BvamtrZ2hkXV9rZGdpaWlnZ2dk + YmNdW1xjYWJua21wZ2puZGhrY11kXFZcUEhbT0ddUExiVVBiVVNkV1VdV1VbVVNaU1VaU1VcU1Ze + VVhjWl1fVlpiVldjV1hfWF1qY2hwaHRzandzbm9rZ2hoX1xjW1dpX2VzaW96cHd3bXNzaXltY3Nz + Y29vX2tpW19nWF1nWlpuYWFpXV5vY2RyZ29rYWlnXV5kW1xoXmJrYmV0aXJ3a3R1amlwZWRpVVNn + U1BiUU5iUU5pVFhwW193Y2VvXF5rWlRtW1VyXGV0Xmh7ZXJ+aHR7aXJ5Z291aW1zZ2pzWlNlTUZe + RUFjSUZnVE1uW1RvW1hrV1VrVElvV01yV1x0Wl5yYWJyYWJ0YmV4ZWl5ZGl3YmdtXVZoWFFoT0hu + VU5wXV15ZWV+bW57amt7aWJwXldnTUZiSEFwVVx1WmF9YWWEaG2Ea2+GbXCCbmh5ZV94X1VwWE5t + VEZlTT9oWlxfUVRXUEdYUUhaUFRaUFRbUVNWTU5VSUBYTURcUVBeVFNbU1FaUVBaTU1aTU1dU1Fi + V1ZjVlFpXFdrYmhrYmhjXl1bVlVUTklOSERUTEpXT05eVFNiV1ZhV11lXGJtYWJuYmNpYWpqYmtu + YWFhVFReVE5eVE5nX2JvaGpwbXVybndtZ29nYWlnXGRnXGRqYWRuZGhpY2luaG5wanV3cHt6c3hv + aG1lV1phU1VlX2VtZ21raGRnY19eXlFVVUhYU0xeWFFkYmVqaGtqZWRpZGN4ZGd5ZWhtZWhuZ2lw + aG9vZ25pXFdiVVBeWFFhW1RiU0phUUlfWl9lX2VtYWRnW15rXWRqXGNnX1ZcVUxhV1t4bnJ6dXdz + bm9zbm9nYmNiVVNcT01WUE5bVVNiVFhnWF1rYmVtY2dua29yb3N0am5iWFxWRz1WRz1aTk9dUVNb + UE1TSEVKRT5RTEVbTkldUExlWFhqXV1jYWJiX2FfXV5bWFpdUE5dUE5eUFNvYWNwbm9zcHJ1bm5y + amp9bXd+bnh3bXByaGtoYWNoYWNkY2plZGtoXmRkW2FnX2RwaW53Z3NyYm5rYmNlXF1eU0lfVEpi + Vk1lWlBkXFtnXl1jXVhWUExTSEdUSUhaUFRdVFdiVlphVVheWFZcVlRXV1VfX11oZXNpZ3RubXJo + Z2tnYmVkX2NqZG1ya3R3b3R3b3RwZ21oXmRpX2NoXmJpYV1nXltlWFhtX19oY2dvam50am5uZGhn + XFZoXVdqYWJuZGVybnR1cnh1bWduZV9vWFNqVE5eU0pjV09tWlxzX2J1Y2dwXmJrXFVqW1RyX2Nz + YWR4ZWt9anB6bXV5a3R1Z2lnWFtkTD5iSTxjSUNnTUZtVE9yWFRtWFZrV1VtWlpzX194Y2N6ZWV4 + YmdwW19zYWd5Z217Z254Y2pwWlFvWFBqUFVyV1x3YW9/aXiAbW19aWl7ZF9qVE9pSUhpSUh1WmF+ + YmmEaHKJbXeHbXV+ZG17YWF7YWF3XVhzWlVuV0ZjTTxlW1ddU09aUEdaUEdWU09WU09hVFRcT09a + SkRbTEVYUE1YUE1bU09aUU5XT0lWTkhWUElbVU5jWFdpXl1oX15pYV9lXVxiWlhhT0hXRj9WSUlb + Tk5eVFBeVFBcVVdhWlxuWmNyXWdpZGVnYmNlXVxcVFNcUU5eVFBpXWNyZWtwanNtZ29qYWRjWl1p + WFpoV1hnXWFpX2NoX2ltZG5vZG93a3d5cHhwaG9rWFhnVFRkWmJuY2tva3JpZWtiY1pcXVRXVFBV + UU5dXV9jY2VoZGppZWt1Z2tzZGlvYm1uYWtuanNva3RvYl9uYV5qYl5uZWJjV09YTUVcV1ZnYmFo + Xl9lXF1oXmJpX2NkYV1bV1RjXF53b3J6cHJ3bW5ubm5hYWFkXFhdVVFdT1FdT1FWUExWUExfW1xr + Z2hzc3VwcHN1bnNkXWJYSUNcTUZWUVBUT05fTUdbSENQRTxYTURVTUdXT0lYVVFeW1dlXmFjXF5j + Xl9kX2FdUE5fU1BlWl9wZGpvam5pZGhoY2JrZ2V1a3J6cHd3b3JwaWtoXVpjWFViW11iW11lV15n + WF9oWl5rXWJqXmJtYWRoZGFnY19eWk9eWk9eWFFhW1RqY2NuZ2djW1dbU09WSk5WSk5cUFRfVFdj + VVpiVFhhWFdcVFNYVlVaV1ZhYWNjY2VqZG1qZG1oX2dpYWhrY21uZW95a3d4anVuZGpoXmRlXmFn + X2JqY2VqY2VnXmVoX2dnaHBub3hzaW1qYWRoXlVrYlhzZGl4aW54cnp3cHl1Z2luX2JkV1dkV1dl + W1ppXl1rYmNuZGVvZGFtYl5lW1VnXFZzYmN3ZWd4ZWt7aW97aW95Z21vYl1kV1NoT0FnTkBrU09z + WlZ1XFd1XFduWldwXFpzZGl3aG10Z2RyZGJwXV1zX19yX2N4ZWl5Y213YWp0YVpyXldtWlxvXF5w + ZXB1anV9aG16ZWp1XFdlTUhnTUl0WlaAaGuGbXCGaWl6Xl59YWN5XV+CYmOGZWd9ZGh+ZWlwXk5c + SjtkXFthWFdfVk1cU0lWUUdXU0hpWFdoV1ZhUUpeT0hdU09dU09hUE1kVFBaU0lWT0ZUSD9aTkVi + VVNiVVNhVlBkWlRpXltnXFhnVlNdTUlfTkddTEVaT0xcUU5dVVRcVFNhV11jWl9oY2RnYmNjXVtc + VlRbVVNeWFZkXmduaHBva3JtaW9qYlxjW1VlVVFoV1RhU1diVFhjVlRlWFZjV1trX2N0a3NzanJw + Y2FqXVtqXl90aGlybndwbXVwamhoYl9bV1RWU09aU1NfWFhrYmVwZ2pvZWduZGVuY2tuY2tybXBv + am5tamlua2p0bmtvaWdlXlVcVUxiV1RrYV1nZV9fXlhnX2JrZGdpXlthVlNjXF50bW94cHN3b3Jq + ampjY2NnXV5kW1xlWl1hVVhQUUhQUUhXU1RrZ2h0b3N3cnVvbnNkY2hjWltoXl9hX1xYV1RYSUFY + SUFWSkNYTUVRU0xQUUpTT0lXVE5dVFVfVldjXl9jXl9bW1hWVlRaVlxraG5tZGthWF9eVlVkXFtn + Z2d0dHR1c3RraWprW1pkVFNdVFVhV1hhVVZfVFVbU09eVlNhWlBdVk1hW1hjXVtkXFZlXVdlXVpq + Yl5za25rZGdkWlRfVU9cSUdYRkRbTU9iVFZrV2FwXGVoXl9fVldhVlNcUU5iVlpqXmJyZG9yZG9v + Y2dtYWRrYmVuZGhtaXRuanVuZ2trZGlvYWVuX2RyZWlzZ2ppZGhkX2Nram9ram9qYl5kXFhoYl1w + amV4anV6bXh5bnd1anN0a2pvZ2VqXmJpXWFoXmJnXWFtY2dwZ2ptZVxnX1ZhWFVjW1duYmN1aWp9 + aG14Y2h1YmJyXl5uYlhnW1FpW0ppW0pyXlx4ZGJ5ZV51Ylt3ZWJ4Z2N5bXB3am51aWFyZV1vXFxy + Xl5yYWJzYmNyXWdvW2RuXFZtW1VrW1x0Y2R5bW50aGl6YmNyWltoVU5tWlNwX1x3ZWJ1ZGNyYV94 + XVZ1W1R1XV56YmN+aWt/am1+ZVtvV01iTT9aRThrXl5qXV1fV1ZhWFdeUU1fU05lWFRnWlVhV01c + U0hiVVNhVFFjU09kVFBbUUhYT0ZRRjtUSD1XTERfVExfVVFiV1RqWltpWFplWFRhVE9aVERTTT1Q + SENWTkhbTklcT0peVlNiWlZkXV9pYmRlZGFcW1dbV1FhXVdnX2Jyam1wa29zbnJ0Z2dtX19rXlxp + XFpiVVBhVE9kWFBjV09lWFRoW1Z1ZW94aHJyZ2N0aWV3amt3amtybndva3RuaWppZGViWlZYUE1X + TENYTURhW1hlX11oZGFqZ2NvY2dwZGhvZWluZGhua21tamtua2ppZ2VdXldVVk9aVlNjX1xpZV9j + X1ptYmFvZGNnXV5eVVZiWmFuZW1zcHR3dHhwZ2hqYWJnX19kXV1iX2FeXF1UUEpTT0lUT1BlYWJw + aW54cHVyaXBkXGNqZGpuaG5uY11nXFZaTD5aTD5XTk9dVFVeV1dXUFBMSkNRUEhYU1BbVVNeV1pf + WFthW1hcVlRdW1xpZ2hpYmRjXF5iVVNfU1BhY2J0d3Vzb3VtaW9nXV5iWFpkWFplWlteVFBYTkpV + SkdaT0xcVFBeVlNkXFhkXFhoXVdtYlxoaWRqa2duaWhrZ2VtWlNlU0xhSkNcRj5eTEZnVE5rXmd3 + aXJvamlkX15hVUlcUEVkUVxvXGdwZW5uY2tkY19iYV1tZWVuZ2dtaGttaGtwZW5uY2tzaW11a290 + a2huZWJyZ2VyZ2VzZ2pvY2dvXltwX1xvaGh0bW13bXB3bXB3b3JwaWtzaW1vZWlzXl5zXl5uY2Jz + aGd1Z2t4aW5uZFtlXFNlWFZqXVtzZ211aW96Z2d1YmJzYmFyYV9tYVhrX1dzYVp1Y1x6Z2d+amp6 + aWVzYl5waGdzaml0bXJ1bnN4aGFuXldtXVZtXVZwXV9uW11uWmFrV15rWlRuXFZyX2N1Y2dyXlxt + WldnWEpkVkhtWFZ1YV53YmJ1YWF1Y1pyX1ZpVlBtWlRwW2J3YWh+ZWR7Y2JvV0FdRjFdQy9fRTFv + X1hvX1hrX2FqXl9iUVNeTk9eVE5iV1FfW1BeWk9iWlZiWlZfV1RfV1RfU1NXSkpaSDxWRTlVRURa + SUheTk1kVFNtVVZvV1hnXFZfVU9fVEhaTkNYSj1WSDtbTEVdTkddUExdUExfWFhlXl5qZWRkX15f + WldeWFZiW1tpYmJqaGlvbW5wbm9vbW51aWpwZGViW1teV1dnVldpWFppVlhtWlxtW2FwXmRqYl53 + bmp5b3N5b3N6c3hwaW5oYWFjXFxjWlBfVk1eTkpYSEVhVlVoXVxnYV5rZWNvYWVuX2RoX15pYV90 + aGt3am5wZ2hpX2FhW1ZcVlFfWldiXFplX11kXlxpYV9pYV9pXFpkV1VlV1pzZGd3dHh5d3puZGVk + W1xnXV5oXl9fYmFfYmFVU1FOTEpRUE1fXltwZ2p3bXBvZWlnXWFwanNvaXJvZGFlW1dcSkFlVEpf + VldeVVZfVVFeVFBaSUZeTkpcUUxcUUxaU1NaU1NiT09jUFBhV1tpX2NpYV1kXFhhV05dVEpiYWVy + cHVvcHRoaW1vYl1uYVxrY19lXVpYUUdORz1USUZeVFBiXVxnYmFpZGNnYmFpYmJtZWVtaGduaWhr + Y2JqYmFqV1BlU0xfTUZbSEFcUEhfVExkXGVwaHJ0anBvZWtjXFNbVEpkW2FqYWdwaWttZWhlXmFi + W11kXV9oYWNqYWdrYmhwZGhyZWlza250bW9zamdvZ2NwY2FwY2FvYWNrXV9wXGFzXmNwZ2hwZ2hy + aGlwZ2hwa29rZ2pwZGhrX2NwX15yYV9rXWJ4aW57b3N5bXB1ZV1qW1NqVlhwXF55ZGt4Y2p6Z2F0 + YVtrX1drX1duXVpyYV14Y2F9aGV7ZWp6ZGl3ZGpyX2VvZ2VzamlzZGt0ZW15YV9yWlhrW1prW1pw + XFxtWFhoV1RqWlZnV1BrXFVyXmFvXF5tWlNqV1BqVE9rVVBvW1twXFx1XVx1XVx3X1dyW1NoTklp + T0puVVt1XGJ6W1NwUUlhSTddRjNjSDRoTTltX11rXlxtYWRoXF9fU05eUU1hVFFjVlRhV1hkW1xq + Xl9uYmNnXV5kW1xkW1xcU1RlT0ddRz9RRDdTRThYSEViUU5lU1NqV1dlWFZlWFZlWlFjV09dTENV + RDtTSUBRSD9USD9VSUBVTE9fVlplY2dkYmViXWFeWl1eVlNjW1dnYVxpY15raG5uanBwZ2pvZWlt + YmFrYV9pXmdrYWltX2hrXmdkWlRfVU9eXF1ua211c3d3dHh5cnJtZWVqXV1lWFhpWFVjU09XSkZW + SUVYUEpdVU9nXl1pYV9qYl5kXFheWFRlX1tuYmNzZ2huZWJlXVpdVVFaUU5bVVBcVlFjW1dkXFhl + XVdnXlhtWlpuW1tqXmRtYWdzbXV6dH1pamFeX1ZiXlhhXVdbW1tdXV1VU1RQTk9eVVhuZGh3a3d0 + aXRoYWNkXV9uanVva3dtaGlpZGVjV05lWlBfWlNdV1BhVUlfVEhkUVFlU1NnW1xiVldYVElVUEZW + SkNcUEhdVVRnXl1oX1pjW1VnVlViUVBnYWd0bnRzanRwaHJwZ2puZGhraWpqaGleU0dVST5cT01q + XVtta2Vta2VuaWhuaWhza2t1bm5vamlrZ2VqXVhjVlFlVk5jVExjUUhkU0lhV05hV05iWFpqYWJ1 + ZW91ZW9uYWFlWFhkXV9lXmFrZ2hoY2RjXF5iW11hV1tiWFxkWFpkWFpqWF5vXWNtZWhrZGduX2Jr + XV9uXF9uXF9pXltoXVprX2NtYWRtZGNoX15oXmJoXmJpX2VtY2lwY2NnWlpkV1VqXVtvZG11anN5 + bW5yZWd0W1RpUElkUU9pVlRyXWR1YWhzX1ZuW1FrV1VqVlRuWlp0X196ZGl+aG14ZWlyX2NrXV9t + XmFvY2l1aW90ZW1wYmlzX1pvXFZqX1xrYV1tWlBlU0lhT0NhT0NhUERlVUhnVE1nVE1tVlBuV1Fr + U0xtVE1tVVZwWFp0XF91XWFwVlZyV1duVVFyWFVzXFR0XVV3V0xwUUZnT0NoUERuW1VwXVdnX1Zk + XVRlW1ppXl1nW09cUEVdTENhT0ZfU1NlWFhtX19tX19pY2FoYl9oXl9kW1xtXVZnV1BcVkZWUEBY + T0NcU0ZiU0xjVE1kV1dkV1dhV1hjWltlVVRhUE9YT0ZWTURYTURbT0ZaTk9eU1RiXWFhXF9dVlZb + VFRdVVRfV1ZfXFhkYV1nY2ltaW9pX2NpX2NwY2FvYl9oYWNqY2VqY2hqY2hiW11YUVReW2FnY2l4 + b3d5cHhyb3BpZ2hqXVtoW1hlWFhfU1NWTkhTSkVcUU5dU09lWltqXl9pX2NkW15hW1ZjXVhnYmVu + aW1uZGVoXl9cVk9XUUpbT0ddUUlqXVtpXFpoX1poX1ptYWRrX2NrZW5uaHB1b3p1b3ptamtlY2Rh + X1phX1pfW1pbVlVVT01WUE5jWl1yaGt1a29rYmVfXVFhXlNnZ2ltbW9zZ21qXmRoXVdnXFZnW1Fl + WlBrXFFrXFFvYmJtX19nXFZhVlBXT0lVTUdTTUhXUU1hV1hjWltjXVZjXVZpWlFnV09nYmNqZWdq + ZWdwa21vb3JtbW9ubXRubXRkW1BaUEZkWFxyZWl1bnNza3Bya2dwamV1bnB7dHdybnRqZ21tXFtn + VlVnXVNpX1VuXVpuXVplXFNkW1FlXVptZGFoZWdtamtuZGVlXF1nWlpoW1toX2dqYmljXF5iW11f + VlphV1tiV1ZkWlhrX2FvY2RvZWlvZWlrXlxnWldkV1dhVFRhWFViWlZnXWFoXmJpXltkWlZjVlFk + V1NiWFxlXF9tW15oVlppW2JqXGNvZG10aXJ3YmtuWmNuVFhrUVZkV1dtX19zYWR0YmVuW1hpVlRp + V1BoVk9uWlxzXmF0YV5yXlxqWlhpWFdiWFpnXV5wZGV1aWp3ZWRyYV91ZGF1ZGFwZWJyZ2NtYVhi + Vk5iUERdTD9eSTxiTT9iUElqWFFuXlZyYlpwWlRuV1FvV1t3XmJ0YV5yXlxvXlFvXlF0Y199a2h6 + Z2R0YV5zVUZvUUNrUU5zWFV0W1Z0W1ZkXFZkXFZjXFNqY1plXVpaUU5eRzteRztYTURfVEpdW15j + YWRnYmNoY2RpYV9nXl1pYmJpYmJnXFZdU01hV05iWE9jWk9eVUpfVVFfVVFfV1ZiWlhpW11jVVdd + VEpbUUheT0dhUUlfVFVdUVNdU09cUU5hUE1hUE1bVU5YU0xXVk5VVExdVlhpYmRlX11nYV5qY2Nr + ZGRwaGRuZWJrZGdnX2JkW1xeVVZeWl1nYmV4b3l6cntycHVpaG1pXFpoW1hlXFNjWlBhV05YT0Zi + UEljUUpiWlZlXVpkXlxeWFZfVVFnXFhpZGhrZ2prY2JnXl1hXFFaVUphVU1kWFByYWJ1ZGVrZWNr + ZWNtXmVtXmVoY2dtaGt5bnl3a3dwaWtqY2VoaWRhYl1cXFpWVlRYT1BbUVNjW2JoX2dnYmFiXVxi + WlRjW1VlY2dqaGtqYlxkXFZjXFNqY1ptYVduYlhzZWF1aGNzbmNuaV5uYlplWlFcU0hUSkBQSkRU + TkdeWFRlX1tnXlhiWlRdVkxeV01fWFhqY2NoaGpra25qbWtoamlqaXBubXRkX15fW1ptZG51bXdy + bndwbXVza255cnR4dH19eYJ3cnNuaWpnW1xlWltrYV9vZGN1YWV1YWVvYl9tX11qZF9uaGNpZ2hv + bW5vaGhkXV1kV1NjVlFiWF5oXmRlXVxbU1FdSkpeTExdVVRlXVxuZ2l0bW91aWpyZWdvYmJqXV1i + VlphVVhhVlVlW1ppXV5oXF1oXVxkWlhiWE9hV05kVlhkVlhnWFtoWlxnXFtqX15tYmpzaHB1YWVw + XGFoUFFkTU5iUVBvXl1zX2JvXF5rV1dqVlZlWFZnWldpXFxpXFxuX1FtXlBrX1ZrX1ZuXF9zYWR0 + aGl3amt7aGh9aWl9a2p9a2p0aGl1aWpzY1hvX1VuWEpiTT9kSTppTj5rV1d3YmJ1aGVzZWN0Ylxt + W1VvW1hzXlxyXlh0YVt1ZFd5aFt4bWt+c3J/a2t1YmJyU0dvUEVtT01vUU90VlN0VlNnVlVoV1Zp + V1BtW1RoV1hnVldiVEZbTT9XTz9aUUFVVVVfX19pXWFrX2NtXFtrW1pnXFhnXFhqWltoV1hpW11q + XF5oX1plXVdkV1NeUU1bVEpaU0lhVlNhVlNYT0ZbUUhiVVBkV1NiVFZdT1FeT0hdTkdbTklcT0pb + VElaU0hbVEdaU0ZVT0hcVk9iWlRkXFZnYmFuaWh3bm10a2puZWRoX15kXlphW1ZdVlhiW11lZWhy + cnR4c3d3cnV0Z2dtX19pX2FvZWdvaGhjXFxjV0xiVkplXlViW1FlW1dhVlNfTU1nVFRlXmFtZWhu + Y11nXFZoXlVfVk1iVk5qXlZ+a299am50b3Bwa21tY2dpX2NiXWFnYmV0bnd0bndvamluaWhqamhj + Y2FbW1tUVFRWTk1YUE9hWlpkXV1oX1xnXltiWlhiWlhpZGVuaWpoYVZiW1BrYVt0aWN1cm5va2ht + amttamtvcGtub2ptZ2JqZF9jWk9cU0hVRjxXSD5dVEpiWE9tXFtoV1ZhWFNhWFNjWlBpX1ZpY2Fo + Yl9kYV1raGRqaGtvbXBqZWdiXV5pZ2pyb3Nwa29wa29ubXJ0c3h3dX10c3puaWpoY2RoXF9tYWR0 + aG51aW95ZGt3YmlrYmNvZWdvamtybW5wbm9yb3BtamlqaGdpX1ZlXFNfWFheV1dkWlRfVU9kUFBl + UVFkWFpuYmNvbnVta3NwaGRoX1xoXmJnXWFoVFtlUVhcU1ZfVlphWlxhWlxnXFhjWFVhVU1fVExj + WFdjWFdiWlhfV1ZeVE5kWlRrYmVrYmVwXV1pVlZnTkdnTkdkUVFvXFxyXVtuWldzWlZ3XVpwXVdu + W1VvXVZyX1h0aWN3a2WAa2l+aWd6Z2l6Z2l3aWl0Z2d6ZW1+aXB9anB6aG50aWVzaGR6aWV7amd4 + YVhqVExlTUBvVklwXmR5Z217amd1ZGFrYVtqX1pwXVt1Yl93X1dvWFBqV1VuW1hoXmJzaW15bmpz + aGRvU0lqTkVrTkhuUEp0VFN1VVRnXFhiV1RqV1VoVVNpVlhpVlhjWk9dVElcUEVdUUZdVkxkXVNu + YWFtX19pXFxjVlZfVExiVk5lW1dpXltoXl9rYmNrYmNqYWJjXVtbVVNfT0NcTD9YTUVbT0dbT0df + VExkWlZpXltkVlhhU1VjU1FfT05fT0xiUU5jWFNjWFNhVUxdUUhhVU1oXFRjW1VoX1prYmV1a291 + cHJ3cnNoZ2NkY19kY11jYlxjW1dlXVptZWV4cHB9dHt+dX13b3J3b3J4bnJ7cnV9cHdwZGpqYl5p + YV1vY1tpXVVhWFVaUU5aUEdaUEdhV1htY2RtaWFnY1tlX1teWFRlWFZvYl93bXN4bnR1cnhwbXNr + aWhlY2JlYWJjXl9jZ2plaW1wa211cHJzbm9uaWpoXVdfVU9WUUZRTUFeVFBnXFhqYWJqYWJrYmNt + Y2RpZ2VpZ2VnXlhpYVtwZ2p3bXB0b3Nvam5vaGh0bW13bW50amtramdramdpZV9dWlRYUUVTTD9e + U0ppXVVuYV5tX11jX1diXlZlW1dnXFhkXV1iW1tkXV1pYmJpZW5qZ29iX15iX15vamtybW5taGlv + amttcHdwdHp5d3p0cnVyZWllWl1iXWFpZGh0a3V3bnh3bXNwZ21oYWNrZGdvZ3NwaHRyam1waWtw + a2pybWtrZ1tkX1RhV01iWE5hV05hV05hVFRiVVVoXF9tYWRyZ29wZW5vYmJpXFxoWlxiVFZiT09i + T09fUVRfUVRdUVNjV1hqWFFrWlNtW1VqWFNnWlVhVE9hVFFhVFFkVU5qW1RtX11rXlxwXFpqVlRj + UEdiT0ZlU1BvXFppXltuY195ZWV6Z2d4ZV9yX1p1Ylx+amR+b3SCc3iDbnN/am93ZWd1ZGVzZGdw + YmR1Y2l5Z214Y2h3YmdvZGN1aml+cnN9cHJ7Ylt3XVZuW1RzX1h5aGl7amt4ZF1yXldtXFtuXVxz + XFd1Xlp4WlRzVU9fVVFlW1duX2J5am17aGh6Z2dzV0drUEBtVEd0W057WFZ/XFpkV1dkV1dpWFVo + V1RoV1RlVVFhV05fVk1eU0pfVExeVUxiWE9jWFdoXVxlWlthVVZeUU9eUU9kVU5nV1BoW1tqXV1l + Xl5jXFxnXl1eVlVeTEZdSkVVUEZVUEZXUUpbVU5lW1ppXl1qXl9kWFpfWFhbVFReWFZjXVtlX11j + XVtnWldiVVNnV1BqW1RqXV1rXl5rY2p0a3Nyb3Nyb3NtaGlqZWdpZGVoY2RlXVdnXlhlYWJzbm97 + cHuAdYB6dH19d399dXp9dXqCeHt1a293b293b293c29wbWloYl1bVVBUSkBUSkBXVExnY1tkZV5t + bmdqYl5nXltjWFVuY19zcnl4d351dHlvbnNza25uZ2lqY2VjXF5hYWNnZ2lwaHJ5cHpyb3BqaGlk + XFZcVE5QTEBQTEBhVFFtX11zaWpwZ2hvZ2VuZWRraWppZ2hrZGdvaGpva3RybndvaGpqY2VrZWNy + a2l1bnB1bnBvaGhvaGhraWplY2RiWlRaUUxfVVRoXVxpX2VwZ21tZGFoX1xnW1xlWlthWlpjXFxo + XF9qXmJqYWdtY2ltYWRuYmVybXBwa29vaG1waW50bXJ4cHV5dHV1cHJuYmVhVVheXF1pZ2h7bnt7 + bnt3aG1rXWJkWF5lWl9qX2hoXWVpXWFtYWRuZ2l1bnB0aWNuY11eW0lYVURbUUdbUUdfU05hVE9l + VFprWl9oXmJnXWFoV1ZkVFNkVFNfT05iUEpkU01kVFVkVFVlU1NpVlZrW1pwX150Y19tXFhqXVtj + VlRkUVFoVVVuWldtWFZuWlpwXFxyXlhrWFNeU0dhVUlkVU5tXVZrY19vZ2N5aGl4Z2h3ZWd4Z2h6 + Z2mCbnB/c3l+cnh/a2t1YmJtW1RpV1BtXmFyY2VzZ2p3am53ZWd0Y2RtY2lzaW96bXV5a3R3Z15z + Y1twX1x0Y194ZV91Y110W1ZwV1NtWFZrV1VzWFV3XFhzWFhyV1dnVU9uXFZ0X2d/anJ+am14ZGdz + WkxuVUdyWFRzWlV6V1OAXVhrWl9vXWNwX1xuXVpuYWFrXl5lWFRqXVhoXFRkWFBjWlBkW1FfWFtl + XmFjXGFkXWJlUU9iTkxfTkViUEdqV1BuW1RlXVdkXFZnXl1iWlhiTkxkUE5eV01eV01iWlZhWFVl + W1plW1pkXV1iW1teW1dfXFhlXVppYV1nX19nX19uYV5nWldoXFRqXlZpXV5pXV5oXmJwZ2p1bnB3 + b3Jvamlwa2p3amt0aGluX2RoWl5jXFxrZGR3bXN9c3l3c3t1cnp5dXt5dXt7eXh5d3V4dXl5d3p7 + dX5zbXVnYmNaVVZXTkVXTkVXWE9naF5tbWpycm9nZGhnZGhkW2FwZ214dH97eIN1cnhwbXNraG5o + ZGpnZGVlY2RfXGJoZGpycHpwb3lpZGViXV5hWl5kXWJXTk9eVVZrYmVzaW14bnJ1a29rZWNpY2Fj + Y2NkZGRtaGt0b3N0b3Bwa21pXV5oXF1pZGVzbm91cHJ1cHJza2tvaGhtaGluaWpuY19uY19rY2Jr + Y2JwZGh1aW13a2hyZ2NuY2JtYmFnX2JjXF5lXVxjW1ppW19pW19tW2NyX2htaGtzbnJzbm9wa21w + a291cHR6b3h4bXVvYWNlV1piW19qY2h3a3d1anVvXl1iUVBeU0phVU1kWlZnXFhiW11qY2VoZG1t + aXJ3b29waWlpZV1WU0paUEdkW1FnWldiVVNeVFNnXFtkW15eVVhjVlZlWFhoXVxnXFtrXlxrXlxn + W1xlWltrV1xvW19qXF5wYmR1Z2lzZGdwYmRjVVdlU01kUUxqVlZuWlptWFtwXF5uV1FoUUxeUENf + UURjUUVrWk1zXl56ZWV7aGh7aGh7Z2d7Z2d+b3eAcnl5bXByZWlyW1NpU0plT0lpU01tXmF1Z2l3 + a2p1amlyX1hzYVp0aGt3am55bW53amtwZV9rYVtrW1puXVxzXFZuV1FtVUpuVkxrWFNtWlR0W1Z1 + XFdzX1pwXVdrV1VvW1h0Ymh+a3J9bWV5aWJ4YVhwWlFyWlh4X15/ZF+AZWFtXWdzY210am50am50 + a2pvZ2V0ZFxyYlptYVhqXlZnYVpnYVphW1hnYV5pYmJqY2NoVk1iUEdjTkBlUENoWFBpWlFuXlZt + XVVqXlVlWlBqV1BtWlNrXlptX1tuXldqW1RlWFZlWFZdVlZfWFhbU1FdVVRjWltqYWJuZGhvZWlr + YV1jWFVjXVtkXlxlXF9pX2NuYmVvY2d3bW53bW5yb3Byb3B6bnJ3am5vZ2VpYV9vYmJuYWFqY2V1 + bnB1cHR4c3d4d3t3dXp6dXl4c3d4c3d/en6Ad310anBiXVxaVVRYT1BcU1RiYWVycHV5c3tzbXVn + X2RiW19oYWN1bnB6cnB5cG9wa21uaWppa21oamtlZGliYWVfXmNlZGlzbXNwanBoYWFhWlpeV1pf + WFtWT09lXl50b3N0b3N0cHdtaW9oZF5oZF5cX1pcX1ppZWtwbXNya3JtZ21iW1tnX19qaXB3dX16 + eX51dHl0b3BtaGltZWhza25tZWhvaGpybW5rZ2hqYmFqYmFwaWtyam1wamhvaWdoZWRjYV9fXVFb + WE1fVU9lW1VnW15qXmJvZ250a3Ntam5raW1yamp4cHB3b3J0bW9vZWdpX2FoYWNoYWNwZ21wZ21t + XVVtXVVrXFVoWFFjWltlXF1jYWRoZWlpZWtuanB0b3B0b3BwZWJiV1RfWlNnYVprXlpqXVheWFFj + XVZkXFtkXFtnWldpXFppXltqX1xtYWRtYWRtXmFlV1plV1poWlxoWmFvYWh3amt5bW51ZGVkVFVl + U01iT0ljUFBoVVVqW1NrXFRpV1FnVU9jUUVeTUBjU0ZtXE93Ymd+aW59anB9anB7ZWp7ZWp+bnh6 + anR0Y19rW1djWEdhVkVnV1BwYVp3ZWd5aGl0Z2dzZWVzXmN0X2R1Z2l1Z2l5Z2pyX2NoWFBnV09v + XFZ4ZF55Ylx3X1p1XlZ1XlZ1W1t3XFxyXmF0YWN6ZWN3Yl9zW05wWExrYVtzaGJ1aV90aF54Y2Ny + XV11XVx7Y2J9ZGh7Y2dqXGFyY2hvbXByb3N4bnJ0am5wY2FuYV5oZF5oZF5lZF5kY11nY11nY11t + ZGNyaWhyYV9tXFtoVk9pV1BpXlhwZV94ZGR3Y2NwZFttYVduY11zaGJwZ21yaG53Y2VzX2JuXV5r + W1xlWFhdUFBeTUdeTUdkVlhtXmFwZGhwZGhnX19aU1NfVVFkWlZkW1xnXV5oYWFuZ2d1bnB3b3Jz + cG90cnB1bnB1bnBwa21rZ2htX1tqXVhiXV5rZ2hyam96c3h6cn54b3tzbXNvaW90cHl7eIB4dXlw + bnJnXWFaUFRbVldfW1xrbXV1d391bXRoX2dcVlRdV1VjYV9qaGdwaWlyampqZWdnYmNoYmhoYmhi + Y2tiY2tlZGlpaG1yam1tZWhjXVtfWldhVlNiV1RYW1xoamtycHhwb3duZGVnXV5fXlheXVdhXFte + WlhrZW51b3hyam9nX2RfXV5pZ2hra3h3d4N5en5wcnVqampkZGRpX2NtY2dfXltlZGFra2tycnJt + bmlpamVrY19uZWJua21ua21tamtpZ2huZWJkXFhfVVFfVVFfWFhiW1trZGdtZWhuaW1wa29zaW1w + Z2puZ2tuZ2tqZWdoY2RnX2JkXV9pX2FtY2RzY1x0ZF11Y110YlxnX19lXl5kX15pZGNtZWhyam1z + a3B1bnNyaGlpX2FnYmFrZ2VwYmRqXF5fW1pfW1plXF1kW1xoWFFpWlNrW1ptXFtuWmFyXWR0X2Rt + WF1jVVdfUVRjVVppW190a3V1bXd5ZWVtWlpkU0RhT0BdSkRdSkRlVERnVUVoWkxlV0lkUD5nU0Bo + W1t1aGh5bXB5bXB1ZGV3ZWd1Y2t3ZG19anB5Z21yYlttXVZnXFZoXVdrXV9wYmR3ZGh4ZWlyYV1w + X1xvYl9zZWN1aml1amlzYl5pWFVlU0lnVEpvW1h6ZWN9ZWF7ZF97Ylt9Y1x6YmV+ZWl1aGVzZWN5 + Z2F1Y110XlNyXFBrW1dtXFh1Ylt3Y1x4X150XFt1YWF9aGh9ZGV5YWJqXmJwZGh0bXJ1bnN1a3Jv + ZWtrYV9pXl1lXmFpYmRrZ2htaGlvY2dvY2d3ZGp0YmhzZ2pzZ2pvY2RyZWd3amt5bW57cGp3a2Vw + ZV9tYlxtaWVybmp0a3N1bXR6cnB3bm10YmhuXGJuWlppVVVfTkheTUdoV1RyYV1yZWttYWdpVlhl + U1VXT0laUUxdV1VhW1hkWlhuY2JuaG51b3V0cnN3dHV1cHR4c3d4c3dwa29vZGNpXl1iXWFtaGt0 + c313dX+Ac3t+cHlza3BuZ2t3bnh+dX95cnJza2tiW1tUTU1XV1pdXV9vbnNycHVwZV9nXFZXT0lX + T0lcV1hiXV5nZ2doaGhuZ2loYWNdVlhfWFtfX2JeXmFlY2dqaGtua2poZWRqY1pjXFNeVlBcVE5Y + W1xkZ2hwanNuaHBtZGNpYV9dXlpbXFdjXl1qZWRua29tam5uY19jWFVeWlhrZ2Vzcnl0c3p3a3Rr + YWloXF9nW15hV11iWF5aVlNeW1dtY2d1a29wbnJvbXBrZV5oYltraHBuanNya3J1b3Vza25rZGdo + X15iWlheVFBfVVFjXl9nYmNqZ21pZWttaGlqZWdrZGdtZWhrYmNoXl9nXFtpXl1pX2NqYWRtaGly + bW57Z255ZGt3aWdzZWNqYl5oX1xnWldlWFZkYmVkYmVnYmNnYmNtZWhvaGp1ZGNrW1phWlpfWFhi + WlhfV1ZkV1NnWlVvW191YWV7ZWp/aW56ZGtvWmFlU1BjUE5oVlpzYWR3bnV1bXR5ZWhwXV9vVk9r + U0xeTENjUEdqWE9vXVRuXlRtXVNrWlBuXFNzYWd4ZWt5Z2pyX2NpWlNpWlNoW1ttX194Y2V3YmRu + XldrXFVuXV5zYmNyZWlvY2dzX2JzX2J0YVd3Y1p6Z2l6Z2l5am9zZGl1X1RvWk5qU0hpUUdpWFVv + Xlt4Y2F5ZGJ6aGJ9amR+aW59aG16Z2d7aGh7Z2d4Y2N1XlhvWFNtU0xwVk9wXFpzXlx4ZF55ZV+A + aGl+ZWd5YWJ3Xl9wXmR3ZGp5bnl1anVuZGVpX2FeVlVdVVRcVVVkXV1oYWNqY2VqYWdpX2VyYmtt + XWdrZGdwaWt1Z256a3N9c3d+dHh3c29ybmpwZV9uY11uZWR0a2p5bnd7cHl4dXdyb3B0aGttYWRu + YWFlWFhlVE1nVU5rYV9rYV9uaWpqZWdvXl1rW1phUE1jU09jWltkW1xkW2FnXWNpZW5wbXVyc3d0 + dXl3cHt4cn10c3pta3NtYmFoXVxkXV9oYWNub3N3eHt5d3p3dHhraW1pZ2pwbXV4dH1yb3Byb3Bq + YmFnXl1kWFxkWFx0aGt0aGtnX1ViW1BcUU5cUU5cW1dpaGRyb25yb25raWhpZ2VjXl9hXF1hWlxj + XF5qYWRzaW14cHNza25zamdqYl5rXFVoWFFdWFplYWJvaGpuZ2lyaWhuZWRnY19iXltiW11nX2Jr + Z2hvamtuaGVrZWNhXFtnYmF1bXR4b3dwaWtqY2VqXVtqXVtiWlhcVFNbUE1fVVFpYmR0bW91b3h0 + bnduaGNkXlpoXGJtYWdzbXV5c3twcHNtbW9rZGdkXV9fT0xjU09fW1xiXV5lYWRoY2dkYmVlY2do + Yl9oYl9rXl5tX19qXVtrXlxoXF1tYWJraHB5dX59dYR5coB1a29zaW1qX15nXFtnV09kVU1pWFdl + VVRnXFhrYV1wZGVyZWd0X11tWFZpXVVfVExeU0pjV09lWlFoXFRrX2NwZGh4aW56a3B7YWV4XWJu + W1VpVlBrXl54amp5cHh1bXR7aGh1YmJqYVZlXFFdU09iV1RtYmF4bWt4bWd1amRyYltvX1hwYmRt + XmFuW1RpVk9jVUdlV0lnVldtXF1yZGJyZGJ1XVx1XVxrYmVwZ2pyY2VzZGdyZF9yZF95Z2F6aGJ7 + b3N5bXB+aWt0X2JpWlFoWFBpUUdpUUdrW1dwX1x3ZF55Z2F+ZWd+ZWd+ZG1+ZG1+ZGp9Y2l1YWV0 + X2R6YV10W1dwVlNvVVFtWlp0YWF+amh/a2mCbW1/amp4XV1zWFhuX2JyY2V1anhvZHJqX15lW1pe + TElaR0VcTEplVVRnU1NnU1NnVldlVVZnW1xkWFpjXVtnYV5tZWVwaWl1bnB4cHN3cnB1cG90Z2Rr + XlxqYWJwZ2h4bnR7cnh4dH1zb3hwbm9qaGlrZGllXmNoXlVuZFtwYmRvYWNtbWpqamhuZV9pYVto + XFNpXVRjX2VkYWdiYWVoZ2toZ25ta3Nwcnh1d317c3p4b3d0b3NuaW1nXV5kW1xpXFpvYl9ya3J4 + cnhzdXducHJqZGpoYmhta3Nwb3dvdHV0eXp1dXNycm9oZ2FcW1VkXV9lXmFnZV9eXVdlWltiVldo + Y2d1cHR1dXV0dHRwbnJqaGtiYWVjYmdjYl5kY19nY2lwbXN9eIh5dIR1dXhtbW9uaGNnYVxbV1Fh + XVduYmNzZ2hwa2ptaGdoaWJiY1xfWFtiW11qaGlyb3BvbnNqaW5kYV1lYl50anB3bXNtamloZWRu + Y11uY11iW1BcVUpbU01eVlBkYmVua29zbXV1b3h5bmhqX1piVVBnWlVwaW54cHVzcnlwb3dvZWto + XmRjVlRbTkxbVlVdWFdhXF1nYmNoXmJnXWFoW1hnWldrXl5uYWFpYmJtZWVqYWRrYmVtaXR1cn15 + dIN1cH91aHVwY3BuWl5lUVZkU0lkU0lpV1FnVU9kVFBtXFhwXmJzYWR3Y2F1Yl9qW1RjVE1jVE1h + UUpiWlRjW1VpXWFuYmV3amt5bW50Y19vXltrX1doXFRyXmF7aGp9cHR5bXB6Z2d6Z2d1ZFdqWk1j + VVpoWl50Ymh7aW9/a25+am13Z19zY1x1ZGVvXl9tW1FlVEphUUdiU0hoVFtyXWR1YWV3Ymd1YWV0 + X2RzZGl0ZWp5aGd5aGdzaGRzaGR6a3B+b3R9cHJ7b3B+Z2JyW1ZpVVNtWFZrVkpqVUlqVlZvW1t1 + ZGN6aWh/amh+aWd+ZG2CaHB/aW53YWVwXV91YmRzX19uW1tzW1p1XVx0ZF16amN/amqCbW2DamuC + aWp7YVp3XFVnYV5oYl9uZW1rY2poWlxhU1VcSkVWRT9YRkRdSkhYTElcT01YTkpXTUlXTkVdVEpe + UFViVFhkXlpoYl1rZGduZ2l0b3B4c3R1a21wZ2hqYmFoX15zZ211aW94cnh3cHd3b3Jyam1nY2lo + ZGpuYmVvY2dzZGdzZGdvbWttaml0aF9uYlpjW1dkXFhlYWJpZGVnZ2dpaWlvam5wa29va3R4dH16 + dXl0b3NraGJoZF5lXVxoX15qZ2Nva2h0bnR3cHdvb3Jqam1pZGVlYWJqZGptZ21ub3h1d397eoJ7 + eoJ7cnNtY2RcVVVqY2Nqa2dqa2dpY15kXlpkYWl0cHl4eHp7e354c3dwa29nZWpta3BqamppaWll + aXJydX56eod7e4h+fYdycHpwbm9vbW5eXVVYV09rYV94bWt1cHR3cnVvb21jY2FfXFZfXFZqZWd4 + c3Rzcnlta3NkYmVkYmVvZWl0am5nZ2Rra2lyam1waWtvY2RpXV5pX2NoXmJnYWtwanVzcnd1dHl1 + a29lXF9dU1FiV1ZuZGp3bXNzb3hybndwZ21pX2VoW1tkV1diXFdkXlplY2JjYV9oYWFnX19rY2Jq + YmFuYmN0aGlwa290b3NybXBybXB4b3t4b3t3c350cHtyaGtoXmJkVlhiVFZlW1pqX15qX1xoXVpl + VVRqWlhzXmh6ZW96a3N5anJ3Z1xyYlduXlRvX1VyZF9qXVhpXl1vZGN4ZWt4ZWtuYVxoW1ZnXFZl + W1VvXl95aGl5bmp5bmp6a25zZGd0X11vW1hwW190XmN3Y3B7aHWDbXKCa3B7amd6aWV6ZWpwXGFz + WlZuVVFqV1BwXVZ0Ymh5Z216ZW14Y2p0Z2RzZWN0aG51aW95ZGt4Y2pyZGR1aGh6aG6AbnR9cHJ9 + cHKGaWt6XmF0VlN0VlNtV0xrVkptVVh0XF95ZGt/anJ9aWN6Z2F9Z2t7ZWp6ZWV1YWFvW11zXmF0 + X2R0X2R1Yl94ZGJ5ZVx6Z116YmWDam6DamuDamuCaGN5X1tnXFtnXFtrXV9uX2JpXFxkV1ddUE5Y + TElbSEZdSkhXSEBYSUFVT01RTElUTkdYU0xfVFVjV1hjXF5kXV9nXWFnXWFtam5wbnJ3bW51a21w + ZWRrYV9qYl5vZ2N3cnN1cHJ5bXN3anBqYmtqYmtpYmdoYWVoX15uZWRvbW5wbm93a2pvZGNiX2Fd + W1xkW15pX2NnZGNlY2Jvamt1cHJ1c3d3dHh3c3lybnRzbm9uaWpjXFxqY2Nua29wbnJ1dHl0c3h0 + bnRrZWtkYmNiX2FlXl5qY2Nqa29zdHh5eIJ9e4Z/dH1zaHBnX2Jza25wbm9vbW5waGdqYmFkZGdy + cnR4d359e4N7cnh1a3JoZ2tubXJta3Nta3NqbXlwc391dYZ5eYl+fYd6eYN3dHh1c3doX15hWFdr + Y29+dYJ6d4JybnlpaWlkZGRYWE1VVUljX1x0cG16c4JyanloZG1hXWVqXmJvY2dpanBvcHdvbXBw + bnJ0a2hvZ2NuZGVwZ2hlYWRwa29wdHptcHduaWhhXFtnXFtqX15vYm14anVzbnJuaW1uZ2drZGRq + YmFqYmFrZ2VpZGNpZGVpZGVpZGVpZGVtaGdtaGd0ZWp3aG1zaHV1anh3b3R1bnN0aXJ1anN5b3N5 + b3NvaWJiXFVeVFNhVlVqYWRuZGhrYmNqYWJqXV1oW1tyXmt4ZHJ5a3R9b3h7cmR1a151ZGF5aGR5 + a2tyZGRuXGJ1Y2l6bnJ3am5yYWJqWltoW1tpXFxuYmV1aW15b3B4bm95am1zZGdyXWJyXWJ4Ymd4 + Ymd6a3N9bnWCbm6Cbm6Ca3B9Z2t6aGt0YmV1XlpzXFdzX2J7aGp7b3B5bW54ZGR1YmJzZGdzZGd1 + Z2t3aG15ZGl4Y2h3YWV4Ymd3aG96a3N9bXd6anR+X1x5W1dzVU90VlBtVlBuV1FvVVV1W1t3Y2V/ + a259aWd5ZWN6ZW15ZGt3Y2F1Yl9zW1puVlVyV1NzWFRyWlh3Xl14YVt5Ylx3Y2F+amiCbnB+am19 + Y1h5X1VjT1ZjT1ZlVFppV11nXlthWFVoV1RqWlZnU1BjT01cTkBYSj1USj5RSDxVTD9cU0ZeVFNh + VlVeV1diW1tiWlhnXl1qZWltaGt3bXB4bnJyaGluZGVvZF5vZF5yam1za25/aXV9Z3NvYmJtX19k + XV1jXFxhXFFhXFFnZ2dubm53bXBwZ2piX2FbWFpfWFtjXF5lYWJkX2Fyam9za3BycHpzcntycnRu + bnB1bnBza25nYmFqZWRraW1vbXBzcndzcndyaXBqYmliXV5bVldbVVNdV1VhYWFubm5yc3d1d3p/ + d4N5cH1qZWlzbnJ4dXl4dXl1bnBza25paWtycnR3dX16eYB/eH13b3Rrbm1ucG9ybndraHBuanNz + b3hwcIB3d4d9eoh5d4R5dXt4dHpzZGluX2RubXd3dX90dX5qa3RpZ2ViX15YVU1XVExkZGdwcHNu + bnBoaGplY2dbWFxjW1dtZGFwcH50dIJubXRubXRwaWt1bnBzanRvZ3BqYmluZW1oZ2tkY2htYl5u + Y194a293am5uZGhwZ2prZGlpYmdrZGdvaGpqaWVta2hraWpraWptY2dvZWlyY2V1Z2ltamtyb3B5 + bXBzZ2pvZG1zaHB0b3Bzbm93bXByaGt1a293bXBwaWlkXV1hVlNoXVpzZ2h1aWp0aGluYmNuYWFv + YmJrXWRzZGt3a3d6b3p+dHV3bW53aGp3aGp7b3N6bnJ6aG59anB+cnV3am5zX19rWFhqWFxqWFxq + XWV0Z291a214bm96aWh1ZGNvYWNvYWN0Y2R0Y2R+am2Db3KDb3KCbnB7amt5aGl5ZWNzX11wX1x0 + Y195bXN9cHd6bm91aWp1XlpuV1NrWFtuW114XmR5X2V0YWNvXF5vWl5yXGFwY253aXR7bXJ9bnN/ + ZVt+ZFp5ZV93Y11tXVNtXVNzV1p4XF55Y2h/aW57aml5aGd7ZWp5Y2h+Y2V3XF51WE9wVEppUExv + VlFzV1d4XFx0Ylx0Ylx3Y2F+amh/a255ZWh6YVR3XVBtX2hiVV1oVlpnVVhlX1hoYltuZV9vZ2Fo + YVdkXVRiVk1fVEpYTj9aT0BfVExjV09kV1dlWFhkWFplWltpV1tuXF9nXFttYmFybXB4c3d1cHJy + bW5yaGlyaGlyam13b3J/anR7Z3ByZF9qXVhfXVBaV0peUVFeUVFlXF9zaW17b3N4a29qYWJlXF1k + W15kW15eXF9lY2duaW1vam5ranJvbnVuanBqZ21vZWlwZ2puZ2duZ2dvZ251bXRyc3tvcHlwbm9q + aGlkX1VhXFFbWE1aV0xdV1BjXVZqYml0a3N1dHtubXRnY2lraG53dX13dX10b3N0b3NwanB0bnR7 + dYCCe4d9eX93c3lta3Bwb3RwbXVtaXJram9qaW5rbnpvcn51d310dXt5dX55dX5wZ21yaG54b3t9 + dIB0c3pqaXBtaWVkYV1VVlFdXlpvbXB3dHhpZ2hjYWJpYmRfWFtkYmNraWpzeINwdYBzanJuZW10 + aXR6b3p3aG1tXmNlV1pkVlhjVVpnWF1uY2t1anN4bXV4bXVyam1nX2JpX2NoXmJpX2NyaGtybW5y + bW5wa21rZ2hrYmVoXmJqYWRzaW11anN3a3R0am5wZ2puZGpvZWtyb3NqaGtoZWdqaGlranJqaXBq + Z21iXmRnYV5rZWNza25za25yY2VwYmRvYl9tX11tXF1tXF1yXmt6Z3R5bnd1anN5ZGt5ZGt1a295 + b3N4bnJ3bXB9bXd6anR5ZWhtWlxoXVpoXVpnWFtuX2Jtamtwbm90aWVtYl5rY2JuZWR0Z2dzZWV5 + Z2p9am6Aa3B9aG15ZWN3Y2F0X19zXl5zXmN5ZGl5bnt9cn99am53ZGhvXFVkUUpqUVdtVFpzVl10 + V150XFtzW1ppWFpqWltqWF5yX2V4Y2p+aXCAam+EbnN+c294bWlyYVRqWk1qV1FuW1VwX15yYV9z + YmNwX2F0XmN5Y2h9aWN4ZF54XlB0W01uV0ZqVENyVFF6XFp0Ylx3ZF55XmF9YmR7Z2R4Y2F0XFFu + VkxqZWlhXF9rWFhqV1drXlxvYl9uaGVtZ2RtZF5oX1pkV1NnWlVlVEppV05iWlRkXFZqXmJoXF9k + W15lXF9vXWFqWFxiV1FkWlRkZGRubm51bnB0bW9ybXBwa29za3B3b3R7bnd5a3RzaGRuY19jXVZe + WFFcVVVcVVVkWFBuYlpyY2V0ZWhuZWJqYl5oYWFoYWFoY2RtaGlvaG1uZ2tuaWpuaWpzZ210aG5y + Z29zaHByZWlyZWlrZW50bnd0cHtva3d3bXB3bXBwZ2puZGhoXVpdU09fTkdhT0hjXGFyam93b3J1 + bnBvamtwa210cHt1cn1yb3Nyb3Nva3J3c3mAeoOCe4R5c3lya3JtZG5vZ3BubXJqaW5ta3BqaW5p + am5wcnVucnVvc3dzd31ucnhtaW9va3Jzb3p6d4JvbW5qaGlnX19pYmJnX2Jyam1wcnhzdHppYmJc + VVVhVVhhVVhoYmhya3JwdHpydXt0anBwZ210c315eIJ9aWtvXF5oW1hkV1ViVlpoXF9uZW13bnV1 + bXR1bXRyaGlpX2FlXGJnXWNpYmduZ2tzbnJwa29waWtqY2VqYWRrYmVpY2lwanBuZ2tuZ2tyam1y + am1raWpraWpwa29taGtrYmVtY2dtYm1vZG9pYmdpYmdoYWFqY2NyaGt1a293ZWRyYV9yYV9wX15v + XFxoVVVqXmR3anB3a3d0aXR4ZWt4ZWt1anN6b3h3bm1zaml1a3J0anB5Z21vXWNoV1RkVFBqWlty + YWJ0b3N0b3N6aWhzYmFzXWJ4Ymd1Z2l1Z2l5bW54a215am16a257Z2d3YmJ1XlpyW1ZrXl5wY2N4 + anN6bXV4ZGdyXmFlU0lfTURiTk5kUFBnU1dtWF1wWFdwWFdrVU9qVE5lWlBlWlBwXmR4ZWt+bnqC + cn6DcnN6aWp1XFdqUU1yVFB3WFVyXVt1YV5zX19vXFxyX2N1Y2d0Z2d5a2t6Z194ZF11X1BwW0xv + WFN3X1p9ZV19ZV2AYl97XVt+Y157YVxuVkxqU0hlYWJjXl9pXV5pXV5oXmJpX2NpY2FlX11lW1Vl + W1VjVlFlWFRlWlBqXlVtXVZtXVZtXF1qWltnW15tYWRpX2FpX2FeWk9dWE5fW1xpZGVwaWlyampw + Z2p0am51a290am51bXd4b3l4bnJwZ2pqYWRpX2NkWFpjV1hjWElnXE1vX1dyYlpwZWJyZ2N0Z2R4 + amhybW5wa21yZG1yZG1wZGVyZWdyaG50anByaXVyaXVzYWdvXWNpZGhybXBvaXJuaHB4aHJ6anR0 + a3h3bnpwa29oY2diU0xhUUpfW1xqZWdzZ2hzZ2hwaWtyam1vbnNubXJwbXNzb3V4b3d9dHt/e4J9 + eX9zc3Vqam1tZWhyam1tbnJoaW1taW9uanBpaWtpaWtqaW5ubXJzb3puanVraG5qZ21ranJ1dHtq + aGdhXl1tY2RzaWptamtyb3BudXNudXNrY19cVFBfT1BqWlttZWp0bXJ1b3V3cHd3a3d0aXR4d354 + d355bW5yZWdtX1trXlpjWltoXl9oZGFva2hwaW5waW5pZGVlYWJkXGVjW2RjWl9tY2lwaWtvaGpr + ZGdqY2VrYmVqYWRpX2NtY2dqYWJqYWJzZGl1Z2tyaGtwZ2puZGhqYWRtYWRvY2dtX2huYWltY2dq + YWRtYWRtYWR1aW93anBzZ2huYmNrY19tZGFqWlhiUVBlWGFzZW54bXh3a3d4ZWl7aW17cH57cH54 + bWtwZWRyY2hzZGlzZ2puYmVvW1tpVVVkXWJrZGlwanNzbXV4Y2huWl5yWF56YWd4a210aGl4a294 + a296a3N6a3N6aGtwXmJyW1ZzXFdvXFxuW1t0Ymp6aHB4X15vV1ZnTkdiSUNiSkloUE9uWF14Ymdw + XV1vXFxtWlNpVk9rVU1qVExtW2F0Ymh7bXR/cHiAa256ZWh4XV93XF57XVt9Xlx1XV55YWJ0X190 + X190YWN0YWN4ZWl1Y2d4ZGR4ZGR1YltzX1h1XFdzWlV6Y159ZWF6X2J4XV94Xld0W1RqUUVlTUBj + V1tkWFxkWlZkWlZpV1tkU1ZdVEpdVEpdUUleU0piUU5iUU5hVE9nWlVrWFttWlxlWFhlWFhrV2F1 + YWpoZWRlY2JnXlhiWlRfV1ZiWlhqY2VtZWhramdramdza2tza2twZXB0aXR5a3d0Z3JtZWhrZGdt + YWJoXF1oWFFtXVZyYWJ4Z2h1Z2l6a255b3N5b3N4cHVza3BqY2VpYmRvaGp1bnBzb3hzb3h0bnlw + anVoXl9pX2FpYmRuZ2lpZGVqZWduanBwbXNua290cnV0cHtraHNpVVxiTlVjW1ppYV9taGdqZWRp + YWhqYmlpZW5uanNyanlyanlzand3bnp5eIJ4d4B7d3pvam5oY2RpZGVnZWpnZWpraWptamtuZGVr + YmNrYmVyaGtubXRpaG9tZWpvaG1ubnBvb3Jqam1kZGdvZG93a3dzcntubXd0dX5vcHllX1hbVU5l + X1hvaWJraG5raG54bXh5bnl3bnhzanRycHV0c3h5cnR4cHNybmplYl5iWlRkXFZrZ1xtaF1tZF5n + XlhjX1piXlheU1RbT1BXUVdlX2VuY2tvZG1rY11lXVdjXVhkXlpoXF9pXWFnX19qY2NzZ2pyZWlq + X2hoXWVoX2lrY21yZWlyZWluX2RpW19qXl9oXF1nWF1tXmNyY2p3aG9uY2tvZG1taGtpZGhoXVxd + U1FdV1BoYlt0bW91bnB4bXp5bnt9c4d9c4d6a251Z2lyY2hvYWVwZGhtYWRtXmFqXF5qXmR0aG57 + a3h6and4Y2hqVltuWF13YWV0amt5b3CCc3p9bnV/bXN+a3J5a2tzZWVyXlhoVU9oW1hoW1hwXGN4 + Y2p1Y11uXFZuV1FpU01wVVV0WFh0Ymp9anN7bXJ0ZWpwXVtwXVtvV1hqU1RqVlhwXF5zYWd9anB/ + am16ZWh1YmR6Z2mAaGd/Z2V6X2J4XV9zV1dyVlZzW1xzW1xyXV1yXV11Xlp4YVx1Y110Ylx3X1d1 + XlZ5Yl14YVx5XmNwVltyVE5wU01rTUFtTkNhUFFkVFVlVVRlVVRpWFVkVFBdUUlcUEhdTkdcTUZe + Tk9hUFFiUVNkVFVqWlZqWlZqXV1pXFxtXmF0ZWhwbXVraHB0Y19vXltiVk5fVExiWlZlXVpqZ15r + aF9rY11pYVtuXGJyX2VwZGpwZGppZ2ppZ2prYmhrYmhzZ215bXN4bXV5bnd6cHd4bnR1bXR1bXR3 + bnh0a3VrZ2huaWpwa2p1cG90cnNwbm9tZWpqY2hoYWNoYWNoXmJnXWFqY2VqY2VraWpwbm9ua21w + bm9zc3VwcHNrZWFoYl1qZWdrZ2hqaGlpZ2hnX2JoYWNoY2duaW1uZW9qYmtnYmNuaWp0c3pzcnl6 + c3Vza25tZ2RkXlxhX2RlZGlraWpqaGlyaWVtZGFyZ2V3a2pwcHBvb29uZGp0anBybnd0cHl1bnN0 + bXJ4bXh3a3dzb3hwbXV4d4B0c31nY11kYVtzbnJ3cnV1cnpybnd4b3l9dH51b3VzbXNybnd3c3t6 + dH17dX53cnBkX15tX111aGVyaWhuZWRpZFpkX1VeVlBdVU9iVFhiVFhdVFVkW1xuZ2dyampwZV9r + YVtpXlhnXFZjWFdnXFtiX2NraW1rZ2plYWRhXVpiXltnX2RrZGltY2drYmVkXFhiWlZlXFNkW1Fo + Wl5wYmd5Y295Y29waWlwaWlzbm1uaWhpWFViUU5kXFhrY190a3V1bXd4bXp4bXp6bn94a317Z25z + XmVuXF9vXWFrYmVpX2NuY19qX1xtXF11ZGV4a293am5yXVtoVFFtWFt0X2J1aW1/c3eEdH6AcHp7 + bXJ6a3B6aWh3ZWR0YWNuW11vXFxvXFxyXmF4ZGd9YmR3XF5yYV1zYl53YmR5ZGd0am56cHR9bnN4 + aW54Z2NwX1xuW1hnVFFoVFZrV1puX2d6a3N/am19aGp4ZGR7aGh7aGV4ZGJ4XFxwVVVqT1ZrUFdp + VVNoVFFqUFBrUVFvV1ZtVVRwWlFyW1NwWlRzXFZ3V110VVt4WFpuT1BrTUVtTkZvUEhyU0pfT05n + VlVnWF9nWF9jWltfVldeU0pdUUlbUUVcU0ZhUE1kVFBnVlVlVVRnXVRtY1puYWFvYmJqYWRyaGt3 + bnh3bnh1Z2ltXmFhWFVeVlNjW1dqYl5wZ2hwZ2hrYV9rYV9uXFZtW1VrXlxuYV5iX15fXVxjXF5p + YmR6bXWAc3t7c3p5cHh3b3JuZ2lyZ3R0aXd1a3t3bX1zbnJzbnJzcG9zcG9zbWVqZF1kXlxkXlxn + XWFpX2NpYV9jW1ptYWJwZGVybW50b3BzbnJ0b3N1bXR3bnVqampvb290b3B0b3B0c21ramRkYVtu + amRvaGh0bW1lY2diX2NjYV9nZGNuaHB3cHl6cnt4b3lyam9rZGljYmliYWhoZGpuanBuaGNrZWF1 + aWp3amt0cG1ybmpwZ21zaW9ya3d5c354b3d5cHh+coN6bn93cHt3cHt3dX90c31uaGVuaGV6d394 + dH15dYB0cHt5bnt5bntzaHN0aXR0bW95cnR5d3p1c3dzamltZGN1anN9cnp9dIB1bXlqaGlkYmNq + XVtkV1VlWFZjVlRiV1RoXVpyb3N4dXl5cG1zamdwX15tXFtnXFtrYV9pZWtuanBrX2NlWl1hWFdk + XFtrZGdqY2VqZWlnYmVjXVthW1hjV1hlWlttYWJvY2RyZGR0Z2dyam15cnR5c3lvaW9rW1pkVFNo + X15uZWRzanJ3bnV3bXN1a3J7cHl6b3h5Z2prWl1nVFRoVVVoW1tpXFxlXlVnX1ZkX2FpZGVzaHBu + Y2ttWldpVlRoVFhzXmN3b3R7dHmAdHp+cnh3bXN0anBwZ2hyaGl5a2tvYmJrXFRuXlZ0YWF4ZGR+ + Y2h7YWV1ZGF1ZGF1Y2d3ZGhyaG54bnR9anB3ZGp5ZWN1Yl9qXVhlWFRtWlprWFhvYWh4aXB6Z2R3 + Y2F1YmJ3Y2N6ZWN1YV5vWFNpU01iTlNjT1RkUVFnVFRlUU9qVlRvVVVvVVVuVUptVElvUU5yVFBw + UVNvUFF3VlFzU05lTUNlTUNtUERtUERhV1toXmJuZ2ttZWpnYmFjXl1iVVNcT01eU0piVk5uWmFw + XGNwY2NqXV1lXVprY19vY2RvY2RqY2VuZ2lqa3JtbnRwZ2pwZ2ppYV1hWFVjV1htYWJrZGdrZGdo + X1plXVdkWFBnW1NlWFRlWFRiXFpcVlRhXF1oY2Rzb3h3c3t6cHdzaW9tY2RtY2RwZ21yaG5vam50 + b3N1cHJ3cnN1dXVycnJuaGNoYl1pXl1rYV9nX19oYWFoYWFnX19rZ2Vwa2pybXBybXBzaW10am5z + bm93cnN7eH5+eoB7eXp5d3h4d3Bwb2lzc3V1dXh1c3RzcHJpZWtkYWdiXGJfWl9fXmNram9ycnJz + c3Nza3BvaG1hW2FdV11jX2VkYWduZGVuZGVtYWR3am51b3V3cHd1c3draW1taXR1cn1wb3lzcnt4 + d4Bzcntta3NjYml0a3V6cnt3b3R1bnN6dH14cnp1cnpybnd6bXV7bnd1cHRvam5ubm50dHR5c3l4 + cnhyam1waWt4b3t/d4OEeYJ6b3hybnRwbXNuZ2tpYmdqZG1oYmpiXmRqZ21zdHp1d31yb3BvbW5p + YV9oX15nX2JtZWhtaW9qZ21pXV5jV1hfVVRkWlhoZGFoZGFrYV1jWFVoVVVnVFRnUVhwW2JrY2Jt + ZGNuZ2dtZWVwbXh3c35ubnBkZGdnYV5pY2FzaW14bnJ3bnV1bXR3bnh1bXd6cn55cH15bW5wZGVp + WlNqW1RpXltrYV1zYVtwXlhrXV9wYmRzZGlwYmdrXlxnWldkV1dpXFxvamt0b3B3bXB0am5tY2dr + YmVuZGhzaW1yaGlqYWJtW1FqWE9tWFhzXl54ZWt4ZWt3ZWd1ZGVwY2NwY2N4ZWt7aW99Z2t5Y2h5 + YWJ1XV5rW1dqWlZyXV9wXF50Ymp1Y2t6Y154YVx1XFd1XFd3XVZyWFFkU0ZiUEReTE5jUFNqV1pr + WFtqVE9nUExnTUZnTUZlSENpTEZwTkxyT01yUU91VVN+W1Z5VlFyVUxrT0ZpSUVwUExqY2VtZWhz + aWpzaWp1Z2lyY2VrYV9lW1pnWlVwY15raW1qaGtyaGltY2RuYV5rXlxtWlpuW1toYl9rZWNoaGpq + am1qaW5paG1tYl5nXFhoW1hvYl9oYWFvaGhtZ19pY1xrXlpuYVxwYVprXFViW1tYUVFfWFhtZWV1 + cnh1cnh1a29tY2dpX2NrYmVvamtvamtwZ213bXN3cnV3cnV1d31yc3lyaGlnXV5lXF1pX2FpX2Nt + Y2dyZWluYmVpaWlra2t0a3N0a3NwaWl0bW1wcHB1dXV/eX+DfYOAfoJ3dHh6eHl9ent/e4KAfYN5 + dX55dX5vb3JlZWhjXl9fW1xdXV1paWlvb29qampwaW5waW5nX2JhWlxpYmdrZGlwZW5wZW5rY21v + Z3B0cHt3c35zbm9oY2RnYWtwanVvbnhycHpzcnlwb3doYl9jXVtpZ2pyb3N3cnV3cnV4dHpzb3V4 + c3dwa29vaXJwanNwanB0bnR5b3N9c3d5c3l1b3V0anB1a3J9cn+EeYd/en53cnV1dHtycHh1bXd0 + a3VoaHRoaHRkam9la3Bvc3twdH1wa21iXV5iVVNnWldjXF5tZWhuaWprZ2hlXVxeVlVfU1NnWlpv + ZGFwZWJtXVVoWFBlUU9lUU9hU1dqXGFqYWd0anB3aGp0ZWh5a3R6bXV0am5vZWluZGV0amt6cnl4 + b3d0cHdybnR5a3d4anV1anh3a3l6b3hzaHByXl53Y2N0Z2dzZWV3aWRwY15yXV10X19wYmRuX2Jt + Yl5pXlttXF1wX2FvZWt1a3J1aWpzZ2huYVxvYl1uZGhyaGt3aWRwY150W1RwV1BtW1VyX1p3ZGh5 + Z2p9aGp6ZWh3Y2N1YmJ0X2R4Y2h7Z2l1YWNzW1pyWlhrWFZrWFZlW1dlW1dzXmN1YWV3XlRuVkxr + U0huVUpwV01uVUpnT0NoUERhTU1kUFBuVVFtVFBnTkdhSEFfSj9fSj9oRz1vTkRyT011U1B0VU16 + W1N7XVt5W1h0XFFvV01wVVV4XFxlY2Rtamt3b293b297a3V9bXd4a29zZ2ptZGFtZGFpaWlqampu + aWptaGlpZGNeWlhdUUhbT0ZeUVFkV1doXF1pXV5qY2VvaGpoYVdlXlVpXlhtYlxyY2h4aW5ua2pt + amluaWhuaWhzamltZGNrXlxlWFZiV1RqX1xvbXBzcHR4a29uYmVvYWhyY2pwaWtwaWt1anV5bnlz + cnt3dX94d4BzcntwbWRpZV1kY11jYlxrZGluZ2tyY2VyY2VlZWVtbW15b3N1a29ycG10c29wcHB3 + d3eCen+AeX6DeIN7cHt5d4Z+e4uIf4yEe4h7e4l4eIZ5bndtYmpkXV1fWFhhV1hjWltkY2hlZGlq + YmltZGtrYV9qX15pYWhwaG90bndzbXVta3NranJ1cnh4dHpyam1hWlxcWGFoZG1tZ3JwanV1dHly + cHVnYVpcVk9fYVxnaGNpaWltbW11b3V0bnRzbm1qZWRnYWlpY2tlZGtta3N7c3p3bnV6bnJ5bXBz + aHN0aXR9cIKCdYeAeoB1b3VwaG9yaXBvbnhqaXNvZWtrYmhnZGhtam5ycn5vb3twaGdjW1phVlBf + VU9jWl1tY2duaWhqZWRpX2FjWltnWlprXl5wa21vamttZGFjW1djU1FkVFNlWFZtX11yZWl4a290 + aGlyZWd3amt5bW53bXBwZ2p0aG59cHd7d4Z4c4J7cnV4bnJ5Z296aHB4anN5a3R4bXV4bXV7aGh+ + amp7bXJ6a3B0aGltYWJzW1xzW1xwXGFzXmNvXl1wX15yXWJ4Y2h1Z2t1Z2t4aWt4aWtzY1twYVh0 + aWh4bWt6bWhzZWF1XlpzXFdwXFxyXV14Y2V6ZWh9YmR9YmR1YWFzXl5wXmR0Ymh5ZGd6ZWhzX110 + YV5zXFdpU05nVUhpV0prW1dtXFhwWE5oUEZrT0RwVEhzW05yWk1qVUloU0doTU9pTlBqUUVpUERj + TEFeRz1fR0BiSUNjSj5rU0ZtU05tU050W1B4XlR3Xl11XVx0XVdzXFZ4XGGAZGltX193aWl4a3J7 + b3WAdHh/c3d9cHR1aW1zaGRtYl5pZWJraGRnYmFlYV9oYWFfWFhdVElYT0VdTUljU09lV1pqXF5w + XmJwXmJvXltuXVpqXVhtX1t0ZWh4aWt5b3B3bW50b3N1cHR3bXByaGtwaGJnXlhjX1ppZV9wbnJ1 + c3d7b3N4a293am5vY2dtY2RuZGVvZWl1a290c316eYN+fYJ9e4B6enpycnJvb29wcHB3a3RtYmpp + X2FtY2RvaWd4cm91c3dua29tam5pZ2pwcHN3d3l/dH19cnp5bnl6b3p5dIR9eIh7eH53c3lzb3pv + a3dpXmtnXGlhW1RdV1BfXltfXlteXF9dW15hWlxkXV9pYmJrZGRtZWhza253dHhvbXBtamtua21w + b3dzcnltZWhjXF5dWmJkYWlkYWloZG1ybnd0cHlqY2VXUFNbWFpdW1xcWlhhXl1pYWhzanJtZWho + YWNdV1BdV1BeWlhnYmFtaGt1cHR3bW5uZGVnX2JqY2V6cIJ/dYd1cHJuaWppYV9pYV9oY2JnYmFn + XWFiWFxiW11nX2JoZ2tta3BybW5qZWdjW1dfV1RkW15vZWlwZWRqX15jWl1nXWFoW1ttX19wanN0 + bndyampqY2NkWE9lWlBjXF5rZGd4anN7bnd0bmtzbWpzb3VybnR1bnNtZWpzZ2p7b3N+d4Z7dIN7 + cHl1anN4ZWt1Y2l0ZWpzZGl6a25+b3J/cHWDdHmCc3p6a3NwZV9pXlhzW1p1XVxvW19wXGFuXVxy + YV93ZGh5Z2p5Z2p3ZGhyZ2VzaGd0Y190Y190aG55bXOAbnJ9am59ZGh7Y2dtXVNrXFF3Y2N3Y2N3 + Xl9yWltwVlttU1doV1huXV50ZWp3aG11Y11yX1ptVE1nTkdnVUhnVUhvW1twXFxuW1FtWlBvXFVz + X1h5ZV93Y11wV1BuVU5nTUZiSEFoTEBjRzxhQzljRTtfQThkRjxoST5nSD1jSj1lTT9rU0xzWlN0 + WlZ5Xlt5XWJ3W194W2SAY21rW1pvXl11Ym19aXR7c396cn53cHl1b3h5a2lzZWNtZGFwaGRrYmVr + YmVrYmVnXWFkXFZiWlRjWFNkWlRkWlZpXltzX111Yl95Z211Y2luY2JuY2JuYmNzZ2h6cHd/dXt7 + d3h5dHV5b3N4bnJyb3BtamtubWdvbmh3cHd+eH6AdYB+c355c351b3p0bnRya3Jya3J3cHd7dX56 + dH14e4R7f4h/gId6e4J6enp6enp+c3t3a3RqZF9qZF9rZ2h5dHV1c3Rwbm9rZ2VqZWR1cnp/e4R/ + dXt7cnh0a3N3bnV3bnV7c3p3cHl1b3huZGhnXWFnWFtnWFtlXl5tZWVpaWtjY2VhXVpYVVFhVVZn + W1xuaG50bnR3b354cH90cHdpZWtqY2hvaG1qbXlucH1tZWhkXV9fW1xfW1xnXmhnXmhua29yb3Nu + Z2deV1ddV1BbVU5YVU1fXFRlY2dvbXBzaHNuY25iW11jXF5fXFZkYVtlYmhqZ21yaG5tY2llX11o + Yl9uY3BwZXNya3dwanVwZXBwZXBtZWhqY2VoY2JlYV9kXV9qY2VuZ2lrZGdrZ2VkX15lXF1lXF1l + XVxoX15vZGFrYV1jWltiWFplV1xrXWJ3bX55b4B5bm10aWhoWFFpWlNoX15uZWR4bXV7cHl5cnd0 + bXJybXtzbn1zbXNtZ21rZGlwaW56b3p9cn15cnRza251aWpwZGVoX1xtZGF6a3B/cHWCdH2Ac3uA + bW13Y2NqXVhoW1ZyWlt0XF1uXV5tXF1qWltyYWJzZWN6bWp6Z2d4ZGR1Y2d0YmVzZ211aW94anN5 + a3R7Z257Z25+am14ZGdvY1dyZVp6b2t+c29+aW50X2RwV01lTUNiT1FvXF5zZGl5am95ZWVwXV1r + VU1lT0dpVEhrVkpuV1FvWFNwWlRzXFZwXGF4Y2h6Z2RyXlxyWk9tVUpnSj5jRztkTD5hSDtlST1o + TD9nRzlqSjxtTT5uTj9jTTxkTj1oUU1uV1N1Wlp1Wlp1V1V3WFZyVFB3WFVlWFZlWFZpW190ZWp4 + cH97dIN6dXl5dHh6b256b251b210bmtwZ2hyaGlqYmFnXl1pXltrYV1qXVhqXVhnYV5pY2F0Y2R5 + aGl1cHJ5dHV3b3Jyam1tZWVvaGhyam96c3h6eHd5d3V9c3l7cnh1cHRuaW11bm51bm53cnV7d3p6 + dXd4c3R3c3l7eH5+eXp6dXd1c3d1c3d9dH57c314eIZ7e4l+fYR+fYSEgIeEgIeDfYh9d4J1bWtr + Y2JqZWl1cHR0dHRzc3NwaW5yam96eYB9e4N6dXd5dHVwaW50bXJzb3p7eIN6b3h1anNvZF5jWFNj + VlFtX1tra2t0dHRzcHRpZ2plXF1eVVZiVVVpXFxua291c3d3c3tzb3htZWplXmNhW1hnYV5jY2Np + aWlnY2llYmhfW1xdWFpkWlhoXVxnZ2dqampyaXBnXmVkXV1eV1dlX1tuaGNzb3VwbXNubXdubXdl + YmhnY2lnYVxlX1tkZGRiYmJvZWtuZGpoXl9oXl9lXl5nX19tZWVtZWVtZWpyam9vZ25vZ25uZ2tu + Z2tuZ2lqY2VyY2hwYmdrYmVoXmJnXltpYV1rZFtpYlhoXFBpXVFoXFNnW1FnWFtrXV95bnl5bnl5 + Z2p3ZGhyX2NvXWFuYWl1aHB4dH94dH97c3p3bnV4bXV3a3RraWhpZ2VpX2FqYWJzaHB5bnd4b3dz + anJyaGlrYmNlXmNpYmd0am59c3eAdHh4a293ZGhuXF9tXFtrW1p0XmNzXWJvW1htWFZjVlZpXFxq + XVt1aGV9amR7aWN4ZF5vXFZwXGF1YWV1X255Y3J6aHB5Z295a2t4amp3aWd4amh6c3N7dHSAa3B6 + ZWpwWlRuV1FpVVVyXV1zYWR4ZWl7aGV0YV5tVVRnT05jUEdlU0loVU5tWlN0W1Z5X1t3YWV9Z2t7 + aV90YlhzXEhuV0RqTT5oSjxoVD9oVD9uVkVtVURtUERtUERtUUFvVERpUURlTkBlVEduXE91XFd0 + W1ZwU09vUU5qUUdtVElqWFNvXVduYWF0Z2dycHh1dHt7c3qAeH+Ad3p9c3d+d3t5cnd7a3V5aXNv + Xl1uXVxoW1ZoW1ZpXltrYV1lXmFrZGdyZWd6bm95dHh5dHh4bXV3a3Rzbm9zbm91bXR6cnmAeoB+ + eH5+eH5+eH57c3p0a3N1a3J1a3J4cHV4cHV1bXR4b3d0c316eYN6d313c3l1dH51dH54d353dX10 + cHt4dH94d357eoJ9eoh+e4l+c36AdYB6c3Vyam1vY2l3anB1c3R1c3Rya3d0bnl5dYB9eYR7eX10 + cnVzbm91cHJuanNzb3h1cnhybnRwaWlqY2NnX2JuZ2ltcHRwdHh5d3hvbW5pXVVpXVVkXGNtZGtu + bXJwb3RwcnhpanBrYmVpX2NjXl1nYmFvZWd1a21uanBqZ21uYmVvY2dqX15nXFtrX2NwZGhyZ3Jy + Z3JoZWdqaGlvb293d3d9fX90dHdta3VycHpzcntvbnhwaWtqY2VjY2NkZGRuaWpuaWpuYmNpXV5k + XV9oYWNwZ2hwZ2hrYmVtY2dtZGtvZ25vZWtuZGpwaW5uZ2twXmJwXmJpX2FoXl9pX2NrYmVuZWRw + aGdtZF5uZV9uYlprX1doYWFrZGR1bXR3bnV4a210aGl3ZGp1Y2lyaXN5cHp5dYB9eYR/dH17cHl3 + aG9yY2pvZGNyZ2VzaGdzaGd4a3J4a3Jua29pZ2ppX2FjWltkWFxpXWFvZ25zanJ5am90ZWpuXVxq + WlhlXF1lXF1qYVduZFt1XlhwWlRpWFVnVlNkW1x3bW5+b3J+b3J6aGJwXlhyWl10XF91YWp4Y217 + aW97aW99aGh7Z2d9aGqAa25+b3R/cHWCbXR9aG96X2J3XF5yWl10XF90YmV4ZWl7amd4Z2NyXVto + VFFiU0xiU0xkUUpoVU5tVUpvV01yXlx6Z2R5ZV95ZV9wWkZuV0RzV0VwVUNwWExvV0p5WEd6Wkh0 + VUp1VkxvV0RvV0RvVk94Xld/Z2WGbWuHa2SAZV51WklrUEBqTkNvU0dwX2FyYWJ0Z2d4amp1cHR4 + c3d/cn2HeYSAeX5+d3uAeoB/eX97dYB0bnl4ZGdwXV9oXFRlWlFpW11tXmFlX11nYV5tY2d1a293 + c3l0cHd4bXV3a3RzcHJ0cnN0cHd1cnh9d396dH15dYB5dYB7c311bXd1a291a290bndzbXV0bXJ1 + bnNzb3hzb3h4cn13cHtzcH5zcH5vcn5tb3tzZ216bnR4aXB7bXR5cH17c394bXV6b3h5b3VyaG50 + aGt1aW1vbnNvbnNqaXBranJ0bnl/eYR7eX16eHt6eHt0cnV1bnN3b3R1dXh3d3l5cnR0bW9wanB0 + bnR0dXtzdHpzdHhub3NqZ2Nva2hvbnV1dHt4dH11cnp0a3hwaHRvZWlqYWRjX1xpZWJ1a3J+dHp4 + cHN3b3J0a3NyaXBlY2RjYWJuX2d0ZW1zZW5vYmpoYmhrZWtzanJ9dHt6eHt3dHhranJoZ25qanpv + b39zbXVya3RpZGVqZWdraW1raW1rZ2plYWRhYWNra259d396dH1tamtoZWdkYWdkYWdtX2pwY25q + Y2hza3BzaW1qYWRrX2FtYWJqZGp1b3V9cHR7b3N9a219a21zaW1vZWlrZ2hrZ2h4anN6bXV6c3V6 + c3V5b3VyaG5ubXRwb3d4c4J9eId6d31zb3VzYmNrW1xtX191aGh5b3B3bW56bm97b3B0b25taGdr + W1doV1RbV1RfXFhvYm15a3d5am9yY2hwXFxvW1tvXWF4ZWlwZ2hzaWp5bmp1amdwX15pWFdrY2J1 + bWt3b3J1bnB4ZGRtWlpuWlptWFhwYml4aXB7bm56bW2AaGeCaWh+a3KAbnR+cnN7b3B+aWd9aGV1 + YWNuWlxtWlNtWlNuXVxyYV94YVt0XVdpVlBhTkhhSkNdRz9dRjxhST9iTEdnUEx3XF5/ZGd/ZWJ9 + Y195YU94X051XU91XU90W050W059XVN7XFF1XE9vVklrVEBqUz90VFOCYV+Ha3CNcneNbmiIaWN4 + W05rT0NqTEBuT0RzZGl0ZWpuZ2lpYmRvamt1cHJ7bneDdX59c3d5b3N7dHl+d3uAeH99dHt5Z29z + YWloX1xlXVppW11lV1ppV05kU0lpV1tyX2N0a3h3bnpzaW9wZ21qaGttam5uanNybnd1b3VzbXNy + a3J5c3l7dX54cnpwa21uaWpwanBwanByam9uZ2tvaGpuZ2lwZW5yZ29zanR4b3lvc3ltcHdwa21z + bm9yZGRvYmJwZGp0aG5ya3RwanNyaXBvZ250aGt0aGtzanR0a3VwaWtvaGpzbXN6dHqDeX+Ge4KH + f4SCen9/cHV+b3R9eHt+eX1+d3l9dXh4c3d5dHh4eHp5eXt7dX50bndvZG10aXJ4b3t+dYJ+d4Z9 + dYR9b3h6bXV3a2h0aWVqaGltamt1cnqCfod/en56dXl3bnp3bnppbm1na2pqYmlvZ254a29uYmVl + Wl1uYmVuZ2t7dHl4c3Rzbm9tZ2JqZF9pZHRwa3tva3RtaXJqZWdlYWJrZGlvaG1zZGtqXGNbX2tr + cH2EgpR9eox4eHhzc3NqZWljXmJwYmlyY2ppZWtzb3V7bnd5a3RuZGhrYmVtaXR3c357eIB7eICA + cnSEdXiAdHh0aGtwZGhuYmVzaHB5bnd6d319eX97dXt0bnRwa29ybXBycn94eIZ3eoBvc3ltXVZo + WFFqXVt0Z2R5dHV5dHWCc3h/cHV3bm1waGduW1FoVUxjU09nVlNuY2t0aXJzZ21tYWdpVVpvW191 + YWV9aG16bXp7bnuCc3h/cHV0ZWhvYWNyY2h1Z2t4bm90amt6Y15vWFRqV1FtWlRvYWN1Z2mAbW2A + bW2Ea2+Ea29/anKAa3N/bm17aml4Y2F3Yl95Wl1yU1ZpVlBpVlBrWFFwXVZzXU9rVkhlTkBeRzpe + QzdbPzNbQzdbQzdfQz9qTUlyWl15YWR/aGKAaWODaWSCaGOEZFqCYld/X1R/X1R/X1d+XlZ7XlFz + VklvTzxtTTp0T06EXl2Oa3CUcHWIbWiDaGN7Wk5wT0RrSkNzUUl0am5tY2dnZV9jYlxrZ2Vwa2p3 + a3d4bXh3a2p1aml3bW51a214bXp/dIJ5ZXV4ZHR3Y25yXmlrXFVkVU5nUD9nUD9qWFFzYVpzaGd3 + a2pwYmRoWlxjXWNfWl9jW2RnXmhvZWdwZ2h1aHN6bXh5a3R5a3RwaGdtZGNrYmhyaG5waHJtZG5u + ZW9yaXN0bW9za250a3N1bXR3dXp3dXpvbnVvbnV1Z2ttXmNuW11uW11uZ2dyamp0anByaG51aml0 + aWh0bXJza3BoY2JlYV9qaWV0c295eH9/foaHfoaDeoJ3bXN3bXN7en+CgIaCgIZ/foN9d31/eX95 + eIJ6eYODe4t1bn10ZW1yY2pybnR5dXt/eYR9d4J7c39+dYJ9eHl5dHV4dH19eYJ6eYB/foaAfYN+ + eoB5cHp3bnhubXJwb3RvbXBzcHR1a29vZWlwXVdpVlBtXmN1Z2t1bnNwaW5tY2RoXl9rXWJuX2Ro + XmJuZGhlY2JhXl1pYV9uZWRwX15qWlhoYm17dYCJh5aGg5KIgoiAeoB3bXBrYmVqXmJwZGhtaXJ4 + dH1+cHt5a3dzZ2pwZGhyaXV/d4OEfomEfomLd4SMeIaDeIB3a3RvaWdlX11qZG11b3h5dX5+eoN+ + d3d3b29zaWp0amtycHh5eH97eoR4d4B1Y2drWl1vYl94amh7cnV+dHh/cHV7bXJ1a21wZ2hvXFVk + UUpnU1VpVVduXmhyYmtvXWFuXF9pWFptXF1wY2F7bmt+bn2AcH+Db3qEcHt9am56aGt0Y2RwX2F6 + bW14amp1Y11vXVdwWE5tVUptWldzX119am6Cb3N+b3R9bnN4Z2h5aGl7Z2R5ZGJ1YV50X115XGNy + VVxoUE9nT05pU01uV1FvWkxoU0VoST5iRDleQDVaPDFaRDNYQzJfRztlTUBtVlB4YVt7Z2l/am2I + cGqJcmuHbV+AZ1p6YVZ5X1V6YVZ6YVZ5XUpvVEFtSjlwTjxvUU97XVuHbnKIb3OJdW9+amR+XlRt + TkRrSj9vTkN5bXBvY2dkYVtcWFNiWlhqYmFrZW5uaHB0aGlwZGVvZWdwZ2hwZ211a3J7ZXJ+aHR4 + aXB1Z25tYl5kWlZkUUhlU0lqXVttX11wZV9wZV9oXVxiV1ZjV1tfVFdjWl1jWl1qXl9tYWJqZWlw + a293anB6bnRvZ2VtZGNvZWlwZ2puZ2lwaWtvZ25waG9zanR0a3Vzb3pva3d3b3R1bnNvbXBua29v + Y2RtYWJrXl5yZGR0bmt0bmt1bWtyaWh3aGp0ZWhqal5paV1kXlxiXFpkXlxvaWd5eH1+fYKCeYCA + eH94c3d3cnV5eoCDhIuCho59gIl+eoZ9eYR+e4l+e4mAeoBya3JwY2FyZGJvbWt5d3V4eHp3d3l0 + b350b356d396d397dXt/eX97eH5/e4KAfYh7eIN4dHp1cnhta3Vta3VvaHhyanp3bXB4bnJ3Y2Fw + XVtuW11uW11zZ2pyZWltY2dtY2drY2JnXl1iV1ZjWFdbWFpfXV5tZWVvaGhtY2RqYWJyY2p+b3eD + gJKDgJKGe4yDeYl9bnBzZGdkWmJrYWlyaXV9dIB+dHp4bnRzZGdtXmFuZHR7coKHfY2Ifo6EeH6I + e4KCe4R1b3huZ2lkXV9kX290b396dYR/eomEeoB9c3lyaGlzaWpzb3V6d32Ce4R6dH15aXVyYm5w + Ymd5am96b3h9cnqEeH6AdHp6cHdyaG5yYlpuXlZtX19tX19vXWF0YmVzYl5uXVpuX2RvYWV1ZGN9 + a2p/anKAa3OEb3mCbXd9Z2t1X2RyXV9zXmF0Z2R1aGV0aWNtYlxzX19vXFxuXV5uXV55Z21+a3J5 + am93aG10Y2R1ZGV9aWN+amR7aGh1YmJ1XFVrU0xjSj5hSDxlTkRqU0hrVElpUUdtTTpoSDVhRDFc + Py1aPStiRTJhRDVnSTtpV0dzYVB5Y2qDbXSGcHWHcneGa2F7Yld0W05yWEx+YVd+YVd+XFB1VEhy + TjlvTDdwV1B7YluHbnKJcHSIbXKGam9/YlZyVUlwTUNvTEF9cHdyZWtjXVhdV1NeW1VkYVtrYmht + Y2luZGhvZWluZ2tuZ2tyaGl0amt5bXB6bnJ3a3d3a3d4bmRtY1poXUpqX01uYmNyZWd0a2pyaWhp + Y15eWFRhVFRhVFRjWFdpXl1rYmNvZWdqaGtqaGtzaHB4bXV0bXJ0bXJza3B0bXJ1bXRwaG9wZ21z + aW9yam9vaG1uZW1vZ250anBzaW9oaGVpaWduYmNvY2RtZWhyam10bWN3b2V5b3B3bW55bW5yZWdq + al5ra19vY1thVU1iWE9kW1F3c3l7eH5+d4Z9dYR4cHV6c3h4eIiCgpJ/go54eod7d4Z7d4aCf42A + fox+eXpvamtyaWhyaWh3c3l9eX97en94d3tua21lY2RtZGtzanJ1bXR3bnV3cHd6dHqAfYZ6d394 + eX1vcHRranRpaHJtZ3JvaXR4bXiCd4KCdXd+cnN4amhrXlxvYmJzZWVvZWdyaGlqaGdpZ2VpY15b + VVBdW1xkYmNtaXJ3c3t5b3V3bXN9cn19cn19eoiCf42Gf4aCe4KDd3p0aGtjW1dqYl5vZ259dHt9 + dIB5cH10bXJpYmdqZGp4cnh/eIiCeouAfYaAfYaAfoJ1c3dvZ2VnXl1nX2Rza3B6d4KAfYiCeYB5 + cHh5b3NzaW1ybnd6d3+Ed39+cHl6bXh5a3d4a294a296c4N9dYaCen99dXp7bnd3aXJ1aGV1aGVz + Z2pyZWlzZGlzZGlyYV9wX15uX2JwYmR5aGd7aml6Z2R/a2l6bnJ4a299aG91YWhuWl5uWl5wYmR1 + Z2l0anB1a3J5am9yY2h0Y2JyYV93aG14aW55aGd0Y2J0Y2J4Z2V9bnN/cHWAc3N5a2t3XlFuVkll + TT9cRDdhST9oUEZzWlZ0W1dzVUFuUD1qTDRkRi9kRzduUD9vVU50WlNrW05wX1N6YWuEanWDbXKC + a3CCX1R5V0x0V051WE9/X1d/X1d/XEx/XEx5VEV4U0R4XV+CZ2mHbm+JcHKIbXKIbXKAZ1yAZ1x9 + Xk91V0h3c3tuanNjYlpcW1NjVlFjVlFlWFhtX19zX191YmJwZGhvY2dtaGtvam50bW14cHB6dH17 + dX6Eb3R/am90aF54a2J4cHV5cneAcnd9bnNpYmJhWlphVlVjWFdpXWFvY2dzZ2p1aW1taGtrZ2p3 + cHl5c3t/cn2CdH90cHlybnd5cnR5cnRyaGtuZGhzZGdzZGdtZWhoYWNuX2RuX2RqYWJvZWd0aGl4 + a210b253cnB6dXd/ent/eX9+eH56en15eXt3c21ybmh0aWNtYlxuWlpoVFR3a3l/dIKAeIR/d4N6 + c3V6c3V/fY6DgJJ/eId4cH9zb3p4dH9/fYuCf42Ae39zbnJ1a215b3B4d4B9e4aHeYJ+cHlwaWlk + XV1oYWNpYmRoZWlpZ2prZW5tZ291cnp0cHl3dXp0c3h3b3Ryam9oZGpoZGpwb3mDgox/gpB+gI6C + f4NzcHR3am53am5vbnNvbnNzaHB3a3RvaGhkXV1rZGlza3B6cnt+dX+Ad31+dHp7dYB/eYR5eIJ/ + foiIfpCHfY6Hd4Z6anlnXFtpXl1kaGtwdHh7eoR4d4Byb3BnZGVoX15uZWR1bXl/d4OCfoeCfoeG + gIJ4c3R3am5wZGhnX2RvaG15eIJ/foiEe4iDeoeAe395dHh0bXJ4cHWAc4B9b314b3d0a3N4a3J4 + a3J6c4N9dYaAeIR7c39+a3R4ZW5zaW1zaW17bXJ7bXJ5ZGl0X2RvW1ttWFhuYV5tX11yYV9uXVx4 + X157Y2J5Z295Z293Ymd0X2RyXV1uWlp1YWh+aXB7bXR6a3N4aW50ZWpyZWdwZGV5bXB7b3N9a2h3 + ZWJ5ZGR+aWmAbneDcHmEdXh7bW9+ZVdyWkxqSjpkRTRlTkRtVUpzXlx0X114W050V0pvVT5wVj9v + Vk91XFV9YmKAZWV6Z2F5ZV+AZGmHam+HbWl+ZGF+YUp6XUd1X1F9Z1iGa2iHbWmEalx9Y1V7XUx9 + Xk1/ZGGEaWWGameJbmqIb3CEa22HaGKHaGKHZFqAXlR5bnl4bXhwZWRlW1pjWlBkW1FpX2FrYmNz + YmF1ZGNzYmNyYWJpX2NtY2d3aWd6bWp7cH6AdYOCeH5/dXt5cnJ1bm6CdXuDd32DdX5+cHlwZ2pr + YmVrY2JrY2J0Ymh5Z211aW94a3Jwa21wa215c357dYCAdYCCd4J3dX13dX11cnh1cnh1bnNza3Bw + bXVuanN0ZG50ZG51Y2dyX2N0aGl5bW53b3R0bXJzc3V1dXh6eHt/fYCDfYaEfoeCgIt7eoR6eHt3 + dHhzbm9uaWpvYWVpW193bX2Ad4d+eoN4dH16eHt9en51fYh5gIx1cnptaXJrY2p0a3N9e4Z/foh6 + eX5ycHVyb3N3dHh4d356eYCEfYx+d4Zwb3RoZ2tvXWNvXWNrX2NpXWFtW15uXF9wY2t3aXJrb3Vw + dHp+eX11cHRqZ21kYWdvb3uAgI1+g5J+g5KCfol7eIN0bnd1b3h5dX55dX5zanJzanJ3am5wZGhw + aG93bnV4dH97eIN7dXt9d32Cd4SCd4R/eId9dYR9eox+e42Eeot5b39uZW1oX2dlY2Ryb3B7dYB+ + eINybW5taGltX1tqXVhnYmN1cHJ/eIeAeYh9eHt3cnV1a29uZGhoX2twaHR7eIOAfYiHfoiGfYeC + e4d6dH93b3RwaW5zbXh0bnl3a3R0aXJ0bW9yam11c4J6eId6c4Z1boB0YmhuXGJyXGF4Ymd6bW14 + ampzZWNlWFZnUUZoU0dpWlFrXFRuXldrXFVwXFp0X119ZGWCaWp5aGl3ZWdwX2FtXF1yY2h6a3B9 + bnN7bXJ/am17Z2l4Y2V4Y2V7bW97bW97aGh0YWF0ZW19bnWGcHiGcHiEbnN/aW6AZ1p4XlFyU0dp + Sj9uU1N3W1uDY2SDY2R9Y1h9Y1h6XVF5XFB0W1Z5X1t9ZGh/Z2p9ZGV+ZWd/Z2iDamuDb2h9aWJ5 + YVN9ZFZ/a2WGcmuNcneMcHWMamiIZ2R/YlZ/YlaCY12CY12CY1+HaGSDamuGbW6EaWSEaWSGY1h+ + XFF+c4B5bnt0aGtyZWlvYmJyZGRtam5vbXB3aG13aG1vZWdrYmNlXl5lXl5qX1xwZWJ6b32DeIaI + eoODdX55d3h6eHl/dH+AdYB9d394cnp4aWt0ZWhwa21wa211a296cHR7a3V5aXNza3B4cHVzcnt5 + eIJ5eH94d354d353dX16eX54d3t3dX9ycHp0dIRycoJ3bnp1bXlyaG5tY2lyaGt3bXB6dH15c3t5 + dHh3cnV5cnJ7dHR6d3+AfYaCeomCeol9eIh5dIR0c3p0c3p0aXJtYmp5bneAdX5/eYJ9d39/d4CD + eoR4foN4foN3dHVua21nYmNuaWpteH5yfYN3eXp3eXp9eHl4c3R4cnh5c3l7eYt+e416eIZ1c4Bz + aW1wZ2pyaGtrYmVqX15qX15lXWRyaXBzb3p3c35+c3t4bXVwb3dkY2prb3h5fYaCgpKDg5SAe4t7 + d4Z3bX14bn56eYN7eoR4cnhwanB0am5zaW1zcHR1c3d1dHl4d3t9d397dX6Ad4iAd4h1cnp3c3t+ + dIaEeoyCfYx5dINwdHprb3Vra2ttbW15dYCAfYh3cnNwa21qZGJoYl9nWlpyZGRzb3p5dYB+cnV6 + bnJvZWdrYmNpXmlyZ3JydX53eoN6eYB9e4N6eoh7e4l1cnhuanBzZW5zZW5rYmhtY2lyaGtvZWlv + ZXV4bn55cHp0a3VzYmFoV1ZqVVptV1x1YWV5ZGl4YVhkTkZjTDlkTTprU0xwV1BzXFd0XVh1Ylx9 + aWOAaGmAaGl/a2t+amp3Y2FyXlxvYWV1Z2t0amt7cnN6bWhyZF91Y2d3ZGh9aG9/anJ6ZWp3Ymd6 + aG57aW+Eb3eGcHh/a2t9aWl9YWNyVlhuUE1wU09yWF56YWd/ZWuAZ216Z2d9aWmCaWh9ZGN9Xlt9 + Xlt/Y2OCZWV+Y2WCZ2l/amp+aWmDa2eDa2eGa2iIbmqMc3KNdHOUc3mQb3WEameDaWV/ZF97YVx7 + ZF96Y16CY19/YV16YmGAaGeDZVx/YliAX0x6WkZ6and6and1a21yaGluYWlzZW53bnh5cHp4bXV5 + bndzbm1wa2pzZ2pqXmJtX110Z2R4bXh/dH+AeIKAeIJ5dHh3cnV1cnh5dXt+eXp6dXd5cG14b2tz + a3B0bXJ3a3R3a3R1bXR0a3NybXBvam5uaHNya3dwb3lzcnt7c317c317eIN7eIN4c4J0b350bnly + a3dtaW9ybnRzaWp3bW51a3J+dHqAdYN9cn96a250ZWhzamlwaGdyb3NvbXB0anB3bXN3a3l6b314 + dHp0cHd0bnRzbXN5b3N7cnV5dX56d3+AdYCCd4J5eYZ+fot7eoJzcnlraHBuanNzcnl3dX15eH17 + en96en11dXh0cnVzcHRybX16dYZ6eYN3dX96dXd+eXqDeoJ4b3dvZ25qYmlzbXh6dH95d4R5d4R0 + c3p4d351bXdrY21iY2dyc3d5e4h+gI2Ae4t0b351Z2t0ZWpqaW55eH16cHRzaW1yaGtvZWlwbXN0 + cHd4cnh3cHd4b3t5cH15d4R+e4l0cnNyb3B5c36AeoZ7eoR6eYN6e394eX1zcnd0c3h/eouCfY1/ + d355cHhyaXBtZGtnX2JoYWNya3RzbXV1bWtvZ2VwYmRtXmFoXF9oXF9qaXB3dX13dX14d354d4B6 + eYN5d4R3dIJ7b3VyZWt0X2JrV1prWFtuW11tXWlyYm54anV4anV7amlqWlhlUVRqVlh1ZXR6anmD + ZGJ4Wld0V0xzVkp1XVx3Xl11ZGV5aGl9aWmAbW2GcHCEb2+CcG2CcG2AaGd7Y2J1ZV53Z195a2t/ + cnKDb299aWlzZ21vY2l0Z293aXJ4Y2p5ZGt9aG99aG+Gb3eGb3eDamt+ZWdzW1pvV1ZvVlF3XVh4 + XmR7Ymh/ZWJ/ZWJ/ZW6Ga3SDaml6YmF+XmKAYWSDYl2GZF9+Y2N+Y2N7aml+bWuGam2Ha26HaXOI + anSIbWiGamWGaWmGaWmDaWKAZ19+ZGF9Y19/ZWF3XVh3Wk50V0x3XVh7Yl1/YV1+X1x7W0l0VEN+ + b3d9bnV4b3dyaXBnYV5qZGJ0Z295a3R4bXV6b3h3bXB0am54a3JzZ213ZWd6aWp4a3KAdHqAeoN+ + eIB7dHd4cHNzbXN3cHd+eIB+eIB+cHl5a3RuamdpZWJuZ2tuZ2tuZ2tuZ2twZ2pvZWlqY2VuZ2lu + aG5wanB5bnl6b3p6b313a3l1bXd0a3VwaHRuZXJyam91bnN5bm17cG96cn6AeIR/eId0bXtyZWd0 + aGlvZ2VtZGNqZWlpZGhvam5wa29zbnJ4c3d1cnhybnRycHVycHV1b3V7dXt+eIOCe4eCeYN+dX96 + eIZ/fYt7en96eX51dH50c31wbXh1cn1+e4uCf46Afox6eIZ0dHJycm9va3Jzb3V1c4B6eIaDf4iD + f4iCf4N1c3dybndzb3h4cn14cn1zcntvbnh1bXd4b3lyaXBpYWheXVpubWl1d397fYaAe4tybXtv + Z2VvZ2VqZWd1cHJ5cHp3bnhwa21vamt3bXN5b3V7dHl6c3h0cHlzb3h5eoN9fod7eXpzcHJybnR5 + dXt6eod9fYl7d4Z6dYR3coB6dYSAe4x/eouAe394c3dvZWdoXl9pXl1pXl1oYWVwaW51cHJzbm9z + aWpvZWdkXFtiWlhoZ25zcnl3dXp6eX53c3l1cnh0dIB7e4iEe4OAeH97b3BvY2RuXF9pV1toXGJu + Ymh0aGt0aGt5bW5wZGVuWF1wW19wanVzbXh9aWd4ZGJ4YVt5Ylx6Z2d7aGh9aWeCbmuEcnqHdH2I + dXt/bXN6bW1/cnJ/am1+aWt9aWt9aWt7bnd/cnqCc3p7bXR3a2pvZGNyYWJwX2FyX2V4ZWt6aG59 + anCDbnOCbXJ/ZWJ5X1xtWlBrWE9vWFR1Xlp5X2h6YWl9YmR/ZGd/Z2qGbXCDaWSAZ2KDaG2Gam+Q + cGqMbWd+Y155Xlp6YmF7Y2KCZ2uIbXKEa22CaWqEZWJ+X1x9YWODZ2mCamR9ZV+CZ2eAZWWCZFh4 + W09yVUlzVkp3XlB/Z1iDaGN9Yl1+W0p4VUV+dHp7cnh5bW5zZ2huYmNtYWJtYWRvY2dzaHB3a3R0 + bnl3cHt5b391a3t5bXN7b3V6bXiCdH+CeYZ+dYJ7cHl6b3h3bXN5b3V+eH5+eH6Hc4CDb31wb2tk + Y19kXV9nX2JrY21waHJuZW1vZ25rZGlqY2hpY2trZW5waHJzanRyam9uZ2t1a291a29waHRuZXJ3 + aXJ5a3R5b3N6cHR5dX56d399eX9raG5nXV5oXl9pXV5rX2FtY2doXmJqY2VuZ2lwbm9yb3BvbW5u + a214c3d1cHR0cn99eoh/eol/eol7d4Z3coB6eod/f4x+fYd6eYN3dX1ycHhubXJ1dHmHgpGHgpF/ + foh5eIJ0c3pycHhvaXJzbXVzdHp6e4KCfoeAfYZ9fX93d3lzcnlzcnl5c351b3pzbnJvam51Z2t4 + aW5qY2VoYWNrXWJ4aW51dHt7eoJ1dHlqaW5rY2JrY2JqY2NvaGh5c3t0bndrZWtqZGp7b3WDd32D + eoJ/d35zcntwb3l3eYZ7fot6c3N1bm5vb21zc3B4eX95eoB7d4Z7d4Z+eIODfYiEf5CDfo6HgId5 + c3lqYlxkXFZpW11uX2JpYWhwaG93a3d7cHt3cnNzbm9kX15hXFtnZGhua291cnh7eH50c3hzcnd3 + cHt7dYB7eX1+e397endwb2tzaGJvZF5tZWhyam13bW50amt4a294a294ZWt0YmhzbXVzbXV5a2l6 + bWp5ZWN6Z2R7aGp/a26Db2+GcnKGc3mMeX+Cc3p9bnV6aG55Z215a2t7bm5+b3J9bnB/b3l+bnh7 + b3N6bnJ9aWt3Y2VzWl9yWF5vXWFyX2N0YmV5Z2p9a2h3ZWJ6XVF7XlNrWkltW0pyV1p0Wlx5XmN6 + X2R4Y2F7Z2R/Z2qGbXCJbW+OcnSJc32OeIKUe3eOd3J+a2J0Ylh7Yl5+ZGF/ZWuDaW99aGV3Yl97 + XlN5XFB0W1d9Y19/Z2qCaW2CZ2J+Y15/YVF3WEl0VFN6Wlh/Z2WJcG+NdHWDamuCYU94V0Z5eH14 + d3uAdHp+cnh5Z21vXWNwY2FzZWNwaGd0a2p1dXV4eHh9d4KCe4d7cHt4bXh5bXB7b3N9dHt7c3p6 + b3p5bnl1a293bXB5cHh7c3p/dIJ7cH5va3RpZW5pX2NqYWRrZ2prZ2puaG5pY2lpX2VtY2llYmhk + YWdnaG5panBvamtrZ2hvZWtrYmhtZHBqYm5vYmpyZG1vaGp0bW93bnh5cHp4c3Rzbm9uYmNrX2Fw + Y2twY2tzaWpuZGVzYmN0Y2RvamtuaWpybXB1cHR1cnh4dHp1dH55eIKAfo17eYh4dYN0cn90c31/ + foh/fYt6eIZ6e4J4eX95dX59eYKEf46Ae4t7eIBybnd0cHd0cHdvbW5yb3B4dYR9eol/e4d6d4Jv + a3R5dX53eIB4eYJ4cn1zbXhuaWptaGluZ2luZ2lrX2NlWl1jWl9nXWN1bXd/d4Bwb2loZ2FvZGFz + aGRtZWhtZWh1cnhva3JtX2hwY2t5cH2CeYaGfo5/eIh1c4Bwbnt1dYJ5eYZ5cnR1bnB1bnBza25v + a3RuanNtbnRvcHd0c3p4d357eYiCf46Eg41wb3ljY1dfX1RtY2dyaGt0a3h0a3h7bXSGd36Ad317 + cnhqZGJfWldqXl9vY2R0bnR3cHdva3JybnRya3d1b3p4dXl6eHt6eXVycG13aWl4amp6a3B7bXJ1 + bXR3bnV0aXJ3a3R9aG97Z257bXR+b3d/cnJ/cnJ/bm16aWh6aGt7aW1+cnh/c3mEdH6JeYODdHd5 + am13YmR0X2J5Y2h7ZWp7b3B6bm+AbneCb3iCbm6EcHCDbmt4Y2F5XltyV1RtWlNpVk9pWlNwYVp5 + ZV51Ylt7YVx7YVx/ZWJ6YV13XVp0W1d7X2J/Y2WAaGuAaGuAanJ/aXCEaG2NcHWJd32NeoCOfXmI + d3N9bWV3Z193Y113Y115YWJ9ZGV9Y1x4Xld1WE10V0xvVlN4Xlt+ZF+CaGN/ZVt+ZFp/Y1B7X013 + WFZ/YV6CbXeGcHqIa25/Y2WAXFN6Vk1+eXp9eHl9d317dXt4aWt4aWt5Z215Z213amt7b3B4c3R4 + c3R5c3t/eYJ4cnp1b3h0bW91bnB4b3d+dX1+dX17c3qAbnR/bXN3b3J4cHN0cHd1cnh+bnp7a3h0 + aGtwZGhvaG1za3BwZ21wZ21qY2VqY2VqXmJqXmJrX2VrX2VuX2JuX2JtX19vYmJzXmVwXGNuX2dv + YWhzYWR1Y2d5Z216aG55bW53amtvZ2NwaGR0bW9za251a21wZ2hzYWR1Y2dnZ2dtbW10b3N7d3p7 + dYB6dH9wb3R3dXp/eYSAeoaDeoJ1bXRybnd7eIB9eol+e4t9fYl6eod6eYN4d4CCf457eYh7dX5w + anN0b3Nwa29qaXBycHh9e5B/fpJ7eH54dHpwb3d5eH99e4Z9e4ZzcndqaW53ZGp4ZWtwZ2hrYmNq + XmJoXF9lXmFlXmFuY2t1anNwY2FrXlxqY2V1bnB3bXNzaW91bXRzanJuZW9waHJ1a3+CeIyEeI2I + e5F9eYJ1cnp7coJ9c4N5bW54a21zaW1tY2dnZGhkYmVqZWl0b3NvbnVzcnlwd4h4fpCCgIt6eYN1 + b21tZ2Ryam14cHN/dH97cHt6cHSDeX2Ef4OCfYB0a2pkXFtqXGFyY2hvbW5vbW51a3JzaW9zanRy + aXNybXB0b3N4bm9wZ2h9anB9anB3cnN4c3R5bXB3am5waWtuZ2l4ZGd5ZWh4anN7bnd/a2mAbWp4 + bWd0aWN9ZGN5YV9+ZG2DaXJ7bnmDdYCDdHd5am11Y2lrWl9vYWN1Z2l6bnR7b3V6bnR5bXN9aGh/ + amp+amh4ZGJ4YlZyXFBrVU1qVExpVlBtWlR1W116X2J9aGWCbWqDcnB6aWh4Xlp5X1t6X2KAZWiH + anKHanKCa3CAam+CaW2Dam6Cb3WLeH6JeHSCcG2Abmh7aWN5X1x5X1x6YVx7Yl16YVp5X1h0XFFv + V01yWlt5YWJ+aFqAalyEbWSCamJ/Z1h5YVNyV1N6X1uAaXWDa3iEZGiAYWR9W1NyUEh9dXh7dHd9 + dHt+dX17dHR9dXWAcH2AcH17cHl9cnp4cnp5c3t/dH+Cd4J7cHl6b3h0b3B1cHJycHh4d355eH11 + dHl1bXd0a3VzaW1zaW1wZ2pzaW2AanR/aXN6a3N/cHh9cn15bnl3bXByaGtrYV9nXFtkVlhnWFtq + WFxoVlptWlxrWFtoV1RrW1dtXFhrW1dpV1ttW15zXmFyXV9zZ2h1aWp4ZWl5Z2pwamh0bmt0bW9y + am1waWluZ2dyZ2V1amlraWpvbW56bXqDdYN6cnt1bXdqbnJydXl/foZ+fYSCen11bnBqZG13cHl6 + c4OAeYl/fYx+e4t6eYB5eH9/fYt9eoiAeIJzanRqaGlraWpqa3RzdH2CfYyEf45zdHhub3N0bneA + eoN/fYyAfo1yb3BpZ2hvZ2V4b25vbW5lY2RlXF9qYWRuZWRuZWRvam5vam5vZGNuY2JtaW95dXt/ + en5+eX1ycnJvb29oZXNraXd4coh/eZCHfY2DeYl+eoN3c3t7c3p6cnl4b253bm13a2hyZ2NlX1tl + X1toX2duZW1tZ3J0bnl5dISEf5CHgIl9d3+AdHh9cHR+cniDd32AeIJ7c313dHV5d3h+e3+AfoJ3 + bW5pX2FqYWdwZ21yaGl0amt0aGtyZWluX2RrXWJqXF5wYmRyZWdwZGV4aXB9bnV4c3R4c3R0a2Vq + YlxvYmJvYmJ1YWh6ZW1/anSAa3WCbmd/a2R9Z1t6ZFh5Yl14YVx6YmV+ZWl9bnV/cHiEb3l+aXNz + YWRvXWFwY2N4amp/cHiCc3qDbXJ6ZGl7Z2d6ZWV3ZWR0Y2J7Ylt1XFVuV1NqVE9tVlFyW1Z4XV1/ + ZGSHa2uNcnKMc3eIb3OCZ194XVZ3XmJ9ZGiAa3CCbXJ/amp/amp9aGV7Z2R/a26CbnB/am1+aWt6 + Z2F4ZF5/YV1/YV15XleAZV5+Y1x6X1h+ZVt+ZVuCZ2OCZ2OAaFuCaVyGbmmHb2p9Y1h1XFF0VlN6 + XFiHZW6JaHCIZGJ/XFp6VUhzTkF1bXR4b3d7c39+dYJ/eYKDfYaEeYKHe4R/dYZ9c4N/eYJ/eYKD + dYCGeIN+dX19dHt0b25uaWhvaG1yam90a3N3bnVza250bW90ZWhvYWN1aGV3aWd5Z299anN7b3N9 + cHSGcoKEcIB3cnVybXB1ZGFwX1xtWlptWlppWFVlVVFjU09jU09oW1ZpXFdqV05qV05pVk9pVk9u + Wlp0X191Z2l3aGp3aG11Z2tyaGl1a214cHV5cnd4b2twaGRza2tza2t1b3V3cHd7c397c39yam9p + YmduanB3c3mCgo59fYl+eXp0b3BwZWRzaGd1bXR1bXR6c4N+d4d6eIZ4dYN/e4SAfYZ+d3l4cHNv + bW5ua21rbXBzdHh7eIB5dX5zb3pzb3p1b3qDfYh+eoZ/e4d7cnN1a211c3R5d3h1dXhvb3JqaGtr + aW17d3h6dXd5bm14bWt0bW91bnB3eIB+f4iEgId/e4Jyb3Bwbm9ta3Vwb3l3dIZ/fY6Gf4iGf4iD + gox9e4Z9c3d3bXB6cHR9c3d3b3JvaGppX2FpX2FuY19vZGFtY2lyaG5yZ354bYR9dYR7dIN7dX55 + c3uDeIaGeoiCd4R5bntva3d3c35+fYJ/foOAd3ptY2dkYmNwbm93bXB0am5wYmRvYWNtXFhuXVpu + YV5uYV51Y2l1Y2l1ZXJ7a3h6cHR4bnJ3bWNvZVxvYWVwYmd3Ymt7Z3B3ZGp6aG59a2p9a2p9ZWF7 + ZF9+Y2OCZ2eDZ3OAZHCAbnd/bXV9aG19aG10YmhyX2V1YWV9aG1+aW6DbnOEa2p7Y2J1XWFzW151 + Ylx6Z2F6ZWh9aGp7YVpwVk9uVUhwV0p3XF6CZ2mGcHWOeX6IdXmDcHSAaWN0XVdzX196Z2d/Z2iA + aGl/ZWJ7Yl55ZGJ6ZWN9aGh/amqAa2t/amp+amR+amSAZV59Ylt6X1iAZV6DaGODaGOGaWmEaGiG + amV/ZF9+Y16CZ2KEa2GEa2GAYVh9XVV5Wl15Wl1+X12AYl95Wk50VUl0Tz50Tz51a3J3bXN7cHl9 + cnp9cnqCd3+DeIOEeYSGd4iHeImHeoCDd317cnV/dXl+eIB+eIB9cHJ5bW54ampwY2NzZXB0Z3Jy + ZWd0aGlyZGJzZWN0aWV5bmp0aGl1aWp1a211a219b299b291b3V1b3V4bnR3bXN7amt1ZGVvYl1u + YVxvYl9wY2FvYl1qXVhrWlBrWlBtXFtrW1pyXmF5ZWh3amt4a210aGtzZ2pzaGd0aWh+cHmCdH2D + eX99c3l5d3h5d3h4dHp0cHd1cnh1cnhyaXBnXmVrZGd0bW96eId+e4t/dIJ5bnt3aG1tXmNtaXJy + bnd4dH94dH9+eIB7dX5+eIN7dYB5cnd6c3hzbm9wa21qam1vb3J6dHp9d31ybnRzb3V0c32Dgox/ + f4J7e35+dHh/dXl/e4KEgId9entyb3BqZ21wbXOEgImEgImAdHWCdXd7cHl7cHl6eX6Dgod/foZ1 + dHt0am53bXBvbXB0cnV4dYSAfo2Df4iEgImAf4l+fYdta2hqaWV3b3R+d3t3dHhwbnJwanBtZ21y + aG5vZWtwZGhyZWlwaW51bnN7dYB7dYB3coB7d4aDeoeAeIR5cndyam9zaXl9c4N+e4mAfox/en5w + a29tZG51bXd3aXJ0Z290Y2RuXV5vXl1tXFtrXV9wYmR3ZGp1Y2lwZ2p1a296bm95bW55bmhzaGJv + YmJvYmJ3YmlyXWR1XVx5YV9/a2WDb2mGcHCHcnKGcHWIc3iIcH+EbXuHcnmCbXR4ZGd0YWNuXVpv + XltzYWR3ZGh+a3SCb3iAaGd9ZGN4YVt1Xlh3X1t9ZWF6ZWV5ZGR7Yld1XFFzWkx1XE54Y2qAa3N+ + dX2GfYSGdHWAb3B+ZF15X1h0YVtyXlh9Y1+AZ2N+ZFp7Yld6YV17Yl56Y16AaWSAZ1+AZ1+CaGGC + aGF9Y1x9Y1x7YVp+Y1yCaW2GbXCIbW+EaWt/ZF97YVx6Wld/XlyDZF6AYlx5X1V3XVN3WFN1V1F3 + XVp6YV14WE51VkxyTTxyTTx3aG93aG95am95am93bXN6cHd5bnd9cnqDc32GdX+Cd3+AdX53dHV4 + dXd4dH95dYCAcnl7bXR3ZWRvXl1rXlxuYV5rYmVuZGhzaW90anB0b3N3cnVyam1vaGprY2JvZ2V3 + aG10ZWp1aHN4anV0cnV1c3d5cnd1bnNuZGVrYmNwZWJzaGRyZGJuYV5tYWJrX2FqYWRqYWRzaGd3 + a2p9b215a2l5YV93Xl11Y2d9am6Ed4SEd4SEe4h/d4N/en6Ae396eHt5d3p6cnl6cnl0anptY3Np + ZGVybW55c3mAeoCDd31/c3l0am5wZ2puanVybnl0c3p1dHt7cHt+c36AdYN7cH55cnR5cnR1bnN1 + bnNvamt4c3SDeIB9cnp3cHd0bnRzcnl7eoJ5fYN4e4J9en6Cf4OIg5KEf46GfYR1bXRwaHJ4b3mH + g4yDf4iEd3+HeYKAd3p9c3d7eX2AfoJ+eoB1cnh4bnJ+dHh6c3h4cHV9dYSGfo2Dfo19eId6eod5 + eYZwbm1oZWR3b296c3N4eHh0dHR0a3N0a3NwaW5uZ2tvZG1uY2ttaXJzb3hzb3pzb3p3b3J7dHd+ + dHqCeH55dHVtaGltZG55cHp/eouCfY2AeoZ5c350ZWp0ZWp6bXV4anN6aWhuXVxuXF9rWl1yXWJ4 + Y2h1ZGNwX15wZWR0aWh5am9/cHWCdXd5bW5wZWJoXVpqXVhoW1ZzW153XmJ/ZWuGa3KJdHmLdXqL + e4CNfoOMfYKHeH2IcneAam9zYmNtXF1qVlhvW11wY2FzZWN+bnh/b3l9aWt9aWt4X2F3Xl95ZV96 + Z2GCZ2d+Y2N7ZFx6Y1t1XFV4Xld9aG2DbnN/dXl9c3d+amN6Z19+ZFp/ZVt7Yl54Xlt9Yl2AZWF+ + ZGGDaWWIbW+Lb3KEb2+CbW2HamqIa2uHbWiGa2eCamJ6Y1t7YWGDaGh/bXCDcHSLb3KDaGp5X1N1 + XE91WE97XlWCZ199Ylt1XU9vV0l0TkV0TkVzWFRzWFR7WEZ5VkR7Uz51TTl3bXNvZWt1YWN3YmRw + Ymd0ZWp4anN4anODcHeDcHd6dXl4c3d3bm15cG9vb3J0dHeAc4B/cn91Z25wYmlvXFpqV1VkXWJu + Z2tybXB3cnV1a29uZGhjXVteWFZkWlhoXVxuXV5vXl91Y2d5Z2p0bXJ1bnNwaWttZWhqYl5tZGFr + amdvbmp1bWl0a2hrZ2hrZ2hrZGdtZWh3bXN7cniDdXV7bm57ZFx1XlZ0bXJ9dXp/fYyAfo1+eoZ/ + e4eAf4d9e4N6en15eXt7eIN5dYB0aXJqX2hpZGN0b251dXh3d3l4dH95dYB4cHVza3BzbXVwanNu + anNwbXV1bXR1bXR1cn13c359gISChomEfoSCe4J4cnp6dH1+eoZ4dH9zcHRtam5ybnd1cnp4d357 + eoJ+e3+Gg4eGhI6Af4mDeIZ7cH54anOAc3uHgIyIgo2Df4iDf4h9e4Z3dX96eYN/foh+eoN/e4R4 + dH19eYJ+c359cn2EeImLfpCAeX55cndzcH9wbn1qaGtraW14cnh+eH59eHt0b3NyaGlvZWdpYmJn + X19jWltjWltkX2FqZWdoYl9lX11lZ11ub2V5b3N+dHh1b21rZWNoXF1wZGV4aHR+bnp/eId+d4Z/ + cHV5am93am55bXB5b2VtY1pwXFxyXV15ZXB9aXR0aWhtYmFvXl10Y2J9aG+DbnWIdXuCb3V5aGdv + Xl1qWlhpWFdvVlx1XGJ7ZW2DbXSEeXiJfn2Nf4iMfoeMeYKJd3+EbnV7ZW15YWJ1XV5vXl90Y2R9 + anB/bXN9bXd9bXd3anByZWtwXVdzX1p5Yl15Yl1/YV57XVt0W1Z1XFdzXFd3X1t4ZF2Cbmd/b2d/ + b2d+a1x/bV2IcGuIcGuLa2iIaWWEbWeIcGqJdHmMd3uSdX2Qc3qRdHmLbnOJameQcG2LcnWGbXCE + Y15/Xlp+Xl+CYmN/a2WEcGqCaWh4X150VENuTj1wUE54V1V0YVp4ZF11XE5wV0luT0VrTUNyU0h3 + V011V0hzVUZ4U0F4U0F1c3Rwbm9tZWVnX19rXl5wY2NuZGpwZ213b3J5cnR5cHh3bnV0aWV4bWlz + bm95dHWAeYh/eId7cHl3a3R0ZF1vX1hrYmVwZ2pvbW5wbm9zaGRrYV1jV05kWE9nXVRlXFNjW1pk + XFtrYmhwZ21zZ2pyZWlvZGFuY19rXl5wY2Nvamt0b3B5cnR5cnR0bW90bW9yam1za255cHp7c313 + bW5zaWpvZ2FuZV9waWt/eHqDgoyDgoyCeYOHfoiDfo1/eol+eIN5c356eIZ+e4l7cnNzaWpzaW15 + b3N6dH15c3t5dIN5dIN4dHpybnR4a29zZ2prZ2pwa29wa21zbm9wbXNzb3WAhI2Hi5SGh41/gIdz + c3VwcHN6b3h9cnp6dHpwanBzbXNzbXN4dHp/e4KDgISCf4N9foR9foR/dH1+c3t6bXh/cn2DfYiH + gIyCg4yDhI2AeYh/eId4e4R6fod6eX57en9+fYd+fYd9dH56cnt6eIZ/fYuCd3V4bWtqYWRpX2No + YWFuZ2dzdH15eoN4dHpva3JqZVtpZFptXFhoV1RlVFdkU1ZjVVplV1xkXFhiWlZlYV9uaWhtaXJy + bnd4b2lzamRpYV1oX1xpXWN1aW+AeoaAeoaCc3qAcnl7b3B5bW5/b2d1ZV1wXlh3ZF54bXV3a3Rz + Z2puYmVqXV1wY2N7Z2uAa3CEdXp+b3R1ZGNoV1ZkUVFjUFBoUFFuVld3YmmAa3N/dXmEen6If4mH + foiHen6Dd3qHcnl/anJ/amp+aWl7aW96aG53anB1aW96a256a254Z2h1ZGV1XFd3XVh5Ylx4YVt4 + XlpyWFRwW09vWk5tVFBuVVFzXFd5Yl2CamSGbmiDb3KHc3WNeH2OeX6Od3KLc26Eb22Ic3CJc3iJ + c3iNcHOLbnCNa2qLaWiEaW6Lb3SMcHOJbnCIZVqAXlN4Xlt6YV17aWN5Z2F5YVRvV0puTjtvTzxt + T0xwU09wWlF1XlZ7XUl1V0RzU0RvT0BvU0ZyVUh1VEh0U0dzVEl0VUp6b3p6b3p7b3BzZ2huYV5u + YV5rYmVuZGh1bnN4cHV7cnh6cHd7bW95am10am54bnJ+cH6Ac4B6dHp5c3l+am17aGp0ZWp1Z2tw + Z2hpX2FnXVRkW1FlW1drYV1rYVtlW1VkV1dqXV1yXml0YWtrZGdqY2VuY11rYVttX1t1aGNwbnJ7 + eX1+fYR9e4OAd3p9c3d7cnV5b3N4b3l5cHp3a2p1amluaGVqZGJqY2V3b3J9e4OAf4eDeIaIfYuH + gIyEfomAeoN+eICCf5F/fY6EeYKAdX54cnh7dXt6eYB1dHt6eYB7eoJ/dH93a3d4aW53aG1/anKC + bXRyam1vaGpuZ2t3b3R/fYuGg5GEgIx7eIN1dXVubm50b3N6dXl1dHlzcnd4cHV0bXJzcnd6eX5/ + eX9/eX+DeX+Ad31+dX16cnl7cH5+c4CDfo6Ae4yEgpGIhpWGfYmEe4h9eYKAfYaGgoiHg4mEhox9 + foR5cnd5cnd3dXqCgIaAenhwamhqXlNrX1RoYltuaGF3dX9+fYeAe31zbm90aWNwZV9vZWdvZWdq + XGFlV1xjVlRoW1hfW1xhXF1nXWNtY2lwaHR3bnqDcnOAb3B3ZWRuXVxkW15nXWF0c314d4B9eYR/ + e4eEdXh+b3KCbmt/a2l5aGR6aWV9c3l4bnR0aGtvY2dvXl90Y2R5ZWN+amiAdHp9cHd1ZV5nV1Bj + UUphT0hpT0hvVU5zYWR+a2+Cd3WNgoCQg4mMf4aJc3iDbXKEanCEanCAam9/aW5+aXB9aG99a216 + aWp7aGh9aWl6Z2d4ZGR9Yl5+Y197Z2R6ZWN6Y110XVdrVkpoU0dtVElrU0huVFR5Xl5+ZGGGa2iH + cHqHcHqEcHOIdHeIcGqGbmiEbnWEbnWDbnOEb3SCaGOAZ2KAZ2KGa2eIcnmJc3qJcHKIb3CCX1R0 + U0d0WlV9Yl1/ZV54Xld+WkZ3Uz9uTUFyUEVrU0xwV1BwWExzW055WkR1VkByTkRvTEFyUUN0VEV0 + UEZ0UEZ3UUV5VEd7c397c3+Ac354anVvaGpuZ2lwZGhvY2dzZ213anB6bnJ9cHR5b3V3bXN3am54 + a293a3R3a3R5bnd+c3t/b3t/b3t3bXN3bXN3am5yZWlqWlhqWlhlWl1rX2NqYl5tZGFlXFNjWlBo + WlxqXF5jXGFoYWVrYmNqYWJtYWJ3amt4b3eAeH97eoR6eYN7c315cHp4cHV1bnN0anBzaW9yaF5u + ZFttX11rXlxnYmNrZ2h7d3V/enmCe4KGf4aCfol+eoZ7dXt7dXuCgo6GhpKIg5KJhJSCg4x+f4h7 + eoJ0c3p4cn16dH97eIN9eYSAeISDeoeAeIR9dIBza3p0bXtvZ3N6cn6Afo2Cf456eYNta3Vya3Ry + a3R5c353cHtzcHRyb3N1cHRzbnJ3dHh5d3p9c3l7cnh9dHt7c3p5dIN5dINybnl1cn2AfpCGg5WD + gpaIh5uAeYh7dIN7dYCAeoZ/f42IiJaDgol6eYBycnJqampza3B4cHV9c3d3bXByZGJvYl9qYlxt + ZF5zcnd9e4CAeIJ+dX9+cnh/c3l5dX5zb3hyZWtpXWNjWFVnXFhjW1VhWFNiVVVlWFhpYWp1bXd4 + cn15c351a29wZ2pvZWluZGh3cHl5c3t9eIeCfYyEe4h/d4OEdXiAcnR/bm1/bm2Cc3h7bXJ5Z19y + X1hwXFp1YV55ZWiGcnSGd35/cHh+ZF9uVVBhUD1cTDloTklwVlF3ZWSDcnCIeXuOf4KQgo2LfYiE + cnh+a3KAbW17aGh9aWt5ZWh5am96a3B/a2l+amh9ZGV/Z2h9ZGN6YmF6ZWN+aWd+anWEcHuIc3V5 + ZGdvV0ppUUVoUTxvWENvWFB0XVV+ZF+DaWSDbmuGcG6Db2l/a2WDaGSDaGR6Y299ZXKEb3KCbW97 + ZF53X1p0YV5+amiIdHeNeXuIbmmCaGN9Xlh4WlR1XWGCaW2DaWR5X1t5VT9zTzpvT0p3VlFyWEp0 + W016WE14Vkp1U0NvTT1zSEB0SUF4UDx7VD9zTzx0UD17Uz6AV0N9cHR7b3N4cHNza251a290am5v + YmJyZGRzZWV1aGh6bnR9cHd5cHh1bXR1bnNyam91anV3a3d1bnN6c3h9dIB/d4N9dH57c317bnl1 + aHNiXVNeWk9hWlxqY2VzaGRwZWJrXlxkV1ViVk5kWFBjVlRnWldrXlxtX11yZWd4a216b3h9cnp3 + cnV0b3N4bWt1aml0aGt0aGt3bW5zaWpwa2pybWtyZGJtX11pYV1tZGF5bm2Cd3WEfoSIgoiDgol7 + eoJzcHR1c3d6eId9eomHf5CIgJGGhI6Af4l+e31yb3B1bnN3b3R1cnp4dH16d317eH57eIN7eIN3 + cHl3cHl6cIJ/dYd/eYR7dYB0b3Bwa210bnl4cn1+dHp5b3Vyam9uZ2tuZ2tyam94a297b3N7c3J+ + dXR9dXp7dHl4dYN1c4Bwb3R3dXqCf42EgpCIhpWIhpV/eId7dIN7d4eCfY2DgJCJh5aEgpB5d4R0 + cnNraWp4a219cHJ4cm91b21vZ2V0a2p0aWVwZWJvaHd4cH99dHt/d359c3d6cHRybnduanNwZWJo + XVphVU1iVk5kWlZlW1doXFNtYVdqYmFvZ2Vya3dzbXhza3Byam90am5yaGt0anB3bXN5b39+dISA + eIR9dICAdHp9cHeCcHKGdHWDdHl+b3R+aW54Y2hwXlh3ZF57bXKGd3uLeoR/b3l7Yl5tVFBnTkBd + RThkTEdyWFR4ZHKJdYOOgIyQgo2NgISLfoKGb3d5Y2p3YmJyXV13Y2V1YmR0aGt1aW1/amh9aGV9 + ZGh+ZWl5ZGJ5ZGJ6aWp9a22Da4KLc4mRd32LcHeCX1VzUUdrUTluVDtvV0l3XlB7aGKAbWd/amp/ + amp+aWd+aWeCXlqAXVh9YmKAZWWAZ199Y1x1XVByWk1wXVRzX1aDbmuEb22CaGR9Y193YVN1X1F0 + X2J/am2CaVt5YVN3XEV5Xkd9Y16AZ2J9Y1Z5X1N+VEx3TUVvTT10UUF5UEV9VEiAW0x6VUZ0TD50 + TD55UDqAV0B6aWp4Z2h0bW91bnB5bXB4a29vY2drX2NzX2J1YmR5bW56bm94b255cG9zcHJyb3Bz + aWp0amt0b3B0b3B3c3l7eH6CeYaAeIR+cHl1aHBiX1RhXlNqX2hwZW53bXN4bnR3YW1rVmJlUEVi + TUFfT0BlVUZoWFBtXVV0ZWh4aWt5bXB5bXB4bWlzaGR3a2V0aWNwZ2p1a295cHh9dHt5dXt6d315 + bW54a210ZWp3aG11bXd6cnuAfYaGgouGgJB6dYRzbXV1b3h4c3d6dXl+eXqDfn+Mg42Hfoh+e31z + cHJyZWlyZWlza253b3J6d4J5dYB1b4Z1b4Z0b35wa3p4bn99c4R+dX95cHpvZWltY2dzanR6cnuD + dHt9bnVyZGRtX19tYmFzaGd5am9+b3R+dX2CeYB/eX99d313dHhyb3Nybnl+eoaJhpGIhJCIg5KI + g5KDeIB+c3t9eoiCf42HhpCLiZSGhI5+fYd6cHdyaG56Z3KAbXh9dXh3b3J1cHJ4c3R3bXBzaW1v + ZWtyaG50bXKDe4CAeXt3b3JybW5rZ2hrXlptX1tpV1BkU0xpXFxqXV1vXWF0YmV1aGh0Z2duZGpv + ZWtzaW14bnJ4bXh1anVyaGtwZ2p0Z296bXV7cH57cH54bXV4bXV+cnWMf4OGe3+CeHt5bm14bWtz + Yl55aGR9b3iEd3+LeoR+bnh5X1hzWlNwWEdpUUBtW1V3ZF59cn2Lf4uNf42Nf42Gend+c29/am1z + XmF0W1RzWlN1XFh4Xlt5Z2F6aGJ+amR9aWN+aWmCbW1+am1+am1+b3KDdHeLd4SLd4SSeXqMc3SD + YVZ5V01vV0RwWEV3XFd9Yl1/ZWF/ZWGDaWWDaWV5YV93Xl17W1Z/XlqCZ2KAZWF+ZFp5X1V6V1N5 + VlF0XFF3XlSDa2WCamR/ZGd+Y2V5Yl13X1t6YWuCaHOEZFqAYVZ7XFSCYlp/ZWKEameGZFCDYk5+ + VESAVkZ3U0h5VUp9W1OAXlaCXlB7WEp3Tj50TDx6Tz5/VEN3ZGp4ZWtwaWlwaWl4ZW53ZG1vYWVv + YWVvY2dwZGhua29vbXB0am53bXByb3Byb3B0am5yaGt1amd4bWl5cnR+d3mAfYh/e4eHeYJ3aXJy + ZV1yZV13aG15am94b3d4b3d5bXNwZGpuWldrV1VoXlVqYVdzZWN9b215dHV3cnN6cHJ6cHJ6bW10 + Z2d3Y2N1YmJvZWt4bnR4dH1+eoN/fYt9eoh9eHl1cHJ1Y2dwXmJkanJvdX2Cf46Cf46EeYR9cn14 + bXV4bXV+d3t9dXp7dHl9dXqAdIaDd4h9ent0cnN3aWlyZGRqaGdraWhwZ2pzaW1vZG9wZXBtaHdv + anl1bXR5cHh4bnJyaGtuYmVtYWR3Z3N+bnqAdHp+cnh3bm1yaWhvZWlwZ2ptbW90dHd9e4aEg42C + fYyCfYx+d3t5cnd1bn1/eIeIh5uMi5+Eg4t+fYSDeIB+c3t6e4KEhoyGg5KJh5aHgpKCfY2AdX56 + b3h4d357eoKGeoZ9cn13c3l+eoB+fn56enpyamprZGRwZGh9cHR6cHR4bnJ4a29yZWlyYV1rW1dt + XE9qWk1qWlhyYV90Y2R1ZGV0ZWh0ZWhyX2h3ZG15a3d+cHt7cHt1anVyaGtwZ2puaW1ybXB0am53 + bXB4a297b3N+dHqGe4KJfX6AdHVwamVtZ2JwX1x5aGSCcHKDcnODbmt7Z2R9Y2mCaG59Z2t4Ymdw + XmR6aG6Ac4CDdYOHc35/a3d6amN6amN+amN7aGF/Z1x9ZFp3YWV9Z2uAam+Aam99aGh9aGh9aGV9 + aGV5aGl7amt7amuAb3CCdH2Ed3+MeneCcG1/ZVh/ZVh9Xlh+X1p4YVt7ZF6EbWiHb2qNcm2Ha2d6 + Y1FvWEdzWk13XVB/ZGGDaGSEal99Y1h7Vkd9V0h4XlR+ZFqDb2WAbWOCamV+Z2J6XVR9X1Z+XmSG + ZWuGZ2SJamiGamqHa2uGameGameHZ1uIaFyEYU5/XEl7VkV7VkV7Wk6CX1SMYlaDWk59VEZ5UEN7 + Vkl+WExlV1ppW11vXFpuW1hvW19vW19qXGFtXmNtXmNtXmNtYWdyZWtyYm51ZXJ6aHB6aHB5ZGt4 + Y2p1aGV3aWd3bW57cnN/d4CCeYOCc3h5am91aGVyZGJwa2pzbm16dHp7dXt5dHV0b3ByZWl0aGt5 + am19bnB7dHR/eHh7dHd9dXh9dXh9dXiHdHiCb3N6aWp0Y2RzaW94bnSEcICIdISGgJCEf45/ent4 + c3R4ZV9zYVtrZXB1b3p+e4t+e4t+eH56dHp9cHd/c3mDeICDeICDdX6CdH19dH59dH57eX15d3p6 + dG91b2pyampqY2NoYWNqY2VnYmVqZWlrY2pvZ25wa290b3N5bmp0aWVuY11uY111a296cHSAeXuA + eXt7d3h6dXd5b3N1a29waGd3bm2DfYONh42Mho6DfYaDd32CdXt5cId+dYyHhpqLiZ6Dgox+fYd7 + eIN5dYB0dXt7fYODgJCJh5aGgJF/eot5eoB3eH57en+Af4SAd3p7cnV5dHiAe3+CfoR5dXt5am1u + X2JrXWJzZGltZ21vaW93amt4a214bWl1amd4ZV51Y1xyX1p4ZV93ZWJ5aGR0Z2d0Z2dyY2V0ZWh4 + a3J/c3l+bnh4aHJuYmVwZGhrZ2prZ2ptZWVtZWVyaGl1a214cnp+eIB+dHp5b3VyZWdqXl9tWlN1 + Ylt6aWp+bW5+a2V7aWN4a3J+cniAdHV+cnN7aW17aW2Cb3iEcnqAb3B7amt3aWR7bmmDb22EcG6G + cmuEcGp6bXV7bneCa3iAaneCaG5/ZWt5ZV93Y113Yl90X115YWKCaWp/cHWCc3iLdXWLdXWRcm6R + cm6Jb2iGa2SGa2SIbmeOeH+UfYSWgICMd3eHaVx+YVR1Vk57XFR+aG2Ca3CGameCZ2OCZFiCZFiA + a26HcnSLd3eHc3OEamN7Ylt4Vkp5V0x3W1t+YmKEaGqJbW+Eb2+Eb2+Ha2eDaGODaVyEal2EZVR9 + Xk16VkB6VkCAXFWEX1iMYViEWlF+VER6UEB7U0eAV0xrVVBvWFRpWlNqW1RuWlptWFhwWFpvV1ht + WFtuWlxvWl5wW19vW2J0X2d0Ymh0Ymh7Z2t6ZWp0YmV0YmV9am6EcnV+eX19eHuDb297aGh1ZGN0 + Y2JyaGl6cHKAdX6Cd39/c3d7b3N4a3J6bnR7b3N+cnV6eHl7eXqEeHuGeX2GeX+AdHqGeICHeYJ/ + c3d6bnJ+a3KCb3WCbnmEcHuHeoyJfY6Cf4N3dHh1aGVyZGJqaGtzcHR7dYB6dH94dH14dH13bnV5 + cHh7c32AeIKDeX+CeH5/eH1/eH19dHuCeYCIfn+DeXqAdXR3a2pvZWltY2doYWVqY2hwZGVtYWJz + bm97d3iAd3p+dHh4cm11b2qDe4CCen9+e39+e3+Je4SGeICCen91bnNyYWJ0Y2R1eHmGiImHh4mC + goR+dHh7cnV1a3+Ad4uLgpmLgpmDgI59eoh1dH5ycHpycHV6eX6DgI6Jh5WIg5Z/eo14dYN1c4B7 + d4aAe4t7d3h4c3R4cHN9dXh/en57d3p4bWltYl5oV1htXF1lXF9oXmJzZGl5am94bnJ6cHR5bW55 + bW54bWl7cG16b2l6b2l+amh6Z2R0ZWp4aW54bXV1anN5bXB3am5vYmJuYWFtYWJtYWJtY2dtY2du + ZWRwaGd4anV7bnl7b3V1aW9tX1tpXFdrWE9uW1FvZGN3a2p5bm15bm1+b3SDdHmGeHOAc25+bW5+ + bW59bnB+b3KAbWp/a2l3b3J6c3WEd3+GeICLeH6LeH6Ed4SGeIaJcn6Hb3uEaG+AZGt+Ymd9YWV6 + YmF4X15zX2J4ZGd+aW6DbnOMd3mQen2ReoKVfoaUe3WOd3CIc3OIc3OQeISZgI2ahImSfYKIcGh6 + Y1t7W1iCYV6Ga3eHbXiGam2Gam1/bm2Ab26IdX6LeICMdX2IcnmNaViEYVB9W1B7Wk91Wlp/Y2OA + a2uEb2+Hb2mGbmiIamGHaV+Ial6HaV2JY1aGX1N/W1CEX1WGYl2HY16JZFp/W1B5UT11TjpwTkB5 + VkhuXFZwXlhtX1twY151Y11vXVd0XFtyWlhtW15tW15tXF1uXV5vW1t3YmJ1aGh4amp7cG95bm1v + Z2VwaGd0bXJ5cnd9eHl+eXqCcHJ7amt0aF90aF9zaWp6cHKAc35+cHt7bm56bW15bW59cHKAdHWD + d3iCe4KCe4KGeICHeYKEeHmCdXd+eX2DfoKEd4KAc35/c3l7b3V6a257bW+Cc4SGd4h7eoJzcnlz + a25waWtyaG55b3V7cH55bnt5cH13bnpwcHNwcHN1bXR5cHh7cHuAdYB/eId9dYR+d4aDe4uDfYaI + gouLfoKEeHt6cHRzaW1wZ2puZGhuYmVrX2NuanCDf4aMf5WGeY57eIN1cn2CeIiEeouDeIOEeYSH + gImIgouHg4l5dXtyXWJyXWJ0c3qGhIyHg4l/e4KAeHR+dXJzbXh7dYCHfZGLgJWGf4t/eYRycHht + a3N1b3h7dX6AfoyGg5GIhpV/fYx0cHlwbXV+c36AdYB5d3h3dHV4cHN9dXh5d3V6eHd5b2VvZVxp + XVRlWlBoW1ZpXFduZGh1a297b3V9cHd5cHh5cHh5cHh9dHuEeHmDd3iDdXN7bmt3bXB1a299bXl1 + ZXJ3am50aGtwXV9uW11uXF9wXmJtYWJtYWJqYmFtZGN4Y2p5ZGt7aW10YmVuXFNoVk1qV1FvXFZ0 + X2R6ZWqCbXR/anJ5a3d+cHuHc3WAbW96bm94a22Aa3CCbXJ+am2CbnB/cn+DdYOMeIaMeIaNeIKM + d4CGeICGeICGd35/cHh/a259aWuDaGp/ZGd1YmJ1YmJ1Y113ZF57Y2eCaW2HcHiReoKQgIaSg4iS + foCJdXiHbm+LcnORdYiafpGWgpCMeIaIcGiCamKAZ2OAZ2ODcHeCb3WHbm2GbWuJcHSJcHSJc3iL + dHmMb2+GaWmLaF+EYlp5V1p5V1p0WF17X2SCZ2KIbWiLcGOGa16Eal+Eal+Eal+Ga2GJZ1uIZVqC + YV6DYl+HZWGEY16OZFSIXk59UzlySC9ySThzSjlyYV13ZWJzaGd1aml1bWl0a2h6bW15a2t1amlz + aGdzZWVwY2N0Y2R5aGl6bnR/c3l7dHd1bnBva2hwbWl0bnR5c3l7eIN6d4KCbXJ/am90a2p0a2p1 + b215c3B5b3B3bW56bWp7bmt6bnJ+cnV6cnl6cnl9dICCeYaGeoOCd3+Gd3t/cHV7cHl+c3t/dH17 + cHl7cnV3bXByampyamp/b3uDc395cnd4cHV3am53am5yZ291anN4bnR1a3J0anB1a3JtaW9taW9r + ZGRvaGhza3B6c3h7eoJ6eYB+eIOAeoaEeouIfo6MgIyIfYh7eIBzb3h1anVwZXBrZGRpYmJuanWA + fYiNhpWJgpF4dH93c35/eYR/eYSDdYOGeIaIgJGNhpaDhpJ5e4hua21qaGl3c35/e4eMhpGHgIyE + fYJ+d3t0bW94cHN/dIKIfYuJg46Efol1dXVzc3N1bXR7c3qDfYaJg4yHhJZ+e414c3Jzbm14b3d5 + cHh+eX19eHt1c3R3dHV5d3p3dHh4cGd3b2V1aV1vY1duXlZqW1NpYmRza256bnJ5bXB4bnR6cHd7 + cnWCeHuGfYSEe4OIenWDdXB+c3J5bm17aHN7aHN7aW13ZGh1XVxzW1pvXF5yXmFuXV5vXl9vYl9v + Yl9zX195ZWV3aWRyZF9wXVZwXVZ1Xlh7ZF5+am1/a26Aa3B/am9+b3KAcnSEc3SAb3CCcG2CcG2I + dHeGcnSAbnSCb3WDbniGcHqHdHqGc3mIdXmGc3eGd3uIeX6Jd32AbnR+aWt6ZWh+aWd6ZWN1YWF0 + X19wXVtyXlx1XFd/ZWGEbnOSe4CRgomSg4uSfniJdW+GZ2GLa2WNdYKSeoeSeoeMdICLcmeDal9+ + aW6CbXKEc3SCcHKEa22GbW6IbnSJb3WJcG+JcG+Lal6IaFyCY2F/YV5/XFp7WFZ5W1h+X12GZGKI + Z2SLaF+HZFyDZF6CY12EZV+HaGKHZFiDYVV+XViCYVyHY2GEYV6MYVCDWEh+VDx5TzhyTDNzTTR5 + ZWh7aGp6anR7a3V6dHp5c3l+dHh7cnV5cnR4cHN4aWt1Z2l3aGp5am1+c3uAdX5/dXd5b3BzaW10 + am53aG99bnV3c3l1cnh/cHV9bnN/cHV9bnN5b3N5b3N4bm93bW5+bWuCcG97cG97cG94bm90amt7 + bW9+b3KGeoODeICJeHmEc3R6bnR5bXN9anB6aG55bm1zaGdtY2duZGh4aW59bnN9cHR+cnV7bmt6 + bWpvZWlvZWl0aG53anB3am53am5zZ2pzZ2pvZWdwZ2hvaml3cnB+eX1/en6He4SCd3+AdX6DeICD + fo6Ef5CAfox7eYd4cn1rZXBvZF5vZF5wb3R/foOMhJeEfZBua3pzcH96eIl5d4h+dYKCeYaHepCO + gpeIhpWCf451c3Rwbm96cICDeYmLg5KMhJSHgId/eX90bXJ1bnN5cHqIf4mLhJCJg456e4R1d39y + b315d4R/eYSLhJCGg5GAfox9eHd1cG9zb3V6d31/eYR+eIN5dXtzb3V4dXd4dXd6dXd6dXd7b3N1 + aW1zYlVvXlFtYWRzZ2p4a215bW56aWh7aml6a26AcnSHe4mJfoyMfomMfomDeX1+dHh6aG55Z214 + aWt0ZWh9ZGN6YmF0YVpuW1RpWlFqW1NvXFxwXV11XVx7Y2J1aGh1aGh6Y1t7ZFx5ZWV/a2uCc3iG + d3uGc3eEcnWGcHOGcHODdHmGd3uNfoCMfX+Oe3+Jd3qAcnd+b3SCbnCEcHOAdHh+cnV6cHR7cnWG + d36IeYCEdXp6a3B9ZGN7Y2J3Y1p3Y1p3XFxyV1dwXFpzXlx3Xl+AaGmEcH6Qe4mSf4aSf4aSeG2I + bmN/ZGSHa2uMd3uRe4CRd32Nc3mEbWSAaWF/bm+DcnOLc26GbmmEaWmGamqHbm+Hbm+IbWiJbmmO + a2GLaF2EZ12AY1qAXlR9W1B6Wld/XlyHZWOJaGWLZ2KGYl2AX1uHZWGHaV2HaV2JaFiCYVGAXFGE + X1WDYViEYlqGXUiCWkWEW0SEW0SCXUmCXUl+b3SAcneCc3iAcneDeoKCeYCAd32Ad31/eHh9dXV5 + b3N5b3N7b3V9cHeAdYN/dIJ+eoB6d311a29zaW11Z2t3aG1waWt3b3J+cniGeX+IeIKEdH6AdHh+ + cnV7cHl5bneEcHCEcHCAc3N/cnJ7b3B4a217cnN/dXeHfYOGe4KEeoB9c3l5bmpzaGR3Ymd4Y2h1 + YWFwXFxoWlxpW11vYWV5am+AcnSCc3V+cnN4a21vZ2VtZGN0amt3bW55cnJ0bW1zbm90b3B4bXV3 + a3Rwbm90cnN7cnWHfYCHgoZ/en51bnN5cnd/eIiEfY2Hf5CIgJF7c3ppYWhoXVpuY191dH6DgoyJ + fYOAdHpqZWRqZWRubXJwb3R0c3h4d3uCfZCHgpWRh5eGe4x9eYJ9eYKEe4iJgI2MhJSNhpWIgJGD + e4x4cnp4cnp7eYeDgI6Lg5SMhJWEgIx7eIN1cn14dH+Ae4yGgJGIgJGHf5CGgIR7d3p6c4OHf5CI + go2HgIyAeH96cnl7cnh+dHp+e3+AfoKGgIJ6dXd3aFpvYVNzYmN1ZGV5am16a26CaWqDamt9aG9/ + anKDdYOMfoyNgJaOgpeNgISDd3p0amtvZWdyY2p3aG9/a257aGp4ZFtvXFNrWlNrWlNvXFVwXVZ5 + Yl17ZF94aF96amJ/a2mAbWqAc3OGeHiEeoCJf4aHen6EeHuAcnmCc3qHdH2NeoOOg4yNgouSf4aI + dXuEcHCGcnKCcnuEdH6Dd31+cnh7aW1+a2+DcHeHdHqEeHl+cnN+amF/a2KAb25/bm17Z2d0X19z + YVt0Ylx9aG2DbnOJeYiNfYyQgIONfoCEcmR9al16Z2eHc3OLfoSQg4mQd3iIb3CEbWSAaWGAbW2D + b2+Jb2uHbWmCZ2KDaGOIa26Ia26JbmqOc2+UdHKRcm+Jb2qGa2d+X057XUx9WleCXlyEZV+HaGKI + Z2KEY16GYl+OamiMaV6Nal+LaVWHZVGDY1eHZ1uIZFaIZFaMZ1OMZ1OMZViNZ1qOalqUb16CdXmD + d3qGeX2Dd3qGeoOEeYKHeYKGeICHeoCGeX+CeHt/dXl+dHV+dHV9cnp5bnd4eYJ1d391a21uZGVu + YWFvYmJvaGh4cHCCdH+HeYSGe4KDeX+Cc3V/cHN+b3d/cHh/dH2Cd3+EeoCCeH59dXp6c3h+dHiA + d3qAfYaAfYZ9e4B3dXp4b251bWt0ZWhzZGdvXltuXVppXVFoXFBvXWF+a2+HdHqJd317d3h4c3Ry + am1yam15cnd7dHl4dXdzcHJ0bnd6dH16d4J5dYB1eHl3eXqCdXuNgIeIg4eAe395bXN3anB3bnh/ + d4CCgIuCgIt9c3RtY2RpYmJza2t9eoiAfoyDdXV7bm5yampyampvam5uaW1zbnJ0b3ODe4uGfo2G + gJGDfo5/fYuDgI6HhpCIh5GMhJWMhJWDgpZ9e5B5c356dH9+e42Cf5GDfpGIg5aGgot/e4R5dYB5 + dYB+e4l/fYuGfo2Gfo2JgI1+dYKAdIeIe46LgoyGfYd9dH56cnuAbneGc3uDgoyIh5GOho2DeoJ+ + b3R5am91bnB4cHOAcnmAcnl/dHN/dHN/cnJ7bm57c32Ee4aGf5aMhp2OhIuIfoR+bW53ZWduZGVz + aWp/cnJ7bm59aWd5ZWN0YlxyX1pwYVpwYVp1ZGF7amd/b2iAcGmDbnOEb3R/d36GfYSGf4aIgoiG + e4KDeX+Gc3mEcniAd3qHfYCIf4eMg4uQgIiHeH+Jc3iLdHmCeYaDeoeLd4KEcHuAa26CbW9+a3SA + bneAc3ODdXWHc3CJdXOLdXWGcHB+amh4ZGJ3Y1x3Y1x9Z26Gb3eHdYiOfZCSfYSNeH+EbmJ/aV14 + a2+CdXmJe4SQgouRdXWMcHCEal+CaF2AbWqEcG6JcHKIb3CIaWOIaWOQbm2Qbm2OcnKRdHSSd3OS + d3OJdW+Hc21+ZVF7Y097XFGCYleDaVuDaVuEaWKAZV6CaGSHbWmLbV+Nb2KMa1+Ma1+Ia1uJbVyM + aFeMaFeMaFWMaFWOamWUb2qUc2qWdW2AdHiDd3qAd32Ad32Hd4OGdYKIdH+JdYCIeIKHd4CEe4OC + eYCAeXt+d3l9c3R7cnN+eIB/eYJ5cnJuZ2dtZGFvZ2N3bXB6cHR/eX+Ce4KHen6GeX2CdXl/c3d/ + dXuDeX+Gf4iHgImEe4aEe4aAdYB/dH9+eX17d3qAdX6AdX6CeHt+dHh6bnJ6bnJ4a211aWpvZ2Nt + ZGFwZFhzZ1tlZF5vbmh9c3l/dXt+dHh9c3d4bnJ3bXB6b3iAdX6AeX5+d3t3cHl4cnp0d4N0d4N7 + en9+fYKAeoCGf4aHg4x+eoN9b3p5a3d3bXCDeX2GhIyEg4t9dXVyampoaW11d3qEg41/foh9dXV4 + cHB/c3l/c3l5bXB6bnJ1c3d0cnV+foCDg4aDgJKEgpSCf46Cf46HhJSJh5aJgpGLg5KDfYh/eYR6 + b3p6b3p7c4l/d42Dd4iIe42GfYeCeYN7c313bnh1dH53dX+AdYOEeYd7eIN4dH93coR/eo2He4R/ + dH14bnR5b3V+cniEeH6Ng5WQhpeQiZKAeoOEd4J9b3p5bnd9cnp/eHp+d3l+eXqAe32Lfn+GeXqA + dYN/dIKId42Ne5KMgI6IfYuEb3R6ZWp5Z2p7aW1+cnN+cnN+c3J5bm13aWd0Z2R1ZGF1ZGF7amuD + cnOAcnR/cHODdHmEdXqDfYiHgIyJgIiIf4eEen5/dXmAbnKAbnJ/cnKDdXWIf4eIf4eQfYOEcnh/ + cHiAcnmEeYeJfoyQe4eHc36GcnSCbnB/aXB/aXCCa3OLdHuMd36LdX2JeHmGdHWDb2l7aGJ5Ylp4 + YVh6YmODamuGb36OeIeNeHqJdHeAbWN/a2J+b3SDdHmOeISSe4iQdHeJbnCAZ1+AZ1+HbWiMcm2J + b2uJb2uMcGmLb2iLcnCJcG+NdHWReHmSeX2Qd3qIdG6GcmuDZ1aAZFSAY1aEZ1qGa16Eal2CaVyC + aVyGamOJbmeNbWSObmWLbWGLbWGLal+JaV6OaFuOaFuIaVeLa1qScG6Vc3CZdG+adXCAcneCc3iD + dYODdYOLdIOJc4KGd36DdHuDd32GeX+EeYSCd4KEd3+DdX6AeHeCeXh9eX9/e4J/dH15bnd4cHN5 + cnR6b3p7cHt9eHmCfX6De4CDe4CAd3qCeHt/en6Ef4OHfoaIf4eEeoCDeX+DdX6Ed39+dX99dH5/ + c3d+cnV+dHV9c3R/dHN/dHODcnB/bm17bXJ7bXJ/a2t+amp1aml5bm14cHV5cnd7cnh3bXN5a2l6 + bWp/c3mGeX+Deod/d4N3cnN3cnN1c3d7eX1+eoB9eX95eH1+fYJ/eId+d4Z5cH10a3h1cHSDfoKD + hI2HiJF5eoNvcHl3bniEe4aLhI2Ce4R9eYKAfYaGgouAfYaDe4CCen+De36AeXuDgI6AfoyDf5WA + fZKGe42IfpCCgpCCgpCEfY1/eIh7cHl6b3h3aGpzZGdya3J1b3V6b3qCd4KHeYJ/cnp+a297aW11 + anN5bnd9cHeAdHp3dHh4dXl9eX+CfoSGfn55cnJ4amp6bW19dHuEe4OIg5SLhpaUhIyLe4OIe4KH + eoCEdXqGd3uIeXuJen2CfX6GgIKLgomJgIiNeoOIdX6HcnuLdX+Mg4uIf4eHen55bXB5am2AcnSH + eHqEdXh/dHB9cm56Z2l6Z2l9aWN9aWN+cnWEeHt+dHh7cnV/cnqDdX6EfomIgo2Lf4iMgImGeXp+ + cnOAa2t5ZGR6Z2eIdHSJfomLf4uNeH+Eb3eEb22Hcm+IeoaQgo2Qg4mLfoSLdXiHcnSAaGt+ZWl+ + aXCEb3eMd4CNeIKNeHiIc3ODa2d7ZF91Xlh6Y119ZWGDa2eLdX2Md36Mc3SGbW6AaWR/aGN9aG2A + a3CIc3qLdX2Mc3eGbXCCZ2l/ZGeDammIb26Jb2iJb2iMdG6Od3CJdHKLdXOJdXiLd3mLdXiJdHeL + b2uEaWV+YVV/YlZ/ZV6IbmeJcHKEa22La2WJamSEaWKJbmeNbWSNbWSMbmSLbWONbWSMa2OOZ16N + ZV2QblyRb12Ub22RbWqRaGWRaGWCc3qCc3qEdICHd4OEd4KCdH+EcnqDcHmAdHqAdHqEd3+Ed3+G + eX+Ie4KDe36EfX+DfYOHgIeHeoCCdXt6b3p6b3p1bXRzanJ3bXN7cnh9dXqAeX6GeX+GeX+Ce4KE + foSHe4SEeYKDeX9+dHp+cnV+cnV9cHd9cHd7b3OCdXmAd3iCeHmEdXqEdXqAdX6AdX6GeX2EeHuI + dXmCb3N7amt9a217cG17cG17bm59b294aW57bXJ9dICDeoeEeYKAdX56dXl0b3Nyb3B4dXd/eH1+ + d3t6c3N1bm55a3d4anV0bXJza3Bwb3R6eX56eYCAf4d5dXtzb3V3bnqCeYaIgJCCeol7d4aDfo2H + hJSGg5KDfo2Dfo2Gf4iHgImDf4uAfYh7eYh4dYSAdYCAdYB9eoiAfox/d4B/d4B/cnp7bnd1Z2ty + Y2h3am56bnJ4cnh7dXuGeX99cHd5bW59cHJ6bnJ7b3N4bXV6b3h5d3h7eXp/foOAf4SAe316dXd1 + a216cHJ+dISIfo6LiZGIh46NgIeIe4KIfoSJf4aIe4KJfYOLeoSLeoSAfoKAfoKHfoiIf4mIeIKE + dH6AcneHeH2JgoeLg4iHf395cnJ7b3B+cnOMeX2MeX2Je3uCdHR7amt6aWp/amiAa2mCdXuIe4J+ + d3l9dXh7bnmAc36EeouHfY2Lf4iMgImId3WAb256aGF6aGF5a2mHeXeHfoaJgIiMeX+EcniAbW+E + cHOGdYKLeoeOf4SLe4CId3WGdHN6a253aGp4aW57bXKHcnmLdX2MdG6IcGqGbWuCaWh9Y16CaGN+ + a2WEcmuJdHuJdHuLcnWGbXCAZ2KAZ2KCZW2HanKLcnWMc3eIbW+DaGp+ZF2CaGGGbWuIb26Nc2+O + dHCNdHONdHOJdHKLdXOIc3CNeHWUdHKOb22GZ2GDZF5/ZVuDaV6Ha2iSd3OOeH2Jc3iIbl+EalyD + ZVqLbWGObmKMa1+ObWiObWiLal+HZ1yGZV2GZV2Nal+Oa2GUa2OQaF+QZVqQZVqAcHqCcnuDdYCE + d4J9dH57c31+cH5+cH57cnh6cHd+dHp+dHqGdX+IeIKDeoKDeoKCe4SGf4iEe4N+dX15bnd1anNy + aGtwZ2p0aWh9cnB/dXeEenuHeYSGeIODeIaDeIaCd4SCd4SAd3h+dHV7dXN4cm9+cHB/cnJ6cnuC + eYODfYOEfoSIeoaIeoaHfoiIf4mIgouHgImIfYiAdYCCc3V/cHN+d3d9dXV7b3N7b3N1aW99cHd/ + dYaDeYmDeoSDeoR/eX95c3l4c3R1cHJ5dHV5dHV3am5zZ2pwZGVrX2FtY2luZGpwZW55bnd4cnh7 + dXt4bXV0aXJ1aXp7b4B/eYSAeoaAeIKGfYeGg5GHhJKEgIyDf4uIfo6LgJF/e4d9eYR6dHp3cHd6 + cnt6cnt4dYSAfo1/dYZ9c4OAc4B/cn93b3R0bXJ6a3B4aW5zbXN5c3l+cnV6bnJ1bXR4b3d9cnp9 + cnp5cHh5cHh1cnh5dXuCgIaEg4iDe356c3V5cnd+d3uCeomEfYyEf46Ig5KJhIiHgoaLhI2IgouL + eoeLeoeIgIaLg4iGf4iDfYaGeIaEd4R/dH9/dH9/d4OCeYaJg4mMhoyJgoKAeXl9c3eAd3qQgIaS + g4iOgoaDd3p9b210Z2R6aG6AbnSJeoKJeoJ/c3R9cHJ4a297b3ODeICHe4SQgo2LfYiGd3l+b3J4 + Z2V7aml+cnWEeHuIfYuJfoyOeYOGcHp+b3KDdHeIdH+JdYCOe4SJd3+HdXeHdXd+cnh4a3J9aG2A + a3CEbnqHcH2EcmuHdG6GcnKEcHCEa22Hbm+DbnWEb3eJdHmIc3iIc3OGcHCAbWN/a2KDaGiIbW2N + bmuQcG6Ha2d/ZF96YVODaVuDb2WHc2mQdXuQdXuRdHeMb3KLcnWOdXmOdXmReHuSd3KMcGuEZFyA + YViDY2SLamuLb2+WenqWeX6Qc3iLal6EZFiCYVyGZF+MZWSSa2qScGuScGuIal2CZFd/YlaAY1eL + a2WLa2WSbWOUbmSUaF+RZV16bXp9b311bXd3bnh3b3R3b3R6b3p4bXh7cG95bm14b256cnCAcnmG + d36Cd4KCd4J9eYR/e4eAeX59dXp6a25wYmRyZGR1aGh1bnOCen+HeYKJe4SHe4eGeoaGeIOHeYSC + eIiGe4yHe4SDeICAeX59dXqAd32Ad31/d4OCeYaAe4uGgJCIgouIgouMg4uJgIiIg5KHgpGNg5WE + eox/e4eEgIyLhomHgoZ7e3tycnJyZWd0aGl4b3l6cnuCeomAeYiAeoB+eH59eHd4c3J1c3R0cnNw + YmRvYWNoYWNlXmFlXF1oXl9vXWF5Z2p3bW54bm90aGt1aW1wYmlzZGt3bXB9c3eAeIKEe4aIhpSE + gpCCfYCEf4OLgJGMgpJ/fYt5d4R7c314b3l5b396cIB3c4h9eY56d4J1cn19cnqAdX57eIN1cn13 + bXBtY2duZGVzaWp1aWp5bW50anB3bXN7eYd7eYd6cn51bXlycHp4d4CEe4aJgIuEfX+AeXuDfYOG + f4aCfYx+eYiCfoeIhI2If4mMg42LhIuGf4aEeoCGe4KGgISIg4eLhI2Gf4iHfYB9c3d4cnp7dX5/ + eomCfYyGg5GLiJaRiY6EfYKAdYOHe4mQgpCShJKViI6NgId/cm11aGN9aG+DbnWMe4aMe4aAeXt3 + b3J7amt+bW6DdHuNfoaOf5GJeoyHeHp+b3J+amqEcHCCc3WEdXiJe4SHeYKGcHiDbnV9bnN/cHWG + b3eIcnmJdHmDbnN/cHWAcnd9bnV9bnV/cHWEdXqIdXuHdHqGeHWHeXeIdHSHc3OHbm+GbW6AcneD + dHmIdHeJdXiLdXiGcHOEb2+HcnKHcm+Ic3CMcHCJbm6Ibmp+ZGF7Yl6CaGSCb3OMeX2MdXqLdHmL + b2uIbWmJa3OOcHiUdX2WeH+UeHiOc3OHbWKEal+EaGiNcHCReHuWfYCWd3OOb2uLaVqIZ1eCX1WG + Y1iHZ2iQb3CUeHOUeHOLcmOCaVuCY12IaWONdHWWfX6deHeXc3KUb2GRbV54aHJ4aHJyaGtyaGt1 + aWp6bm9+cnh7b3V7bW97bW95b3B6cHJ6cHd7cnh+bnqCcn5/eX+AeoCEd3+Ac3t5b3B3bW55bXN9 + cHd+eoOEgImHf4SEfYKGfoOHf4SHe4SEeYKEeYeGeoiIgouGf4iGeoOHe4SEe4ODeoJ/d36DeoKH + e4mJfoyJf5CMgpKMho6IgouLh52Df5WHfoiAeIJ6eIaAfoyMho6Mho6Cf4N4dXlyZGRwY2N0aGt3 + am5/c3d/c3eAeISCeYaDeX2DeX19dXh7dHd3amt1aWpvY2dpXWFpV1FqWFNjYlxubWd5cnR6c3V4 + ZWt1Y2ltX19tX19wZGh9cHSCeYOEe4aDf4uAfYiGeoaIfYiHfY6DeYt4c4JybXt3cHd1b3V3cnV4 + c3d6cIB+dIR3c3t3c3uCeYCGfYSHfoiDeoSAd3p1a29zYVtwXlhvZGF0aWV3am59cHR+eH6DfYOD + eIN5bnl0b354c4KDeYmLgJGHfoiGfYeJg4yLhI2Ee4Z+dX+HgImJg4yJgIuMg42LhIuHgIeCf4OE + goaEgIeEgIeEgpCGg5GMgoaGe397c3p7c3p5d4R7eYeDe46JgpWQg5WJfY6IeYuRgpSQh5SOhpKU + iZCLgIeCdWt6bmR9aG+Eb3eLeoeMe4iGe397cnWAbnJ9am5/c3mIe4KNfYmJeYaNeXmIdHSDb3KD + b3KDcHSEcnWJeYOIeIKIdXl/bXB+aWt+aWuCbXSDbnWEc3R+bW5/bXWCb3iAbnSGc3mGeX+JfYOJ + d3qJd3qNe32LeXqJdXiHc3WIbXKIbXKCc3WGd3mJdXWJdXWNdHWHbm+IbXKLb3SHc3WGcnSIa2uH + amqDaml+ZWR7Y2J+ZWR+a3SIdX6ReHuLcnWEaW6Ha3CHanSMb3mRd32UeX+Re3uJdHSJb2iHbWWG + aWuJbW+OdHqQdXuRcm+La2mHZFyDYVh9XVGDY1eIaGmVdHWWeXuUd3mScGGLaVqIZGKOamiQd3ia + gIKheXWZcm6RbVyQa1twZ2pvZWl0Z2J0Z2J6aGt+a2+Acnd9bnN9bnB9bnB5b3N5b3N7cnV9c3d+ + a3KAbnSDe36De36De4t/eId7eIN7eIN6dYZ+eYmHfouJgI2Jg4mLhIuLgomJgIiEgId+eoCEfoSG + f4aIgouLhI2LgoyIf4mHf4KGfoCHen6JfYCGgISEf4OIfo6Ifo6Dfo2Ef46GgJR+eYyAdX59cnp5 + dX6AfYaNg5SNg5SGgo16d4J5ZWVwXV1vZ2N0a2h6c3N7dHR/dH+Cd4KEfoSIgoiCgoSDg4aAd3h4 + bm91aWpvY2RtWlRqV1FoY2R7d3h/dXt6cHdyY2hqXGFnW1FoXFNrX2N9cHSAdYOEeYeAf4d6eYB7 + d4Z/eomCeIl9c4R0a3NyaXB4cHV4cHV5d3h6eHl7c31/d4B6cn5/d4N/foiCgIuIh46Hho2EgoZ6 + eHt7amd3ZWJwY2F3aWd+cHmGeICAfYaHg4yGgIR7d3p4cn14cn2AeYiMhJSHhJKDgI6LhpWJhJSH + eYJ+cHl+eoaCfomNh42Nh42Lh42IhIuHgIeHgIeIfYaGeoOGf4iIgouQgo2OgIyDd319cHd7cHt/ + dH+CdYiHeo2HfY2Ge4yMeo2UgpWNiZWMiJSUjJGNhouHe3V6b2l/Z2iEa22IeoOOgImNfoOGd3t6 + a254aWt6c3WAeXuJen2MfX+SfoCQe36JdHmIc3iDdHeEdXiHeYeIeoiLeXh+bWt/ZGd+Y2WAbnSE + cniGdHWDcnOCbXKDbnOCb3WHdHqHeYKIeoOIe32Ie32Jen2MfX+Me3OEdGuHbm+LcnOLdXqMd3uI + d3OGdHCHbnKGbXCGcHCDbm6DbmuCbWqEa2qEa2qGaWmCZWWAZGeCZWiDbXSGb3eLcnCHbm2GZWmE + ZGiEanCHbXONd36QeYCHeHqCc3WHa2iIbWmHbWmGa2iLb3SOc3iMbWeDZF5/W1R9WFF+W1iGYl+E + Z26UdX2Xd32Uc3mVaWSJXlp9Yl6IbWmQdHeXe36adXCSbmmOZ12OZ11uX2dvYWh3Y2V5ZWh5Z29/ + bXWAdHiAdHiAc3OAc3N9dHN9dHN9dXh7dHd6cHR7cnV/d36CeYCAd4d/dYZ+d4Z/eIeEeoyHfY6J + foeLf4iIf4mLgoyEg42Eg42HfoiCeYOCe4eCe4eDfpGIg5aNhpaJgpKHhIiDgISDeICEeYKEeYKD + eICDfYODfYODfYOCe4J/d359dHuDdHmCc3h7eH6Df4aLgoyIf4mAf4l9e4Z+cGt6bWh7cG99cnB+ + dHp+dHp/eX+Ce4KAe4uGgJCIiZKMjZaHhIiCf4N7cnNzaWpuX2JwYmR5cH1/d4ODd316bnRqY1pk + XVRqXlZuYlplXF1zaWp5bnl+c35/dH1+c3t6dHp+eH6AdYN3a3lvbW5tamt0b3N7d3p9eId7d4Z5 + dYB5dYB9c4N/dYZ9eoyAfpCHhJaIhpeJhpGCfol+c3J6b257b3B6bm+AeYiEfYyGfo2IgJCJgIiD + eoKAcneCc3iAe4yIg5SOh5eJgpKRh5mQhpeGdYJ6and6cnl7c3qGgo2MiJSGgouCfoeEfYyHf46J + foeCd3+GeX2JfYCHhouGhIl+fYJzcnd5bXN/c3l+c36DeIN/eYSCe4eAeYiGfo2If4mQh5GSjJKM + hoyMf4B+cnN+amSCbmiEeHuOgoaOgoaDd3p6bW14amp4bnKDeX2LgIKRh4iNg4mQhoyOgoaIe3+G + d3uCc3h/cn+GeIaNeXuEcHOCaGSIbmqMd4CVf4mUfoaRe4OIdHeDb3J+cnOCdXeIeYCQgIiUgISN + en6Qe3SQe3SNfXSJeXCJdHSMd3eJd3+Jd3+Gcm+Db22EaWmDaGiIaWOHaGKDaV6Eal+EaWSHa2eH + amqDZ2d/Z2qAaGuCaW2GbXCJb2uCaGSAYl6CY1+CZWiGaWuIcneLdHmJcG+Hbm2Eal+Eal+Ham+E + aG2Hbm+JcHKHblyAaFZ/XE57WEp6WliGZGOJbXeVeIKaeHWVc3COZ2GMZF6DZGKMbWqSb3SRbnOQ + al+MZ1yMZ1+NaGFtXF1wX2FyXl53Y2N4ZWl+a29+b3R+b3R+cnN/c3R/dXl/dXmGeICDdX57d3h5 + dHWCdH2CdH1+c3t/dH1/dH+AdYCDeICIfYaJe4SOgImLf4uOg46IgouJg4yHe4mCd4SAdYCCd4KE + eoyMgpSMhpGJg46LgomEe4OAeoB/eX+HeH+EdX2Ed3+DdX5+dHh/dXl/eHp/eHqHeH+Gd36CfYCD + foKLfYaLfYaCf4OCf4OEenuCeHl6eHt1c3d+c3uAdX59en5+e3+EfY2MhJWSkqGQkJ6Mi5WLiZSC + f4Bwbm9uZGp0anB+eIN7dYB9eHtzbnJpZV9oZF5yZF9wY15vY1twZFx6bnJ+cnV/c3d+cnV/dH2A + dX6Dd313anBpZWtpZWtwaW56c3h7eIB7eIB6c3h6c3h6c3V7dHd7dYCAeoaHfY6Jf5GJg46Igo2A + eXt9dXh/c3mAdHqEfYyGfo2JfY6JfY6NhIyJgIiAd3p/dXmCfY2JhJWRh5uOhJmNhpmOh5qHeoB4 + a3J1bWt+dXSDfo2LhpWMgImIfYaDe4uGfo2IeoOHeYKCd3+EeYKGhImGhIl/foZ1dHt0anB4bnR4 + bXV9cnp9cnp7cHl7cHmAdX6GeIaLfYuNh5COiJGOgoiDd31+bW5/bm9/eHqJgoSOe4SIdX6CcG97 + aml5am2DdHeMhImUjJGUjZaSjJWSgoyJeYODdHuAcnmEcHuIdH+MeX2Gc3eAa26HcnSNe46SgJSU + hIyQgIiMd3mDbnB+b3J/cHOCdXuOgoiSe4COeH2OfXuQfn2Qen2Md3mNd3uOeH2Od4aMdIOLcGuE + amWGZ2OGZ2OIamGJa2KEa16GbV+IaWOJamSHaGSHaGSAaGt+ZWmDaWWGa2iMbmKHaV2JY2KMZWSI + aGuIaGuNcm6Ncm6Lb2iGamOCZ1+AZV5/ZGmDaG2AbWOEcGeHbV+CaFt/XVN5V011VFaDYWOLbnOS + dXqXeW+SdGqJaGOLaWSLa2mQcG6ObmWMa2OIaVeHaFaIZVqJZ1twXVt0YV5zYmN4Z2h4bWt4bWt+ + a297aW14bnR6cHd+d3uAeX6IeISHd4N+dX97c31+cnV7b3N4bnJ5b3N9cHR7b3N+dHiDeX2Me4aM + e4aNf4uOgIyJgpGLg5KEfYyAeYiCd4SAdYOGeYyLfpGMg42If4mNfYeDc319dHt9dHuCdH2CdH1/ + dH19cnp/c3eEeHuEe4iIf4yMf4aMf4aHfYCIfoKJfYCMf4OIf4eJgIiOf4eLe4OCfYB6dXl+d3uA + eX6AeoOCe4SHeo2NgJSOjJuSkJ+QkJ6Ojp2JiJJ1dH50anB6cHd7dXt4cnh1bnB0bW9taW9ybnR+ + dGp6cGd1a2J0amGAcnSAcnSDeX2DeX2CeYB/d36CdXl6bnJoZGppZWtvZ254b3dzcHJ4dXd5dHV3 + cnN4bnJ6cHR4dXl6eHuAeX6De4CGf4aIgoiAfoJ9en6CeH6EeoCHgImIgouJfoyLf42Qh5SMg5CA + e4t/eomAeoaIgo2MhJSMhJSMiJSMiJSHeYR9b3p6bm+CdXeGfYmLgo6LgIeDeX+AeoOEfoeDeIOC + d4J/dH+AdYCDeYuDeYuAeH94b3d1a290am53am53am55bW53amt4Z2N4Z2N3anB/c3mGfYmMg5CL + g4iJgod9cHJ5bW59c3eHfYCLfoSHeoCDb297aGh3aG2Cc3iNhIyVjJSXjpmSiZSRgomGd35/cm16 + bWh+a3KHdHqIeIKGdX+Cc3WGd3mJfoyRhpSWiJGRg4yOeXuEb3KDbXKCa3B/c3eJfYCSe4OReoKO + f4KNfoCUeYKRd3+Rd32OdHqMdYKMdYKJcm2Da2eGamOIbWWLcGuLcGuLc22JcmuJbmqLb2uMaWuL + aGqGZ2SEZWOEZV+GZ2GOa1+Oa1+NamKOa2OObWiMamWIbWiJbmmGa2eDaWSDZF6AYlx6YVx+ZF9+ + ZF+Ga2eIal6GaFx+X1B5W0x1U06GYl2NbW6Uc3SSc22MbWeHZWGIZ2KObWqRb22Mb1yNcF2HaVyG + aFuGZ1WHaFZ/amqCbW17bXJ9bnN5bW55bW56bW14ampzaW13bXB6cHR5b3OEcH6Hc4CDdIaEdYd7 + b3V3anB1ZGN3ZWR5bXB+cnV/dIKDeIaHeYKHeYKLfoSMf4aGgJGEf5CCfYx+eYh/eHp7dHeAdYCI + fYiIg4eEf4ODd3p9cHR9bXmAcH19d4J/eYSAeoOAeoODeoeMg5CLhpaMh5eOhpKMg5CJgIiIf4eL + f4uMgIyQhJCNgo2Ug42OfoiJfYCCdXmAdHiCdXmCfYCIg4eHfoaLgomHho2Mi5KNkJ6OkZ+RkJd/ + foZ+d3l9dXh1c3Jyb25wa210b3B4bXV+c3uAd3h/dXd7d3qAe3+IfYuGeoiMgImLf4iGf4aAeoCA + e394c3d3dHh0cnV1b3V9d317c3p6cnl6dXR5dHN4bnJ4bnJ7dHl+d3uAeoaDfYiHfoaGfYSCe4KD + fYODeX+HfYOJgI2If4yHe4mMgI6LiJeLiJeIgJF+d4d+dIR/dYaGeoaIfYiMhpGMhpGHfYB9c3d5 + b3B+dHV/e4KEgIeHf4R+d3t/dH2DeICAeIJ9dH6AcHp+bnh6cIB5b393b291bm50aGl0aGl6ZWp6 + ZWp6a3B6a3B5a2l3aWdvYWV3aG1/c3mLfoSJf4OJf4N+cnh5bXN9b3iDdX6GeIOEd4J/bm95aGl7 + Z26Ic3qLfpGUh5qSjJeNh5KQgIOHeHp/bm95aGl3bXN7cniIeIKHd4CEen6HfYCJfoeSh5CViIyS + homRe3uIc3OCZ2eAZWWCaWqJcHKNeIKUfoiWgIuWgIuUgISQfYCRd32QdXuQdYCOdH+Hbm2CaWiG + amONcmqQd3WQd3WQdXuRd32OeXuNeHqUcm+Na2mJY2KIYmGGaW6LbnOWdW2Xd26VdW+RcmuRcGiQ + b2eMa2ONbWSLaWSIZ2KEZFp/X1V5WlF6W1N/XFeHY16IYl6LZGGAYVZ+XlSAXFGIY1iMbWeOb2mM + bmSIamGGZGKDYl+MamiScG6Ucm2Ucm2Rd2uOdGmNbVaIaFGCc3WCc3WAdHp/c3l7b3V9cHd9bnN5 + am95Z214ZWt5aGl7amuCa32Jc4SEeYSAdYB5bXB1aW13aG19bnN/cnqDdX6DeICDeICGeX2Ie3+M + fYKLe4CGfo2IgJCGfo6De4x/en57d3qGeIaMfoyNgo2GeoZ/eHp6c3V+c35+c36DfYaGf4iJgIuM + g42JgpGNhpWJgpKLg5SMg42Mg42HgIeIgoiJgIuNhI6Ng5SNg5SOhpCNhI6Jgod/eH1/dXmAd3qH + fYONg4mHgIeHgIeHho2NjJSSkJ+VkqKSjpeIhI2Je4eGeIN+eXp4c3R0b3B3cnOAe3+Ef4OAfYZ/ + e4SDfYaLhI2Lg5KHf46If4mGfYeCe4SCe4SEgIeEgIeAfYiDf4uGeICIeoOAeoaDfYiEeH6Dd317 + d3p4c3d7dXt+eH59dH6AeIKDfYaCe4SEfYKHf4R/e4J/e4KJgIiLgomEeYKLf4iHh5WHh5WHe4mD + eIZ/dH1+c3t+eIOGf4uGhIyDgomIfoJ/dXl6cHJ/dXeDeoSEe4aCeol9dYSGd36DdHuAeoN+eICD + d31+cnh5bXB1aW11aGh3aWl3ZWR4Z2V9aG2Aa3CDc3+EdICCc3iAcnd0aGtyZWl6bXWGeICAfoKA + foKGb3R7ZWp1aW16bnKCcnuAcHqCbXR7Z25+a3SHdH2Jf5SNg5eOhpCLgoyQfn+Id3iAa2t6ZWV0 + ZWp6a3CCdH+Ed4KEeHuGeX2LeH6VgoiZg4uVf4eUenuJcHJ+a155Z1qAZ2KHbWiLdHmSe4CXgIuX + gIuXg4aSfoCOeH+Nd36JdHmHcneHamqDZ2eIbmmMcm2UeH2Xe4CWen+UeH2Uen6Qd3qOb2mHaGKJ + ZWGIZF+HamqNcHCVeXuXe36VenWQdXCUdWmOcGSNaGGMZ1+JZF2JZF2CZFd9X1N5Wk96W1B6WlV9 + XFeEY16IZ2KEZFyAYViEZFyHZ16JbmmLb2qIamGGaF6EY16DYl2MammScG+aeHeaeHeheXWbdHCU + b16MaFd5dHV3cnN6c3V9dXh6dXl7d3p/c3l5bXN5ZWh6Z2l4aW5/cHV/a3mEcH6CdXt/c3l1Z2lz + ZGd1ZXJ+bnqAdX6DeICHgoaHgoaJgIiJgIiMf4OMf4OEfoeEfoeIf4yHfouEe4OGfYSEfY2JgpKO + gIyIeoaHeH2Gd3uGd3uHeH2DgI6EgpCIhJCIhJCLhIuJg4mIf4mLgoyJfomMgIyIg4eIg4eIgoiL + hIuLhI2OiJGMi5WMi5WHhouAf4SIfoKIfoKGgouIhI2EgImHg4yGhI6LiZSUjqKWkaWWkpuNiZKQ + h5SOhpKGhIl9e4B5dXt6d32HfouNhJGMg42Mg42Ih5GHhpCIgouDfYaAeoN+eICCd4SJfoyNg5eQ + hpqNhpmIgJSMho6Mho6Ifo6EeouDeIOEeYSDe4CCen+Ae39+eX1+dHh/dXmAeoOCe4SJf4OLgISI + g4eDfoKHf4SGfoN/d4CCeYN/eouGgJGEfoSCe4KDd32HeoCAfYaEgImEg4iAf4SIe3+EeHuDe3uI + gICLgoyGfYeHeIuHeIt+dX2GfYSEf46Ef46GgIR9eHt7aml1ZGN1YmJ5ZWVuZWRuZWRyaGt7cnWE + eImMf5GMfoeGeIBzamlpYV90aXR7cHuAeoOCe4R+b3J3aGp3Y2V4ZGd3bXB3bXCAbnR3ZGp4ZG+E + cHuLe46NfpGRfoSNeoCIenqDdXWDb21/a2l6a256a25+cniCdXuDdHeEdXiLdX+OeYOSfYSRe4OS + eXiLcnCAb2J+bV99bWWGdW6ReHuWfYCUgIeWg4mVgoaSf4OQfYOOe4KNdHiJcHSJamSGZ2GIb3CL + cnORen+Se4CXen+Ze4CSeXqNdHWEaWV7YV2DYl2IZ2KLbm6SdXWSe4CSe4CaeHWScG6UcGiOa2OO + Z2GJYlyEYVyIZF+HZFyDYVh5XU16Xk56WlV7W1aCY1+GZ2OHZWOIZ2SGZ2SLa2mLa2mOb22LbWGD + ZVqDX1uEYVyMaGORbWiXdXSbeXiZd3SUcm+Sa16JY1Z6b256b259cm5+c293dHV5d3iAdHh9cHR7 + aW1+a2+Dd3qHen6Jd3qLeHuHcnt+aXNzZGl1Z2t6bnKAdHiDfoKHgoaGg5GHhJKLg5KLg5KMhImN + houLg4iJgoeLf4iMgImMgI6Og5GHh5WIiJaQiZKLhI2Sf4aMeX+Dd3qGeX2EgIeIhIuJiJKHhpCJ + hIaOiYuOg4yOg4yOg46Og46Mg4uIf4eMfoeOgImRiJKUi5WVkJ+Ujp6Oi5SJho6LgomMg4uLhpWE + f46GhI6CgIuCgpCHh5WSjqWWkqiWkaKUjp+VjZ6Si5uOjZWLiZGHfoiEe4aNgJSQg5aMhJSHf46G + go2Hg46GfoOAeX59b22DdXODfYiNh5KLgpuLgpuEfYyDe4uJgpKNhpaLg5KEfYx/d4CCeYOGeoiG + eoiAeoB9d31/dH2Cd39/e4eGgo2Mg42NhI6Lf4iIfYaDe4CCen+CeH6Ad319c4R+dIZ+d4aAeYh+ + eoOEgImIgo2HgIyEgId/e4KGe3+IfoKHg4mJhoyOhJaMgpSNgpCHe4mGgoiHg4mJh5WIhpSJhIiC + fYB9aWt1YmR5ZWiAbW9/bm+Ab3B0am54bnKGd4iVhpeOho2LgomGdW59bWV5Z21/bXN/d4B+dX9/ + am17Z2l6ZWN7Z2R5a2t9b2+Ab3B6aWp9Y26Ga3eMeYKUgImRfoSLeH6Ed3eDdXWIdHeEcHOAbW97 + aGp/aXB/aXB/am2Eb3KHcHqHcHqMdX2QeYCOd3KLc26Db22IdHKLeH6MeX+Re4CVf4SOg4KQhIOS + fYKSfYKQfYOOe4KOdXSMc3KOb2uMbWmIc3ONeHiZfX+ZfX+VeXuUeHqReHeSeXiEamV6YVx9XliE + ZV+Gb3SNd3uQen2Qen2ScmeQb2SUa2OSamKOaV+LZVyGYl2HY16HY16EYVx7XUx1V0Z3VU16WFB+ + X1qCY12Lam6NbXCQdG+JbmmLa2WQcGqHbWKDaV5/XVODYVaGaFuLbV+RdHSUd3eWc2iQbWKLZFWJ + Y1R5am97bXJ9cHJ/c3R+dHh+dHiAcneCc3h/c3mDd32Gf4iGf4iMeYKLeIB/dHN1aml4aWt5am16 + cHSCeHuIfYiMgIyLg5KJgpGLg5SNhpaOiJGMho6NhouMhImJgIiMg4uOhpCOhpCJiZaLi5eUjZSQ + iZCMhImGfoOCeH6HfYOJgoeNhouLhIuLhIuOh4yOh4yMg5COhpKLh5KLh5KMg5CMg5CNhJGOhpKR + iZ2UjJ+VkqGSkJ6SjJeMhpGSiZaUi5eQh46Mg4uJhIiCfYCGhI6NjJaUkqeWlaqVkKGNiJmLhpWN + iJeQjZuOjJqRg5GJe4mLgo6OhpKLg5SGfo6DfYiDfYiIeIKAcHp9anB/bXODe4uMhJSEgpB+e4l7 + dHR/eHiCe4eHgIyEfoeAeoN5c3l/eX9/d359dHt7c319dH57c39/d4OCeomGfo2GgJGLhpaQh5SM + g5CJhIaGgIKCdH+DdYB9d317dXt4c4J6dYR+fYeCgIuMg4uHfoaDe4CAeX6EeYKLf4iMiJSQjJeS + iJmQhpaJho6Hg4yMho6Nh5CQh5GRiJKQg4eIe395bm13a2p9cHSEeHuDc3+Dc394bWt4bWuAbXqS + foyUiJGRho6NfoCCc3V/am+CbXJ/cHV/cHV/amp6ZWV4ZGd9aWuAb3CCcHJ/bXB5Z2p4Y2iAa3CJ + d32NeoCOf4SHeH2AcneAcneHdHqCb3WDbmt+aWd9aGV6ZWN7Z2d+aWmDbnCIc3WMdYKNd4OMc3KG + bWuCbXKGcHWMeYKRfoeRgoeRgoeXgoyWgIuUfoaOeYCOeX6NeH2OeX6Md3uLd3CHc22LdXqNeH2X + e36ZfX+Zf36WfXuXfn2SeXiLbWOCZFt6X1t/ZF+Ca3OLdHuUd3eUd3eOcGeLbWONa2mMamiQbWSL + aF+JZ1yEYleGY1iGY1iDYUx+XEd4U0R5VEV+XUyHZVSOa26VcnSZem2UdWiLa2WMbWeHa2SEaWKG + Y1iEYleLaF2RbmOSdXqUd3uXb2eQaF+LYVCJX097aW9/bXOAcneCc3iCdH2Ac3t/dH2DeICEfYyH + f46JiJKHhpCOf4eDdHt1bm5vaGh4a217b3B9c3eHfYCIgIOJgoSMg42LgoyLgJGMgpKOiJSNh5KM + hoyJg4mJg4yLhI2Nh5CNh5CLh5CNiZKNjJSQjpaOjZeLiZSJhIaEf4CHfouJgI2Hf46Lg5KRiJWN + hJGHgIyMhpGIh5GLiZSMgpSNg5WNhpaQiJmSi56UjJ+RkJqQjpmUiZqOhJWShpeXi52RiJCOho2I + goiCe4KIgJCRiZmQiKeQiKeOg5GHe4mGgoiMiI6Rjp6QjZ2Qg5aIe46EeoyJf5GJfoeEeYJ/d4B/ + d4CIeIeCcoB6bnJ5bXCDeYmGe4x+eX15dHh1b216dHJ/dXuAd31/eHp6c3V4b256cnB6dHJ5c3B7 + c3J6cnB4b3d7c3qCeYCHfoaGgJGLhpaUiZuSiJqQiZCJg4mGeoaCd4J/eYR+eIN6cnt1bXd7cHmD + eICMe4aIeIKDd3p/c3eDdYCMfomOh5aUjJuRi5SLhI2GhI6LiZSOhpKOhpKOg46ViZWXh5GNfYeC + dXuAdHqAeoaEfomCfoR7eH55b2V3bWN+aW6LdXqMgI6QhJKJgoSHf4KHdXSGdHN+cml6bmV9aWd5 + ZWN5ZGd/am2Eb3KHcnSCb3N+a297aGp/a26Cc3qJeoKUfoiLdX+CbmuCbmuEcnWDcHSAdGt9cGh9 + aWl3Y2N3ZFt6aF6EbnOMdXqRfoeOe4SMfn6HeXmGcG6Hcm+Jd32Sf4aUgImRfoeWgpCVgI6WgIiS + fYSOeXuLdXiMd3mOeXuNeXeNeXeQeYCReoKVe3qVe3qVf4KVf4KWgoSOen2ObmOGZVt/YVuDZF6C + a3CMdXqRdXiRdXiMcmeHbWKJb2uJb2uMamWJaGOIZ1eHZVaJZ1yNal+LaFOCX0p+VER6UEB+WEyI + YlWManWXdYCefXSZeG+Vbl6QaVqOamWQa2eMZ1+IY1yMaGeSbm2WeG6Vd22RbmWMaWGIY1iIY1iD + bnWIc3qAeX5/eH1/dH9/dH9/eYKGf4iGgJCEf46Mg4uIf4eEeXiAdXR7b3B9cHKHenuLfn+LfYaL + fYaGgo2JhpGLhI2LhI2MhJWJgpKOh5aOh5aNhI6NhI6LhJCLhJCGgo2EgIyIg5KNiJeOjJqQjZuS + i5qRiZmSiZSLgoyJeYaIeISCeIiDeYmHe4SIfYaDgomIh46NhJGNhJGGhI6HhpCLhI2QiZKSiZaU + i5eSjpqOi5aOhpCOhpCRh5eSiJmRiZmQiJeJhJSCfYyHeoyJfY6GfYeGfYeDe36Hf4KGh42QkZeW + lKaUkaOMh5aDfo2DfYODfYOEd4KAc354dHp9eX+IeoaGeIOAe399eHt/dH+EeYR9eHd4c3J9cHR/ + c3d/c3mAdHqAd3h7cnN5bmp7cG1/dHCAdXKCen2AeXt7b3N6bnJ/d36CeYCIfYuMgI6QhpeWjJ6W + i5SMgImHfoiCeYOEe4OAeH9+dHp3bXN6a3B/cHWGd36IeYCEc3SEc3SCdXeGeXqMhpGRi5aOhpKJ + gI2Jf5GIfpCLf4uQhJCQgouRg4yVgouOe4SIeIKLeoSLhIuMhoyNh42Gf4aEdGl9bWJ5a2l/cm+D + eX+IfoSLgIeJf4aLfoKHen5/c2l3amFzYVtzYVt3ZGh+a2+Ic3iLdXqLd3mEcHOAa26DbnCEcnqL + eICNeoCIdXuCcG9+bWuAbnKIdXmEd3SCdHJ9cm54bWl6aGGAbmeGcm+Ld3SRe4OVf4eVf4eQeoKM + eHiNeXmQeoSRe4aUfYSSe4ONg4mNg4mUgISQfYCNdHOIb26McniUeX+Re4CRe4CQd3qNdHiQdHCO + c2+JdHmSfYKagIKVe32NcF+GaViAaF2AaF2Eb3KLdXiMcmqLcGmHb2mHb2mNbW6Obm+Ob12Ob12N + a1eMalaMa1+NbWGQaVeLZFODWkN7Uzx6VkOCXUmHZWSVc3Kee3eee3eXb2eUa2ORaGiOZWWJaV6I + aF2LaWeQbmuUcm+ScG6Ra2KQamGNYlGOY1ODe4CIgIaGfYeEe4aDeICCd3+Je4eOgIyMgpSGe42C + eYN+dX9+cnOCdXeGe32Jf4CShoyOgoiQgo2Qgo2LgJGLgJGJgpKIgJGIgo2MhpGLiJaLiJaRho6R + ho6Lgo6Lgo6Jf5GJf5GMh5eQi5uUjJ+VjaGWjJ6Vi52WhpCRgIuNeYSEcHt7dHd7dHeCd3+JfoeM + ho6Mho6NhI6NhI6GgoiGgoiLf4iNgouUi5eVjJmQjJWJho6JgIuIf4mIgJGNhpaMhp2LhJuIfo6G + e4yCeYaGfYmCfoSIhIuNh5KRi5aJjJ2RlKWdlaiZkaWMhpGHgIyCfol/e4d9dHt9dHt7d3qDfoKH + fY6IfpCLgomHfoaEgImEgImDg4Z6en2CeHuGe3+De36De35/fYB9en55cnJ+d3d/en6Ig4eGgouD + f4iCd3N5bmp7dHl9dXqAeH+DeoKLf42NgpCXiZKShI2HfoaDeoKGfoOAeX56eHl0cnN+bW6DcnOI + eX6HeH2GeHiEd3eEeG+LfnWJgIiOho2RgomJeoKEe4iEe4iNgIeOgoiOfoiSgoyOgoiIe4KGeX+I + e4KJfomQhJCVh5CShI2MgHqLf3mId3WCcG+Ad3iHfX6Qg4eRhIiRhIuJfYOCdHJ6bWpzX1hyXld4 + amqAc3OIeXuIeXuMeX+HdHp/bm2Ab26Cc3iHeH2Jd3qHdHiDcnOCcHKGcHOMd3mQfYONeoCId3h/ + bm9+amh/a2mIenqNf3+SgoyVhI6UhIyRgomQen+OeX6MfX+MfX+Qen+NeH2IeX6Le4CLe36Gd3mH + c2uAbWWGa3KQdXuNeoCQfYOOeniIdHKHbWWLcGmNdHiXfoKdf4KZe36IdWWHdGSAbmGAbmGIb3CL + cnOMcmqJb2iGbmWGbmWSb2SVcmeSc2GRcl+QcGGRcmKQdWiUeWuUc2eObmKLaFOHZE9/XEl/XEmH + Z16ObmWeeXifenmZdWqUcGWRbmWOa2OIbmOHbWKMammMammQa2mSbmuOZ12MZFuOY1OOY1OMgIyL + f4uJe4eIeoaHeYSHeYSMfomMfomLeomGdYSCc3iDdHmDd3iJfX6Mg4uOho2Qh5GNhI6MgIyMgIyJ + fY6JfY6LfpGGeYyAeoOJg4yHiJGIiZKRiJCNhIyHfoiIf4mEf46GgJCIg5aMh5qOjJ6OjJ6OiZ2N + iJuSh5KQhJCMe4aCcnuCd3WHe3qLgoyMg42ShJCOgIyIfoSLgIeJgoeHf4SIfYaMgImNi5mNi5mO + hIuIfoSDe4CEfYKJfoyOg5GJh5aJh5aIhJCEgIyHfouJgI2Ef46Mh5aNhpmOh5qMi5+QjqOOi6GM + iJ6JfoyJfoyLf4iJfoeCeYCEe4OCfoeCfoeIe46OgpWNgo2RhpGLiZSHhpCGh4uEhomDf4aHg4mD + f4aDf4Z/gISAgoZ7eHR/e3iGgJCLhpWQiJmLg5SCf351c3J5dHV7d3h7dHR6c3OAeoaEfomUhpGR + g46EgIl9eYJ7eIN6d4J6d31zb3V5bmqAdXKJeoKJeoKEen6HfYCLfn+NgIKLg4iNhouQgIaMfYKC + eH6DeX+Cen2EfX+IfoSLgIeHfYOCeH6DcHeGc3mIeIeOfo2OiJGQiZKJhIOMh4aQfYCJd3qJd3qL + eHuQg4eViIyUiZCMgoiDeXp6cHJ6ZFh5Y1eCb3ONen6NfoaMfYSLeICCb3h/b2d/b2eEc2+HdXKJ + dHmHcneJdHKJdHKMd3uLdXqQfYaOe4SQenqHcnKGam2Lb3KIe4KNgIeUg42Ug42Wg4ySf4iNen6O + e3+OfXuQfn2MeX2HdHiLcHmOdH2Md3mGcHOAbmh/bWeDam6NdHiOeYCNeH+NeXOEcGqCZ1+Ha2SQ + c3iWeX6Wen+VeX6Hc2mMeG6Nem2IdWiLdXWGcHCMcmqJb2iJaV6IaF2Nb2OQcmWObmWObmWRb2qR + b2qSdGqXeW+WeGqWeGqZdGGQa1iJaFaEY1GIZVuJZ1yScG6Zd3SeenKZdW2RcmKJaluCaV6GbWKM + Z2mLZWiSbWORa2KLZFWGX1CJXk6LX0+IeYyGd4mCcnuCcnuDb3qDb3qHd4OLeoeJfYOHeoCHfYCH + fYCLgISNg4eJho6Jho6Rg4yOgImGeX+EeH6Ed4SEd4SDeIOAdYCAd32Jf4aJiJKNjJaRho6QhI2M + f4aJfYOIeoaJe4eIf4yLgo6NhpWIgJCQgpCQgpCOhpKQh5SHg4x/e4R/foOHhouQiJeOh5aUhIyL + e4OIeX6QgIaIg4eJhIiMg42Qh5GNiZWNiZWLgIeJf4aIg4eMh4uLh5KIhJCHhJSIhpWEg42CgIuG + gJSIg5aMhpGOiJSSiZaQh5SNh5KNh5KQfpKQfpKLgoyMg42LhomOiY2LiZGIh46Df4iDf4iJg4yN + h5CLhJCMhpGNiZWMiJSLhIuMhoyLgoyLgoyDf4iIhI2IhoeIhoeCgH2Dgn6Ng5SVi5uWkJuRi5aH + h4d4eHh9b3iCdH1/c3d6bnKCdIKHeYeLgJGMgpKLfYt/cn96b3p6b3p7cnV5b3OCc3iGd3uLgIeI + foSGe4KLgIeNhI6NhI6Mh4uNiIyNg4eJf4N/dXl7cnV/c3eDd3qEeXiJfn2GeHWAc3B+cnV/c3eD + c32LeoSSiI6Vi5GUiJGUiJGOhIuHfYOEd3SEd3SShI2XiZKXiZKQgouMfX+AcnR5a2l9b22AdX6G + eoONfYyLeomIdHeCbnCAcGWGdWqMeHWNeXeOen2JdXiHdXSHdXSOeH2OeH2QeoKOeYCOdXmHbnKH + a2uLb2+Ie4KOgoiQg4SOgoOSfYSOeYCQfYCOe3+Lf36MgH+LdXqDbnOEanCDaW+EameGa2iAbWN+ + amF7aGqDb3KNeXuRfX+SeW6NdGmHbmOGbWKObnSXd32Ve3+Zf4OVgICXg4OXfn2UenmReHuMc3eR + cHKNbW6HaGKIaWOMa22Qb3CRb2qRb2qNbmqMbWmOcGeUdWuVdW+VdW+UdG6Wd3CUcm2ScGuMbmGH + aVyRcm6UdHCQdHCMcG2Nal6JZ1uGaF6LbWOLaWeGZGKRbmWRbmWOZU6HXkeEXEeHXkmCcnuAcHp9 + bXd+bniEb3eHcnmHeoCJfYOIfo6MgpKMg5CIf4yMfomNf4uLf4iNgouOgICHeXmEc3KGdHOAbneD + cHl+dHiAd3qCdXmMf4OOiZmNiJeQh46Qh46Le4CHeH2EeHuEeHuDeoKEe4OGeoiHe4mIfYuLf42S + h5KUiJSMiJSHg46JiJKMi5WQjJWMiJGOhIaJf4CJf4aNg4mOiJSOiJSQh5SRiJWSjJeRi5aLgJGL + gJGLhpmNiJuOiZqMh5eCfomAfYh/eYKAeoOJfZCNgJSLg5SOh5eRh5eQhpaOho2LgomIfYuGeoiA + f4mIh5GNh5KRi5aOiZmOiZmLh5KDf4uIg5SLhpaJhpGLh5KQhI2Rho6OhIuQhoyQh5GOhpCNh5CM + ho6Qh5GOhpCDgISHhIiOiJSUjZmRjZaOi5SOiJF+eIB5cHp7c32Cc3qCc3qDb32MeIaJfoyJfoyJ + fYOAdHp6a3B7bXJ9cHR6bnJ/dH2EeYKIgIaHf4SEfX+JgoSSiZaQh5SJhpGJhpGLhomIg4eIe32H + ent+dHV9c3R/dHOIfXuIfXmDeHSDd3iDd3iEb3eLdX2Nf4iVh5CaiZaZiJWQhoyHfYODdXOJe3mS + g5WZiZubiJGUgImLd3mHc3V/dXuAd32GeX+GeX+Hen6EeHuHcm+Eb22HcneMd3uNfYmNfYmSf4OR + foKJen2EdXiJc3qMdX2OenqMeHiLcnOGbW6EcGqGcmuHeH+MfYSQen+Md3uMdXqMdXqQeYCReoKQ + fYOMeX+Qc3WLbnB/ZV53XVZ+ZFqCaF2DaV5/ZVt7Z2eAa2uJdHeQen2RfXWOenONdXCNdXCQc3WS + dXiRe4OWgIiZgoyZgoydf4SXen+Qd3iMc3SRcHeNbXOObWuObWuMcHWQdHmUdWmSdGiSb2eQbWSO + bmWUc2qUcGiRbmWObWqRb22Rb22WdHKQcmiNb2WQbm2Rb26RdXKMcG2NaF2JZFqGY1eMaV2IaVqI + aVqRameVbmqSaVGHXkeGWkSGWkSAc3uCdH17bnl9b3qEb3eJdHuIe3+Mf4OMhoyNh42ShI2OgImL + f4uMgIyMe4uMe4uLfX1/cnKEcHCCbm59am5/bXB7b3OAdHh/c3mJfYOLhJCNh5KNhouMhImIeXuD + dHd9c3R/dXeEeoCEeoCEeYSHe4eJgIiOho2Ui5WSiZSNiZKMiJGShpmViJuUjZmRi5aNiImRjI2R + i5GQiZCUi5eUi5eSi5qSi5qSi5qOh5aLhIuMhoyRjJ2RjJ2OiZmJhJSAeXt9dXh9dXqAeX6He4SJ + foeHf46MhJSOhJWNg5SNhJGMg5CAfYZ9eYJ7en+HhouRh5eUiZqSi5qRiZmMhpGGf4uHhJSJh5aJ + hJSLhpWVh5CUho6RjJCOiY2NhpWQiJeUjJ2RiZqJgpKIgJF/e4SDf4iIf4yVjJmRjZmOi5aMiI5/ + e4J4eHh3d3d/c3SDd3iIdXmQfYCJf4aIfoSGeICAc3t7aW19am56bnJ7b3OCdH+Je4eHf4KEfX+D + fYOMhoyWi5mRhpSLgoyJgIuMho6Jg4yLf4iHe4SAeXt7dHeDdX6LfYaNfoCLe36LfoKMf4OHc3WH + c3WGeICNf4iWiJGZi5SShoeIe32DeHeLf36RhJaWiZueiJKVf4mGd3mGd3l/eH1/eH2HeHqGd3mE + c3KDcnCCbW2Dbm6Ic3qOeYCNgpCOg5GUfoaOeYCLdX2GcHiIbneMcnqHdHiHdHiCbnCEcHN+cG5+ + cG6Gd3mJen2Oen2IdHeIcGuJcm2NeoCQfYOOfoiLeoSSdXiJbW9+ZVh1XVB7YleCaF2EaWWDaGSC + aGSEameIcneOeH2Sf4ORfoKUeHqRdXiOc3OOc3ONeHWQeniaf4abgIedgIaVeX6Qc3WIa26JbW+J + bW+NbmuOb22Oc3OWenqVeHiSdXWWb2uUbWmQbWSSb2eRbmKQbWGQal+Ra2GMbmKOcGSMb16Mb16Q + bW+UcHOVdGuScmmQa12NaVuHYVGHYVGGZ1eGZ1eOamiQa2mSaFqMYlSMX0yNYU2Ee4OAeH99dXp+ + d3uDd32GeX+LfYaOgImMh5aLhpWShI2QgouNg4mMgoiHgImIgouHfYB7cnV+cnV4a297amt6aWp5 + a2l7bmt7bXKEdXqHeYKOgImOh4yNhouCe3d9d3J7eXh+e3qGfoCIgIOJfoeMgImQiZKUjZaSjJeU + jZmOi5SLh5CWhpWXh5aViZWXjJeVjJaXjpmSkJ+OjJuRiJWSiZaOiZmRjJuXi52Uh5mNhI6SiZSZ + kaKZkaKVjJaJgIt/fXt6eHd+cniEeH6CeHuAd3p9d32DfYOHfY6OhJaRh5mQhpeEfoR7dXt9eX+J + hoyOhpCQh5GRiZqOh5eLgJKIfpCIg5KLhpWJhJWQi5uUjp6VkJ+RlKKMjp2OiJSNh5KUjJuQiJeH + fYOAd314bnJ+dHiAd4eOhJWMiZeNi5mLh42AfYN4eHh5eXmEfX+GfoCLgIKMgoOIfYaLf4iIeIKC + cnt6b257cG95bXCCdXmIeoOOgImNfoOIeX6IeYuXiJqbkp+SiZaLfoKGeX2IgouMho6Hho2Hho2L + fYaGeICIeYCMfYSShoyRhIuUh42ShoyLfX1/cnKCdXmMf4OWiJSZi5aUh4uNgISIeoOMfoeOhJWW + jJ2dh46Re4OCdXd+cnN9c3eAd3qGeHiGeHiAcnR/cHN/cHWDdHmMeIaOeoiNe46LeYyLeH6Gc3mE + b2+CbW2Eb22Hcm+IeX6IeX6CdHR/cnJ9cnB+c3KLdX2LdX2Je3eCdG+AbmeGc2uGd36Le4OSg4uS + g4uWgH6NeHWHbV+AZ1qEZWKIaWWHa2eHa2eHbWiHbWiJcHKNdHWMeX2QfYCXfoKVe3+Sd3OMcG2J + cm2NdXCXe4CZfYKZf36SeXiOc2+IbWmDZ2uDZ2uEbWeIcGqMb2+Ud3eUeXSRd3KZc2uSbWWLamKM + a2ORbV6OalyMaFeJZVWGaFyJa1+LbWGLbWGNa2mQbmuUcGiWc2qXcmiOaV+NY1eIXlOHXVGIXlOL + ZVyLZVySa1qRaliUalWUalWHfoaEe4ODeX+DeX+DeICEeYKHfoiJgIuLhpmMh5qNhJGJgI2HgImE + foeCfoeEgImCen97dHl/c3l7b3V6bWp7bmt6bW1+cHCAa3CGcHWMeX+Wg4mUiJSNgo2Ae32CfX6A + f4SDgoeJhIiJhIiLg4aOh4mQjJeUkJuUjJuSi5qNh5CNh5CRiJWSiZaVjpeZkpuWlKaUkaOSkKKR + jqGVi5uVi5uVjpqVjpqWi5mQhJKJf5CUiZqXkJ+VjZ2WiJGNf4h9ent7eXp/dXmDeX1/enl9eHd5 + b3N9c3eDeIOOg46QhpqQhpqEgIyAfYiAeoCHgIeIgoiNh42MhpGIgo2He4eJfomJg46MhpGGgo2N + iZWUjp6WkaGSkp+MjJmGf4uHgIyNh42IgoiAd3h9c3R6a26AcnR+d3uIgIaNh5KSjJeMh4uAe39+ + d3mAeXuHfYOJf4aIhoeLiImJgIiJgIiJeYOGdX99cmt7cGp6bW2Ed3eEeoCIfoSJen+Jen+LeomX + h5aXkKGRiZqJgH99dHOCd4KHe4eHfY2Jf5CIeYCHeH+HcnmNeH+Igo2LhJCRiJCQh46Nf3+Ed3eG + c3eQfYCXiZWajJeUhpGNf4uJe4eLfYiOho2Ui5KVh4SMfnuAc3B9b22DdHeGd3mNen6LeHuEcniD + cHeDcHeHdHqJeYaIeISJeoKDdHuDb29+amp9aGp9aGqGbmmNdXCMfX+NfoCLenOCcmp+a2+Cb3OL + dX2Md36NeXmHc3OAbmiCb2mEb3mIc32OeISVfouagISXfoKRd2uJb2SGa2eIbmmDb2WCbmSCamKC + amKAaGeHbm2Hc3WMeHqQe3WSfniQd2mGbV+CaWiGbWuOcnmQc3qSeXiQd3WRcm+MbWp/ZGF9Yl6E + Y16HZWGGaWmMb2+Ld22MeG6ScmeNbWKJaV2Lal6Na1yMaluJaFaGZFOJZVeOalyQamGOaV+NaF2R + a2GRaWOVbWeQal+Qal+OZFSNY1OIXk6GXEyIZVuJZ1yNZVyOZ12OaVWUblqGeoaEeYSLd4KIdH+H + eH2Jen+LgoyNhI6Qh5SQh5SQgpCJe4mEeYeGeoiAeIKGfYeEeoCCeH5/dXt6cHd5b3N9c3d+cnV+ + cnWDdHmGd3uJeoKQgIiUg5CNfYmHeoCMf4aMhJWNhpaJhpGIhJCLhomQi46SiZaXjpuRiZqQiJmN + h5KMhpGQh5SUi5eUkZ+VkqGXkaiRi6KOjJ6LiJqWjJ2Vi5uWjZqUi5eQhJKLf42JgpGUjJuXjZ6W + jJ2Rh42Jf4aCfoeCfoeEgoaIhomDgIJ+e31+cHB9b29/d36LgomMhpGLhJCHgImDfYaIe4KNgIeM + goiNg4mEfoeAeoOCe4KGf4aMgIyMgIyIf4eQh46UlKGXl6WWkpuOi5SIfoSIfoSMhISGfn59dHB/ + d3OAdHiGeX2GfoCIgIOIgouSjJWSiImLgIKDe3uDe3uHfoaOho2JiJCJiJCNhJGLgo6JeYOGdX9/ + dHN6b253a2V+c219enuAfn+Mf4OHen6He4eRhpGWjp6RiZmJfX6EeHmAdHqCdXuHd4aJeYiDeX+A + d317cG+AdXSHe4SMgImOiJGOiJGShomEeHuLe4CSg4iWi5mViZeMf5GEeImDdX6Je4SOh4mRiYya + iISQfnqMc3eIb3OGdHWNe32Rg4OOgICJdHmCbXKEa22NdHWMenmLeXiMeHqEcHOAZV57YVp5Xlt+ + Y1+Da2eOd3KUgISSf4ORfXqLd3SGbXCDam6DbnWLdX2OeH2Jc3iDb2mAbWeAa3WEb3mMdYSSe4uV + f4SWgIaOen2NeXuLeHKIdW+GdGd/bmF+ZVt/Z1yDYl2EY16GamqNcnKOeXeRe3mSeW6NdGmIbWiH + a2eHbXOMcniSd3eRdXWScG6LaWd/YVt/YVt+ZFqAZ1yGZGKObWqLdGWLdGWRb1+Qbl6NaF2SbWKO + bmKNbWGRb1uLaVWOZ2GVbWeQbWGSb2ONaF6OaV+LamKQb2eOaV6UbmOValqQZVWHYk5/W0eJXlaM + YViJZFuMZ12RZ1uWa1+Gd36DdHuCcnt/b3l+dX1/d36GfYeMg42OhpKMg5COfoiHd4CAc3t+cHl9 + b3iAc3uGd36EdX2AdHqAdHqAdYCEeYSGeX+HeoCIeIKIeIKMeYKLeICHeoCGeX+Cd3+IfYaJf5GN + g5WLhJCGf4uEfomLhJCMg5CRiJWOh5eMhJWLgomLgomVh5KZi5aVjZ2VjZ2Ui5eQh5SRhpGQhJCO + hpCMg42NgpCJfoyMgoiLgIeLiJaQjZuUiZqSiJmOgImIeoOIfYuLf42MhpGQiZWJho6AfYZ9cnCA + dXR+e3+EgoaMg42LgoyIf4eEe4OGfYeIf4mMg42Mg42HfoiGfYeHfoaJgIiMgoiJf4aGgJCOiZmV + laKamqeUkJuNiZWLe4OJeoKHf4KCen2CeHmEenuHfoaHfoaIgoiLhIuMg42VjJaXjpmVjJaLiIyJ + h4uJiJCMi5KWiJaXiZeUiJaQhJKLe4CEdXp6bm96bm99b2qCdG+Ie3+Mf4OGfoOGfoOHfoaOho2S + jJWRi5SMgoaGe3+IdXuDcHd+cnh/c3l+b3R+b3R+c2+DeHSHf4KNhoiSh5CSh5CRg4yMfoeUf4ua + hpGVjpeSjJWJe4SCdH2AcneHeH2Jf4aRh42Uh4uQg4eNeH+GcHiDdHeMfX+NhouOh4yNe32CcHJ+ + bmOHd2uLfnWNgHiLfnWAdGt9Y1x5X1h1XFF4XlSDb22RfXqWf4eUfYSRe4OIc3qHanKAZGt/amqG + cHCLeHuJd3qEb22CbWp+aWt/am2HbnKQd3qQeYCSe4ORe4aQeoSQe3uMeHiNdGeHbmGIZVuGY1iI + aF+IaF+Ha2uMcHCIdHeMeHqXfoKReHuOc26IbWiDam6Ib3OScnOUc3SWdGSLaVqAXlaAXlZ6YVZ6 + YVZ+Y1+EaWWHbWKLcGWSa1yRaluRbWqWcm+Wd3CXeHKUdGSQcGGQaWWRameRbmWQbWSNZV+NZV+H + ZFyNamKIZVuMaV6LaFCLaFCEXk2AW0mDWkmEW0qCWEqCWEqMX1eSZV2AbnJ+a297bXJ7bXJ7cHuA + dYCHeYSNf4uOg5GJfoyHeYKEd39/dHB6b2t7b3B/c3SGd3mGd3mEeHuGeX2He4eIfYiJgIiLgomO + goiHeoCHdHiCb3OCcHKAb3B4bnJ/dXmEe4iIf4yNf4iIeoOGd3uHeH2IfYuLf42IgouHgImLg4iL + g4iSiI6Vi5GVjJaUi5WSjJKNh42Lh42JhoyJgoeIgIaJe4SMfoeNhIyRiJCRjJ+Qi56OhJaMgpSG + d36Gd36IfoSIfoSMhpGQiZWQh5SNhJGCd3+EeYKCe4SHgImLf4uEeYSCdXmIe3+LgoyQh5GQiZWM + hpGDfYOGf4aHg4yJho6NgouIfYaJg46VjpqalJ+fmaWVjpeLhI2Ef4CEf4CHgoaCfYCGfoCHf4KG + goiJhoyLhI2Nh5CLg5aRiZ2UkaOSkKKOjJuMiZmNiZWOi5aUhJaVhpeUiJGWi5SXhoSJeHd5bW59 + cHJ/c3SGeXqHfYCLgISHf4SIgIaGe3+Jf4OVgouWg4yWg4ySf4iLfn+GeXp+c299cm57cnN9c3R+ + eX2Ef4OLhomRjJCUiJGRho6QgouOgImRg4yXiZKVkJSUjpKNf3qGeHN+bWt/bm2HeH+Sg4uRho6R + ho6QgIiIeYCEeH6NgIeQhJCSh5KRfXeJdW+CcG+LeXiQhomQhomOg3+EeXV7a2F1ZVt0YlV3ZFeC + c3WOf4KXgomVf4eUfoCOeXuNdHWGbW57aGV9aWd+b3SEdXqHcnSHcnSGbmmDa2eDaGSJbmqLcHmQ + dX6QdX6SeICSfXqRe3mScmWLal6IZVqJZ1uJb2SHbWKMcm6OdHCIc3WOeXuWeYCUd36QdW6IbmeH + Z2iHZ2iNa2mQbmuUcGiMaWGGX1CCXE15WlF1Vk57XFSEZFyGamWLb2qUb2GUb2GUcm+aeHWbe3md + fXqXeGiRcmKRbV6RbV6Sb2SQbWKJaFiEY1SDX02HY1CEXVSEXVSEXEeGXUiDW0aCWkV/V0WAWEaA + VkaDWEiGXEmMYk9/cnJ+cHB9aG9+aXCCa3iGb3uJc3+OeISNfpCOf5GMfYSGd35/cnJ7bm56cHR+ + dHiGeXqHenuIeX6IeX6Lf4iOg4yIhI2IhI2Ng4eGe3+AdGh7b2N9bWV6amN3aWeDdXOEeoCHfYOI + foKHfYCHdHiIdXmEeoCIfoSJgIiHfoaIgoiMhoyRiJCUi5KXjJeWi5aQi46NiIyJhoyJhoyJf4aL + gIeIf4mMg42Rh5uWjKGVkKGRjJ2LhIuIgoiDd3qAdHiCfX6GgIKLhI2QiZKRiJKRiJKJg4mGf4aI + f4mNhI6Lg4iEfYKCeH6LgIeQiZWVjpqUjZaNh5CEgImEgImHhouMi5CMgoiJf4aMhJSWjp6alaWa + laWRkZSGhoiIhICMiISMhIeJgoSIg4SJhIaMh4uOiY2OiI6Nh42JgpWQiJuUjaWSjKOQi5uMh5eM + iI6MiI6NgpCSh5WVjZ2XkJ+WiIiIenp7cG99cnB/d36If4eIf4eLgomLfoSHeoCDd3iEeHmRe4OV + f4eai5KZiZGShoeMf4CCc3V+b3J/c3SCdXd+eoOJho6Nh5CUjZaViJqUh5mQhJCNgo2ShI2ajJWX + jpmVjJaWhn6Me3R9amN/bWWLeH6Sf4aRiJKSiZSUh42Qg4mIe3+ShomSh5CSh5CUenuNdHWHc3CN + eXeSiI6WjJKRh4iLgIKId3N+bWl6aF5+a2KDd32Mf4aXgomVf4eXfYOUeX+OenqMeHiAbmh7aWN+ + aW6HcneJdHSIc3OJbW2GaWmCZ2eDaGiGbW6JcHKJcG+Mc3KReXOSenSUdGSLa1yHZ16IaF+Lc26N + dXCOd3KNdXCNcm2UeHOVeXmWenqUeWuNc2WJaGOEY16HaGSHaGSNal+Nal+NY1eHXVF9Vk5+V0+D + WFCHXFSHaGWNbmuVc26XdXCXd3qben6de3ObenKdeGSbd2ORbmKQbWGObVuObVuLaFB+XEV+VUCA + V0OCVkCEWEODWD6CVz2GVz6HWD+DWkOEW0SCWEqDWkyCWkCGXUSHeH+Gd36EcHCDb2+GcHWIc3iJ + d3+Oe4SNf42QgpCSg4uJeoKDdHeGd3mDeX2Ge3+Een6DeX2Jen+Jen+LfYuRg5GJhpGMiJSQhomI + foJ/c2d5bWF1aml3a2p/a26Hc3WHeYKIeoOEe4aCeYOEeHuAdHiEd3+IeoOGf4iHgImMg42OhpCS + i5CVjZKZjZaZjZaRiJCRiJCNh5KJg46LfoSMf4aLhI2Ri5SVjJmVjJmViZWUiJSNg4SLgIKGe3+A + d3p+eYiDfo2Ig5KLhpWRiJKQh5GOh4yNhouRiJWOhpKLh5CJho6IhpSOjJqSkZuVlJ6VkZ2VkZ2J + hpGJhpGLiZGHho2If4mJgIuMhJWXkKGelKaakKKSiZSOhpCOho2SiZGViZKUiJGMh4uNiIyNiIyO + iY2NiZWMiJSOh5aNhpWRh5uQhpqNg5SOhJWIhIuJhoyLgo6OhpKQkJ6WlqWSkpWEhIeJeHmMenuL + g4aUjI6UiZCOhIuNen6Gc3eGc3eGc3eLfYaQgouZjJ6bjqGWi5SQhI2JfYODd32EcHOJdXiNhIyU + i5KWjp6XkJ+XjZ6SiJmNgo2MgIyNf4iUho6UjZmWkJuZjI2Mf4CAb25/bm2IeoiQgpCQh5GOhpCW + g4mVgoiJf4OSiIyWi5SViZKUgoOJeHmHdXeNe32Uh42bjpWeiJCXgomUen6Mc3eAbW+Ld3mNf4uU + hpGWgoKUf3+QfYCQfYCRg36Rg36JdXOAbWqEaGiGaWmDb3KIdHeMcm6Ga2iCZ2d/ZGSDaGOIbWiG + bmmIcGuNcHCUd3eUeHCMcGmIaF+NbWSRdHuUd36Rd3ONc2+McGmOc2uUd3eWeXmXeHSVdXKHa2eA + ZWGEZV+GZ2GIaF2Ma2GNaVaHY1CDW0aAWESCXk6DX0+JZ1yMaV6RcmuUdG6RdXKVeXWeeHCXcmqW + cGWadGmVb2WUbmSSbl+Qa12MaVGAXkeAVUGAVUGEVUCGVkGHWD+IWkCNXUiRYUyUY06VZE+OY0qH + XESIWD2JWj6MgoiMgoiMf4OHen6HdH2IdX6JeoKNfoaLfYuMfoyOgImLfYaJfYOIe4KJd32LeH6H + en6GeX2Hen6Ie3+JeoKNfoaRfoeVgouOhIuLgIeDdXB+cGt7bXJ/cHWDdHeIeXuIe4KGeX+GdX+E + dH6EeHt/c3eDdHuHeH+DfYiHgIyLhI2OiJGWi5SWi5SXjpuVjJmRhpGQhJCLgomLgomNgouOg4yR + iJKUi5WSjpWRjZSSiZGSiZGUjZSQiZCMh4iDfn9+eoaCfomHg4yIhI2LgoyMg42Ug42Ug42Sh5WS + h5WNhpWOh5aQiZWSjJeSkJ6WlKKUkJuSjpqNhJGOhpKJhpF+eoaAd32EeoCHgpKUjp+akqOWjp+X + iZWXiZWRiZmRiZmVh5KWiJSSh5KRhpGMiJGQjJWSi5qSi5qQh5SOhpKNhouLg4iHfYOEeoCAe4uE + f46LhJCQiZWOiZmZlKOZlZuOi5GShomRhIiUiJGZjZaUh4uQg4eQe3mEcG6CbmuGcm+Gf4aNh42Z + jp+XjZ6ViZeRhpSLg4iGfoOMeX2QfYCVjJmVjJmWjJ2XjZ6SjJeNh5KHf4KEfX+Jen+QgIaOiJGV + jpeVjZKNhouGeX+AdHqHfpWOhp2Qh46NhIyQgIOQgIONg4eSiIyZiJWaiZaUgIeIdXuHcneLdXqX + g46diJSih5Kdgo2OeH2Jc3iEd3eLfX2Sf4iVgouXgoKVf3+Re4OSfYSRhoSRhoSRgHmHd2+Ha2eC + Z2KEa2qIb26McHOGam2EaWKCZ1+Eal2IbmGIbWiIbWiLc2qReXCRd3KOdG+Sb2eXdGuXdYCaeIOV + eX6RdXqLb2iIbWWQcG6ZeXeXe3uWenqMcGuGamWEY16GZF+IaFyLal6JaluLa1yGZU+DY02EZFqH + Z1yIaVqJaluQbWGSb2OOb2uRcm6ab16UaViSaFeRZ1aSa16Wb2KObmORcGWRblaHZE2GXkN/WD2H + WD2JWz+OX0SNXkOOXkmRYUyaZUqeaU6ZaFCRYUmHWDqLXD2Nh5CMho6Ngo2He4eHeYKHeYKEeHuH + en6Ie3+Mf4OSgoyMe4aEeYSDeIOJdHeLdXiId3iJeHmEeHuHen6GeXqHenuLe4OSg4uMhpGJg46H + f4KDe36HeH+IeYCGeoOHe4SJf4OEen6IeX6HeH2EeHmAdHWCdHSDdXWAd32EeoCEf4OMh4uVjJSX + jpaQjJWMiJGOho2JgIiJgIiMg4uQiZKQiZKSiZaVjJmRjZaSjpeRjZaUkJmWkaKUjp+SjJWNh5CD + gISIhomHhIiDgISGfoCGfoCMfoeUho6Qi5qSjZ2Li5mIiJaJiJCNjJSQjZuRjp2MiZeLiJaMgImJ + foeCfYB6dXl/dHOHe3qHg46NiZWRjZmOi5aSiJqUiZuRi5aQiZWQh5GSiZSQiZCQiZCQiZKRi5SV + iZWXjJeUjZaUjZaLiIyJh4uGgH+Ae3qEeYKGeoOMg5CLgo6Ri5aZkp6XlJ+SjpqRiJKSiZSXjJWa + jpeUjI6Oh4mOeXeJdHKHdG6Jd3CCfoeNiZKXkqaUjqKQh5GOhpCOg4yJfoeQgouShI2VjZ6Si5uM + iZeLiJaQh5SMg5CHfYCEen6Een6IfoKShJCZi5aZi5SXiZKNgouMgImLhpaNiJmSi5CQiI2SfYSQ + eoKLg4aOh4mVh5WZi5mWgIOLdXiEcGqJdW+MfYSXiJCZho6Wg4ySe4OMdX2Jen+NfoOUfoaWgIib + f4Sbf4SUfoaUfoaRhIiRhIiWgoKLd3eLcGWCaF2CaWqIb3CLcnOJcHKLbWOHaV+Eal+IbmOOb22O + b22QdG+Ncm2Od3CSenSSeHCVenOWeYCVeH+UeHqNcnSIZ2KIZ2KHamqRdHSUe3eReXSRcGiJaWF/ + X1d+XlaCYlaEZFiIa1uIa1uJaFiJaFiMbmKNb2ONcF+JbVyOaFaMZVSIamGLbWORbliNalWLZU+I + Y02OY1ORZVWOaV6SbWKVcF2JZVOHYT+DXTyHXkOJYUWUZEqSY0mVZE2ZaFCaa0yfcFCXaE6RYkiI + XUCHXD+SiJmOhJWOhpKNhJGMgIyLf4uIgIOEfX+Ie3+JfYCLeoeLeoeMeX+MeX+MeHiLd3eHeXeE + d3SDdXWEd3eIdXmHdHiGf4iIgouJgpKJgpKNf4iOgImDf4aIhIuMhpGJg46OgoaLfoKIe3+Hen6G + dHOEc3KDdXOGeHWHdHiMeX2NgIKXi4yWjJKWjJKRh42QhoyGfYSJgIiEfomHgIyJf5CLgJGOhpKM + g5CLgo6NhJGWjJ2akKGUkaGQjZ2SjZ2OiZmLh42Hg4mGg4d/fYCCeHuGe3+Qf46Xh5aSiJmSiJmR + iJCLgomJhoyQjJKVjJaRiJKLhIuHgIeMf4aIe4J5dHV4c3SCd3WGenmHg4mNiZCSjJWQiZKRh5eR + h5eOhpCQh5GSiZGVjJSQiZCQiZCVi5GWjJKXjJqWi5mSkJ6WlKKWkJmRi5SIiY2AgoaGeX2Ie3+C + en2AeXuEfomMhpGViZKWi5SSh5CViZKWjpSakpedjZWVho2SfYKRe4CSf4aSf4aQh5SVjJmXkKGR + iZqJgIiLgomJfoeJfoeOg5GNgpCViZeRhpSMhoyHgIeLgIeMgoiHf4KGfoCEf4CGgIKOfouWhpKR + hpSSh5WNhI6Mg42RiJWVjJmXjZSRh42QeX6Nd3uJe4mQgpCUg5KXh5aRgoSIeXuGbmmEbWiIdXmS + f4OShomRhIiWf4eWf4eUhIySg4uVgoaWg4eVf4KVf4KSf4OSf4OQgIaVhouVf4SSfYKNc2uDaWKD + aW+IbnSLcnCMc3KLcGWGa2GEaWWLb2uMcG2Lb2uLaWeObWqNc2+VeneWfnmagn2dgoiZfoSSdXWG + aWmAYVZ5Wk93XViGa2eNbmqUdHCWc2qOa2OJY1SAW0x/Wk2CXE+LZFONZ1WNal6Nal6ObWqXdXOS + eGmJb2GJZ02EYkiEY1SIZ1eOaleOaleNaFGNaFGQZVOSaFWOaFaOaFaSa1qSa1qOZESOZESRZFCU + Z1OZblaUaVGVaVCUaE+Xa1OablWWak2SZ0mMYkGMYkGVi52Vi52UiZuUiZuMh5eJhJWIhJCEgIyI + foSJf4aMe4iLeoeLfoSNgIeJfn2IfXuJen2Jen2LeXiMenmNeH2JdHmLe4OLe4OJgIuLgoyMg4uR + iJCOiJGOiJGVjJaRiJKRgoSNfoCHf4SGfoOLeH6LeH6GeX2JfYCHfYOJf4aQgouVh5CVh5CVh5CQ + gouLfYaDeoKDeoKCdYeDd4iIeISIeISHen6JfYCOgoiRhIuUi5eZkJ2Zkp6Zkp6akZmVjJSQh5SN + hJGMg4uJgIiAdX6DeICLfpGQg5aRhpSMgI6MgoiLgIeLh42MiI6Oho2Mg4uHfoiGfYeIgIZ/eH2D + d3p/c3eIe3+LfoKDgISJh4uOi5SOi5SSiJmRh5eSjJeRi5aSjJeWkJuUjZSSjJKZjZmZjZmWjp6U + jJuRjp2WlKKWlZ2SkZmOjZeIh5GHfYCCeHt+dXJ+dXKEen6LgISRhIiViIyUiZCUiZCUjZaWkJmX + jJWUiJGWiJGUho6Qh46Qh46SjJeXkZ2ZjZaUiJGNg4eMgoaMf4ONgISNhIyMg4uUho6Rg4yQg4SL + fn+Ng4SNg4SLg4iLg4iJgoSGfoCJeoyQgJKOg4yQhI2OhIuQhoyQh5SRiJWUjpKRjJCRfoSLeH6I + eISOfouSgo6Xh5SVgoiOe4KJdXWHc3OId3WQfn2Vg4SWhIaSg4iUhImXhI2Zho6Zg4aahIeVgIOU + f4KWfYCWfYCUfoaXgombf4SVeX6Oc2uDaGGDamuIb3CLcnCMc3KDcGOAbmGAbWeGcmuLb2qJbmmM + a2GIaF2IbmmQdXCZe36bfoCbf4SXe4CSd2+EaWKDYlN6Wkp0V0x7XlOHZFyRbmWQb2SJaV6IZFSA + XU1/W0WAXEaNY1eQZVqIZVqIZVqNa2eUcm2ZenCQcmiNakeAXjyCXUmLZVGRbV6Ub2GWbVeWbVeX + a1uWalqUaleSaVaSbVaUbleUak6Uak6Wa1aWa1abdWGVb1uVa1GWbVOeblGiclWdck+Wa0mRY0OQ + YkGVi5uWjJ2WjKGWjKGQi5qMh5aOh5aMhJSOgoOOgoONgouLf4iLe42MfY6LgIeJf4aMf4OOgoaM + fYSNfoaOe4KIdXuIdXuLeH6JgIuNhI6QiZKRi5SRiJWSiZaWi5mUiJaMgImHe4SGgISHgoaNgIeM + f4aJf4aLgIeHe4mJfoyOgI6Nf42Of4eNfoaHen6EeHt+dHV9c3SDdHmDdHmIc3qIc3qAeX6Hf4SQ + hoyUiZCZkJqdlJ6dlp+alJ2WkJmOiJGQh46NhIyLhIuHgId/d36CeYCLhomMh4uQhomJf4OMhISN + hoaMjIyIiIiJf4aLgIeGfYSEe4OHf399dXV7dHeCen2JfoeNgouHgIeIgoiQiZWQiZWQjJeNiZWQ + i5qRjJuUjp6SjZ2Zkp6XkZ2elKadkqWQiJeNhpWNiJeQi5qSkZuQjpmQjJeIhJCJg4mDfYOCenqA + eXmDeX2HfYCMgoONg4SMhImQiI2UjJuZkaGWkJmXkZqdjJudjJuVjpeSjJWQjJWUkJmajJWWiJGR + h4uNg4eJf4OJf4OEgIeJhoyViZKUiJGViImOgoORh42SiI6RhpGUiJSSgoyLeoSHeH2Jen+LfoSN + gIeMgImLf4iLgoyMg42Oho2SiZGRgoeMfYKEdXiJen2Mf4aShoyWg4mWg4mUfoaQeoKNeoCOe4KS + f4aXhIuXh5GXh5Gah5CXhI2ag4iag4iZhIeZhIebgoOXfn+Wf4SZgoeagISWfYCVd22GaF6CaGGJ + b2iNdW2MdGuHbmGCaVyCamKJcmmMcmeHbWKLaVeIZ1WGa2eLcGuUeHSXe3iVeneQdXKSdGeJa16H + Y1B+W0h0VkV1V0aAX1CGZFWHZ16DY1uCY1F+X06CX0qLaFOQamOUbmeRb1+ObV2LbliQc12Vem+R + d2uWb0yEXjyEXEWNZE2RbmWWc2qZdGGadWKbdGKWb12ZbVyVaViRal2UbV+WcFyXcl2XcluXcluh + dWSid2WbdWGadF+idVyjd12hclGeb0+XaEWUZEGRiJKVjJaVjpqVjpqSjpqSjpqWjZqRiJWNhouM + hImJe4mIeoiHe4SIfYaMgoaMgoaNhoiNhoiOhIuLgIeJf4CCeHmCc3iDdHmHeYKQgouQh5GOhpCW + iJSWiJSajJqVh5WOgoiIe4KIeoOLfYaIf4yMg5CHfoiGfYeEe4iEe4iIfoKJf4OJe3uIenqEeHt+ + cnV+bWt+bWt9am6AbnKDbnWHcnmAeoaIgo2Og4yUiJGXjJebkJuZkp6SjJeLiIyLiIyShoyRhIuM + hoyMhoyHgoOGgIKJhIiQi46QiIuJgoSRh4uOhIiMiYuMiYuUh42OgoiMh4uLhomLgISGe39+e3+E + goaOiJGMho6OgImLfYaLhI2Nh5CQiZWOiJSQhpaUiZqXkJ+Wjp6bkaKdkqOekquXjKWOh4yGfoOG + foOIgIaLiZSJiJKMhpGNh5KOiI6QiZCJhoyJhoyNhI6LgoyOgoiMf4aIgoiLhIuSh5KZjZmZkJed + lJuikaGhkJ+ajpeWi5SSjJWSjJWbjZabjZaWjJKUiZCJgoeGfoODf4iMiJGXjJeXjJeUiJGUiJGX + iZKZi5SajJWXiZKVgoiRfoSIenqGeHiGdX+Hd4CHeYKJe4SMg4uLgomMgImRho6VgouSf4iNeH2L + dXqGeIONf4uVgoiWg4mZg4uZg4uRgoeOf4SOf4eSg4uejZqbi5eZjJCUh4uSg4aVhoiai5KdjZWa + jIyUhoaXgoSXgoSXgIaWf4SWe26Jb2KHalqLbl2MdGuNdW2OcmGHalqGa2GLcGWJb2GIbl+HZ1uH + Z1uJbmqNcm6MdG6NdW+SdGqMbmSLa1yIaVqQZ1SJYU6AX0x7W0d+W02AXU+DXlSAXFF+X1CAYlOH + ZFiQbWGadHefeXuZem6UdWmQd2iSeWqSeW6Ve3CadF2MZ1CJY1GOaFaSc22VdW+ad2qbeGudeWGZ + dV2ec2KZbl2NaVuOalyObVuScF6XcGGddWWfeGWje2mheWeheWeme2WnfWemeV2jd1ubcE6UaUeR + iJKUi5WVjJmUi5eVi5uZjp+XjZ6UiZqOhpCJgIuEd3+CdH2Ee4OHfoaOfoiRgIuSg4uUhIyOh4yL + g4iDe3t/eHh+c3KAdXSDdX6Nf4iNhouNhouWg4yWg4yXh5SXh5SNgo2DeIOGeX+LfoSHeYeMfoyE + e4aAeIKCeYaCeYaEeoCDeX+EdXiCc3WDdHl/cHV9b217bmt6b25+c3KEb3SIc3iJe4mQgpCSh5CU + iJGVjZ6Si5uOho2Mg4uOhIiNg4eWgoSZhIeShoyRhIuMgoiNg4mNh42SjJKUi5KRiJCUjI6RiYyR + jZaWkpuajpqXjJeSjpeNiZKVi5GOhIuGgouMiJGQjZuOjJqNf4iLfYaEgoaGg4eJhIiIg4eNhI6R + iJKSkZaSkZaVlp2Wl56elqaVjZ2RiYyHf4KGd3mJen2Nh42Nh42LhI2OiJGRi5aWkJuVjpqSjJeO + iJSOiJSQhomOhIiMh4uNiIySi5CWjpSZkJ2flqOilqKflJ+fkpmajZSUiZCUiZCajJWbjZaajpeW + i5SOhIiJf4OJf4aRh42XjpmakZuVjpeRi5SVjJaWjZeakJaZjpWShomQg4eGd3mGd3mHdH2Gc3uH + eYKJe4SGfoCHf4KLgISMgoaRhIiQg4eUfoOMd3uGd3uLe4CRgoSRgoSZhoybiI6Uh4uQg4eQfYOU + gIeXh5GdjJadkJGShoeUenuVe32ajJWhkpuikpeai5CahIyWgIiXe4CXe4CZenCUdWuJb2SMcmeM + cGmOc2uQcmiMbmSJbmmJbmmJb2GIbl+Ga2GEal+MbWmQcG2SdGeUdWiScF6MaliJaFaHZVSMaFeN + aViJaV2GZVqIZFZ/XE6DWE2DWE2DXU6DXU6IYlWSa16ed3eheXmdfnSXeW+SeHOUeXSUeHOXe3eX + c1+NaVaQbl6WdGSdeW6deW6ZeWedfWqhe2ihe2ihdV2ec1uVb1uRa1eOaleQa1iUaVuab2GbdWuf + eW+leG+meXClfW2heWmidF2jdV6edFqacFaVh5CWiJGSiJmSiJmUiZqZjp+XjpuVjJmUg5COfouG + d3uEdXqJeoKLe4ORgI2Ug5CWgo2Wgo2QgIiNfoaHeHqDdHeAc3OAc3OAd32MgoiOhIiOhIiQg4eQ + g4eNhIyOho2Oe4SIdX6GdHWGdHV/dXt+dHqAcnmCc3qHeYSEd4KHdH2LeICLdX2HcnmHdHqCb3WC + bnCAbW9/dHOAdXSEdXiHeHqIfYiNgo2Qh5SSiZaUiJaOg5GMh4uNiIyRiY6QiI2SiI6Vi5GWjpSR + iY6Mg42Mg42MhpGUjZmWkJmZkpuZkpuXkZqakqOdlaaWkaKRjJ2RkZ+SkqGUkZ+Ni5mLiJeNi5qQ + i5qOiZmLgIeJf4aCf4CAfn+Ig4eLhomOiY2OiY2Oi5GUkJaUkpqSkZmZlaGVkZ2RjpCEgoOHen6N + gISOhpCQh5GQh5GQh5GViZeajp2akZuXjpmSiZSSiZSSjJWQiZKQiZKRi5SVjJSSiZGRkJWZl52e + l56dlp2bjpKWiY2Si42RiYybjpWdkJaZkJeWjZWWh4yRgoeJe3uQgoKajZSekZeVjpWRi5GViZKZ + jZablJmXkJWUh4uMf4OGd3mCc3WHcHWCa3B+b3R/cHV/dXmGe3+JfYCNgISOgoiRhIuVf4eQeoKN + eH2OeX6Rg4ORg4OXiI2XiI2SiIyNg4eQg4eRhIiSgoyXh5GejpaUhIyQen2LdXibhJSjjJunlJ2j + kJmahImUfoOSeXiVe3qWenOUeHCRc2mRc2mQcGqQcGqLc22Lc22Ic3CIc3CQcmWLbWGGZ2GHaGKJ + b2SOdGmXd2qWdWmVc2ORb1+RaliOaFaRbmOUcGWMbmSLbWOOalqDX0+CXUmAXEiHXUiJX0qLZVuR + a2GWdW2aeXCde3ObenKbeG+ZdW2adGqZc2mUbV2QaVqRal2XcGObdWqdd2udd2uie3Clf3CmgHKj + eGeec2KbcFiSaFCLYUmNY0yQaVqOaFiRaWOXb2mdd2+dd2+bdGefeGqid2OleWWfdFyXbVWRiJKQ + h5GVhpmai56bjZmekJudjpqbjZmShJCJe4eLe4CNfoOJf4aLgIeOho2Mg4uRg4yQgouMgoaLgISE + eHmDd3iCdG+Ed3KIe3+ShomUh42Uh42NgouJfoeLhomIg4eMeHiIdHSGc2mEcmh+cG5+cG6DbnWE + b3d/c3d+cnWAcnmGd36CdXuEeH6EdH6GdX+EeHuDd3qIeXuJen2EfX2EfX2Hf4SHf4SJgIiNhIyN + houOh4yOiI6SjJKUjJ2UjJ2ZjqGZjqGXkJ+UjJuRi5SLhI2Qh5SXjpuUkZ+VkqGUlKKUlKKalaiZ + lKeSjaGUjqKZkKqZkKqSi56NhpmJhpGSjpqQjpaQjpaSi5CRiY6GgouGgouMgI6Lf42OiY2Qi46U + i5WVjJaXjJeXjJeWjZqZkJ2NjZCHh4mGg4eIhomMhJSQiJeRiJKQh5GUiJaZjZuhkqGdjp2djpqW + iJSOiZmRjJuVjZ2Wjp6XjpaVjJSVkZedmZ+el6GVjpeRiY6Si5CUjJGXkJWekp6bkJuXkZ2XkZ2V + i5GRh42Jg4CMhoOVjZCXkJKVkpaSkJSVi5GXjZSdlZqakpeXi5GOgoiGeHiHeXmDdXV+cHCEcHOD + b3KGdHWGdHWIdXuMeX+RfoeUgImUgIeQfYOOe4KQfYOOgoaMf4OVf4eWgIiZhoyVgoiSg4uQgIiL + eoSSgoybjJSVho2SfoCMeHqQfYadiZKilJ2jlZ6hjImVgH6LdXWMd3eSdXWSdXWLd3CNeXOMeHWL + d3SQeHKOd3CMeHqJdXiOdGeGa16EaWKEaWKLbWOUdWuWenWVeXSVdW+UdG6Vb2SSbWKVb2SVb2SS + cmmQb2eQa1uQa1uJZUqDX0WJYUyNZE+JZFqMZ1yUa2KddGqeem+deW6XdGiSb2OSa16UbV+UbVuQ + aVeSa16bdGeXdWOXdWOddWiheWuhd3Sme3muf3eoenKjdWGXalaMYk2JX0qJX02LYU6OY1ONYlGS + aFqZbl+fdWKhd2OedF6hd2GhdFuablWLiZSNjJaZiZuejqGekp6dkZ2XjpuUi5eOhpCLgoyLhJCM + hpGMhoyNh42OiI6MhoyMhImJgoeQgIORgoSMfn6HeXmGfXmIf3uOgoaShomNhouNhouIg4eIg4eJ + hIiGgISJfX6EeHmDd26Dd26Ac3B/cm+CcHKAb3CDbnWAa3OCbnmEcHuDd32HeoCJen2NfoCNfoaQ + gIiLgIeOhIuJgoSLg4aLfX2Je3uCeHuEen6Mf4OViIyVjpWWkJaai52bjJ6ZjqGZjqGXkKGSi5uQ + h5SMg5CQh5SZkJ2blKOdlaWWkaKZlKWZlqaVkqKRjp2UkZ+akqaWjqKWi5aSh5KUiJGXjJWWkJuX + kZ2Ujp6SjZ2NjJSJiJCLhpaQi5uQjJWNiZKQiZWVjpqUjZmUjZmSjJeUjZmRi5GMhoyIhIuLh42O + hpCRiJKSiZSRiJKSjJWVjpeakKGelKWbkaKXjZ6RjJuNiJeRjZmUkJuZkJqXjpmalJ+fmaWfkZqZ + i5SVh5CVh5CXjZ6bkaKZlKeXkqaXlJ+Wkp6WkJmRi5SRhIuViI6ZkJeXjpaVjpeVjpeUi5WVjJaa + kZmZkJeXjJeSh5KLgIKHfX6HeHqIeXuHeHqHeHqGdHWEc3SEeHmIe32SfYKVf4SRgoSNfoCNeoOM + eYKQeoKMd36Re36UfoCXgIiZgomRgoSOf4KLeICOe4SZhJCXg46WgoSRfX+Qe36Xg4ahjJejjpqh + jIyXg4OSeXqQd3iSd3eRdXWQd3iUenuRfX2RfX2VeXuUeHqWe4KVeoCNd2eDbV2CZ1+DaGGJameQ + cG2WeneWenebenKaeXCZdWmZdWmVcmWXdGiZdGWUb2GRa1WUbleRbVyOalqQaVqNZ1eIZFaIZFaS + Z1iZbV6Zc2ibdWqWcmGUb16UaFqUaFqLa1eNblqOcGOWeGqZd2eee2ubdGSbdGShdG+nenWsg3mr + gnioe2qfc2KSaVSIX0qIXkeMYkqLYUyNY06QYlWRY1aZbliab1qdclqmemKhdFubb1aJiJKOjZeW + jZqbkp+dkKabjqWVi5uOhJWNh5COiJGUjJ2UjJ2SiJmRh5eQhJCNgo2Oh4eOh4eWiIaShIKRgoeM + fYKLgIeQhoyUho6Uho6Oh4yMhImGgH+JhIOMgoaMgoaLgIeGe4KGenmGenmCdXd/c3R+b3KAcnSC + a3B/aW6CbXSGcHiGe32LgIKMgoaMgoaQg4eViIyRiY6Si5COiY2Ig4eGd3mDdHd7c3J/d3WQfYaX + hI2Wi5SZjZaZi5SZi5SWkJuZkp6UkaGMiZmOg4yMgImOi5aUkJuZlKWalaaXkqKZlKOZl6KWlZ+U + kZ+SkJ6XlaOVkqGXkZqUjZaVjJSXjpaZkp6dlqKalaiWkaWUjp+OiZqRi6KZkqqSkZmJiJCMiJGR + jZaVjpqUjZmOiJSQiZWQiZCNh42JhIiMh4uOho2RiJCRiY6RiY6SiZGWjZWdl6idl6ialaaWkaKU + kJaLh42Ri5GVjpWXjpmZkJqalJ2dlp+akJaUiZCXi5GXi5GakZ6flqOblqaXkqKUkJuVkZ2XkZ2U + jZmSiI6Vi5GakZuelZ+ZkJqWjZeZkp6VjpqakZuelZ+ZjZmWi5aUhpGRg46OgoiMf4aMfYKMfYKJ + en+Gd3uEeH6HeoCUfYSWf4eQgIOMfX+LdXqNeH2OeH2MdXqOeH2Se4CSf4OVgoaUgISQfYCOfXuL + eXiMf4aUh42ZhISVgICOen2RfX+dhpChiZSdh4mahIeUf4KSfoCWfXuReHeVeHqZe36WgoSVgIOX + e3uWenqWfX6WfX6Od2KEbViAY1aCZFeLaWSRb2qVeXuWen2fenmfenmbeG2ad2uXdGuXdGuZdGGV + cF2RbliZdV+Vc3CUcm+Wc2iWc2iSb1qJZ1GQZEyVaVCZcmKac2OZc16WcFyRZU2NYkmGZ1WMbVuO + dGeWe26bem+ZeG2edWuddGqeeHClfnenhIKnhIKqfm2memmedFeQZ0qIX0GIX0GLYkiOZUyNX1CI + W0ySY0maalCeclimeV+hc16ecFyNgo2UiJSViZKViZKXiZKVh5CNhIyLgomQiZCUjZSWiZ2WiZ2W + i5aNgo2Qg4mRhIuSiIyVi46UiY2SiIyVhI6SgoyRho6ViZKXh5GXh5GVh5CRg4yJgoeLg4iUgImV + gouNg4mMgoiLg4OJgoKGe3+Een6Ie3+Dd3p+b3J+b3KGb3eJc3qNfoOVhouRi5GQiZCUiJGUiJGV + jpWSjJKOjpGGhoiDfn17d3V4bm9/dXeQeoSXgoySh5CSh5CQiZKSjJWWjZeVjJaOi5GHg4mMgIyN + go2Qi5uSjZ6Wjp+Wjp+XkKGakqOblqealaaVkZ2VkZ2WlKOZlqaVkZ2VkZ2VjJSXjpaZlqWbmaeh + mayelqqajqeXjKWbkKudkayWlZqMi5COiI6UjZSVkZqSjpeOiJGOiJGOiI6MhoyOhIuQhoyQh46R + iJCLh42NiZCUi5KUi5Kdl6eblqafl6eakqKXjJeSh5KRiJCUi5KVjpqWkJualaWXkqKZkpuRi5SW + iZCXi5GbkJuekp6hkaOejqGZjJ6ZjJ6bkaOWjJ6XkZ2Zkp6bkaObkaOZjJ6WiZuXjpmWjZeakZ6e + laKalJ2UjZaVhI6VhI6Rh4uQhomSg4iUhImVgIyOeoaNfoOOf4SRhIiRhIiRhoKLf3uNeXuLd3mL + dXiMd3mLd3eOenqOe4KRfoSRfX2Sfn6JeHeEc3J/cnqIeoOXgIiWf4eUgISNen6Vf4eahIybhIme + h4yUhImUhImXgoSRe36SeXiWfXuXfoKXfoKWenqUeHiUenuUenuUdWmNb2ODZViCZFeLaWSRb2qU + eHOXe3eZeXedfXqaeXCaeXCaeW6aeW6adWSZdGOZd2KaeGOZeHmbenudeniZd3SZcmSUbV+Va1GW + bVOVa1idc1+ec2Kec2KSaU2LYkaHYk6OaVWSdGqdfnSbeGuZdWmddWWbdGSad2ubeG2ff32lhIKo + gnqngHmleWGab1eNYkeLX0WLXkiLXkiJW0SJW0SJWz+ZaU2Wa1uid2WidWShdGOSfYeWgIuRgIuS + goyOgIyIeoaIe4KOgoiNhIyVjJSZjZuWi5mWiZCQg4mVgouWg4ySiI6XjZSVjJaVjJaSh5KUiJSV + h5KVh5KSh5KRhpGOhpCOhpCVhI6Ug42Vh5CZi5SRiZmSi5qLiZSIh5GIgIaHf4SLfoSAdHp9cHR/ + c3eIc3qRe4ORg4yWiJGXjJWViZKXiZKXiZKRjZaRjZaVjpWOiI6JhIZ/ent6cHR+dHiVeoOaf4iU + ho6Rg4yMhoyMhoyNhI6JgIuHf4KGfoCJgoSOh4mQiZKUjZaViZeWi5mUjp6ZlKOelqedlaaVkKGV + kKGWkKeXkaiWlKKWlKKalJ2dlp+mnaqlm6ijl6ahlaObjqKbjqKhlKqhlKqalZmRjJCNhIyUi5KQ + jpaRkJeRjZSOi5GMhoyOiI6UhImUhImQh5GQh5GNiZCLh42QiZCQiZCUkaGXlaWfkqWajZ+ajJqV + h5WNhIyRiJCUiJSViZWXkJ+Wjp6UjZSNh42Oh4yUjJGajpeekpujjp+hjJ2aiZmZiJeZjp+XjZ6Z + jp+akKGbjqKZjJ+VjJaRiJKSh5KViZWXkZ2blaGZkJqSiZSShoyRhIuVho2ZiZGZjJKZjJKZhJCU + f4uShISRg4OViIyViIyUiYuOhIaOeYCJdHuHcneLdXqMd3uSfYKRfoSRfoSWf4SRen+Ld3mGcnR9 + aWuHc3WNeoCVgoiVf4KQen2Qen2Re36WhIaaiImXhI2VgouXgn+SfXqReXCVfXSagn2WfnmQdW6O + dG2QdHeSd3mQdG+Ncm2JaliIaVeJa2KQcmiXeW+ZenCad26beG+XeWuXeWuhfXKifnObfXCZem6d + e2+bem6be3mff32ifXibd3KZcmSXcGOSa1qVblyRb12aeGWfemueeWqXcl2NaFSJZVORbVqXd26e + fXSdd2uadGmWc2ead2qad2uWc2ideXujf4KmfnqogH2ne2qdcmGba0+XaEySYk+LW0iHXEGHXEGH + XUaSaFCWcGWbdWqic2Web2KNeoCJd32GdX+GdX+EeH6AdHqEcniLeH6IfYaNgouUi5WVjJaXiJCU + hIyQgIiUhIyUi5WakZubkJuWi5aSh5KSh5KSh5WRhpSNh5CLhI2LgoyOhpCQh46Qh46SjJWWkJmW + jaWWjaWRiZqNhpaIg4eDfoKAd3p+dHiJdXWEcHCHen6NgISVho2XiJCXjJWUiJGUi5KSiZGQiZWU + jZmZjZmXjJeXh5aLeomDb2+GcnKQfYOWg4mXiZKXiZKNh5CMho6Gg4d/fYCDg4OHh4eMh4uRjJCW + kJmVjpeSjJeRi5aVkJ+dl6eblKWdlaadlaadlaaal6eZlqaZmaeZmaefl6eblKOimqqlnaymnaqh + l6WXkqOZlKWalaiZlKeVkpaQjZGOh4mNhoiRi5aWkJuSjpqNiZWMg5COhpKQg4mOgoiOhpCQh5GR + i5GNh42Nh5COiJGQiJeQiJeVjZ2Si5qUi5WSiZSQg4mViI6Uh42ShoyVjJaXjpmUiZCLgIeRhIaV + iImWjJKdkpmllqKekJuSiZSSiZSUkJuRjZmZi5aekJuikZ6hkJ2UjIyQiIiOho2RiJCWjZeelZ+i + lJ2djpeRhIaShoeXiZKXiZKZi5SZi5SXiJCUhIyXhI2Zho6XiZKbjZaZi5SShI2Jd3+LeICIdXuL + eH6QeoKWgIiWg4ySf4iXgIiReoKQeHOJcm1+amOHc2uIeXuNfoCWf4SVfoOQenqRe3uRgoSVhoiX + iIuVhoibf3+UeHiSenSWfniWg3uSf3iSeW6JcGWIbW2Jbm6OdG+Nc26NbWGMa1+QcGqVdW+WenOU + eHCbeG2ZdWqUeWuXfW+ff3mjg32ffXiee3ehe3ehe3ehfnuif32he22bd2iXbluacF2Wb2KVbmGU + c2iaeW6dfnCdfnCdeWOVclyObmKScmWZeG2efXKZd2SUcl+RbmOXdGmec2ehdWmfdXOieHWienem + fnqleWifdGOjblOfak+ZZ1GSYUyQYUeNXkWJX0qNY06Xc2SXc2Sdc1+WbVqJd3+Abnd9a217amt7 + bm57bm5/a26GcnSIeXuRgoSOi5aOi5aNhouMhImRhIiViIyUjZaWkJmdkJaViI6RhIuRhIuOgImQ + gouJf4aIfoSEfoSJg4mHg4mMiI6Mi5WQjpmWjp+blKWXjpaMg4uJen2Gd3mCdHKDdXOAc3CCdHKG + e3+MgoaRhIiWiY2bjJSWh46Rho6Og4yQiZKSjJWdkqWbkaOVi5+IfpKEd3SLfXqMhImVjZKfjp6e + jZ2OhpKHfouHfYCEen6JiYyOjpGbkJ6flKKZlKWVkKGSh5KSh5KVjZ2akqKZlqWZlqWblKOdlaWb + maeal6adma+ZlauWlqeWlqedl6ifmqufl6ifl6iXlaOSkJ6Wjp6Wjp6SjpWMiI6MhIeLg4aOi5SN + iZKRjp2OjJqXjJeUiJSOgoiQg4mJg4mMhoyMhoyMhoyIf4eLgomNgouNgouOg46RhpGRiY6RiY6U + hImSg4iUhImUhImQiI2UjJGWh4yOf4SOgoOViImWjJCdkpaimaGakZmRho6Og4ySiZSRiJKWi5aZ + jZmmlaKfjpuVi4yRh4iJgIuOhpCRhpSbkJ6ekpudkZqViIyWiY2XjJeWi5aXiZKWiJGah42XhIuV + gI6ahpSWi5aWi5afjJWXhI2QfYOMeX+HdHqHdHqOeH+Se4OWgIiWgIiSfYKMd3uLd22IdGqDb2WI + dGqIdHSNeXmOeX6Qen+Oen2Qe36UfoaahIyhh4aehIObf3qUeHOVeneVeneNf3qNf3qUeXKEamOD + aGGEaWKEaWKGamOIbmONc2iSeHSWe3iZfXmWeneWd3COb2mUcm2denWbgHmeg3uef3ObfXCfeHSi + enejfnmlf3qlemSbclyRZ1GValWXbWGbcGSaeW6ffnOhf3SigHWffWqaeGWXeWuVd2mWe3Caf3SX + d1uLak+JZVeQa12ZcmKZcmKUblqadF+ddWiheWuld1+idF2icleeblSda1aZaFOUZE2NXkeIXEaO + YkyRb1+XdWWedFqXblSLdHuGb3eCamV/aGN7b2V5bWN5bmp/dHCHeHqQgIORi5aRi5aNh42Nh42Z + hoyah42XjJeXjJebjpKViIyRgoeQgIaNgIKMf4CHfn2DenmHfYOIfoSMhIeRiYyQiZKVjpebjqGe + kaOZjpWRh42OfXuJeHeLeXiJeHd+dXJ/d3ODeneJgH2RgoSVhoiai5CXiI2SiIyUiY2SjpeWkpub + lqealaaRjJuJhJSJen+Of4SRi5aalJ+ekaObjqGVho2Le4ODfn2Mh4aSjpqZlaGel6+fmbCelqqa + kqaUiJGRho6SjJeZkp6ZkaWZkaWdlKGdlKGal6abmaeem66XlaeWlqWZmaebmaifnayem66ZlqiW + kpuQjJWXiZKXiZKVjpWQiZCMhImMhImRh42UiZCSjpqSjpqXkZ2UjZmQi46Mh4uOgoiJfYOGeoOH + e4SJfYCNgISRgoeNfoOOf4eUhIyRg4yShI2XhIuWg4mZhoyVgoiSiI6Rh42Vho2RgomShomXi46W + jpSakpelmaWekp6Sh5CNgouOg4yRho6Sh5WWi5mdkZqflJ2dkJSXi46ShoyRhIuOg5GUiJaZi5ae + kJuUiJGUiJGZjZmWi5aVi46UiY2ai5CWh4yRgomVho2Vh5KVh5KbjJSZiZGVg4SLeXqIdXmHdHiN + eHiOeXmSfoCVgIOUenmOdXSGcmqGcmqJcG+LcnCMd3mQen2Wen+UeH2SeX2Uen6SfYSZg4ufhICd + gn6aenSSc22OdG+UeXSQf3iSgnqWe3SGa2R/YVuAYlyCY12EZV+JameRcm6WeXuZe36ZeXWXeHSW + d3OQcG2Xc26deHOihoKfg3+igHibenKaeHObeXSifXilf3qfeGWVblySaVSOZVCQal+WcGWZd3Kh + fnmjgHujgHuffWqaeGWWeWWXemede3OigHihemOSbVaRYVCQX0+OaFuOaFuQZ0+WbVWXc1+eeWWh + dWSid2Wjd1ueclaablOXa1CUZEqVZUyRYUyOXkmSZ16bb2edc1iacFaLdHmEbnOCbWqHcm+Cd3V+ + c3J+b3SEdXqJe3uRg4OOhpCOhpCJhpGNiZWXiZKXiZKZjZmZjZmXjZGUiY2QfnqUgn6Lg4OJgoKJ + gH+Ee3qHfYCIfoKOhIiRh4uUi5eVjJmZkaGZkaGXkZqSjJWJgoKJgoKMhImIgIaHenuEeHmEeXOR + hn+Vh4KXiYSbiJGdiZKViZWXjJeXkqKblqaZmaeWlqWUkpeNjJGOh4ySi5CWkKeblayelqaWjp6S + hISMfn6Lh42VkZefmqqemaidma+fm7KhlqibkaORiJCQh46NiZWQjJeWjJ2XjZ6bkp+dlKGal6af + nauhm6yblqeXkqKWkaGbmaiem6uem6qbmaeZkZaSi5CWiY2ViIyWkJmSjJWOho2Oho2RhpGUiJSW + kJaZkpmXkqaXkqaWkp6Oi5aah5CSf4iGeX2Ie3+Le4COf4SOgoaNgISQg4eQg4eWhpKWhpKWh4yZ + iY6Xi46Uh4uSi5CQiI2Zho6Zho6UiJSXjJeWjp6ZkaGhl5+elZ2XkJKSi42OhIiNg4eNhI6RiJKU + jJudlaWdkpmXjZSXiI2Sg4iNf4uUhpGWh5mai52SiZSVjJaZkZaWjpSZjpCVi4yXjZGSiIyNgoCL + f36RgomUhIyai5KbjJSViImOgoONe32Id3iIc3iMd3uWf4SWf4SVfXSSenKHc2uIdG2JdHSMd3eN + eHqRe36WeH+SdHuMc3KMc3KNe3qVg4KbgoabgoaWenWOc26RdXWVeXmRfXeWgnubgHWRd2uJaFiA + X1B6XEp/YU+DaGOOc26VeHibfn6Vem+Vem+adXCUb2qScmmXd26bf3ufg3+hf3SXd2uXeW2Vd2qa + eW6de3Cfe2+beGuVdWGRcl2QcFyQcFybd3She3mjf3Sjf3SeeG6Zc2mZdWqdeW6he22mgHKhe2iW + cl6UYliOXVSIXk6HXU2QY02SZU+Sa1qfeGWle3Kof3WnfnSieW+eclSVaUyRY0SUZUaSZVGRZFCR + ZFCWaVWXbVqXbVqEd3SGeHWMfYKOf4SLhIuJg4mQgouLfYaOe4KSf4aRg46UhpGQhJCQhJCQhoyR + h42ViZeUiJaSjJWRi5SShomUh4uQi4yOiYuOiYuNiImNg4eLgISRh42UiZCUi5eakZ6XlJ+alqKf + lKKajp2VjpWWkJaVjJSNhIyMgoaJf4OMf4OWiY2Vi5GZjpWbjZaajJWZkJqZkJqZkJqdlJ6alaaa + laaZlaGVkZ2XkJ+XkJ+WkaGblqadlp2SjJKLgn6Lgn6Vi52flaelnbCimq6fmbCfmbCdlqKXkZ2O + ho2Qh46NiJmNiJmZiJeaiZmZjZmbkJuVlJ6enaeimqqdlaWWkp6Wkp6alqKdmaWdm6aenaebkp2W + jZeWjZWRiJCZlJeVkJSQjJWOi5SUjZmVjpqXlJ+bl6Oblqeblqebl6GXlJ2djZCVhoiJen2HeHqJ + fYOMf4aOhIiNg4eShoeShoeZho6Wg4yViIybjpKWjZWUi5KUiJGUiJGXiJCZiZGZkJqXjpmXkZ2S + jJeWkJmblZ6ZjZaWi5SQhoyOhIuLgoyMg42ViZeXjJqdjJmfjpuZi5aVh5KOeYCQeoKQgouShI2Q + h46RiJCWjJKdkpmfkZqdjpedjZWZiZGUhIeIeXuQen+Re4CWg4mZhoySgoyQf4mOe3+MeX2MeHiN + eXmRe3mWgH6Xf3eVfXSSeHOSeHORe3mUfnuUfoCUfoCZe4COcneAbmF/bV+Lc26Ue3eXgoKXgoKU + eXKSeHCVe32SeXqVeHiZe3uhf3ebenKWb1+LZFWAXEaCXUd/ZViMcmSSd3mZfX+Uem+Qd2uVcmeS + b2SUcHOZdXiXfXWbgHmjf3SdeW6bd3SXc3CZem6dfnKlf3qmgHujg3+efnqVdGuVdGuac3Kienmi + eW+jenCecmWWal6UbV+ZcmSab2OhdWmfeW6adGmValeLYU6DWD6CVz2HWEGQYUmRZ1SfdGGnf3uq + gn6nfnSnfnSjeFaWa0qRYkiUZEqVZE+WZVCZaVGXaFCVZFGVZFGJfYCQg4eUh42Uh42Oi5GNiZCU + iZCNg4mQfYCQfYCNf4iOgImQf4mOfoiOeYOQeoSOg5GRhpSQjJeMiJSUiZCZjpWXjpaVjJSVkI6Q + i4mOiYuOiYuUiJGUiJGXiZWdjpqekaOfkqWjlKajlKadlaWblKOZkaGUjJuQiZKNh5CSjJeXkZ2a + kZuflqGbkpqakZmXkJ+XkJ+akZudlJ6dlqKhmqahlaOekqGajJqajJqZkp6blaGZlJeOiY2Mg4KM + g4KXiJufkKOll6uhlKeelaKhl6WalJ2XkZqWi5aRhpGRi5SOiJGWi5aXjJeVjJadlJ6ZlaGfm6ee + maqXkqOUjJuUjJuXkqKdl6eemayhm6+hmayblKeWkaGVkJ+dmaKZlZ6SkZuSkZuWkp6VkZ2dlKGi + maafmqqdl6ebmqWVlJ6akZuVjJaOhIiHfYCHeoCJfYOQg4mRhIuUhImWh4yXiI2VhouWiZCdkJaX + jZGVi46XiJCWh46Xh5Sbi5eWjJ2XjZ6Wi5SSh5CUjp6WkaGZjZaWi5SVhouRgoeNfoOOf4SRgIuZ + iJKeiZeeiZeSh5CNgouJd32LeH6LeH6NeoCNfoOOf4SVho2bjJSbjZmdjpqfiJCbhIyagIKReHmN + eXeQe3mWgIiWgIiReoSUfYeUfoOMd3uNeHiRe3uSfneVgHmXg32ZhH6Zg4CZg4Cah4uXhIiXg4aW + goSVeHiOcnKCbmR7aF6HbWmQdXKVe32Ve32We3eXfXiXfoKUen6ZfXmafnqfgHeae3KZdGGRbVqN + Z1WNZ1WGaF6Nb2WRdHSXenqSeW6Mc2iOb12La1qRc2eZem6af3Seg3ilgHihfXSddXKddXKZenCh + gnijfnuog4CnhIOmg4Kienmed3Wfc26jd3KleW2ne2+fcl+VaFaNZE+RaFOWaFuaa16ddWiZcmSZ + b1yUaleMZEGGXjyEVzmLXT6QZFSfc2KjfXKngHWqfWuoe2qieFibclOaaVGWZU6aaU2aaU2ZZ1GZ + Z1GXYUmUXUaUho6WiJGUiJSXjJeZkJqVjJaQjJKMiI6NgISIe3+HeoCIe4KIeYCHeH+IdXmLeHuR + gomVho2ViZeQhJKZi5afkZ2bkJ6XjJqXkJWVjZKSiI6Vi5GVjJaUi5Wdjp2fkZ+dkqWil6qil6ij + maqfl6iblKWalaaVkKGWjp6Wjp6ZlKOalaWfmaWhmqaXlqGVlJ6XkZ2UjZmZjJ6dkKKimqqhmaij + l6OdkZ2diJSdiJSUi5eWjZqajJWShI2Ng4eQhomSh5KZjZmilqWbkJ6alJ2ZkpuWkJuXkZ2XjJqS + h5WRi5SQiZKUi5WUi5WSiZSakZualaWfmqqdkqWZjqGWh5mXiJqXkZ2dlqKlmq+lmq+hmaydlaiX + l6iZmaqjm6ufl6eblaGZkp6VkJ+Ujp6blKWfl6ibmaiWlKOUkaGUkaGXlaOVkqGViZKMgImGeX+H + eoCUfoiZg42Vh5CWiJGWiY2WiY2OjJCSkJSWjJKWjJKai5KWh46XiZKdjpeZkJ2Ui5eRiY6QiI2W + jJ2Zjp+bjZaWiJGWiIiRg4ONf32Nf32MfYSUhIyZiJKXh5GShoeMf4CJdXiHc3WJdHmMd3uHeHqE + dXiOeYOVf4mUiY2ZjpKih42bgIeUfn6QenqNe32MenuOeH2QeX6SeX2Qd3qMeHiMeHiQe3WUf3mW + hICaiISbhoueiI2ajZGajZGejZeaiZSdh46ahIyZfneOdG2CaGF9Y1yEaWSNcm2Sd3eVeXmff32h + gH6WgIOVf4KVenWUeXSae3KZenCVdWWSc2OUc2qRcGiOb2mUdG6WeG6WeG6ScmWObmKNa1qMaliQ + bWKZdWqifXungoCmgoSifoCdeHOdeHOZeXeefnuifoCqhoiui4mnhIOqe3Old26idWmjd2qieW+j + enCedF6WbVeQZEmNYkeUZ1OZa1eecmOecmOec1+bcF2XbUyQZUWLYkSJYUOMZ1yadGmmfm6mfm6o + d2OndWKec1Gab06da0+XZ0qdaE2ibVGea1adalWZY0aXYkWajJeWiJSXiZebjZuWjqKWjqKSkZmM + i5KNgIeJfYOGcnKDb2+AbnKCb3OCdHSEd3eJen+MfYKMgIyJfomRiJKZkJqdjp2hkqGXjpuWjZqW + iZCViI6QiZKRi5SUjJ2Wjp+akqaelqqbmaial6eelqedlaaZlqiXlaealaaalaahmqafmaWblKWV + jZ6LiZGJiJCRho6UiJGWjZqakZ6al6eVkqKVkZ2Oi5aLg4aRiYyRi5aVjpqajp2UiJaIhomIhomO + h4mUjI6XkZeSjJKSkJ6VkqGekJ6djp2XkZ2UjZmQiZCOiI6OhpCRiJKQiZWUjZmZjqGflaeblKOb + lKOXiZKWiJGVjJmZkJ2fl6ihmaqemayalailmqynna+emayfmq6jnaialJ+Ujp6RjJuVkKGUjp+S + kJ+Rjp6SjJeWkJuZlqaXlaWVjJaIf4mMd36LdX2Of4eVho2Xh5Sbi5edhpKfiJWNi46OjJCbi5Wb + i5WViI6RhIuViZKXjJWWjZWUi5KOhIuOhIuSh5CSh5CViI6RhIuUh4iShoeUh4uShomMe4aMe4aN + f4iNf4iVgICVgICSfnuJdXOJbnCJbnCJdHSIc3OJdXWXg4ORiYmUjIyaiImSgIKQe3uQe3uSf4OU + gISRgoSQgIOQe3WMeHKHcm+NeHWNeHWUfnuWh4yejpSdjZWdjZWejZehkJqbkJuZjZmhi5Cbhoua + f3iQdW6Ja1+HaV2IbWmNcm6aeHObeXShf4CjgoObgoaXfoKSd2+NcmqRdXCVeXSQdWiQdWiWd3OZ + eXWafnmZfXiVe22Qd2iVc2ORb1+NaVaIZFGJZFqOaV6XeYChgomnhI2lgouaeXCScmmScG6XdXOh + gH6oiIavi4KwjIOofmWfdV2fdV+jeWOlgHSlgHSde2SVdF2UakyLYkSUZ1WbblyfdWKfdWKadFuX + clidc1iXblSRbVGQa1CLa1qUdGKid2WleWiodV+ndF6iclCaakmZaEybak6balOda1SdZ1OeaFSa + Z0iRXkCdiJaZhJKSh5KWi5aZjqOXjaKUjZmSjJeQhoyHfYOIc3CCbWqCbmiDb2l+cnODd3iId3iJ + eHmIeX6Le4COhpCSiZSXjZ6bkaKXjpuVjJmViIyOgoaLgIeQhoyNiJeRjJuZkaGblKOXlaOWlKKa + lJ+dlqKelqaelqaflaehlqijmqehl6WejZeWhpCNhIOLgoCLfoKRhIiNiZKSjpeZkJeZkJeUi5KQ + h46MgoiRh42Qh5GXjpmakZuWjZeUjpKNiIyMhISQiIiVjJaUi5WUjp+Ujp+WkJuXkZ2VkJ+RjJuN + i46MiY2Ng4mQhoyHg4mIhIuSiZabkp+WlKKWlKKZi5SZi5SbjZubjZudkqWelKablKWakqOilaej + lqialaaemaqhmqablaGZkJeXjpaXjpaVjJSRjZmMiJSSiZSUi5WZlKOXkqKZkJeOho2JfX6Ie32Q + gIaOf4SWgo2bh5KVh5KVh5KRho6XjJWdkJaajZSVg4SQfn+Vh5CZi5SWjpSQiI2OgoOOgoORhIiS + homWg4eUgISNg4eUiY2WjZeRiJKQgouLfYaMfYSOf4eWhIaWhIaWgn+RfXqJdW+IdG6Hcm+Ic3CI + d3OUgn6XiIuai42Zh4aVg4KWgH6Xgn+Zi4uajIyZjI2RhIaQfXeHdG6Jcm2MdG+LdXiXgoSbi5Wf + jpmfkJWfkJWbjZaekJmbjpWWiZCXg4aVgIOVfXSOd26Qb2SLal+NcHONcHORd3OXfXmZe4Cfgoeh + g4uafYSUdWuOcGeVdXKWd3OWd3CZeXOafX2hg4Ojh4KhhH+bgnSWfW+beWmZd2eWdVyMa1OMY1CL + Yk+OeH2dhoumiY6fg4idfWqSc2GQblyScF6Xe3Sihn6nh4Cjg32ie2KbdVydd2KhemWjgnmhf3eh + f2WaeV+acleQaE6VaVidcF+edF6dc12acFSbclWbbleecFqdc12bclyZc1qZc1qjeWWlemeoemWn + eWShcFaaalCXaEyWZ0qZaFWZaFWbZE+XYUyXZEOUYT+Wgo2Xg46WhpWdjJuakKGXjZ6akKGWjJ2U + h4iOgoOHdXd/bm+CbWqGcG6Gc3eIdXmHdXKGdHCCdHSGeHiNfoaVho2XjJqajp2bjJ6XiJqVg4SS + gIKLfX2Rg4OQhoySiI6SjJeXkZ2XkZqZkpudlJuelZ2hlKafkqWhmaihmaiimaaelaKfjJKVgoiR + e36OeXuOgH6Rg4CQiZCRi5GXi4yZjI2QhomQhomQhI2Rho6Vh5KdjpqdkZ2ZjZmajpqSh5KQhoeS + iImSjZGRjJCXi52ZjJ6VjJaWjZeSjZ2RjJuNjJSJiJCNgIKMf4CIgn+LhIKLhJCSjJeSjZ2Ujp6W + i5aViZWWi5aWi5abjqGbjqGakZuakZubkJubkJudkqOhlqeblqaalaWXlJ2WkpuWjJKRh42Oho2N + hIyOg4ySh5CfkZqekJmfkJKUhIeMgoaMgoaOgoOLfn+UfoiXgoyQhI2Rho6OhpCWjZeakJSWjJCU + goCQfn2RhIaViImWjYyVjIuMg3+JgH2JfX6Mf4CQfn+Qfn+QhI2ZjZaZjZmUiJSRho6MgImMe4aO + foiQgIiWh46Zh4iXhoeOen2MeHqJdW+Hc22IeXuSg4aZhoyah42XhoSVg4KVf4SZg4iZiY6hkZaa + jpeViZKWg3uLeHCId2KGdF+Hc3OZhISfjpmhkJqdjZCejpGdjZWdjZWfiYmahISWe3CQdWqUeXKN + c2uJbmeIbWWLbm6Qc3OQdW6SeHCVeX6dgIaaf4aaf4aVd2qQcmWRc2mVd22Xe3iXe3iafnqhhICl + iYSjiIOjhHefgHOff22aemiXemmOcmGMa1CLak+Oc3Wbf4KliIihhISjgG6Vc2GMaVSLaFOQcG2e + fnqhhH+dgHueemSXdF6bc2mle3Kjg4Cign+lf2ufemeedFyXblabcF+ec2Kid16hdV2ablCeclSf + c1efc1eec12ec12id2Oid2OleWGmemKqfmWleWGnd1yeblSXaUiWaEebaVSea1afaUyaZEeZYkGU + XT2UfoiRe4aWfoudhJGUiJGUiJGZkJ2Ui5eRhIuQg4mJen+DdHmEcniJd32Jd3qEcnWJdXiMeHqJ + d3qJd3qOe3+Wg4eWi5SZjZadjJmaiZaVhouQgIaQgIaUhImQgIaSg4iQh46SiZGajpeekpuilqKj + l6Olnayfl6efmquemaqblqablqabjpKRhIiMe3SLenOMgHqRhn+Rh4uUiY2ViIyXi46WjJKSiI6W + iZCXi5GakZuelZ+flqObkp+WjZqRiJWZjpWZjpWUi5KRiJCVh5KVh5KNhJGRiJWVi5uVi5uQiZWO + iJSSg4aOf4KJen2NfoCGfYSIf4eUhpSWiJaVi5uQhpaSh5WUiJaUiJaViZeajJWdjpeajpqdkZ2Z + kaKZkaKZkaGblKOZlqWXlaOXkZqOiJGIf4mMg42QhoySiI6XjJeZjZmXjJWSh5CQh46Qh46QgIaQ + gIaRhIuShoyOhIuQhoyOg46XjJeakJGXjY6Vg4KSgH+NgISQg4eWiYuWiYuOg3+MgH2Jen2IeXuM + fn6Mfn6Ngo2Wi5abkJuXjJeWiZCOgoiMfYKQgIaRgIubi5WekZeajZSUf4KNeXuJdW+Qe3WQgIaZ + iY6XiIuVhoiRgoeRgoeVgoubiJGbi5WhkJqhkJqdjJabh4SSfnuQe3uGcnKLdXOXgn+ijJaljpmd + iZCZhoyahImahImhhoCfhH+deW2ad2qSenSQeHKMeXKEcmqLb2qSd3KJcGWHbmONcHCSdXWVeXub + f4KWd3CSc22QdG2VeXKaeniaenibf3uhhICfi4Sfi4SihoCfg36hgH2hgH2bfXCVd2qUdV6Rc1yO + b2mZeXOhhICihoKlf26VcF+OaVONaFGQbWKdeW6jfnmifXied2Sac2GadGqfeW+mgHumgHujf3Sj + f3ShdWSfdGOfeGiheWmmemejeGSbb1Sbb1Seclaeclafcluhc1yfcl+hc2GjdWGqe2enf22iemim + dVuhcFafbVehbliid2Oid2OjcleaaU+ZYkSSXD6Of4eMfYSUfYSZgomQhomSiIyWi5aUiJSUiJSO + g46MfX+EdXiDd3qMf4OHfYCDeX2NeoCQfYOJen+QgIaOgoaViIyVjZKWjpSdjZ+djZ+bi5ebi5eR + hIuRhIuUgImRfoeNgouSh5CekqGilqWhmaqimqufmq6dl6uakqKblKObl6OXlJ+UkZWMiY2MhImN + houOgoOQg4SSiImWjI2ajZSajZSZjZaZjZaXjJebkJublqaemaidmaWXlJ+ZkaGZkaGXlaOal6aa + kZmRiJCNhouNhouQg4mRhIuQhI2Sh5CWhpCUg42OgoiOgoiIeXuHeHqGeXqHenuNgouOg4yRho6N + gouOhpKRiJWUjZmVjpqZjZmajpqhkp6ilJ+XjpuWjZqXi52ajZ+akqKdlaWblaGUjZmNhI6NhI6U + h42WiZCWi5aZjZmVjJSRiJCQh46Oho2Uh4uRhIiQiI2QiI2Ng4mNg4mRg4yXiZKfkpSXi4yZhISZ + hISOgoaMf4OOhIuRh42Qg4SQg4SNeXmMeHiQe3mQe3mNfoaWh46bkp+WjZqRhIuNgIeQfYCUgISa + hIyeiJCilZmdkJSXhoSNe3qNcm6WeneVgoibiI6ZiY6UhImRg4ONf3+RgoSZiYydjJmfjpujlJua + i5KZh4iSgIKQeX6OeH2Re4OZg4udjZWdjZWdho2Se4OVf3+WgICWgnuZhH6deniZd3SUenmVe3qR + emuQeWqRd2uSeG2Jc2eHcGSGamOJbmeUdG6ZeXOWdWqUc2iQdWqVem+eeXSdeHOae3KhgnidiYOd + iYOfh36ehn2ignuignuef3Kef3KZeXOZeXOaeniefnufg36dgHunf22bdGKUaViOZFSSamSbc22d + eHWdeHWadWKXc1+XcmibdWumfXSle3OieXCjenKhdGWjd2ileW2ofXCsgGileWGfblufbluhcFih + cFieblaeblaZa1qhc2Gjd2WnemmqfWumeWijdWGhc16jeGmqfm+og3KrhnSreWWhb1yhaUqXYUON + foONfoONen6QfYCMf4COgoOVgIyXg46Vh5CQgouQfYCNen6MfoeRg4yRhIuQg4mOhIuQhoyNgIKR + hIaQi46SjZGZjZmajpqXjZ6WjJ2bjJ6djZ+QhoyMgoiSg4iQgIaQhI2ViZKdkKOhlKehlquhlquh + lKqdkKaajJebjZmbkpqZkJeVkJSQi46RiJWQh5SOiY2Qi46UjI6XkJKel6Oel6Obkp+akZ6XkZqZ + kpuhmaiimqqblqaXkqKdlKGlm6ienqyenqyhkp6Rg46NgIeRhIuSf4OWg4eVhouVhouWh46UhIyL + f4iJfoeGenmJfn2MeX2Nen6LgISJf4ONfoORgoeNgouRho6UjZaVjpeZjZmbkJuelZ+hl6Kilp+a + jpefjpubi5eZjZmhlaGelKWakKGSiI6UiZCXi5GajZSZi5SZi5SbjJSZiZGai5KWh46WjJCVi46S + iZGQh46ShomShomUho6XiZKfkpaajZGdiY2ei46Wg4eQfYCNgIeRhIuOgoaOgoaQgn+Qgn+Vf3+X + goKUfoOZg4iekJuajJeUgIeNeoCSe4CXgIaZhomhjZGil56il56fiYmXgoKWd3CWd3CXhIuei5Ga + i5CSg4iSfX2SfX2RfX+diIubiZ2di56ijpWah42af4aXfYORe4aOeYOOgoaViIyZiY6ZiY6dg4SS + eXqVeXWVeXWMd3eSfX2ZfXmZfXmVgICahoaZgnWVfnKXeHSWd3OSdGiOcGSHaVyEZ1qObmOUc2iV + d2qWeGuVeXKVeXKbem+bem+SeW6XfnOdgn6fhIClhH6lhH6lg3qjgnmig3mig3mjg4Cjg4ChhISe + goKegn2afnmlfnSfeW+WcGWOaV6QYleVZ1yVb2iXcmqWcFyWcFyUb1yXc1+ec2Kec2KfdGWdcmOe + c2SleWqlfW+ogHOrgG2ofmqjcl6ebVqec1udclqfak+aZUqSZVGhc16meHCneXKqfWunemmjdV6e + cFqid2qne2+nfnWvhn2vg2+ofWmncFOdZ0mNfoaNfoaMf4OLfoKNeoCOe4KQe4eVgIyVgouWg4yQ + g4eQg4eQh5SRiJWVh5CWiJGQi4yOiYuQhomQhomOho2SiZGZkp6Zkp6ajpqWi5aZjZuXjJqSjJKR + i5GSg4iOf4SSiI6SiI6ViJqbjqGikKWikKWfkZ+XiZeViIyWiY2UjI6VjZCQjJKRjZSajJeajJeU + jJGUjJGbkZejmZ+dmqyal6qVkZ2RjZmVjpealJ2lmqyflaeakZ6XjpuVlJufnqahnq6fnaydjpeN + f4iOf4eRgomIfn+Ng4SQhoyRh42Zgo6Zgo6Rh42QhoyOg4KQhIONfoOQgIaSf4iOe4SGe3+Een6L + fYaRg4yRi5aWkJuVjJmakZ6Xl6WZmaaimaOhl6KllqKjlaGbkJuflJ+ZlKWXkqOWjZeXjpmajpqd + kZ2WkJmVjpebkp2dlJ6ekpuXjJWWjpSWjpSVkJSRjJCViIyRhIiQiI2WjpSblZ6fmaKhkJqbi5WV + goaOe3+Ne32Vg4SOhIaMgoORhIaViImag4idhoubhoibhoidkJaekZebh4mNeXuOeX6Xgoeah4uj + kJShlp2hlp2jiY2hh4uafn6Xe3uah42ei5GWiYuOgoOHcnSIc3WReoKag4uZi5SZi5Sah4uUgISX + foKSeX2MdX2Nd36Qfn+Rf4CWhIaaiImZhn6VgnqUeHORdXCQc3OWeXmWfYCXfoKZg4iZg4ieg3ua + f3ibeXSaeHOOd2KLc16MaFWJZVONbl6UdGSZdWmdeW2ZeXOWd3CZeGuZeGuRd2uVem+We3ebgHuf + f3mignuign6ff3uihoKjh4OniYmmiIihhoCeg36dgHuafnmhenOjfXWad2uQbWKQZ0+OZU6QZFSW + alqab1eZblaZb1ybcl6adF+Zc16ec1+ZblubcFufdF6bdWqlfnOnf3Knf3Kme2ifdWKhc16fcl2d + a0+ZaEyUZ1Wfcl+leHOmeXSofWmid2OicFafblSdcmGne2qqgHqvhn+zg3iufnOneFeic1OOg46M + gIyQgIaNfoOMeX+MeX+Me4aRgIuSg4uWh46Rh42Rh42SiZSVjJaViZeViZeSkJSQjZGRjI2OiYuQ + i4yUjpCZkpualJ2ZjZaXjJWWjZeWjZeViZWSh5KNgouNgouai5CdjZKajJWbjZabjZubjZuajZSS + hoyUh4uViIyXjZSWjJKSjpqVkZ2fkZqfkZqakJaakJahl5+mnaWhmaqZkaKWjpSSi5CVjpedlp+l + laeikqWakJSWjJCXlZmhnqKloayemqaekZWViIyQgo2Rg46LhomNiIyQh5GQh5GVh5KWiJSWi5SZ + jZaSiZGQh46WiJGXiZKQgo2LfYiIfoKGe3+LfoKNgISQh5SRiJWWjZebkp2VlaKZmaaflaaflaam + mqijl6ajlaGilJ+ZkaGXkJ+ZjqGbkaOdkKaekaebkp2ZkJqakqKelqaakqKWjp6WkJaUjZSajY6Z + jI2UhoaOgICRh42WjJKdlKGimaaelKWXjZ6ah42RfoSOen2WgoSOhoSOhoSWh4ybjJGfi5abh5Kd + iZCbiI6bkZedkpmbiYuSgIKIfoKQhomajZSekZejlpqll5umkJCijIyXgoSSfX+Zg4udh46biYuO + fX6IbmqDaWWLbniWeYOWh4yai5CZhIeRfX+WfX6WfX6ReHmReHmReHeUenmWgICeiIidiIidiIia + gIKVe32UeXWSeHSWenqdgICehIafhoehh4aehIOfg3ubf3iVe2mQd2SLalSIaFGOcGOSdGebenKd + e3ObfXOXeW+WeG6Vd22QbmuScG6Sc22XeHKZenCZenCXe3ibf3uihoijh4mmiYyni42niH6jhHqf + hHWZfm+de3Chf3Sfe2+XdGiXbVWRZ0+OZFGQZVOXbliacFubd2Wjfm2iemiheWeic2Web2KacF2b + cl6ZcGefd22jf3OlgHSnf3KlfW+meGGidF2bbleXalSWalqabl2eeG2ie3CoemOfclufblSebVOh + b1yod2Osf3qwg36uf3esfnWmdVijc1aQh5GQh5GShoyQg4mRfX+Qe36RhIiXi46ajJWajJWaiZmb + i5qWjZeVjJaUi5WWjZeXkZqXkZqVi46SiIyUiJGbkJmfkqWdkKKZjZmXjJeajJWbjZaSiZaSiZaU + iJaajp2ekZeekZebjJGai5CSjJWUjZaQiI2MhImUiY2XjZGZjZmXjJeXkKGblKWflKKekqGakJae + lJqjmqemnaqilqKZjZmUiY2Ng4eQiZKalJ2hkpudjpeWjJKZjpWel6GnoaqloaqhnaadkpmXjZSR + iJCNhIyMiI6Oi5GSiZaSiZaSjZ2WkaGhlKafkqWWkaGSjZ2Wi5aWi5aUiY2QhomOgoaMf4OJen2J + en2JfomMgIyRjJCVkJSdlqKel6OdlaWdlaWil6qlmqylmaeekqGdjZ+bjJ6ZjqOelKiflKKflKKd + lJudlJuWkaGblqadlqKalJ+bkpqakZmei46fjJCahoaUf3+XiI2fkJWhl6KimaOZlZ6RjZaViIyR + hIiOf4SRgoeVhouWh4yZiY6djZKhkZmdjZWijpediZKVjpqblaGhkpuWiJGRhIiWiY2hlJqilZui + lZmll5ujl5aekpGVf4SQen+Of4eVho2Vg4SOfX6Nc2iEal+Da2eMdG+Vhoiai42ahIeSfX+Ve32W + fX6Ve32UenuUen6SeX2Vf4KbhoieiI2fiY6bhouahImahIKVf32VfXiXf3qahIKdh4SfhoSfhoSj + iIOfhH+bgHWWe3CRcl+La1qSdGeae26igIKigIKif36aeHeWd3OWd3OSb2eUcGiUbmOXcmeUdGSU + dGSVc26beXSbf3uni4eqjI6niYyuhoKnf3uef3WdfnSjfnulf32mgnmfe3Oac2GQaVeSaVGUalOZ + cmSbdGeefXSigHiqhnmohHimfXOheG6ac2OUbV2ZbmKid2qfe3CmgnengHWngHWne2ObcFibalqb + alqXaliZa1qbcl6jeWWmdVufb1WXaEiXaEiVaFSdb1uqe3Syg3uufnCneGqlc1ifblSUho6Vh5CU + iZCSiI6VhouUhImaiZahkJ2hlKaekaOdjpeajJWZjZmViZWUi5eXjpufkZ2fkZ2ei5GbiI6bjZah + kpujkqKfjp6Wi5aUiJSUiJGViZKUi6KVjKOajKafkauekaWajaGai5CXiI2OiJSOiJSUiJSSh5KZ + i5ahkp6flJ2flJ2dlKGdlKGdlJ6XjpmZjZmekp6jl6ailqWakJaUiZCMgoaLgISNg4eWjJCZjZaa + jpeWjJKdkpmflqGqoaulnqWfmZ+XkZeXkZeUjZaVjpeVkZeVkZeVjpqWkJuZlqWdmqiim6eel6OS + kZuRkJqVjJSVjJSZjI2Xi4yRh42QhoyMfX+Jen2Gfn6MhISQi46SjZGbkp2bkp2ZkaGdlaWfl6ii + mqummqahlaGhkJ2ejZqWjZqXjpufkZ+hkqGXjpaZkJeZkJ2flqOhlZ6ekpuhlZ6dkZqbjZmbjZmb + h4mVgIOWh4yhkZahlaGekp6Vi46OhIiRf4CSgIKWgIaahImWhIaWhIaZiY6bjJGhjZSfjJKbjJGa + i5CUi5KZkJebkJuXjJeXi46ajZGjlp2jlp2llZ2nl5+jl5aekpGUfnuNeHWLeXiVg4KWgoSSfoCM + c3KHbm2GcHCLdXWVf4eXgombhImVfoOXfoKXfoKVf4KVf4KQfn+Rf4CSe4OWf4ediZChjZShjZSh + jZSljo6eiIiXfn+UenuVe3qdg4KeiYOeiYOfhH2ih3+egn6afnqdd2uWcGWWd3CefniihImjhouj + h4Kbf3qWeGuUdWmUcGWUcGWVbWOSamGRbmKVcmWScGuZd3KffXqnhIKsiYiqh4aviICngHmde3Cd + e3Cif3qmg36ohHmifnOfemmdeGeadWSbd2WadWSdeGeifXijfnmqh4Kui4aqgHqjenShd2GXbliS + aVaZb1ybbm2idHOje2uogHCnfWSXblabZEqeZ02WaVWZa1eablWdcFeib1qea1aXaEeOXz+JZE6W + cFqje26rg3WsfW2md2eialCdZUyUiJGZjZaajp2ajp2XjpaWjZWdkKKfkqWilJ+ekJuXjJWXjJWZ + jJ6ViJqZjqGelKailJ+ekJuah5CdiZKajpqajpqdkpaZjpKWjJKSiI6QhomQhomRiZmVjZ2ajaGe + kaWbkp+WjZqUiJGRho6Qh5GRiJKXiZKZi5SZkJqflqGlmaWhlaGdlKGbkp+ekpuajpefkZqhkpuh + lZ6flJ2ZjpCVi4yQg4SNgIKQg4SbjpCXjJWajpebkJmflJ2hlaGjl6Ohl5+elZ2alJ2alJ2ZkJ2b + kp+Zkp6alJ+alqKbl6Ofna+in7KfmqqalaWSjY6RjI2RjI2UjpCakpeXkJWViZWRhpGOgoOLfn+J + goKNhoaSi42WjpGalZmdl5ublaGdlqKfl6efl6emmqammqailJ2djpeWjZqXjpubkJ6ajp2ViZKS + h5CXh5GejZehlaOilqWhl5+dlJubkJmajpeXhIuUgIeRh42XjZSbjZaZi5SSg4aNfoCUfnuWgH6X + goKfiYmVh4eVh4ediY2ijpKfjJKei5GbjI6XiIuUhIyWh46WiZCZjJKUiZCVi5GfkZqilJ2mkpms + mZ+mkpmhjZSXf3mQeHKQfXeXhH6Zg4OXgoKQeX6LdHmNeH2NeH2NeIKUfoiahIyahIydh4yeiI2a + hISahISUgIeVgoiUfYKVfoObhouhi5CfkJWejpSmkJKjjZCbhoiRe36Wenebf3udh4eeiIijiISj + iIShhoKdgn6hfXSZdW2bfXOfgHeliZCmi5GjiICbgHmad2uUcGWScmWUc2eScF6Na1qQbl6ObV2Q + al+Xcmeee2ulgnKsh4SuiIashnumf3Wfe3Cfe3ClgoCqh4arh3qjf3Oie3Cmf3SlgHWlgHWffWqh + fmumf3Wmf3Wog36sh4KrgH6lenilemedc1+UcFuSb1qXa1udcF+ec2ene2+mfWKddFqaZUqZZEmZ + aFebalqabViabVibalWZaFOWZ02UZEqNYkeUaE2bdGelfW+qfWunemmjblWbZ06WkJuZkp6Zjp+Z + jp+ekqGekqGdkKOajaGXjpmWjZedjJaejZeXjJqbkJ6fl6efl6edjpqbjZmVho2ZiZGXjJWbkJmZ + lJeVkJSSi42NhoiRg4CRg4CRh42Vi5GZjp+dkqOWkJmQiZKQgouRg4yOhpCNhI6Vh5CajJWdlJui + maGmnaehl6KekJufkZ2ekJubjZmXjpaZkJeel56fmZ+dlZedlZeWiY2ViIybjpWfkpmakZmZkJee + jZehkJqjlZ6ilJ2flJ2hlZ6jmqeimaabkaKdkqOWkaGZlKOdl6einayin7Kin7KbmqWRkJqVhouW + h4yWkJaZkpmblZ6WkJmZjJ6ViJqUi5WQh5GSiI6UiZCWjJKakJabkZWhlpqekqGekqGflqGflqGe + mqOhnaailp+ekpuZkpuZkpuXjpaSiZGVho2Sg4uZhoydiZChkqGomqijmqKdlJujlJadjZCXgoyV + f4mXi46ajZGdkJGXi4yRgoSQgIOZgoedhoueiJCljpabjpKViIyjkJanlJqlkZefjJKfjJCXhIiU + foCVf4KRgoSSg4aOf4KNfoCXiJCai5KijpWolZunlJqhjZSZhIKXg4CXhIiZhomVh4eUhoaVgoiU + gIeShISRg4ONeHiNeHiVfoadho2liZCliZCiiImiiImZhomVgoaSfoCQe36UfYKag4ihiY6ljZKo + lJaolJadiIuOen2Rd3KUeXSZf4CbgoOjhoalh4emhoKhgH2ffnWbenKigHWmhHmmi5anjJemi3+f + hHmjd26bb2eZc2iWcGWQa12RbV6SamGRaV+SbWKWcGWaeW2jgnWuh3+shn6qiH2lg3ijfXWfeXKn + gn+qhIKrh36rh36ognirhHqqhn2ohHulf3CmgHKngHWmf3SmgHungn2qgoCmfn2ofW6id2ibclWR + aEyXZ1Sda1iab1yfdGGld2Kld2KfaUiZY0OWaVOabVabblqbblqaaFWaaFWXaFCVZU6VZU6UZE2Z + aluic2OmeG+oenKreVyjclWajaGbjqKZlKWalaaelqeblKWdkqOakKGWkJmWkJmfjpufjpudjpql + lqKll6qjlqihkZabjJGWiIiajIyXjpmXjpmUkZWRjpKNhoaNhoaMgH+NgoCVg4SbiYuZi5abjZmW + iY2OgoaOe4KNeoCMfYSOf4eQhoyXjZSelZ+jmqWfm6WdmaKekJubjZmXjpmWjZeXjJWdkZqemqah + naijmqWhl6KdlJ6dlJ6blaGblaGZjZaZjZadjZKfkJWhkp6ekJuflqOlm6imm6ymm6ydlp+blZ6d + laWdlaWflqOon6ysn7KnmqyXlZmOjJCWiZCajZSSkp+Skp+akZuXjpmZjp+Zjp+SkJ+UkaGZkpuZ + kpuakJaakJadkZqflJ2bkaKZjp+ekp6hlaGbl6GdmaKhlaGflJ+fkZ2ekJufkJWai5CbhIyZgomO + gH6Vh4SZjZunm6qenaebmqWfkpaajZGah42ah42bjpWdkJadjZCfkJKXiYmUhoaXiZWilJ+jlaOe + kJ6akZmVjJShlJqjlp2mkZ2lkJujjZWeiJCZh4iWhIaRf3uOfXmUenmSeXiJfn2QhIOZjJCekZWd + kJSdkJSdiIudiIuhiZadhpKXi5GViI6diZKhjZaijpWbiI6Qe3SLd2+Rf4CaiImlkZqmkpumjpSe + h4yXhoeUgoORe3mNeHWQeniVf32bh4mjjpGokpWnkZSli4yXfn+McmqLcGmRdXKWenehf4Cnhoeo + iIKlhH6ifnOdeW6denWjgHulh4ymiI2qhH+og36lgHSdeW2dd2ueeG2XdWWRb1+Oa1+Sb2OXc2SZ + dGWbenKffnWmgH6rhoOui4iqh4SohHueenKhe3elf3qogICrg4OnhHSqh3emh3qmh3qrgnirgnir + hHqlfnSiem2je26lfnejfXWlfWqmfmufd1SddFGfblufblubblqidF+ld1+ld1+jc1OhcFCXbVee + c12bb1GZbU+dZ1ObZVGWbVOZb1WebVefblihb1emdFyjdWGld2KqeF2ndVufjaGikKOelKaelKab + lKOZkaGZkp6blaGekJmekJmfjpuejZqfkZ+nmaejmaqhlqedkJSajZGZjJCajZGWjpSWjpSWkZWU + jpKRh4uMgoaIgIOIgIORfXqWgn+ShoyUh42QgIaLe4CLdXqLdXqNen6QfYCNg4eXjZGhlJqnmqGh + l5+ZkJeXjZSWjJKWi5SXjJWajpehlZ6ina6ina6lmqyil6qhmaifl6edlqKZkp6ajZSZjJKWjJCb + kZWelZ+dlJ6fkKOmlqqlnayimqqblpqVkJSdjpqhkp6blZ6mn6iroq+imaadkJaWiZCWjZWimaGa + l6eVkqKVjpeWkJmZkJ2dlKGWkaGalaWel6GblZ6alZmdl5uflKKilqWdkKKZjJ6akZ6flqOflaah + lqedlp+dlp+hkp6fkZ2hkZaZiY6hiY6dhouVhouOf4SUi5emnaqlnayjm6ufkZqbjZaWjJKVi5Gd + kZqflJ2hlp2elJqajo2ZjYyXkZeel56jmqedlKGdkZ2dkZ2jlJmmlpuqlaGmkZ2jjZeijJabjI6X + iIuZhISVgICQe3mLd3SId3ONe3iSg4iZiY6ai42djZCZhoybiI6fjJWei5Sii5Keh46RgI2djJmo + kZ6jjJmZgHqMdG6IdHKUf32fkJemlp6olJahjI6Xg4ORfX2OeXeLdXOQdHCXe3iZh4ajkZCnlZam + lJWnjYybgoCUdG6NbmiSc22Wd3CfgoSihIeihoChhH+fgHebfXOafnefg3ujh4eliIiliICihn6h + hnieg3WignuignuffW2Vc2OWamKabmWadGqeeG6denWhfnmmgH+sh4aujYmnh4Omg36ffXieem6j + f3OmgHuog36mhHinhnmoh3qnhnmohHurh36sh4KqhH+ifmOfe2GjenCieW+mfmuiemihd16fdV2h + dGOhdGOdcmGfdGOdd12adFufdFyjeF+adF+Zc16dbk6dbk6faUyhak2iclqmdV2mdF6mdF6meGGn + eWKleWOjeGKqeF+qeF+djZ+fkKKelqablKOVkJ+Ujp6ZkJ2dlKGdkpmdkpmdkpmdkpmikqWnl6qi + laedkKKblJmakpeekZebjpWZjI2Uh4iWjJKUiZCRhIuNgIeHenuHenuOe3WVgnuUgIeUgIeQfYON + eoCNd3uNd3uMenuQfn+Ngn6ViYabkZehlp2jlpqekZWVjZCSi42ZiY6ai5Cdlp+im6WjobClorKh + maqelqeimaahl6WbkJmWi5SZiY6ZiY6WjpSakpeakqKZkaGXjJeekp6imaaimaaakJGUiYuXi5Ga + jZSUkp2enaemn6udlqKWiZCViI6ZkJ2jmqealaaVkKGSjJeRi5aXkZ2alJ+dlaWakqKjlZ6jlZ6f + lqGimaOilqWflKKZjZmWi5aajpqdkZ2hlaOjl6aelKWhlqehl6WdlKGhkpuekJmfkZqZi5Sai5KQ + gIiUjZmhmqanl6qnl6qhkp6djpqXjpaZkJeel6OdlqKjmqKflp6ZkZSXkJKdlp2fmZ+hmqael6Oe + lZ+flqGmkpuqlp+mmZ+ll56jkp2ejZedjZWfkJedjZKWh4yVgIONeXuLd3SMeHWXg4abh4meiYeh + jImaiImejI2fjY6fjY6hi4uhi4uSgoyZiJKllJ6hkJqehoCWfnmQdW6UeXKajIyml5eqlZWjjo6f + hoSXfn2UeXSOdG+MbWeSc22SfX2fiYmjkJamkpmukZaihouXd26JaWGObmWXd26df4KjhoijiICi + h3+hgnWdfnKafnmdgHuiiIehh4afiHuhiX2liIOmiYSri4esjIiognedd2uZc1yadF2efXSffnWh + f3eefXShfnmlgn2sjIiqiYaqhH+ifXied2med2mhfXSng3qrh3urh3usg3mrgnimgnmohHunhH+q + h4KlgGibeF+hdWeid2ilfmmhemWheWeheWefeGqfeGqbdWGbdWGZc1yXcluhcmKmd2eleWOjeGKi + dE2db0ifaUqjbU6od2Oue2iofWSofWSuf2qsfmmrfWioemWmdFyndV2XkZ2alJ+XkZqXkZqXjpuX + jpubkp2bkp2bkpqbkpqakJaakJaakqKblKOelaKakZ6ilJ2ilJ2fkJeai5KZhomXhIiViI6WiZCR + h42LgIeOgICLfX2Qgn2XiYSXhoeVg4SQeoKNeH+Md36Md36MenuOfX6SfoCZhIedjZWhkZmikpeb + jJGQiI2RiY6ZiJWfjpufl6emnq6nn6+mnq6dlqKel6OhmqOfmaKakJaWjJKWh4yXiI2SjpeZlZ6d + lp2XkZeSjJWZkpuflKKhlaOakJSSiIyRh4iVi4yWkJmXkZqdlp+ZkpuUiY2Vi46dlqKlnqqbkJuV + iZWRh4uSiIyXjpaZkJebkp2XjpmajJWekJmbjqGilaeflqGbkp2ZjpKVi46ViZKWi5SZkJ2elaKe + lKWelKWfkqailaiilqWilqWhl6Kbkp2ekZeViI6SiZSbkp2hlaOilqWflJ+ZjZmakZ6dlKGil6qe + lKailKKekJ6Wjo6akpKdlJulm6OlmaKilp+bkp+bkp+jlaGml6OlmaKjl6GikZuejZedkJSdkJSf + kpaXi46XhIuWg4mSfniOenSVf4Kbhoifi42hjI6hi42hi42ejIudi4mhhoyhhoyZg4iZg4iikpqm + lp6ijYeXg32Nem2Sf3KZh4imlJWsl5qlkJKhiIOXf3qWenOSd2+LcmeHbmOLd3CVgHqhi5KijJSq + jJSlh46Zem6LbWGIamGRc2mbenuhf4Cni4Oihn6dgnSZfnCbf3qdgHuihIejhoiliIiliIiqiYeu + jYuwjYyvjIuviXiifWuWcFqZc1yig3elhnmnhnmhf3OigHWjgnenh4Cnh4CuiYCmgnmdemqZd2ef + eW+jfXOohHmrh3uwg36vgn2lfnSngHeog4CrhoOlgGqhfWefdFybcFifd1yjel+lemenfWmne22j + eGmec2KbcF+Zc1yVb1iicF+od2WqfWuqfWuneWSjdWGhb1ejclqnemGugGewhGusgGi2hGuygGiw + fmivfWeqeVyjc1aZkJeVjJSWjJ2WjJ2ajJqbjZuekJuilJ+flJ2dkZqZjJKajZSWjZqZkJ2bkpqd + lJujl6OhlaGejpaZiZGZhomah4uVhoiVhoiSiIyJf4ORgoeUhImZjJKajZSZiJKWhpCQgIaNfoOM + fn6LfX2NeXmNeXmQe3WXg32ZiY6ejpSdjo6ShISOg4KRhoSWhpCfjpmhl6Wlm6ilmaWekp6dkZqe + kpuflqGhl6KakJGQhoeOhIiUiY2VkJ+ZlKOdlp+XkZqUiZCXjZSajpqdkZ2ZjpKSiIyZiY6bjJGb + kZebkZebkZeZjpWVi5GXjZShl6KimaOijpWXhIuUh4uWiY2akJaakJaXiJCUhIyUh42WiZCVjJaa + kZualJ2blZ6fkpaViIyQhomRh4uSi5CXkJWblZ6dlp+dkKOjlqqll6ummayimaGelZ2bkZeVi5GQ + h46VjJSXkZqblZ6dlaWakqKflaeelKallqWhkqGei5Sah5CZjI2ajY6fkpanmp6om5+ll5uVjJSV + jJSZjZubkJ6bkJ6flKKllZ2fkJedjZKai5Cei5GbiI6XhI2UgImVgoaVgoaVhoiZiYyhi5CijJGn + kZGljo6djZCai42hho6ih5CahImeiI2fkJWmlpumkZGfi4uXg4OVgICbhoumkJWqkpeokZajiYud + g4SXfXWQdW6Rd2uLcGWIbmeSeHCah4ufjJCijJGijJGagG6Mc2GIal2Nb2KaeXqlg4Smh32dfnSZ + fnCZfnCdfnSef3WlhIKlhIKjhoiniYyojIyqjY2ujYuwkI2vjYKjgneWdGSXdWWjfnurhoOqiH2n + hnqmg3CffWqjfnmog36shn6ngHmfemebd2OZcm6feHSlf32rhoOvhn+vhn+nfWmlemehfXSmgnmh + g2+fgm6jd12fc1qeclaidVqmeWinemmofWSjeF+hc16db1uZbl2XbVylc2KndWSnfWSrgGiofWun + e2qldFymdV2nd1yvfmOwgmqvgGmwgm2wgm2uf2iuf2irgGGme1yZiY6ZiY6ViZeSh5Wai56bjJ+b + kaKdkqOdkpmZjpWZiYyZiYyVjJaakZudlKGhl6WomqallqKXjZSSiI6VhouVhouUhImVhouRho6R + ho6Ui5WUi5WXjpuelaKhkaWZiZ2OgoaMf4ONg4SOhIaUf4KNeXuNfXWUg3uShomXi46bjpCRhIaM + goOOhIaSiI6XjZSflJ+hlaGhlp2ZjpWWi5aflJ+hl6WelaKhkpKajIyUiZCZjpWblKWdlaadl5uW + kZWShoeViImZjJKajZSbjJGbjJGdjpqekJuZkJeWjZWbkZWZjpKViZWZjZmhlaOhlaOlkZediZCZ + iY6fkJWfkJWbjJGWhIaRf4CUfoaahIybjJSdjZWelZ+flqGdlZqVjZKQiIuLg4aUhImZiY6WkZWa + lZmdkZ+flKKilKKllqWjl6GekpuakJaXjZSRh42QhoySiZGXjpablKOZkaGdkqOelKWil5uelJed + iIiXg4OdiIueiYyekZWmmZ2om52mmZqejIiUgn6ZhISbh4eZjJCbjpKhjZaijpeei5GZhoyag4ue + h46XhIuUgIeah4udiY2ajpqbkJufjpmikZull5milZahlJeajZGeiJCeiJCei5GdiZCfkJWjlJmm + kpajkJSbho2ahIybho2jjZWrkJmvlJ2skJKhhIedgn6We3iSeWqMc2SHaGKQcGqReHmiiImfjY6f + jY6bgm2Qd2KOcmGRdGOdenmhfn2ffnWde3OZeGude2+eg3ieg3ilgn+nhIKliIumiYynjY6qkJGu + jYuvjoyrjH+lhnmbc2mXb2Wbd3Sog4CujYmqiYaqhHCifWmfeW6lfnOngHWngHWlfWqfeGWWcGeb + dWuienqshISrh3uohHmhfWSbeF+ZdWmdeW2hfXKdeW6hcFiiclqdb1ihc1yidWSleGelel+jeV6h + cFiba1SXblSZb1Whc1yld1+qf2esgmmrf3Cqfm+nel6leFyqeVyygGOzgG2wfmqwgHCygnKvf3Sz + g3izgmmvfmWWg4mWg4mUhpSUhpSWh5mXiJqbjqGdkKKakZmZkJeZiY6XiI2WiJGbjZadlaahmaqi + lp+dkZqQhomLgISQg4mRhIuRh4uVi46ZjpWZjpWZkpublZ6fkqWjlqihjqKZh5qViImWiYuZjJKa + jZSVgoiVgoiXhoebiYuWh4yXiI2ei46VgoaQg4mRhIuOhIiVi46hlJqhlJqXkJWSi5CUjZadlp+l + lqWilKKakJSWjJCajpedkZqlmaelmaejmZ+elJqbh4mZhIedjZCdjZCakJaelJqekaOfkqWjlp2d + kJaZjJCXi46VjJaZkJqZlKOVkJ+ajpqXjJeakJadkpmelJeZjpKUhIeUhIeUh42ZjJKXjJqekqGd + kqOhlqedlZqWjpSQgIaOf4SWg4yei5SWkZWVkJSfkJehkZmbjZmfkZ2flZudkpmbkZKVi4yRgoeQ + gIaMgoiSiI6VjJSXjpaZkJqdlJ6jl5aflJKijZCdiIueiJKfiZSfjpuol6WuoaWrnqKjkY2di4ed + i3qaiHiaiImbiYudiZKhjZadjZWai5KfiYyZg4abhImdhouei5SfjJWajpebkJmjlJullZ2om5+q + naGqmp2fkJKii5CfiI2fjpuhkJ2mlp6mlp6nlJehjZGah42ah42liZCliZCrkJuukp6ukZSni42d + h4eXgoKVgHeQe3KObmKLal6McG2fg3+hjZGdiY2agHOSeWuScmWVdGibeXShfnmhfnmhfnmefnii + gnujh4KliIOliIOliIOmiYyojI6nkZGokpKrjouojIiujoSmh32he22ZdGWadGqjfXOohoOvjImv + h3Srg3Cjf2efe2Omfm6ogHCrfm+meWqbcGKXbV6ZcnKheXmoh36nhn2lfWqbdGKbcGKdcmOfc2Ki + dWShb1Ohb1OdbVWba1SbblyidGKhdV+hdV+ebVeaaVSbbU2fcFCdc1iieF2lf2uog2+rf3CofW6n + eFamd1WjeWGsgmmyh3OwhnKzhHKwgm+wgHWzg3izg3O0hHSNg4eNg4eSgo6Xh5SXiZKZi5SejZ2e + jZ2djJmZiJWah42ah42ZiJKfjpmhlqeflaabkZWUiY2Rg4CQgn+RhIiViIyVjZCWjpGZjpKZjpKa + lJqdlp2elaKflqOfkZ2ajJeVkJGVkJGekpudkZqXi5GViI6ZiZGXiJCZjI2ajY6ajZGShomMgoiM + goiRh4uUiY2akpeZkZaUjJGVjZKUjZaalJ2dkZ+bkJ6bkp2ZkJqdlJ6dlJ6il6qhlqiel6OblaGa + i5KVho2biI6ei5GXkZeel56hlKailaellp+fkZqZiYyVhoiUi5WZkJqVjZ2UjJuXjpuVjJmbkJmf + lJ2ikpqbjJSVi5GVi5GXjZSakJadlKGelaKhl6Whl6WhlJeZjJCVgIOSfoCVho2bjJSakJaWjJKX + hIubiI6Xi46bjpKfkJKfkJKXjouRiISUf4KUf4KMeX2Oe3+Qg4eUh4uZi5SekJmilZuekZebjZab + jZaZiJWbi5ejjJuqkqKmmqajl6Ofjpmbi5WdiIiahoaahIyahIyai5CdjZKWi5SXjJWai42XiIue + iI2fiY6fjpmhkJqekZefkpmmkpaqlpqomZ6snaKqm5mjlZKjjZKfiY6hjJqlkJ6qlp+qlp+rlZen + kZSeiYybh4mdiIuijZCikpqhkZmrkZCjiYiihISfgoKbf3+WenqRd2mJb2KMbWqdfXqijI6jjZCd + gnqVenOUc2iScmeZeXOff3mefnqff3udf3+ihISni42ojI6mjJCiiIyliIimiYmnjYyrkZCyjZCu + iYyvjYSnhn2le3KddGqXcGGddWWhf3enhn2shnuuh32rgmSjel2feGWlfWqqfm+ofW6meGWfcl+a + cmmheG+qg3irhHmme2ifdWKbcl6acF2dc1ihd1ydcFWbb1SablWfc1qhc16hc16hd1ybcleXaFCa + alObaEmhbU6bcl6ieGSrf3OwhHiyhHOqfWund1Ojc0+ld2SrfWqshHSvh3ezhnSvgnCwg3KvgnC2 + hnW6iXmShoyRhIuXhIuZhoyViImZjI2ajZSdkJaZjJKXi5GWiZCWiZCZiJWfjpujkqKejZ2Zi4uS + hISNgoCOg4KQhoyZjpWbkp2dlJ6ekZefkpmblJmelpullqWnmaeflqGdlJ6elZ2dlJuhlZ6ekpuX + i46ZjJCXjpmXjpmakpKZkZGajZSUh42NhouQiI2VkJGWkZKblJmXkJWZjJKWiZCWiJaXiZeWjZWW + jZWakZuakZubkp+dlKGXkKOakqadlaWakqKWiJaUhpSXgI2XgI2UjZSdlp2flaaflaaflKKajp2X + i46Uh4uWjZeZkJqUhpGUhpGVjJmbkp+bkpqflp6jlJudjZWXjJeXjJeXjJWajpealJ2blZ6flqOh + l6WjmZqbkZKWgoKSfn6Zg4ueiJCfkJWdjZKZhIeahoiZh4ibiYudjo6djo6XjIuRhoSSfn6RfX2N + eH2OeX6NfoOQgIaVho2djZWfkpmfkpmekqGbkJ6ajJWZi5SdjJaejZefkZ2ml6OejZ2djJuah5Ca + h5CZhoydiZCdiY2ei46XjJWXjJWbjJSai5Kei5Sei5SfjpmikZulkZehjZSikpWnl5qlmp6onqKq + nZ6nmpumjpadho2ZiJKhkJqmkpuqlp+rlJmnkJWeh4ybhImag4ieh4yfiY6ijJGni4eihoKhg4Od + f3+aenidfXqWenqQdHSRcHKbenufhoejiYuhhoCaf3qRd2uOdGmVdXOZeXehfnuhfnudf4KihIen + jJKrkJankZGljo6miIijhoani4eskIywkpKukJCui4ariIOrg3Wed2mbcF+ec2Kdd22ie3KqhH+w + i4augnCmemmed2Sje2mqfXCoe2+idWSidWSec2ehdWmjfXKmf3SngGehemGfdV+fdV+hc16hc16e + cFydb1uhc2Gld2SneWSld2KidVqhdFibak6ZaEyaaU+hb1WhdGioe2+ugHmwg3uyg26oemWnd1qo + eFujd2Woe2qshnCzjHe0iHSzh3OwhHOsgG+wg3S3iXqWiZCUh42XgomXgomWh4mZiYyZjpWXjZSX + jJWXjJWajp2XjJqdi56hjqKjjpqeiZWXhoeUgoONg4eWjJCflaail6ihlKehlKehlZ6flJ2hlpqh + lpqekqGhlaOfkqajlqqfl6ejm6unlqGllJ6bjJGbjJGbkp2imaOfl5qfl5qdkZqViZKUjZSSjJKX + kZeblZualZmVkJSdh5GZg42VhouWh4ySiIyRh4uWiJGZi5Sdi56biZ2WjZqSiZaaiJuaiJuSh5KN + go2UgImSf4iSh5CViZKZjZaZjZaajJWWiJGSiIyQhomZi5SZi5SOeX6Re4CShI2XiZKbkp2dlJ6f + kZqbjZaUiJSViZWakJaakJabkJuajpqbjZailJ2om52ekZKXgIaVfoOag4uhiZGikpedjZKZhomU + gISXgoeahImeiI2hi5CfjY6XhoeQgoKNf3+QeYCOeH+Oe3+RfoKRf3ubiYajlp2jlp2flqOdlKGe + lJeXjZGajY6Uh4iXi5GdkJaeiZqfi5uViZKViZKZiY6bjJGah42ZhoyXhIuXhIudiZKdiZKfjJWi + jpejjZWijJSdh5GahI6ai5ChkZailp+lmaKqnaOrnqWqkpqfiJCWf46ag5KdiJSjjpqnl52llZqn + iY6fgoebfYSfgIiehIifhomjiIOfhH+eg36dgn2bfXOZenCOenSMeHKOcnSUd3mdg4SmjI2jiH2e + g3iZe2qOcmGOcGSUdWmdeniffXqefX6oh4iojI6ukZSqjZCojI6nhoeigIKnhIOriIewkIysjIis + i3+si3+shHemfnChemWbdWGacmiddGqifXiog36siHuohHiofWmjeGSfdWKieGShc2Gfcl+ec2Kf + dGOee2ujgHCofWuleWihem+lfnOoe3OleG+lc1+lc1+lemeofmqsfmerfWWqeFusel2lcE6ZZUSb + ZE+mblimd2uufnOygoCzg4Kyf2mue2Wod16semKod2OqeGSsgG2yhnK0hnC0hnCzhnSwg3Kwg3e0 + h3qWi5SSh5CXg5GVgI6Zg4uahIyUiJGViZKWjZWWjZWbkJuZjZmdjJaejZebi5WZiJKZhoyXhIuU + h42fkpmjma6lmq+mmaull6qhl6KflqGhlJeilZmZkpmalJqbkaOil6qfmqqjnq6rlqKnkp6fkpme + kZeflqOhl6WhlaGekp6ZjZmZjZmXkZqalJ2elaKflqOZkpuQiZKWh4yUhImRhIaQg4SNgISNgISO + hIuQhoyVho2Sg4uRhIiShomXh5SXh5SRh4iLgIKOg4KViYiRh4uOhIiXi5GXi5GZiZGWh46UiZCU + iZCWh4yWh4yRen+QeX6Lfn+WiYuZkZSblJabkZeakJaViI6ViI6ZiY6bjJGhjZSdiZCfjpmikZul + lqKhkp6aiImWhIaWg4ediY2ikZuejZeZhIeVgIOVgoidiZChiZGii5KhkZaZiY6Uh4iUh4iWf4SS + e4CQfYORfoSRfoKZhomjkp2mlZ+hmqGel56jlZ6bjZaeiYmXg4OZhomdiY2ZiZGXiJCbiJGbiJGb + iJGhjZaijpWei5Gag4uag4uXhIibiIyhiZGjjJSdjZKZiY6UgISWg4eVh5CajJWilKKml6awoq6s + nqqvmaGijJSbhoiWgIOUfoadh46nkJ2nkJ2miJCegIihe3meeXeaf3qhhoCdiIKdiIKegoKdgICb + e3WVdW+IdWiLeGqNc26SeHOif36nhIOmh32ig3mafWuVeGeRcmKQcGGZeG2de3Cbf3ijh3+ni4eq + jYmrjo6qjY2nhIKlgn+og4Kog4KnhH+ohoCvjIewjYiuiHmog3Sjfm2eeWiedWuddGqfdXOnfXqs + g3quhHuvg22ne2WhdV2leWGld2SjdWOdd1+Zc1ydeGelf26mfXOnfnSmfnqogH2ugnWqfnKneWSo + emWof3eof3evf3SwgHWuf2irfWWndWSfbl2hak2hak2jb2OueW2vgHuzhH+wgm2vgGuue2GwfmOu + e2Ood16seme0gm63h3ezg3Owg3KyhHO2hnq0hHmZjZmZjZmXiZeUhpSRgoeSg4iNhoiUjI6XkJ+Z + kaGbjZudjp2ajJWbjZaXiZKWiJGbh5Kbh5KXiZWhkp6fkqajlqqqoa6mnaqhl6KimaOelJqdkpmf + kpSfkpSakZujmqWmn6uooq6qlaaolKWflqGakZuel6GhmqOhlaOdkZ+WjpSWjpSfjp6ikaGjnaah + mqObkJuSh5KQhoeQhoeRg4OOgICHeHqHeHqLe4CLe4CUeX+UeX+MeHqSfoCVhouZiY6RhoSQhIOS + hoebjpCVi46UiY2ZiYyXiIuVhoiZiYyXi4yajY6biIyah4uUf3mSfniOgICWiIibjpKekZWdjZKa + i5CWh4yWh4yZg4uahIyZiY6bjJGfjpuikZ6ikaGikaGajZGViIyUh4ibjpCekJuekJuahoaXg4OV + goaah4uZiJKejZehkpuekJmdkJafkpmhho6ZfoeQgIiRgomOf4KUhIefi5alkJunmaKllp+ijpeb + iJGQgn+Rg4Cdg4SehIadi4yaiImfhI2ih5Chi5WmkJqmkpujkJmXgoSVf4KUgn6Zh4Obh4eeiYmf + iYeXgn+SfXqUfnuNgIeViI6hkJ2nlqOsnqysnqywnaalkZqhh4aZf36OeniWgn+eiJChi5Kdhoub + hImef3WZenCZfX2egoKliIiihoaihISfgoKee3eVc26Qc2KRdGORc2eSdGiee3elgn2jiICfhH2d + gnObgHKQc12LbliZdWqhfXKegnqdgHmhg4OrjY2zkI6wjYysiYSohoCmg4Clgn+mg36nhH+siYev + jImsi36qiHulgHSifnKje26heWuecmmleG+qgHewh32yhnSsgG+ne2OofWSof3WnfnSje2ufeGie + eGOie2eje2unf2+mgHush4KyhnSrf26rfWqoemiuf3iyg3uyhHuwg3qshnCogm2ogmimf2Wsd1Gj + bkmja16udWirf3OwhHiwhG6whG6yg26yg26zgG+semmreWGyf2eyhnSyhnSzh3qzh3qzg3OygnKV + i5uUiZqXiZeUhpSOf4KSg4aVi5GelJqflaaakKGUiJGSh5CWiJGZi5SViZKWi5Sbi5edjJmbjZaf + kZqjl6Gonaanoaqlnqemmqilmaeml6OjlaGljZKljZKikpqrm6Oon6yroq+nmaKjlZ6dkZ2bkJue + lZ2elZ2hkpudjpedkJSdkJSakZuflqGjn6uhnaimkZ2ahpGZjJCZjJCWiY2RhIiIenqHeXmLfX2I + enqIeXuIeXuIeXuSg4aai42ejpGViIyUh4uWi5SajpedlJ6ZkJqekZKajY6ekZWhlJeekZWbjpKW + iY2Uh4uQe3uSfn6Vf4edh46bjpKZjJCdjZWZiZGRh42OhIuXgIadhoudkJafkpmekaOekaOmkKWl + jqOjkJmfjJWai42djZCdkZqdkZqbjYuUhoObhImii5CakJabkZeilp+flJ2jlJullZ2ijpediZKU + h4uRhIiWgoSWgoSai5KfkJeilZuhlJqajZSWiZCZhIeZhIedh4meiIuajouajouZhIeeiYyjkJmm + kpuijJSeiJCQfn+Qfn+SfoCWgoSbh4mdiIufhH2dgnqafnqWeneOenqVgICbh5KhjJemkaKvmquq + maajkp+dg4KZf36SeHOUeXSWf4SfiI2hho6hho6ign6ZeXWbfoChg4amjJCli46jiIShhoKZgnWS + e2+VemuUeWqWdWqScmeaeXCjgnmmi4ejiISmi3+ih3uhgHCZeWmdfXqign+nhIKlgn+jgH+qh4av + i5Cvi5Cwi4irhoOjgHulgn2if3qjgHuhhoKliYami3+jiH2ng3qlgHile3Wle3WjenSfd3Cje26s + hHeyhHuyhHusgG2sgG2rfnmugHusg3qqgHiqd2iseWqmemmofWuqhHWsh3iwg3KugG+qe2mrfWqv + gHizhHuuh32viH6vi3+uiX6yhnSwhHOugGSoe1+ld1+neWKsgHSvg3euhniyiXu2iH+0h360hHSv + f2+qfWGvgmWohnWvjHu0jYK4kYa4i3uyhHWUiJSRhpGOg4yMgImSg4uVho2XiZWhkp6dkZ2Wi5aV + houWh4yVh5KbjZmekJ6hkqGbkJuXjJeZiZGdjZWflqGjmqWjmqWjmqWnmaWnmaWmlqqikqajjZWi + jJSflJ2mmqOom66rnrCmnaWelZ2ajpedkZqfkJefkJefkpmdkJaakJSakJSdkpajmZ2roq+mnaqj + lJuejpaflJ+hlaGakJaVi5GUgISQfYCLe36MfX+VgIORfX+LgISUiY2bjZadjpeXiZKUho6Sh5KZ + jZmekaWekaWZlZ6VkZqdlKGelaKdlZqWjpSQhomUiY2Uh42RhIuViI6ajZSbjZaekJmbjZmUhpGR + ho6UiJGbho2ijJSilJ2hkpuajZ+ajZ+njqGokKKhjJqhjJqijpWfjJKajpedkZqejpGZiYybho2f + iZGekZefkpmhlp2flZullJ6nlqGlkJuhjJeah42ZhoyXgoeVf4SfkJWfkJWfkJWejpSZho6Sf4iW + gIadh4yeiJKeiJKai5Cai5CXjIiajoullJ6mlZ+hi5KXgomOeniNeXeRen+XgIaahImahImfh4Ke + hoCXgoSWgIOUe3eVfXiVf4Kdh4mjkJmrl6GqlJ6okp2lg4eaeX2UeXWSeHSRen+VfoOdgoibgIed + gIOafoCZf4OfhomljZKljZKnjIihhoKeg3ubgHmXe3SVeXKVd22SdGqaenSjg32vjY6vjY6rjoen + i4OmhoKff3uigIKmhIani4eliISigHilg3qqjIysjo6wjI6qhoimhHiigHSefXKffnOee3mif32r + h3urh3uohHmmgnehfXChfXChe3ebd3KidWmoe2+vgHmwgnqvg3eugnWqg3uviICyiH6vhnuvf3Kr + e26leWiofWurg3Ovh3evg3KugnCqe2eoemWuf3evgHiuh3+viICwh4Cwh4Cwh32uhHqrfm+ugHKs + gG2rf2urf3Cvg3SugHuyhH+3iYK2iICziHSsgm6neWKrfWWvh3m2jX+2ko23lI67kYu2jIaUgIeR + foSOf4eRgomVg5aaiJuejZqejZqZiZGVho2XhI2ah5Cdh5umkKWllaejlKajlJuai5KZhombiIye + kp6flJ+elaKelaKhl6Wjmqejl6ahlaOijpeijpeekp6lmaWrnrKrnrKnnaOelJqejpSbjJGjkJmi + jpedkZqZjZaXjZGakJSflZmmm5+oobCmnq6hl5+flp6umaqvmqujmZ+bkZeah42ZhoyVh5KUhpGa + hoiXg4aUhpGbjZmekp6dkZ2dkJSWiY2Zi5SbjZaelKWjmaqfl6ielqefmaWjnaihlZ6Wi5SVhoiX + iIuViI6WiZCXjJWajpefjp6ejZ2bi5qXh5aWiZCWiZCdiJSijZmilqWhlaOijZmijZmhjJqlkJ6i + kZ6ikZ6okZ6ljZqXi5GZjJKZiY6ai5CbiJGdiZKZjZabkJmbkJuflJ+olKWqlaaikqWdjZ+ijZmX + g46XgIaVfoOai5KdjZWfiZGdh46SfYKQen+Wf4Sdhoueh46hiZGhiY6dhouaiIeZh4ahjJemkZ2e + h46UfYSLcnOQd3iVe3+Zf4ObhoabhoaeiI2eiI2dhpCag42XfXiVenWSeXiXfn2ei5GjkJanlJen + lJewiYymf4KafX2VeHiRdXqQdHmafX+df4KegIOdf4KbgImjiJGojZSmi5Glh4eniYmnh4OmhoKd + gHuafnmVeXSQdG+ZfnqfhICsjo6vkZGsjo6sjo6rjpGni42niYmmiIiokIenjoajgG6ee2mjg4Cr + i4isi4yriYusiH2ohHmmgHKhe22jd2+hdG2mfnCogHOohnWohnWlf26he2qddWied2mjd2ileGmr + fnKwg3eyhnewhHWqh3eui3qyiH6vhnuwg3evgnWofWmqfmqogHCshHSuhniuhnireGKndF6nenOs + f3ivhn2wh360i4KziYC2iXqvg3SoemWqe2eofXCjeGurfWq0hnO0h3+3iYK3i36zh3qvgGmqe2So + dV+uemSwg3q7jYS2lJW6l5m/lY67kYuNe3iNe3iNfoCUhIeZiJWdjJmekJufkZ2bjJSXiJCVhouZ + iY6ekJ6jlaOjlaOhkqGijJSahIyXgomahIybi5Wbi5WdjpehkpuhlKailaelmaemmqill56hlJqf + lKKlmaern6uqnqqmmZqhlJWfkJeejpadkpmelJqdlJudlJuekpubkJmflp6lm6Omnq6mnq6imaam + naqvoaqsnqelnZ+fl5qhlJeekZWhkp6ekJufjJCah4uUiJGViZKZlJealZmejIiZh4OXiYeekI2e + lZ+hl6KilqKjl6Omnaqmnaqhl5+Ui5KUhIeUhIeShJCUhpGai52ikqWnkp6ijZmfiZGfiZGUh4uW + iY2ZiZujlKanl5+hkZmeiYyahoiai5KdjZWhkJ+ikaGqlp2ijpWXhIuZhoyZg4ubho2ahIyZg4uX + jJeXjJeXiZWdjpqjkqKikaGlmquhlqelkZeZhoyVfoOVfoOVgouah5Cdh4mahIeRfX2Qe3uZf4Of + homhho6ih5Chh4uehIiahISfiYmhi42ijI6ahn6NeXKJcG+NdHOVeXudgIOfhoehh4ifjJKhjZSh + kJqbi5WZg4CSfXqJdW6Qe3SRhIiWiY2ijJSmkJeskIyliISehoCZgHuVd22OcGeWdXeffn+fg4ad + gIOeg4mhhoyljIeji4alhIKnh4SuiIOsh4Klg3iigHWaf3SXfXKWenedgH2ni5CukZavkJevkJeu + kJqylJ6vlZmyl5u0mpuvlZasi36de2+deHOjfnmmhoOoiIauiIOrhoCnhHSffW2ac2WWb2KZd2ei + f2+og2+og2+qfm2jeGeeb2KfcGOZc2ibdWqfd22qgHeshHSqgnKogHOrg3Wof3Wrgni0hHSwgHCu + emeqd2Omem6ugnWuh3uuh3uqeFuhb1Ohc2GneWesf3qyhH+yh4S0iYe3iX2yhHiweWSrdF+hdWSf + dGOneGiygnKzg3i3h3u2h3Kyg26wfmGsel2sc1+udGGvgn24i4a3jZG/lZnFlZTBkZCQhIONgoCM + gH+RhoSXiZKbjZaekqGbkJ6hjZadiZKWiJGXiZKZjZahlZ6fkqWbjqGdiZCZhoyWgIuZg42Zhomb + iIyZiZGbjJSfi5aolJ+lmaWonaijmZ+elJqflKKlmaemmqimmqiml6GjlZ6flZuflZudlp2blZue + kqGekqGdlqKfmaWhmaimnq6on6yqoa6onq+sorOvo6+soayooqilnqWhl5+elZ2hmZ6hmZ6llZqe + jpSUjI6RiYyWjpSakpeekJCZi4uXiYmbjY2akZ6elaKflKKlmaenna6jmaqfmZ+UjZSQhIOOg4KN + foOSg4iWhpChkJqmlp6ejpafjJKfjJKWiY2ViIyZi5SfkZqjlJafkJKfi4uZhISZhombiIyeiZWl + kJuhlJeekZWZg4CXgn+Vf4SXgoeXgoyWgIuShoyShoyah5Cei5SdjJafjpmjmqWimaOilJ2ekJmX + hoeSgIKWhIabiYudh4SahIKQeniQeniZfYKihouhi42dh4mag4iZgoeahISeiIijiYiiiIeWfnWJ + cmmIb3COdXeafYelh5Glh46ihIyei46jkJSikpehkZaiiImZf4CLd2+MeHCJen2QgIObhpCjjZem + iYyliIuiiIyZf4OReG2Mc2iVdXKaenebh4CeiYOdh4meiIuhh4ifhoelgoCnhIOwi4iuiIanhn2j + gnmefXCbem6WdHKdeninjJKwlZuzlZ2wkpqzlZ20lp6wlZGylpK3nZuwlpWwi4amgHufemuhe22h + fnmjgHumg4Kqh4anhHSffW2bd2ORbVqSbl2adWSifnOlgHWqfXCmeW2fdGOZbl2Sb2OWc2edcmWh + dWmne22rf3CofWerf2mqfmqugm60hHevf3KueF6lb1afc2Soe22qgnSshHeoemOhc1yeaVOmcFqn + eGiwgHCwh36yiH+0iXWyh3OzgmmqeWGmdV2iclqhcmSqem2yhH+2iIOzh3Czh3Cwf2evfmWvemuq + dWevgn24i4a0jIu6kZC+jo27jIuRhIuNgIeQfYOZhoyXjJWdkZqbkaKZjp+fjpuaiZaRhIuViI6e + jZehkJqbjZmWiJSUh4uRhIiVgoaVgoaXhoeUgoOWf4eeh46ejpajlJunmaernauhl6KdlJ6flKKj + l6almaemmqinmqymmaummqinm6qinaGfmp6hlaGflJ+bmaeem6qimaannquqoa6qoa6qo6+qo6+y + pauzpqyrpa6noaqfm6eemqahmqael6OjlZ6ekJmdjZCbjI6bjpWhlJqelZ2WjZWZiY6XiI2XiZWb + jZmfjpullKGqmqyomaublaGVjpqSh4OQhICQe3mUf32XhIujkJafmp6ZlJehlJqhlJqUi4mOhoSb + iIyijpKikpeejpSfi4udiIiahIeZg4abhpCljpmhkZSdjZCagH+Xfn2WgH6Vf32Uf3+Sfn6Ren+R + en+Vf4SbhoubiJGhjZajlaGomqail56akJaWfX6WfX6Vg3+aiISeiIudh4mWgnuSfniWf4ShiY6h + jI6ahoiagISXfoKahIShi4uojpKli46WgnuOenSLcG2QdXKbfoioi5Whho6fhI2fi4umkZGlkZWm + kpamkZSbh4mVenWNc26JdHKOeXeXfYOih42hi4uijIyijIyZg4OVeneNc2+Sd2+ZfXWfh4KljIei + iImjiYufhoedg4SdgH2hhICsi46zkZWojIeliIOognieeG6ScG+UcnClhpCsjZeukZGukZGylZq0 + l52zlZWzlZWwmpqwmpq0joyuiIaie2ebdWGZeG2ffnOjfnuqhIKnfnSmfXOfe2WSb1qRaFOUalWZ + cGiedW2leGuleGufdGGab1yWa1aUaVSUaVSXbVeidF+oemWoeF2oeF2reWiwfm2zg3Wvf3Kre1qe + b06hc1yqe2Sqfm2ugnCue2ilc1+jblWibVSjc1uqeWG0h36yhHuwhG60iHKwgmquf2iseWWreGSo + d2WndWSvgnq3iYK0jHmvh3SwgHCufm6sf26rfm2wg366jIe2kIu0jomziYCziYCRg4yShI2WgIiZ + g4ubi5edjJmajaGajaGhjJeahpGSgoyVhI6Zi5SajJWdh5GahI6XhIiSf4OLf36Lf36XgIaZgoed + goujiJGfkZqhkpujlaOjlaOflJ+ekp6fkZqhkpulmaemmqimnaqroq+rn66onaumm6Khlp2ekJme + kJmfl6ehmaimmaunmqyqoa6qoa6upbKqoa6vpq6vpq6rpbCooq6ml6ajlaOim6Wim6WnmqGll56h + lJqdkJaekJmhkpufmaWZkp6djZWXiJCbiI6fjJKdjZWhkZmol6esm6uml6afkZ+ZjI2WiYuZhH6Q + e3WShISbjY2blZuhmqGnlqGnlqGZjpCQhoeZiZGdjZWekZedkJaeiI2dh4ybho2Zg4uih5CnjJWo + kZmnkJedh4ydh4yXgoeWgIaafoCUeHqVfXiUe3eSfYKVf4SXgoedh4yii5emjpull56bjpWXfoKV + e3+Qgn2UhoChi5WeiJKei46ZhomXgIaii5CfiZGeiJCjhoidf4Kfg4amiYyrkJmnjJWahIyQeoKV + eXmWenqbgIehhoyii5CfiI2biYiikI6lkI2ijYuhjpCbiYubf3+UeHiRdHeOcnSQdHebf4Kli4yo + jpCmjI2fhoeWen2RdXiQdHCXe3ijiYurkZKojo2mjIumiIuihIejh4Kfg36ihoaukZG0lJGvjoys + h4KifXiWdW2ObmWfe36rh4mrkZWulJewlJmwlJmzkZWzkZWvkpe2mZ64l5WsjImng3eeem6VdGiX + d2qfe3Ojf3emfnCiem2heWeUbVuSaFCRZ0+WaVedb12idGKhc2GmeGOhc16Xa06UaEqXZ0+ebVWh + c1ymeGGnd1yoeF2meGOoemWvg3SsgHKhe1ubd1aec2KmemmsgHKsgHKugG+oe2qmdF6hb1qmdF6u + e2WyhnSzh3Wvg2+whHCugnCsgG+re3Cre3CreGureGune2qvg3K0iHmyhnezh3qvg3esg3mrgniy + iIK4joi3jou0jIiygHmwf3iShomUh4uXgoyXgoydh46eiJCekqGajp2bjZmajJeVh5CVh5CWi5SV + iZKZhJCVgIyRfoKQfYCOf4KSg4aZg4udh46biJGdiZKZi5SekJmfkZ+ekJ6ejZefjpmjkJmijpej + laGrnaiqoa6on6ynna6mm6yml6GfkZqdjZWdjZWhkaOmlqillaimlqqmmaunmqyvn7Kvn7KopbCq + prKupbKnnquolZ6lkZqjl6Gjl6Gilp+flJ2llZ2jlJujlZ6omqOlm6ielaKhkpuajJWZi5SajJWZ + jZabkJmjl6ammqionaummqiel56VjpWXfoKVe3+Vg4SbiYuflJ2mmqOrmqWmlZ+akJSRh4uXi5GX + i5Gdl5mdl5mbjJGai5CUh42ViI6ahI6jjZeikpqjlJuhkJ2fjpuhiZuii52XgoeRe4CXg4OXg4OU + f4KXg4aUgoCVg4KXiJCfkJehkZmejpabhoiWgIOUfoObhoudjJmjkp+mjpaii5KfiI2ii5CdiZCd + iZCjh4yfg4iahIyhi5KnkZuijJaZgI2Ue4idf4eegIidh4mhi42hiY6fiI2ijIyjjY2mjIunjYyh + jIyijY2dgIaXe4CUd3mUd3mNc2+SeHSni4erjouoi42jhoiaeHWXdXOVeXmZfX2mjJCwlpqvlZas + kpSriYumhIalh4eegICliIiskJCylZWukZGvi3+qhnqffW2WdGSfgHeniH6ukZSukZSylJawkpWy + jZK0kJWzkZe2lJqzlpuvkpezjYiog36heWubdGeadGmdd2ulemefdWKhdV2ab1eaaFOWZE+UY0ya + aVGhb1eicFimcFqoc1yicFabalCZaU+eblSmdGOreWild2KmeGOld1+qe2Swg3eugHSofmOlel+d + dGqheG6sgn+rgH6wgHWufnOqe2moemiqemqwgHCyhne2iXq3iXqzhneugnOrf3Cqfm+rf3Crfm2q + fWuoeWuygnSyiH+0i4K2iIO3iYS0h36wg3qyg3q8jYS4i4O6jIS0hHSsfW2Vho2ZiZGah5CXhI2a + h5Cah5CeiZWeiZWejZ2ZiJeZi5SXiZKZhJCXg46VgouVgouRfoKRfoKXgoydh5GdiJSfi5aZi5SX + iZKdhpKfiJWii5qii5qhjJeijZmmjZqmjZqllaerm66snqqqm6ennqiimaOjlZ6fkZqhjZahjZah + kpuilJ2ikqWikqWmlKenlaiumaqwm6yupa+so66rn6uqnqqnl52ikpeilKKllqWelZ+hl6Kol6Kj + kp2jlaOrnaurnrCmmaullKOfjp6hkJ2hkJ2ekJuhkp6lmaWmmqanmq6om6+qoauhl6KVhI6RgIua + hIyhi5KelZ2lm6OqnqehlZ6fkJKWh4mbjI6ejpGnmqGll56ejpSai5CXhIuZhoydiZKfjJWhkJ2i + kZ6nl6qmlqinlaijkaWbiIyWg4eXhIibiIybiYuaiImXgoKZg4OXiIudjZChjZGfjJChhoyhhoya + g4ihiY6fjpumlaKrlJ6nkJqliZCjiI6ah4uZhomei46ah4uahIyfiZGnkZmhi5KZgomWf4eag4id + houdiIieiYmeiI2hi5Cmi5GojZSnjJKmi5GijIyjjY2hhImegoeZg4ORe3uReXONdW+if36riIeq + iIylg4ebenKXd26bf3qihoCoi5KwkpqvlZmwlpqsi4yqiImliYabgH2hh4amjIuwlJawlJa0kY6s + iYelfW+bdGeZeXWff3uojIyskJCylJSylJSzkI6zkI6ykJa2lJq3mZ6ylJmujI2riYusf3OleGuf + dGGhdWKmemSjeGKecliablWeaFSXYk6UZE2XaFCeclihdFuodFWseFindVufblSbalOhb1ereGuv + e2+qem2neGqleGmnemuvgnWyhHirfWWrfWWieW+le3Kug4Csgn+yfm2uemmoemWneWSrfnKyhHi0 + jYa4kYm6kIe0i4K2iXqugnOsgGisgGiqf2uqf2uqe3Owgnm2iIO7jYi3jo24kI64i4Kzhn2ugnC4 + jHq3jYO3jYO2iHevgnCbh5Kbh5KZiJWWhpKVhI6VhI6WgJWdh5uXiJqVhpeXh5SWhpKbg5mdhJqa + hI6Zg42XhIuWg4meiZefi5mdjpqekJuajZSXi5GXhIuah42hjZadiZKhkJ+hkJ+hkJ+ikaGmlaKo + l6Wml6allqWml6ajlaOilqWdkZ+fkpmdkJaekZWekZWfkJehkZmjkp+llKGmlaKsm6isoa+vo7Ks + nqeqm6WikpWbjI6jjpqlkJubkJuekp6nkp6nkp6hlKaom66om7KqnbOqmqyllaejl6ajl6aekp6e + kp6fmaWlnqqqmqyomauuoaeom6KhkpuZi5SbjJSdjZWekp6lmaWsm6anlqGjjo6diIiaiImjkZKq + maOqmaOmkZGbh4edhouag4ibjJSejpalkJurlqKqnbCrnrKqm6qilKKfiZShi5WhjZaijpefjJWX + hI2SfXqUfnubh4efi4uhjZafjJWfiJefiJeeg4mdgoiei5GlkZeqkZ6okJ2ijI6dh4mXg4aahoia + h4uZhombh4mfi42jjpGfi42ahIeXgoShi5WnkZujkJSfjJChi5CljpSmjpmqkp2rkJaih42jiI6j + iI6liZKih5CeiI2Vf4SVgnuVgnuhg4irjZKrjo6hhISef3ObfXCihoani4ujjZKokpe0lp60lp6r + jZKoi5CjiIShhoKih4OnjIiukpu0maKzlJuvkJerg4KddXSWdXeaeXqfgoSqjI6vkZasjpSyjZCz + jpGvjY6ykJGyjZKzjpSyjImwi4isg3mmfXOieF+hd16leFyhdFibb1Sbb1SdbVCZaU2XblGZb1Of + c2Kjd2Wnel6qfWGod1ymdFqmb1umb1undGWyfm+qem2oeWumem6qfnKsg3mrgnirf2usgG2rfm+u + gHKrgnmrgnmyg3CsfmuoeF+oeF+qfm+whHWykY62lZK8lpG3kYy0i4Kwh36uf2qsfmmofWmofWmn + fWmug2+yhH24i4O3jYe4joi0h3WugG+sfW2zg3OyhH24i4O6jHq3iXiZi5aajJeXjJqSh5WSgo6U + g5CVhJSWhpWUhpGUhpGUhIyUhIyahpGeiZWZiJWWhpKZho6diZKfkZ2fkZ2bkJubkJuZiY6VhouU + hImWh4ybi5WejZehlaOflKKhkp6ekJuljpmqlJ6llJ6llJ6imaGimaGilqWekqGakZmZkJefkJWe + jpSejZehkJqjkp+jkp+nlqOrmqeqna+uobOwoquqm6WjlJabjI6hi5KjjZWbjpWekZemkJemkJeh + kqGllqWnna+nna+qm6Wml6Glm6ijmqeimaahl6Welqafl6ejlqqqnbCwoq6un6unmaejlaOekJ6e + kJ6jlaGomqawm6qrlqWnkJeii5KeiJCmkJermqqqmainlZadi4ybh4mfi42ijpWei5GjkJmsmaKr + nrCsn7KrlqKnkp6liZKmi5Sqkp+qkp+jjpqahpGWf4SUfYKeiIihi4uljZeii5Wfi5afi5ahh4uZ + f4Obh4mjjpGnkJeokZmijIyfiYmbf3+egoKehIObgoCeiI2dh4yfiYmijIyahISXgoKeh46slZ2r + lZ2jjZWmkJKokpWnkJeulp6vkZmjho2ihImihImih5Cih5CeiJKbhpCeiIuXgoShhImrjpSskpSl + i4yhhH2fg3uni5CskJWqjpWskZezlZ22l5+qjpWnjJKmiI2lh4ymiYmni4uukJezlZ2wlJmylZqs + iYSffXiad26beG+igIKujI2zlJ6ykp2wjpCujI2ujYuvjoyyjIu0jo2zjI6viIuvh4Oqgn6lf3Cj + fm+ieGKhd2Gicleicleiclqfb1efdF6jeGKnenKqfXSrfWirfWiufVuoeFamdV2ldFyjdWGqe2er + fWqsfmuoeWuqem2ofXCqfnKrfnKugHSqe2eqe2eugHKzhnewg3Ksf26od1qlc1aleGurfnKyjIe2 + kIu7ko66kY23hn+2hH62g3KvfWureWisemmnfWSqf2euhH62jIa7jYS4i4K3g3KseWimd2eoeWmq + e3OzhHu3h3e3h3eVh5KZi5aWiZ2ViJuWhpWWhpWUhpGShJCSgoyUg42UhImWh4ybi5qdjJuZiZua + i52ejJ+ejJ+bkJudkZ2dkpaZjpKWh4ySg4iVf4ebho2fjJWjkJmimqqfl6efkpmekZeejpSllZqo + lKKrlqWmmqajl6Ojl6OhlaGhl6KelZ+ekp6ekp6fkZ+hkqGjkp+llKGlm6ijmqemlqirm66snqyo + mqihkZaejpSljpamkJefkJKhkZSokZaljZKijZmlkJunnqumnaqlm6ilm6immaummauim6ehmqaf + lKKhlaOnlqaunayunrKsnbCnlainlaillqKilJ+qkp+wmaarmqenlqOljpafiZGfiZSnkZuolqqr + mayilp+ajpeejpaikpqnkZuhi5WhkJqrmqWqnqqonairlZ+nkZuljJmnjpuqlJ6okp2ikJGdi4yX + fn2Xfn2ihoajh4eljZWnkJeijZmhjJeli4mbgoCdg4enjZGmjpaokZmljpGijI6jgoOjgoOlg4Sn + hoehjIydiIiehIahh4ibg36bg36eh46rlJurl56nlJqmjpSnkJWojZaylp+wkpqoi5KihoadgICe + g4mfhIubhJGeh5Shho6eg4yhg4uniZGskJKni42ih4Kih4KrjZeukJqylJuylJu0maKzl6GskpSs + kpSniYylh4mlh4mmiIusjZevkJqzlZq0lpuvjoijg32heG6ddGqbfoCniYywkZu0lZ+wkI2ri4ir + iIaqh4Srh4mqhoiuiIerhoSuhoKrg3+ogHCnf2+oemOneWKmdFqmdFqndGGreGSqemqufm6ugHiw + g3qzhnevgnOwf2eremKrelqldFSleFyoe1+sfmmvgGuzenKvd26odWeodWeoeWmre2une2ine2io + fXCugnWvg3KsgG+ye1+mcFWhc1yjdV6wg3u6jIS+kpK+kpK+iX23g3e6hHi3gnWyemiveGWoemWo + emWuf3e3iH+4jHq0iHezf2muemSmdF6mdF6meGWoemiyg263iHOWgo2diJSZjJ+ajaGaiZaVhJGR + g4yMfoeRfYiUf4uXh5GejZefkKKejqGdkKKdkKKmkaKijZ6hiZmii5qbjpWXi5GWh4yVhouXgoeZ + g4ieiJKjjZeflKKflKKfkpadkJShjZajkJmolKKqlaOilqWlmaeimaahl6Wmlqinl6qnm6qjl6af + maWblaGllqWllqWll6qll6qnl66oma+umaWqlaGfkJeikpqnkZumkJqdkpSdkpSjkJahjZShjZGi + jpKilZmmmZ2mmqajl6Oomqiqm6qmnaqjmqehlaOekqGnlqGsm6ammayll6umlqqqmq6nl6qnl6qq + m6eun6ummqahlaGolZ6jkJmhkpunmaKmlaWol6eilJ+hkp6llqKnmaWsl6OjjpqikZ6unaqvnqiq + maOmkJeljpajkJmlkZqrlJurlJuijZCeiYyag4iag4ihiY6jjJGnlJ2mkpuikpqhkZmijImdh4Sd + iIunkpWolJ+mkZ2okZunkJqjhouihImfiI2ii5CmkJeijJSfiYyfiYybhoieiIumiJWylKGwmaGu + lp6qkJSojpKmjparlJuwlZunjJKdgHuZfXiSfX2WgICVgIOZhIebhImdhoufhIumi5GojpKli46j + jJGjjJGojJ2wlKWzlqWzlqW3m6e2mqawm56rlpmoi42lh4mohoSmg4KmjJCojpKzkJm3lJ23kpWu + iYyognqie3SfgoSlh4msjpSvkZasjImqiYeviICqg3umfn2je3qog4Cngn+rhH2uh3+whHiugnWv + fWSsemKod1yndVuleWWqfmqsgHKvg3SyiH+ziYC6jH+2iHuyg26uf2qwe1urd1asel2zgGOvgnCy + hHO0gHKreGmjc1iiclemdFyod16mc12reGKsemewfmqyf26yf26wfmindV+jdFOfcE+oenK3iH+/ + jo3FlJLBjIK7h323g3Szf3C6g2uveWKoeF+remKvgG60hnO0jHm0jHm0hnCrfWiremKnd16wfmqz + gG22hnW2hnWVgIydiJSbjJ6bjJ6bh5KXg46SfoyRfYuQf4mRgIuZi5aekJujlaOjlaOflJ+flJ+h + lZ6dkZqfjJWfjJWekZeZjJKXhIuVgoiWhIaXhoeXiJCdjZWhkJqhkJqhjZabiJGhi5WljpmilJ2j + lZ6jl6Gilp+ilqWlmaeil6qjmauooq6lnqqjl6aflKKmlKehjqKikaGllKOjlKaikqWqlp+nlJ2d + kpmhlp2llqKllqKimaGimaGmlZ+hkJqdkJSdkJSfkJWllZqflJ2hlZ6hlaGilqKmmauom66lm6ie + laKilqKlmaWrmqqrmqqvma6vma6omayrm6+un66voa+mmZ+jlp2mlZ+llJ6hlaOmmqiol6Wjkp+l + kJ6mkZ+qlaaumaqwm6emkZ2ikZ6unaqznqyumaeskZqojZaljpaljpaqlJmnkZaeiI2bhouZg42a + hI6hiZamjpumlZ+llJ6mkpulkZqii5Cdhouii5KokZmsl6aumaerlKGqkp+sjpalh46hi5Kljpar + lZ+qlJ6mkJWijJGfiYyfiYyliZWrkJuzlZ+0lqGskpanjZGnkJWslZqslpumkJWmg4KffXuUeXSQ + dXCWe3idgn6Zg4Cdh4SiiIyli46ijJGhi5CljZWljZWojJqukZ+zlqW0l6aymaawl6Wvl52ulpus + jo6jhoafg4OZfX2fg4aliIuojJGwlJmwlJarjpGqg4ajfX+bfn6lh4eujI2vjY6sjIioiISnhn2j + gnmie3KhenClf3qjfnmnfnSqgHergnirgnivfmOse2Goe2KnemGsfW2vf2+vf3K0hHe2jIO3jYS4 + jH+2iX22h3Kuf2qzfWGye1+wfmO0gme2gni7h324iHiufm6jdFOZakmda1Ghb1WqclqyeWGvfmWz + gmmwhG6yhm+zgG2vfWmveV+oc1qseW+4hHq8jYbDlIy+iX+6hnu2hnW0hHS3hG6yf2mzel+udVus + f3C2iHm0jH6yiXuwgm+uf22vfWereWOwgnmwgnm3jIm8kY6Wgo2diJSbh5WahpSXg46Wgo2Rg5GR + g5GUhpGZi5abjJ6ejqGhkqGjlaOllJ6mlZ+hlZ6ekpuajZSZjJKei5Sei5SXhIuVgoiWgIaZg4ia + h5CfjJWbjpKZjJCbiI6Zhoyah42hjZSekZehlJqjlZ6ilJ2hlZ6ilp+llaerm66qnqylmaeikqWi + kqWjlaGekJuekZefkpmfkJefkJeikpqjlJumlp6llZ2ilJ+fkZ2jlaOnmaeml6OilJ+bkZeakJae + jpafkJedjpedjpedjpejlZ6jlKaqmqylmquil6iol6eol6eml6OnmaWsm6urmqqunrKvn7OuobOu + obOnmqGilZullaemlqill6ummayllqWfkZ+hkJqhkJqulqiwmauymqqmjp6mlaKqmaaun66omqio + kZuljZelkZemkpmmlJWhjpCjiI6fhIuXhI2diZKeiZWhjJellqKnmaWvl6Kqkp2ljZeii5Wljpmo + kp2wm6eynaiym6aym6asjpmniZSikZuol6KwmaiwmaivmZ6nkZahiZGfiJCliZKrkJmylqKzl6Or + kJmmi5SqjJSsjpaolZ6lkZqniYmihISXe3iUeHSVdXKaeneZfnOfhHmliIimiYmniZGmiJCmi5Sm + i5SliZCnjJKskZqwlZ6ylqKvlJ+wlpewlpeuko2liYSfhICWe3ideniif32jh4yvkpewkpqsjpas + hIOnf36hgH6ign+nh4SujYuujI2riYuriIajgH6mfnCed2mheWuje26mem6sgHSshHeuhnirfWin + eWSreWireWiqem2ufnCygnSygnSwiHi3jn64kH+3jn67h3iyfm+zgGizgGivfWu4hnS2iIC8joe/ + kH24iXesel2fblGaaFWea1imdF6wfmisfmmsfmmsfmmvgGuvgG6wgm+vf3KoeWuvfne2hH28jYy/ + kI67jX62iHm0h3q2iHu2h3S0hnOygGiufWSyg3u4iYKziX+yiH6vhHCqf2uufm6zg3O2h4m6i428 + kpnBlp2Wh4yVhouUgImSf4iRfoSSf4aVhJSZiJeZh5qbiZ2dkZ2dkZ2bjZullqWml6OjlaGhkp6e + kJuajJWWiJGfi5meiZeah5CZho6ah4ufjJCfjY6ejI2UiY2SiIyWhIOWhIOUgoObiYubjpWekZef + kZ2ilJ+ilJ+hkp6llqKnmaWnl6qfkKKdkKKekaOekJuXiZWbi5WejZefkJWhkZankp6qlaGnl5+l + lZ2hlJqfkpmllJ6nlqGnlqOmlaKflZudkpmejpafkJedjpeekJmhkp6jlaGnl6urm6+mmauom66y + na6vmqujlaGjlaGol6eunayunay0o7OwpbCvo6+sl6afi5mjlKarm66smq6rmaynlqOikZ6ikpqh + kZmolKWvmquwmauqkqWnkp6qlaGnmaellqWolKKlkJ6nkZmokpqolZmei46fhomfhomag4udho2b + iI6ei5GhkJqol6Kvl6KslZ+njY6jiYuejI2jkZKsl6iznq+0n6u0n6uvl5+qkpqllqKqm6e0n7C2 + obK0naeokZujjJafiJKliZKrkJmulqGwmaOrkZWli46njY6njY6ijpWjkJaljpGdh4mXe3eWenWX + c26Xc26ZeXWlhICliIini4uui5SriJGmiYymiYyfhoSbgoCjhIylho2ni5CrjpSojpCskpSqlY6l + kImlg3qffnWbenKefXSif4ivjJWqjZKskJWriIOhfnmaeHWffXqmgH+rhoSmiI2oi5Crh4mmgoSi + f32ee3mZdWmWc2efeGinf2+qhHWrhnesgmuofmiqem2re26sfW2vf2+vf3KsfW+ogHOyiXu6jIS/ + kYm7iYK6iIC2g2+yf2uufnO2hnq2jYm6kY27jnq2iXWyf2SjcleXalafcl2ofWmugm6yg3Cwgm+u + fm6ufm6ugnOwhHWygnewgHWyhHu3iYC3koa6lYi+kX23i3e3h3m0hHe2h3S3iHW0iHSzh3OzhoC3 + iYSviH2viH2whG6ugmuvgnW2iHu4iYy8jZC+lJ3Cl6GZiJKXh5GZg4uVf4eSfX+UfoCZg42eiJKX + i5GXi5GbjZadjpedjp2ml6ailqKilqKekpuajpebjZaXiZKaiZSZiJKeiZWfi5afkZqhkpuhi5Kd + h46ZiJKXh5GXg4aVgIOUf4KXg4aah4uei46ejpafkJeikpqhkZmjlKaomauolq6ejKObi5qdjJui + jZmdiJSei5Sei5ShjZSlkZeolZ6olZ6mlp6ikpqbkZWelJellKGnlqOol6eol6enm6WlmaKolKKn + kqGfkZqhkpuikpejlJmhlaOonaunm6esoayunayqmaillKGjkp+llKOqmairnauzpbO3prayobCr + lKGii5elkqaql6usm6iqmaaomZ6hkZaikpqejpalkJ6qlaOumaenkqGmkJWnkZajkp+mlaKrmqen + lqOmkpunlJ2nlJqfjJKdh4ybhouZg4iZg4idiIuhjI6ijpWnlJqqlJmokpemjI2hh4idiIiijY2o + kZ6vl6Wwn6yyoa6znaWrlZ2ll56mmZ+wn6yzoq+3n6qslZ+miJCdf4edgoinjJKnjJWwlZ6qkJGj + iYuhhoCfhH+fhIuliZCijIyfiYmegn6afnqaeneZeXWZeXelhIKljZKnkJWukJKqjI6miYyni42j + h4Kbf3qffXiffXihgH6jg4CfgoKniYmqjYmmiYalgoCif36dfnSbfXOffoKoh4uskJWskJWrjH+m + h3qdeW2deW2ifXqmgH6jgoOmhIaqhIOmgH+hfn2ffXuefXSZeG+heG6qgHeviYSyjIe0iHmugnOu + f22vgG6vgGuuf2qrf2mrf2mqeXKwf3izh3q8kIO7jIS8jYa6i3Wuf2que2qzgG+0i4S7kYu4kIKz + i32whminfV+ablWdcFeoenWzhH+zhnewg3Svf3KufnCqfnKwhHi2hnq3h3uyhnmzh3qzjIC4kYbB + kIS8jIC6h3OzgG2wgHC3h3e3h3e3h3ewh362jIOuhHquhHque2WqeGKsfmuzhHK4iInBkJG/lJXB + lZaaiZSaiZSfg4ibf4SWe4Kaf4ahjJeijZmZjJKWiZCah42fjJKikaGqmaimlqijlKabkpqZkJeV + i5GVi5GWjI2bkZKhkJ+nlqaom66jlqifiZGahIyShI2Uho6ahoaZhISXg4OZhISfi42hjI6fjJKh + jZShlJqhlJqlkqamlKemkZ+hjJqfiZGfiZGijJahi5WejpabjJSjkJmolZ6ml6GjlZ6omZ6ikpej + lZ6llp+ol6KmlZ+qmqyrm66onaurn66umaqqlaanlqallKOolZuolZuXjpahl5+nm6qqnqysm6ur + mqqllKGikZ6ikKOjkaWqmqywobO0pberm66ilJ+ajJehjqKjkaWumaWumaWqmp+ikpehlJefkpaj + kJmnlJ2rlqKnkp6mkJWljpSfjpmjkp2olKWvmqunkJ+okaGfkZGekJCdjoyWiIaWi4mViYifiYem + kI2nkJerlJurlZqokpejjY2eiIifiYyijI6mjpmrlJ6vmqa0n6uym6aslqGolZumkpmsm6ayoau6 + oa6slKGsi4ybenuWfYCehIiihIysjpamjIuiiIejgnmjgnmjg4ClhIKlh4mlh4mihoafg4Oeg3+d + gn6df4Klh4mvlJ2wlZ6ukpmrkJaniZGoi5KsiH+lgHifeW6feW6ZdWqbeG2ie3SrhH2uiIOog36l + goChfn2efXCaeW2XdXOhfnuriYuujI2ujYemhn+ie3Cdd2uXdXCZd3KfeW+mf3Wrfneoe3Soenum + eHmmeXKhdG2hdG+ugHu0jIy4kJC2joeviIC0gG+zf26uf2iuf2irfWiuf2qofmqme2iqgnSyiXuz + joa3kom/joO2hnqwfWmwfWm2iIO8jom+loy4kYe3jHiug2+meGOjdWGnfniwh4C4hHWyfm+uemes + eWWufnOygnewgnm2h360iHmyhne0h3q/kYTFkIbBjIK4hnS0gnC2gni4hHq6hnu7h322iXW4jHi2 + i3evhHCrel+nd1yreGSzf2u2hIDDkY2+lI28koybjZmXiZWahI6Zg42dhpCdhpCdjJuejZ2Uh42O + goiRhIiXi46ikKOmlKenkaqjjaabkZeZjpWXi5GajZSVkJGblpeilq+mmrOrmqemlaKfhIufhIub + iJGbiJGbhouahImXiYmWiIiei5GjkJajkJahjZSbkJudkZ2lkKGlkKGjjJmdhpKZiY6ejpSnkp6o + lJ+ikZ6hkJ2ml6Oomqammqinm6qunrCunrComqiml6aimaOhl6KomauunrCsnbCrm6+lmaWjl6Os + nqqrnaillJ6hkJqah5CfjJWilKKqm6qrnairnainlqGfjpmejZqfjpuikKOvnbCwoq6snqqmkpue + i5Sii5KmjpajlJunl5+jlJmhkZafkJWikpejkJamkpmnlJ2olZ6njJKliZCeiZWijZmnkJ2vl6Wo + maGjlJunkpWmkZShjZGbiIydjZKai5Cfi4ulkJCnkJWqkpeqkperlJmii5ChiY6ehIifhomhhoyl + iZCulaK2naqwl6WulaKqjZKrjpSokpq0nqa2n6qul6Kni4OZfXWUeXKVenOdf3+miIiihoaihoaf + hH+dgn2jgoOlg4SmhIamhIaeiIieiIihh4ahh4ang4uuiZGzl6Ozl6O0lqGwkp2qi5Kmh46rhoOn + gn+hf3SaeW6acmiddGqbeG2hfXKrhoCrhoCqgoCje3qdenmbeXiXd26aeXCnf36vh4aoiIKignuh + enCZc2mUcGWWc2iac2OddWWjeGmmemuleHOjd3KmdW+jc22bc22ieXOsh4S2kI26kIm0i4SshHeu + hnivg3Svg3SogG6ogG6ugnCne2qoe2+vgnWwi4a3kYy8jom6jIe2hnWwgHCzhoC7jYi/lY64joi6 + jH23iXqugnOrf3Cwgnm3iH+2h2+yg2uue2WvfWevgG6wgm+vf3Kzg3WuhnWshHSwg3u8joe/kYS8 + joK6iXu4iHq2hnqwgHW2gnW6hnmyg260hnC3i3KwhGuvfWKsel+reGSwfWmzg3jCkYbBkYm+joed + jJmaiZaXh5aWhpWXg46bh5KZi5aXiZWVgouQfYaVf4edh46ijZ6nkqOllqKjlaGbkZWZjpKai5KX + iJCbkJmjl6Gnn7Onn7OrmqehkJ2ahImbhouWjJKbkZejjZehi5WhiZGhiZGdjJadjJadjpqajJee + kJ6ekJ6fkZ+fkZ+iiZafh5SZiJWikZ6ol6enlqallaeikqWjl6anm6qunrCsna+zobawnrOmmaui + laejl6Ommqaqm6qsnqyvoa+rnauqnaOsn6awn6qyoaurlKGeh5SRgoeVhoudiJankqGfmaWhmqau + laKiiZahi5KfiZGhjJevmqaznqywm6qljpadh46dh4yijJGhkZmmlp6jlpqekZWijpWmkpmokpen + kZaulp6qkpqliZKliZKjh5WmiZeokZ6okZ6rl56olZuqlJuokpqhjZGdiY2bjI6bjI6njJKmi5Gl + jZKljZKqlJaslpmrkJajiI6dh4mdh4mXgoSeiIuqjJmzlaKykqKujp6vjoysjImrjZe3maO3n6qw + maOwjI6mgoSafneWenOZfnmjiIOlh4emiIiiiIejiYiniYmqjIyni4eliISihoiliIuli4yiiImn + iYyoi42zlZ+4mqW6mqWykp2zjJSwiZGniYylh4mhhH2dgHmhenCeeG6Wc2qeenKqgn6qgn6shn6o + gnqheXWed3OZdWqWc2ibeXSffXilgHijf3eieXOXb2mXb2WVbWOWa1iZbluecmGhdGOjd2+meXKl + d3KbbmmWcGmadG2ogH+3jo22lIuwjoauhHqsg3mzhHu0hn2zhn6zhn6yjH2lf3CmeWqqfW6uh3+y + i4O6jIe6jIe6hne0gHK2h3+/kIi8kZG6jo64i362iHuwiHqvh3mvh3mvh3m0iXOziHKzhG+zhG+w + hHOyhnSwhG6ugmuofWene2WsfW+zg3W7jIO+joa8jn+7jX62hnW0hHS0gm62g2+0gG27h3O3i3m3 + i3myhm2rf2eyhne0iHmyi4O3kIi7jIu3iIediZKfjJWaiZSWhpCUho6XiZKZiZGUhIyReoeQeYaU + foOZg4ibjZafkZqjkp+llKGbkZWXjZGai5CXiI2jkp+rmqeqn7Cnna6ol6KdjJaahImdh4yekZei + lZuolZ6lkZqjjJSljZWdjZWbjJSbjpWbjpWejJ+hjqKhjqKfjaGfi5mhjJqbkJujl6Ovmquumaqn + lqOikZ6nmaernaurnrCsn7Kyo7KworCmmaufkqWolJ+rlqKsl6Ovmqasoaqjl6Gilp+nm6Wsnqys + nqyikpqVho2SfX+UfoCdg4eojpKekp6hlaGnkp6eiZWai42Vhoibho2mkJeunrKrm6+nlJqdiZCe + iJChi5KhkJqmlZ+ll5ubjpKhkZamlpunlJqqlp2slqGnkZuiiZahiJWliZWliZWmkJqqlJ6vlqOs + lKGslaKqkp+nkZGijIydh4yijJGskZqqjpeljpGmkJKulpuulpuukZGliIibhoiXgoSUfYKZgoei + hoiukZSvkZmrjZWrjY2miIioi5eylKGzl6OwlaGzkJunhJCUfoCRe36bf3umiYaqjouliYali4yq + kJGylZqylZqnjY6li4ymi5GnjJKmjJCjiY2oi5KniZGylJ64mqW0maWwlaGyi42viIumi4ejiISi + hn6hhH2je3iheXWbeXeee3mjfnmngn2rg3Org3OhfWebeGKWcmGUb16Wc2iZdWqfeXKeeHCfeGqX + cGOdal6ZZ1uSZVSUZ1Wfbl2mdGOldWineGqoeWuhcmSXcGOac2Wleni2i4i+lo63kIiwhHisgHSy + hH2zhn6wh364joa6lISviXqqeGSmdGGoenKwgnm4iYS4iYS4iH23h3u0h367jYS+kIu7jYi7h320 + gHeyhnmzh3qzh3qzh3q0iHu0iHu7i327i326jH26jH2zhG2vgGmofmWnfWSremKufWS3g3m7h327 + jX68jn+4iHivf2+zgGqvfWeve2W4hG64iYC7jIO2iXqzh3i4lIu4lIu2kpG3lJK7kI24jYuXiJCW + h46XiI2XiI2XiJCai5KZiZGVho2OeYCNeH+SfX+bhoidjJmdjJmdi56ejJ+ajo2ViYiXhIibiIyl + kJ6qlaOlmaWflJ+ljpGeiIuWg4eah4uhkZallZqilZuilZuijJaahI6Wg4mVgoiViI6WiZCbi5Wd + jJaeiZqdiJmhiZmljZ2ikZ6ol6Wsl6ilkKGjjZWhi5KqkqWulqiom66uobOwoquml6GikpqfkJel + kZeqlp2umqOsmaKrm6OomaGmlaKnlqOonaulmaediY2UgISQeniRe3mZe36ihIeikpqikpqekpuZ + jZaUiY2Ng4eWgo2fi5aml6aqm6qll5uajZGdiZChjZSmlZ+ol6KikpeejpSfjJWjkJmqmaOol6Kv + lqOokJ2ii5WjjJaijJSijJSmi5SskZqolKWsl6iwl6WvlqOmkZSijZCfiZGljpaukpmukpmqlJal + jpGslZ+wmaOukZSliIuehIaehIaagIKZf4CehoCokIuukZSqjZCojIyihoamiJWoi5eskZqskZqu + kZaojJGbgIybgIyfg4ani42ujpmvkJqoi5erjZq0maWylqKqjpWukpmrkJmqjpelh4mhg4aliI2l + iI2sjJu2laW2mqOylp+vjY6nhoehhISfg4Onhn2lg3qmgHuhe3eff3uign6mgHuog36qhn2ng3qn + fWmdc1+WalqQZFSQZVWWa1uZbl2ab16XdF6XdF6abViXalaVaFaWaVebbWKhcmeldWimd2mleWWh + dWKab2GdcmOhdWSugnC6koi2joSuhHqqgHeuhHqyiH6rh3qyjYC3kX2zjXmvfmOmdVufdGGmemeu + fXW0g3u4iH23h3uzh3q4jH+7jIO6i4K0hHewgHOugmuwhG6yiXmwiHi0h3q6jH++joe/kIi8joa7 + jYS3iHWsfmusfmeqe2Sue2WsemSzf3O4hHi2hni6iXu7iHe4hnS2gHKyfW6weWeze2m4h4O7iYa3 + jou7ko64lJa4lJa8l5q+mZu/lpK4kIwADQEAAAMAAAABAQAAAAEBAAMAAAABAQAAAAECAAMAAAAD + AAMAqgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAACAAMAsAESAAMAAAABAAEAAAEVAAMA + AAABAAMAAAEWAAMAAAABAKoAAAEXAAQAAAACAAMAuAEcAAMAAAABAAEAAAFTAAMAAAADAAMAwIdz + AAcAABDoAAMAxgAAAAAACAAIAAgAAAAIAAH+CAAB/gAAAQIAAAEAAQABAAAQ6GFwcGwCAAAAbW50 + clJHQiBYWVogB9YABAAeABAAAgAkYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbW + AAEAAAAA0y1hcHBs8Km3nXI3UvdB2LuwZ9wBHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA + AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAYSbmRp + bgAAB+wAAAY+ZGVzYwAADiwAAABkZHNjbQAADpAAAAH+bW1vZAAAEJAAAAAoY3BydAAAELgAAAAt + WFlaIAAAAAAAAF1MAAA01QAAB9tYWVogAAAAAAAAdAUAALP7AAAiflhZWiAAAAAAAAAlhQAAF0sA + AKjMWFlaIAAAAAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov// + /aMAAAPcAADAbGN1cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0A + AHZjZ3QAAAAAAAAAAAADAQAAAgAAAgQC9wQFBQUGCgcFCAsJCAoNCwgMCg0QDg0PDxAOERASEBMS + FBIVFBYXFxgYFhkaGhsbGhwdHR0eHyAeISIiIiMjJCUlJCYmJycpJyopKyosLC0tLi8vLzAxMjEz + NDQ0NTQ2Njc3OTo6Ojs7PD09PT49Pz9BQkJCQ0NEQ0VFRkZISElJSklLTExMTk1PT1BQUVJSU1RU + VVVWV1dXWFhaWltbXFxdXl5eYGBhYWJiY2RkZGVlZ2doaGlpamlra2xtbW1vcHBwcXJycnNydHR1 + dHZ2eHh5eHp6e3t8fH19fn5/f4CAgYGCg4SDhYSGhoeHiIiJiYqKi4uMjI2Njo6Pj5CQkZGSkpOT + lJSVlZaWl5eYmJmZmpqbm5ycnZ2enp+foKChoaKio6OkpKWlpiWmpqenqKipqaqqq6usrK2trq6v + r7CwsbGysrOztLS1NLW1tra3t7i4ubm6uru7vLy9vb6+v7/AP8DAwcHCwsPDxMTFxcbGx8fIyMlI + ycnKysvLzMzNzc5Nzs7Pz9DQ0dHSUdLS09PU1NXV1lXW1tfX2NjZ2dpZ2trb29zc3d3eXd7e39/g + 4OHh4uLjYuPj5OTl5ebm5+foZ+jo6enq6uvr7Ozt7e5t7u7v7/Dw8fHy8vNy8/P09PX19vb39/j4 + +fn6efr6+/v8/P39/v7/fv//AAACBAL3A3AEBAUJBgQHCggHCQwKBwsJDA8NDA4ODw0QDxEPEhET + ERQTFRYWFxcVGBkZGhoZGxwcHB0eHh0fICAgISEiIyMiJSUmJicmKCcpKCoqKyssLS0tLzAwLzEy + MjIzMjQ0NTU3ODg4OTk6Ozs7PDs9PT9AQEBBQUJBQ0NEREVFR0ZIR0lKSkpLSkxMTk5PUFBRUVFS + UlRVVVVWVldXWFhZWVpbXFtdXV5eX19gYWFhY2NkZGVlZmZnZmhoaWpqamxtbW1ub29vcG9xcXJx + c3N0dHV0dnZ3d3l5enp7e3x8fX1+fn9/gICBgIKCg4OEhIWFhoaHh4iIiYmKiouLjIyNjY6Oj4+Q + kJGRkpKTk5SUlZWWlpeXmJiZmZqam5ucnJ2dnp6fn6CgoaGioqOjpKSlpaamp6eoqKmpqqqrKqur + rKytra6ur6+wsLGxsrKzs7S0tbW2tre3uDe4uLm5urq7u7y8vb2+vr+/wMDBwcLCw8PExMXFxkXG + xsfHyMjJycrKy8vMzM1Mzc3Ozs/P0NDR0dLS01LT09TU1dXW1tfX2NjZ2dpZ2trb29zc3d3e3t/f + 4F/g4OHh4uLj4+Tk5eXm5udm5+fo6Onp6urr6+zs7e3u7u9u7+/w8PHx8vLz8/T09fX29vd29/f4 + +Pn5+vr7+/z8/f3+/v9+//8AAAGCAmUDQAQcBPEFuwaJB1wIMQkHCdUKoQtyDEUNFA3jDrUPhBBR + ER4R7hK5E4cUWBUnFfMWvReHGFEZGhngGqobdRw/HQUdyh6PH1UgHSDjIaoibyMwI/ckuSV6Jjwm + /ifDKIQpRSoMKswrjSxNLQgtyS6IL0UwBDDFMYUyQzMVM+00wjWWNmw3QDgROOM5tTqHO1k8Lj0I + Pdw+sj+JQF5BMEIAQtJDqER9RUlGHUbvR8RImUlrSjpLEEveTK1Nf05MTxlP6lC4UYNST1MbU+dU + sVV5VkZXC1fRWJdZYFoqWvJbtlx4XTxeAl7FX4hgUGERYc5ii2NNZA1k02WoZpZnjWiLaXtqdWts + bHBtYG5bb0VwOHEsciJzE3QFdPh153bTd7x4pXmUeoN7b3xOfTd+JH8Mf++A1IG8gp+DfoRohUiG + KocPh/KI04m0ipaLeYxcjTuOHY79j9yQvpGhkoeTb5RPlS+WEpb4l96YvpmdmoCbZ5xRnTqeHp8D + n/Sg9KH6ovuj9qT0pfCm76foqOCp46rdq9SszK3Err6vuLCzsa+yrLOqtKm1qbart664xrnMutO7 + 2rznvgG/FcAwwUnCbMOVxMHF78cfyFDJiMrSzCPNds7M0CnRmtMS1JHWJtfD2WjbJ90C3ujg7uMZ + 5Wbn1uqP7Y/xDvVt+x7//wAAbmRpbgAAAAAAAAY2AACXOAAAVsIAAFQSAACKMAAAJ6sAABaoAABQ + DQAAVDkAAiFHAAIR6wABRR4AAwEAAAIAAAABAAMACwAWACUANwBNAGUAgQCfAMEA5QELATUBYQGQ + AcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVGBXAFxAYbBnQGzwctB4wH7ggfCFIIuAkgCYoJ + 9gpkCtULRwuBC7wMMgyrDSYNog4hDmEOoQ8kD6kQLxC4EUMRzxIWEl0S7hOAFBUUqxVDFZAV3RZ5 + FxcXthhYGKoY/BmhGkga8RucG/McSRz4HageWx8PH2ofxSB9ITch8iKwIw8jbyQwJPMltyZ+J0Yn + qygQKNwpqSp5K0osHCzxLVwtxy6gL3kwVTEzMhIy8zPVNEc0uTWgNoc3cThcOUk6ODsoPBo9Dj4D + Pn8++z/0QO5B6kLoQ+hE6UXsRvFH90j/SglLFEwhTTBOQE9SUGZRe1KSU6tUxVXhVv9YHlk/WmFb + hVyrXdJe+2AlYVJif2TgZhJnR2h8abRq7WwnbWRuom/hcSJyZXOpdO92NnjJehV7Y3yyfgN/VYCp + gf+DVoSvhgmIwoohi4GM445Hj6yREpJ7k+SWvJgrmZubDJx/n2qg4aJao9Wmz6hOqc6rUa5ar+Cx + abLytgu3mbkpurq94b93wQ7Cp8RBx3vJGcq6zFvN/9FK0vHUm9ZF1/HZn9z/3rHgZOIZ49DnQej8 + 6rnsdu427/fxufVC9wj40Pqa/GX//wAAAAEAAwALACUANwBNAGUAgQCfAMEA5QELATUBYQGQAcEB + 9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVwBcQGGwZ0Bs8HLQdcB4wH7ghSCLgJIAmKCfYKZArV + Cw4LRwu8DDIMqw0mDaIOIQ5hDqEPJA+pEC8QuBFDEc8SFhJdEu4TgBQVFKsVQxXdFisWeRcXF7YY + WBj8GaEZ9BpIGvEbnBxJHPgdUB2oHlsfDx/FIH0hNyHyIlEisCNvJDAk8yW3Jn4m4idGKBAo3Cmp + KnkrSiwcLPEtXC3HLqAveTBVMTMyEjLzM9U0uTWgNoc3cTfmOFw5STo4Oyg8Gj0OPgM++z/0QO5B + 6kLoQ+hE6UXsRvFH90j/SglLFEwhTTBOQE9SUGZRe1KSU6tUxVXhVv9YHlk/WmFbhVyrXdJe+2Al + YVJif2OvZOBmEmdHaHxptGrtbCdtZG/hcSJyZXOpdO92Nnd/eMl6FXtjfLJ+A39Vgf+DVoSvhgmH + ZYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qolqj1aVRps+oTqnOrNSuWq/gsWmy8rR+ + tgu5Kbq6vE294b93wQ7EQcXdx3vJGcq6zFvN/9FK0vHUm9ZF1/HZn9tO3P/gZOIZ49DliOdB6Pzq + uex27/fxufN89UL3CPjQ+pr8Zf//AAAAAAAGABIAIwA5AFUAdQCZAMEA7gEgAVQBjgHLAgsCUQKb + AucDOQOMA+QEQAShBQYFbwXdBkwGvwc4B7UINgi5CUAJygpdCu4LiAwlDMQNZQ4PDrUPZRAXENMR + ixJNEw8T0hSeFVkWDxbPF40YURkaGeUasxuEHFUdIh37HtAfqyCMIXIiVyM5JCwlGCYKJvgn7ijr + KeIq6SvpLPMuAC8JMB8xNjJPM2o0kTWyNuE4ETlBOnA7qDzrPi0/bkC7Qf9DUkSzRglHZ0i0SdVK + 7Uv6TRxONE9RUGFRilKoU91VBlYxV1tYkVnCWvhcNl15XsNgA2FGYo9j7WU7ZoZn42lEaptr/21r + bsdwOHGkcw10gnX4d25443pce959Wn7hgGWB54NmhOSGdYgDiYyLEoynjkCP1JFjku6Uf5Yfl7CZ + JJqOm/qdep7xoHOh66NwpP+mdqf+qY6rH6ywrkGv07Fksva0h7YZt6q5O7rLvFu9zL9ZwOjCd8QE + xXfG+8hyye/LaszVzj/PqNEP0nbT3NVB1p7X59kv2nbbvN0B3kXfeeCl4c/i+eQc5THmROdX6Gjp + cepw62PsU+1A7i3vDO/r8LzxjvJW8xvz2/SV9U719vaf90L32/h0+QX5h/oK+o36+vtl+8/8OvyV + /OT9NP2D/dP+I/6J/vT/X//J//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAABtbHVjAAAAAAAAAA8AAAAMaXRJVAAAABQAAADEZnJGUgAAAEIAAADYbmJOTwAAABIA + AAEaZXNFUwAAABIAAAEsZmlGSQAAABAAAAE+cHRQVAAAABgAAAFOemhUVwAAAA4AAAFmamFKUAAA + AA4AAAF0bmxOTAAAABYAAAGCZGVERQAAABAAAAGYa29LUgAAAAwAAAGoZW5VUwAAABIAAAG0c3ZT + RQAAABAAAAHGZGFESwAAABwAAAHWemhDTgAAAAwAAAHyAEwAQwBEACAAYwBvAGwAbwByAGkAyQBj + AHIAYQBuACAA4AAgAGMAcgBpAHMAdABhAHUAeAAgAGwAaQBxAHUAaQBkAGUAcwAgAGMAbwB1AGwA + ZQB1AHIARgBhAHIAZwBlAC0ATABDAEQATABDAEQAIABjAG8AbABvAHIAVgDkAHIAaQAtAEwAQwBE + AEwAQwBEACAAYwBvAGwAbwByAGkAZABvX2mCcm2yZnaYb3k6VmgwqzDpMPwAIABMAEMARABLAGwA + ZQB1AHIAZQBuAC0ATABDAEQARgBhAHIAYgAtAEwAQwBEzuy37AAgAEwAQwBEAEMAbwBsAG8AcgAg + AEwAQwBEAEYA5AByAGcALQBMAEMARABMAEMARAAtAGYAYQByAHYAZQBzAGsA5gByAG1faYJyACAA + TABDAEQAAG1tb2QAAAAAAAAGEAAAnFYAAAAAv/h7gAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENv + cHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA= +item7.X-ABRELATEDNAMES:assistant +item7.X-ABLabel:_$!!$_ +item8.X-ABRELATEDNAMES;type=pref:spouse +item8.X-ABLabel:_$!!$_ +item9.X-ABRELATEDNAMES:father +item9.X-ABLabel:_$!!$_ +item10.X-ABRELATEDNAMES:Custom relation +item10.X-ABLabel:CustomRelLabel +X-ABUID:3D833EB4-BFFC-41F0-9193-96695487C45E\:ABPerson +END:VCARD diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/testdata/AAB4/SingleCompany.vcf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversit/testdata/AAB4/SingleCompany.vcf Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,32 @@ +BEGIN:VCARD +VERSION:3.0 +N:;;;; +FN:Apple Computer Inc. +ORG:Apple Computer Inc.; +TEL;type=MAIN;type=pref:1-800-MY-APPLE +item1.ADR;type=WORK;type=pref:;;1 Infinite Loop;Cupertino;CA;95014;United States +item1.X-ABADR:us +item2.URL;type=pref:http\://www.apple.com +item2.X-ABLabel:_$!!$_ +PHOTO;BASE64: + TU0AKgAAAyiAP+BQOCQWDQeEQmFQuGQ2HQ+IRGJROKRWLReMRmNRuOR2PR+QSGRSOPPyTOZ1OxjM + 1pLZfsVtuBxySaTWHvF5vVkNBqqlZrlTrFbqqfthvOKbUmlQN4PN6L1jMugrep1NZLtguR0uul12 + RvZ8PhhstoVWhWZbr5jsywPivW+PzFxqhZUCz3ehz9st+Z3C/Rp6vd8MFks60Whis1ovd8vm/4+L + ul2O5YrpgYehMBkM2mvTIZ+LOJzOm0ZVgM5qtmcvbQa1+696PZ76vXv2Eu14PJmNNsNNtN7JO7a0 + yncF2u9423Wx+TPx0ZNlNFqrthslar5iddiLxispmtRsc93Pl9PuB7Xyvt3vJ575vVBlrVesOrsF + ZLxgy5i2NoN1xnMxjHOWiLVmWaRrFcW5eroXDMKooS6FyV5cF8zRmmubpwG4cJyJWaT6wjB0HKIX + MLHUdx4QGhbcHk7hlREvEYQeW8GQZGUbxioTtHIdB1uHFTVl4YkXxzGccSNIsjyUvDCGdALlubAx + rSXJEqypK8ilyYRjq1HzXs+2seHWWBcl/LErSTNM0TWtBcGCYzjnjFR/vEY5nGnG01TPPc9KFCZf + NEdM5oGaBrm27U+TZPtFUYYhmGi9NBoEX61xJRNL0WtBWFsXijKRSSB0RTNR0ZTBbvqcrJVAgb61 + NV1SPkYZ1OPVaBNNV9S1JGRZl4YTxVqf9eGFXFiTVBJem8cZz2BIRlTzXNoWLGcIu+bFgTsacyTN + XVuWjWDsTjUBsG6cLqGTaV0LxBhkulJ8VRY3ZsRDbt02hEl4uU1zXnAcpz21euAQgur+Vmd7ltW+ + GA29ha0F0YZkTmaRsG5eeGXpi9GSlOb1nnYWFXrTZeYLUDUGzj+MRknZq0jSSnHrNxjZPi0qvrE8 + U2AgVknOVZaF1mUzp8XL3ZwgramgaxtZ/btHGjfOiIKtsLaVRhbmAYtw6ehacHrqVFwZhxkSlQpt + 2qtRmUtReYHOdZ26yiLAnwaOJvqVZal2+5g5VLrYnu9LauatrxXi7RWwVvF445t3FcXxnG8dx/Ic + jyXJ8pyvLIIgIAANAQAAAwAAAAEAMAAAAQEAAwAAAAEAMAAAAQIAAwAAAAMAAAPKAQMAAwAAAAEA + BQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARUAAwAAAAEAAwAAARYABAAAAAEAAADjARcABAAA + AAEAAAMgARoABQAAAAEAAAPQARsABQAAAAEAAAPYARwAAwAAAAEAAQAAASgAAwAAAAEAAgAAAAAA + AAAIAAgACAAK/IAAACcQAAr8gAAAJxA= +X-ABShowAs:COMPANY +X-ABUID:C5C50103-C86C-40BB-8864-909A089EB390\:ABPerson +END:VCARD diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/testdata/AAB4/SingleExtensive.vcf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversit/testdata/AAB4/SingleExtensive.vcf Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,3567 @@ +BEGIN:VCARD +VERSION:3.0 +N:Lastname;Firstname;;; +FN:Firstname Lastname +ORG:Company; +EMAIL;type=INTERNET;type=WORK;type=pref:work@email +item1.EMAIL;type=INTERNET:other email +item1.X-ABLabel:_$!!$_ +item2.EMAIL;type=INTERNET:custom@email +item2.X-ABLabel:custom email label +TEL;type=WORK;type=pref:work phone +TEL;type=WORK:work phone 2 +TEL;type=CELL:mobile phone +TEL;type=WORK;type=FAX:work fax +item3.TEL:other phone +item3.X-ABLabel:_$!!$_ +item4.TEL:custom phone +item4.X-ABLabel:custom label +item5.ADR;type=WORK;type=pref:;;Work Address;Work City;Work State;Work ZIP;Work Country +item5.X-ABADR:us +X-AIM;type=WORK;type=pref:workaim +X-JABBER;type=HOME;type=pref:Jabber +X-JABBER;type=WORK:workjabber +item6.X-MSN;type=pref:othermsn +item6.X-ABLabel:_$!!$_ +X-YAHOO;type=HOME;type=pref:homeyahoo +X-ICQ;type=WORK;type=pref:workicq +PHOTO;BASE64: + TU0AKgADAAhIMyBIMyBIMidELiNDKxc/KBVAKRY/KBVALBZGMRpIMx5KNSBKNylOOixPOSdIMiFD + LxhEMBlEKxlFLBo6LBY5KxU5JQ47Jw87KhU+LRdELh9IMiNNNSlQOSxVPi5ROytPOS1POS1PODFT + OzRKQDA9MyRHKRZJKxdJMyJOOCZKOCVFMiBAMyVAMyVAMydFOCtMQDVHPDFFNyU/MSA8LyFGOSpP + QC5WRzRQPzBJOSo8MiM4Lh8/LyFVRDReTEVlU0xnT0FkTT9hT0NjUUVhSTxdRjlJNSBDLxpHNy5T + QTlYQzJMNydUOSVVOiZRNyNOMyBKLBpIKhhDLxpFMRxGMRxFMBtOPihQQCpMOSZHNCJMNSJWPytW + QTNWQTNTPjFKNypMMiJNMyNTQTNcSjxiT0ZfTURYRS9MOSRUQC9bRzVbSjhNPStHOCY/MB9ENR5K + PCRYQThXQDdROy5POSxGOiVEOCNKOy1TQzRNPS9AMSREMCRHMydELyBJNCVDLxhFMRpJNyZEMSFF + MSRALSA5LB48LyFGOjhOQT9VSUBYTURTQzdNPTFJOylDNCM/Mx83Kxc6LyhEOTFRRj5XTERYRz5J + OTBBMSNMOyxOOi9OOi9KMy9MNDBENSxFNy1IODJMOzVMRTxTTENUSj5GPTFGNylGNylAOSo8NCZG + LytROjVQPjVTQDhNQDxOQT1OPixJOihFNC9JOTNJPz5KQD9YRUlfTFBcSUxFMzU9JBpGLCJINzdR + Pz9aRkhcSEpOOzlFMjBIOTpaSUpeTElcSUdROTRNNDBDLSJDLSJBLRpELxxOOChQOipTOzRWPjhW + RT9UQz1POjVNODNJMi5IMS1NPDdYR0FfSUFNODBBLy1RPjxWQ0NOOzs9JyE+KCJALCVBLSZIMiNH + MSI9Lhk/MBtOOSlVPy9YQThcRTtbQzdVPTFUOS1WOy9VPylRPCZMNSk+KR1FMCtQOzVPOy5MOCtR + OCVWPClcQTBUOilHOCRGNyNKNSRGMSBHMh1UPihPNCFGLBlKNSZPOipMMiREKx0/JhJAJxNEKhZH + LRhIMBxNNCBQOB9NNBxHNylKOixJNSlEMCRHMR5KNCFGMB0/Khc8KQ88KQ9GKBZKLBpGMB1BLBlF + LxxKNCFHOi1PQTRXRDJWQzFQQCxMPChWOzBYPTJTQTVKOi5HKhtKLR5NOidNOidJPCxFOChDNSZE + NydDLyJDLyJMPC5PPzFNNSlIMSU7MSE7MSFKOylURDFWPzNTPDBFLyNFLyM3MCVEPTFaTkZhVU1i + UEBkU0NfTkViUEdcUUNXTT5INSNALhxOOi1XQzVbRTRQOytYOzFcPjRYQTFTPCxQNCVNMSJKNChM + NSlFMCFDLh9OPS5XRjdNOSxJNSlJOiRTQyxWRjpRQTVPPy1KOylBLiFEMCNQPzlfTkdjU09eTkpX + QzRNOStMSDVVUT5bSUBQPzdIOig8Lh1GMiVVQDJdPzVaPDJROytUPS1KOitIOClIPzVMQzlIOSs9 + LiFKNChMNSlKNCFKNCFBLxtHNCBNPC5EMyZFMB89KRg+LyE9LiA7NS9AOzRRRj5aTkZRRzlKQDJD + PS43MSM9Kh4+Kx88LCZDMixRRUNVSEZMOjhDMS9HLSVQNS1UPTNTPDJQPDFJNSs9NCk/NytBNy9G + OzNEQztJSEBORTlFPDBBMSNBMSM7My47My5BMStGNS9MQDVQRTpVRj5TRDxMPjFFOCtGMiZGMiZF + MjJKODhNRUFPR0RJPjM+MylFLiVKMypNOzVXRT9cTE1XR0hFNTI8LSo9MzBPRUFWSUdUR0VNOS5H + MylEMCM/LB9BLRZMNx9UPi5VPy9VQzpTQDhROjNNNS9MMSdOMylNNTJONzNTQDteTEZVQDNFMSVF + Ny1TRDpTPjNHMyk9Jxs+KBxFKxhJLxxQMiFRMyJDMyVIOSpVQDNWQTRXQTpXQTpYQTFUPS1TPS1W + QDBVPTFQOS1KMydDLCBNNTFTOzdJOi5GNytOOixXQzRaRDNPOipQOylTPStOOChVPi5cRDdfRzpb + PCpPMSBQNyRUOidIMBo6Iw9DJg9FKBFGKhZOMRxPOSdROylNOSNOOiRHNylOPS9MNSZNNydONCRP + NSVMMxtMMxtFMRhFMRhMMCFMMCFKNSJJNCFJNCFKNSJNOS5VQDVWSDtTRThNRTJHPy1MPC5OPjBN + PjdGODBBLCBAKx9UPS1WPy9KQDBEOipGNyhHOClMMSlGLCRQOi5aQzdTOzRONzBFMCFELyBHMiNU + Pi5WRTdTQTNHLhxEKxlDLSJJMyhUSEBYTUVhVkdfVUZfT0BjU0RfUEZeT0VQPzFDMiVJPC1QQzNW + RTlWRTlVQz1aR0FdRT5YQDpUPS1TPCxMPCpNPStEMCZGMihTPDBeRztcRDdROi1HOCpWRjheTENc + SUBFOjE8MSlBLiFGMiVMQDVXTEBnTU1lTExhRTpWOzBQSTNaUzxTTEFIQThEMyU+LiBNNy1WPzVe + QDdYOzFcRjVbRTRUPzFPOy1NRDpKQThGNyVENCNTPDBUPTFQOyVOOSNPOCxTOy9TPTVNODBILCU/ + JB0/KxxDLh9BMyxBMyxTPTVXQTpPPzFRQTNIPzM4LyRDKR9FKyFELypPOjRWRUhUQ0ZMNy9FMClB + KyJPOC5VQzxUQTtNOzRBMCo/MiZAMyc9MTFFOTlMRD5ORkBOPjBHOCpALSBALSBGNCxEMipDMipE + MytQPjVWRDtaRTpRPTJJOixFNShBMSNBMSNBMChJOC9UPTxTPDtOOi1MOCtQOSxVPTBQPjxWREFW + QUZVQEVIOjI4KiM3JiRNOzlWTU5KQUNONy1MNCtIMx5FMBtMMiBYPitRQTVWRjpXRj1RQDhROjBO + Ny1QODFTOjNPODNXPztfT0BfT0BKPS4/MiRJNDBYQz5WPytKNCE5JxY8KhhGMhdPOx9UPSlVPipT + Oy9XPzNTQzdWRjpRQDRKOi5WOzBWOzBYQTVeRztUQz1MOzU+LyQ9LiNJMypMNSxMOy1OPS9URDhR + QTVPPTRINy5KOylMPCpTQDpcSUNkU0NUQzNKNSRDLh1PNyBPNyA/Lg4+LQ0+KA87JQ1BLBlIMh9K + NCFROydNNyVJMyJGNB5MOiNMMx9ONSFPOSdOOCZIOSNHOCJNNyNPOSVVPi5UPS1TPyxTPyxRPCpO + OSdJNC1WQDldTD1YRzlURDhOPjJFOytHPS1QOSxTOy5POCtPOCtPQC5QQS9VPjFNNypJOSpMOyxN + Ny1GMCdIMS5cREBYQDpTOzRNNydJMyRGMSJMNydUQzdWRTlVOi5XPDBNNyVGMB9JOTBaSD9qVlRq + VlRkVEdjU0ZhUUpfUElTQTxHNzFANS5MQDlWSUdYTElUSUhVSklcSkRcSkRcRzxUPzRROytTPCxK + NChNNypUQTleTENTQzdMPDBIQDFRSTpbTERaSkNRQTVENCk/MSA+MB9RPTBeSTxaT05dU1FcSURW + RD5USkBaUEZWRz9KPDRAMSBDMyJKNS5UPjddQzFeRDJdRjpcRTlXQzhRPTJOPjJNPTFMOy1RQDJT + PTVTPTVXQDRYQTVQPC9TPjFMQDhJPjVHMiM+KhtBLRhELxpFMB1JNCFJPC1QQzNMQzpPRj1QQTtH + OTJAKh5AKh5ALzFPPT9XRERPPDxFNSRDMyJFMRxNOSNYPDlXOzhROTRONTFHMylINCpAMixDNC5J + ODFQPjhTRDxHOTFAKBpFLB5GMCVFLyRELSdMNC5OPDVWRD1OQDNJPC9BOCc+NCRELyhFMClEMyhG + NSpKOi5PPjJROi5YQDReSDhYQzJTQzdTQzdYPz9VPDxGNys5Kh83JyJJOTNNRUFGPjtQOjBQOjBI + Mh9HMR5QOjBbRDpWREFYRkRYSDxURDhXQTxVPzpNOzlQPjxWRT9aSENcTj1YSjpNODNNODNOPDVO + PDVOOSdGMSBBKRdNMyFRPS9TPjBTPjNTPjNVOi9XPDFURTtPQDdFOCg/MiNONzNXPzxbTEVdTkdW + RDtJOC88LRw7LBtFLiNJMidQNS1cQDhUQzpOPTRHNzBEMy1ENDVJOjtaRkpiTlNaSTdMPCpIMyJB + LRxPPi9NPC1DNRY7LhA7Kgo8Kws/LBZALRZKNSJOOSVMMx1ELBZALBlNOCRNOChKNSZKNSJMNyNJ + OiRHOCJNOStPOy1QPC9RPTBOPTRNPDNPPjBNPC5KOixTQTNYRTNXRDJMPi9KPS5JOixMPC5NNSlQ + OSxOOCxTPDBMQTFKQDBQPzBHNyhGMiZJNSlKNCtGMCdHLzFXPkBaR0BUQTtPOihMNyVJNCFIMyBJ + OTJVRD1VQS5QPSpMNyNIMyBHMSZVPjJfTUpjUE5kT0FkT0FeU0lcUEdaPD1QMzRAMCNJOStUREBb + SkdVTENVTENdTUBcTD9XSTxVRzpOPS5PPi9IOCpMOy1PQz5dUExPQy9EOCVEPCtNRTNeU0laTkVT + PjBKNylBMSNDMiRMOyxXRjdYSk1cTlBaSENYR0FUSUZbUE1aRkpKODw+LiBAMCJHOCxPPzNVRDVb + STtcRD9bQz5UQzpPPjVMNSxKNCtQPjVUQTlRQTVURDhVRDVUQzRPPzNQQDRKPzdDOC9HMh88KBY/ + LBZBLhdJOCFNOyRGPC5JPzFFPjVNRj1ORzFJQy1JNSlDLyNBMi9MPDlTQDpNOzRHOCJHOCJMOCJP + OyVVPjRVPjRTOzFROjBKOCNBLxs8LSBAMSRHNS9NOzROPzVIOjBHMiFHMiFBLCBFLyNJMyhNNytP + OzBVQDVKQTVHPjJFOi9DOC1GNSpEMyhHMyZHMyZJOitRQTJbSD9iT0ZaSkRTRD1NPzBKPS5OPDNN + OzJEMCY9KiA+LCpINTNKOjFIOC9KMy9MNDBENCdENCdMNzJaRD9YRkZXRUVWRERUQUFUPjlPOjRN + PD9OPUBTQD5RPz1VRTdNPS9HMCRIMSVHOi1HOi1GNyNFNSJJLxhRNx9XQDNVPjFTOzdTOzdRPS9a + RTdWSDtKPTA/MRw5KxZQOjteR0hcUUNWTD1TQzdOPjJGMyM9KxtEKiJPNCxYRUVjT09YR0FAMCs4 + Khk3KRg5LypMQTxbST1bST1RQTVJOi5GMhc+KxFKNyxNOS5HMxo8KRE8KBA8KBA+KxZALRhJNR5N + OSFMNyFGMRw9LBZFMx1HMydFMSVNOStPOy1HNyhGNSdFNSpGNytJOS1KOi5EOS5ANStKOi5JOS1M + PTdMPTdKOitMOyxIOSpGNyhFNSpFNSpFNClMOy9MPC5OPjBNPzJOQDNIOyxFOClEMyhHNytNNytO + OCxIMjFPOThTRkRQREFPRTdKQDJJOStJOStMOzRQPzlPQTROQDNNOzJHNS1GNB5HNR9YRkBeTEZd + R0FdR0FiUUFhUEBeRDRONCZGLytKMy9MPztYTEdVSUBVSUBdTUleTkpYSUNVRj9NPTFOPjJDNSlK + PTBUQURjUFNYRkBNOzVHOTFRQztbU1FRSUhOPDVJODFJMyJMNSQ+LyFJOitaT0BbUEFbSUBaSD9d + TEVhT0hdRz9NODA8Lhs+MB1EOS5KPzRURTtaSkBcSEZbR0VQRTxGOzJBKydJMi5UQzdUQzdVRzpV + RzpQQDFTQzNVRDtXRj1KQTVDOi5JMRlAKRJALhJINRhQOydRPChKPDJJOzFIPTJMQDVNRTJMRDFK + OTBBMCg/MSpHOTFPOzBPOzBFNSBJOiRPOy1UPzFWRD5QPjlXPzlWPjhRPSVGMhs+LRc/LhhEMixJ + ODFKOjNKOjNFNShDMyZBMSREMyZDMyZHOCpMPi5PQTFRQDpKOjNKOjRHNzFFNy9DNC1ENCdGNylP + PjVaSD9bTk5bTk5JRTpDPjNDOC8/NCxGOSxDNSlALh5BLx9HNytHNytINzBKOTJHNS9HNS9ENS4/ + MSo3LSxNQ0FbSUBXRj1WRT9UQz1QOjBOOC5OPDdRPzpRQzxTRD1TQzdMPDBMNSpHMSZAMR5FNSJI + NB9TPihVPixeRzRiT0hYRj9VPTdUPDVTQzdXRztPQz4/My89KSRBLShTSEVdU09aR0FUQTxPPzxJ + OjdKNSQ/Kxo9Ky1VQURbSEZVQ0BIOCwyIxgvIBg6KiI8MjFPRURjSkdbQz9TPCxAKxw0Ig88KRVN + MSBTNyVPNRpKMRZFKhA/JQw/KBNGLhhJNB9NOCJHOCQ6KxgzJg83KRE+KRZGMB1HOCJGNyFGNylF + NShBMic+LyRHMylGMig8LR8+LyFDMiRHNyhNODNQOzdOOi1MOCtHMSBIMiE/LyQ+LiM+NCVBOChD + OypDOypMPCpKOylGMyE/LRtBMiFKOylKOylHOCZNOSxJNSlKOy9QQDRPRDlIPTJOOCtMNSlKOixN + PC5OOi1POy5OPTRIOC9NNSpJMidVMSxcODJVRDheTUBYUUVVTkFXSTlNPy9BOCc8MiJIPTJXTEBN + R0NIQz5TTUpTTUpcSEZPPDpTPTVXQTpQOzNMNy9QPjVbSD9YRj1NOzJIOjBYST9aUUxVTUdQQCxJ + OiZGOCBGOCA4LiE+NCdJPzxMQT5aR0FeTEZkVFNdTUxURzNFOSY/MBs4KRU9MCFIOytbR0VdSUdX + RERTPz9IOS1HOCxAKyJKNCtVRTlhUERaTDxVRzhTRTRWSDhbSj5bSj5URDVMPC5FMxs/LhZKNx9W + QSlbRjhdSDpRRzlGPC5NOzRRPzlQRT1OQztPOjRDLik9Lhk7LBdGMSJMNydINChRPTBWQDlVPzhU + QTtTQDpQPTtRPjxQOi5NNytFMBs+KhY4KRxAMSRGOC5HOS9BMiVAMSRAMSA+Lx45KhxGNyhJPC9K + PTBPOjJTPTVNPDVGNS9HNytAMCU+MClJOzNUSD9YTURWRT5KOjM7LCE+LyRAMR4/MB1INCdJNShO + PS9KOixENSxDNCtFNCxFNCxBMiFBMiFFNCk9LSI0Ly09ODVWRD5XRT9TQTtRQDpPOjJJNC1BLiJG + MiZPOjVRPDhMNzFMNzFFMiA7KRcxIxM+Lx5PODFcRD1lT0dhSkNaSTtHOCpEOCVNQC1MRjdRTDxN + RDo+NSw9LitGNzNRR0RRR0RRQztQQTpPQTRHOi1ELxY9KRFEMCZWQTdTQTtNPDVILx8/Jxc6JBk+ + KB1FLjNYQEZYTUFIPTJHMh88KBY9LBZRPyhRNyFQNSBWORlTNRZGLg9AKQtFLBRHLhZNLyBTNCVH + OSc9Lx40JQs5KQ89KBlELh8/MRw/MRxIOSVMPChGNSo7KyBALBtALBs6Kxg9LhtHMCRONypMNzJO + OTRRPTJRPTJINB9GMh08LyE+MSNBNSNHOyhGPCtHPSxOOypKOCdGMx8/LRlAMCJHNyhNOidOOyhK + OitHNyhGNylNPS9QOS9XPzVVPi5ROytVPipTPChPPCtTPy5PPzFMPC5IOClIOClILyFJMCJJPC9U + RjlfTkVhT0ZYTUFVST5DPy86Nyc+MyxOQztKRUBMRkFRSkFWT0ZVSERMPztHPDNQRTxRQDpIODFQ + QDRYSDxVPTdMNC5IOy5XSTxXU0hWUUdWQTdTPjNHOipIOys8MSk+Mys+Mi5MPztaR0dfTU1pUVNk + TU5VRzhGOSo+MBs3KRU+MiBPQy9cSUdVQ0BPQDlKPDRFNShENCdFLiNPOCxaTUpeUU9RSkFORz5O + QDNVRzpaTD5XSTxbRjtRPTJBOSNHPihRRDRXSTpWSUVXSkZQQzVOQDNNOzJQPjVRQDpPPjhPPClD + MB4/KxZIMx5GNSpFNClJNC9RPDdVSUBaTkVUQzxNPDVFOTRKPjpKPDRHOTE+LRc6KRRIMyJKNSRE + NS5BMyxIMyRFMCFBLRY9KRM5KhlGNyVMPC5MPC5OPDNOPDNJOi5BMidFMSVGMiZENztPQUZXSEBT + RDxJOiw7LB85Jxc9KxtELiNNNytQQzVQQzVOPTdNPDVHMydEMCREMCREMCRDLyNALSE9Kxs+LBw8 + LSI/MCVHOzdOQT1VQ0BPPTtFMytALydBMSZEMyhINzRHNTNENCdAMSQ9KxkyIRAyJR47LSZRPDhf + SUVbT0ZWSkFMPjE3Kh49MCRKPTBTQTVUQzdJOTA+LiZAMydBNChKPzhTRz9OQzpJPjVPPi9QPzBI + OSVAMR5ENSxQQThNPjdGODBEMhxBMBpAKiZAKiZMOjxXRUdRQTVENCk/MSA8Lh0/MiZMPjFUMyVa + OSpiQCZdPCJWQCZUPiRPNB1KMBlPLR5cOSlTPS1FMCFAKRJAKRI8KBRELxpFMh5FMh5NPStOPixA + NCI0KRc9JhE+JxJAKBZAKBZGKx5MMCNMNSpUPTFOPS5HNyg7Lxk1KhU6Jxs8KR1DMyVJOitDPCdI + QSxKOyxIOSpGMCQ9KBxDLyJGMiVJOSpNPC1IPjBDOStGNSdFNCZMNzFTPThUPzJVQDNVRDRQPzBV + PixVPixOPi9KOyxJOiRIOSNFOSZANCI8MiVIPjBbSEFhTkdWSkFUSD9HPjREOzE9OS5FQDVORTtQ + Rz1VRUFaSUZWRT5PPjhOPjJQQDRQPzFQPzFKQzFUTDpbPjlMMCtAOCxMQzdQT0lTUUxYPzxWPTpN + NzVQOjlNODNELys7LSRJOzFeRUlkSk9eSk9aRkpKRUA9ODM9MCQ4Kx9ENyhQQzNXTkRQRz1GPCxD + OSlGNCxEMipFLyRTPDBYTkpcUU5UR0NQRD9QPjlXRT9cSUNYRj9URTtOPzVFOi9MQDVXR0ZdTUxb + TkxXSkhMPTNHOS9KOjNKOjNOPTFIOCxALh4+LBxFMSRNOStIOCxBMSZGMSpQOzNQSkRbVU5NRDtB + OTBGNTBFNC9GNS9FNC48MB44LBpGOSpGOSo7Mio3LiY8LRw8LRw8KhY9Kxc9LR9IOClQPC5RPS9O + PDNKOTBENydBNCVDLSRHMShBNzpKP0NUSTtMQTM/OCc1Lh44KRs6Kx0/LylJOTJRPzlOPDVINChD + LyNBKx9ELSFDMB4+LBo/KR4/KR45KhY6KxZBLR5FMCFJPjNRRjtVQT9KODVELSpAKic8Myg8MyhB + Myo9LyY9MCI6LR81IxYzIRU1JiBAMCpPPDxaRkZWTDtJPy9GMCU6JRo6LCZJOzRUPTNTPDJKMydH + MCRIMyROOSlTQTVTQTVRPS9QPC5GOSFGOSE9LiA3KBo+MSVNPzJNPixDNCM9KRM7JxE7JCBGLipR + PDdPOjRPOS1GMCU4KBs5KRw/Li5NOztHLh5WPCthRTBlSTRjTDlbRDFPOyVBLhlKMh5ROSRWOS9W + OS9MMiBFLBpEMRZFMhdFNSBJOiROPzlNPjhNNyVFLx5DKxdELBhBLBk/KhdFMCFNOChMOShNOilO + PixIOSc+LBg8KhY7IxI8JBM3JRJDMBxIMyJOOSdbQC9VOypMMiBBKRdBLCBDLSFJNDBOOTRJQCxA + OCRFMiA+LBpBMSRKOixQPDFXQzhUQTxVQz1dRz9cRj5WRjFTQy5OOypINSVIOSNENB89MCQ8LyNH + Oj5URkpQST9TTEFURTtJOzFENClKOy9QPzlUQzxXREFbR0VURDhPPzNNOSxPOy5UPS1TPCxKQDJR + RzlVPTdQOTJJODJTQDtRTkpQTUlVRD5OPThPOTpPOTpMOTdDMC43LSA6MCNNP0FcTlBdSkhXRUNJ + PTk9MS07MSI1LB0+Mi5JPTlWRTlTQTVKOixGNShKNTFHMi5GMSxXQTxbSURfTkhRQzxOPzlNOzRT + QDpXPzxdRUFYRkRUQT9KOjRQPzpYTEleUU9cSkVXRkBIOCk/LyFJLydOMytNNy1IMilALSFFMSVN + NTJPODRKOjRAMCtFLipMNDBVSU1dUVVTQTxHNzFMMCtEKSRAKyI/KiE4MB8/OCZPQTJIOyw8LSAz + JRg3Khs3Khs4Khk5Kxo7KB5INCpQOTVXPzxKOjFJOTBHOitAMyU9LShAMCtMOjhXRUNeTElNOzlA + Lh49Kxs9Kh0/LB9MNC5QOTJMNzFGMSxELx5ALBtALBtIMyJGMCE+KRo7JRk7JRk7JhY+KRhMNyVP + OihRQTNVRTdTQDtHNTA8LyE3Khw8Jxs8Jxs7KhM4JxA7KBI7KBI4JA07Jw83KRY+MB1HNS9TQDpU + QT9INzRIKiBAIxlBMSRNPC5VOi9PNCpELyA+Khs/LCJKNyxOPDNNOzJNOStGMiVEMhpBMBg/LR0+ + LBxBMiFGNyVMMx1IMBpFKRZDJxVFLyBMNSZOPS5KOitJMS1BKiY4JRk9Kh5EMCRHMydGLhZTOiFh + STRnTzpnSkFeQzpNNyo/Kh5ALxdEMhpVOypcQTBWOS5ILCJKNx9JNR5NNydQOipNPDVPPjhNMidG + LCFHLB1GKxxAKRZFLRlFKyBNMidMNydTPS1UOyJQOB9GMSA+Khk9JQw5IQk7IAs+Iw5FMRpNOSFe + QTFdQDBRQyY/MRY4Jg06KA8+LyxBMi9FNyU/MSBELxw+KhdBKxJGLxZIOClQPzBPPjJRQDRXRT9X + RT9WRz1VRjxTQTNJOStGOCZBMyJALSA6Jxo+MytMQDhQST9VTkRYQztMNy9BMSlHNy5NOjpUQEBU + QTtUQTtaQzdUPTFJOC9NOzJUPzJRPTBOPy1TRDFRPi1QPSxNOzVTQDtaTU1TRkZNQD5BNTNJMS1I + MCxBMic7LCE5MBs/NyFTRz9VSUFcRURTPDtGNSo+LiM7LCE9LiM/MiZFOCtMOShMOShJNCVOOSlM + Oy9FNClDLilVPzpTRUxURk1JPT1DNzdENSRDNCNHNTNRPz1TQTtRQDpJOzRJOzRQPT9cSEpVSEhR + RUVGMh1EMBtMMCFQNCVINSM+LBo+KRhFLx5ROy9VPjJNPTFENCk9LCdJODJVR05YSlFWQDlHMitJ + LB8/IxYzHw84IxM3LiVGPTNUPzROOi8+KRg1IRE6JRk9KBw6LBc4KhY8JiBGLylTOjdWPTpQOS1O + NytKNClGMCVELyhELyhUOz1iSEpaSENGNTBDLhY8KBA/KBVIMBxTOShROCdMMiBJMB5MMx1MMx1K + NSZPOipKNClELiM8KRw5Jhk5KxhIOiZWRTVUQzNVPTdVPTdMOzJEMys8KhYzIg8+JhU+JhVDKA8/ + JQxFKQpBJgdBKhVDKxZBLBlOOCRNODBVPzhKOTlGNDQ+Khs+KhtKMR9QNyRQOTJJMixBLCM6JRw9 + KBxIMiZGNSdGNSdHMydINChDNyQ+MiA/LRs+LBpHMCVHMCVGLyNGLyNBJxhFKhtDLSRGMCdJNC9M + NzFHMCVGLyQ6JBk7JRo8Kho/LR0+KhlOOSdYRzhfTj5lTUldRUFOOCxBLCE7LhY/MhlUPTBcRThW + PzVOOC5TNyVVOSdXOi9UNyxQPC9RPTBJNCVALB1KLR5KLR5DKxRAKRJAKh9HMCVQNyRXPSpcQSdW + PCJJOiRENB9EKxFAKA8+KxE1Iwo8JxtROy5bRDdfSDtbTDlHOSc7Kw83Jws9Lh0+Lx5FMiJGMyND + LhY9KRE8JQ8/KBFFNyVKPCpMNyNOOSVPOzBUPzRTRz9TRz9UQzRQPzFKOylENCNFLiJAKh5DMyJN + PStVRj9aSkRVQ0BKOTdDMiRDMiRHMydMOCtOOi9UPzRXQDdXQDdIOCxGNSpNOS5QPDFQQC5URDFR + QDJRQDJOPj9OPj9USkxRSElORTlDOi5DLR5NNydENx85LBY1LB8/NShWRERVQ0NYQz5QOzc/MB87 + LBs9KxlALhw8LyA9MCFIMyRMNydINSVNOilOOyZGMx9DOC1JPjNOQEVTRUlNPTFFNSo9MRtANB5H + OCpPPzFPQTJNPzBMPTdJOzRKPDVTRD1RRUNRRUNHMylKNyxPOCxMNClENyg7LiA6Kxg+LxxHOCxM + PDBHOS9DNCs/MStMPTdaSExbSU1YRDVNOStHLxs7JBEyIxY4KBo7MzBKQz9QPzNFNCk7IRE8IhJF + KBdJLBtGLhZELBVELh1IMiFQNS1UOTBQOjBMNSxONy1NNSxHMylMOC1XRERdSUlUPzJFMSU+Kw89 + Kg9FMSVUPzJYRDlWQTdUPSlUPSlPOSdQOihQOzNRPDRKMiw9JiA5JxY8KhhFPDBRSDxcSj5VRDhR + Oi5POCxFNyNBMyA8Khg5JxZBKhNBKhNJLxpMMRxJNRhDLxNGLR9ILyFNOCRWQCxYQTRXQDNNOzVI + NzFDLhdELxhOOSdRPCpMOShHNCRELx46JhY8JxhDLR5FNCdHNylMOCtNOSxIOiZENSJBLRw8KBc+ + KRZAKxg+KRpGMCFDKxdELBg/KiFHMShVOi9XPDFQNyZKMSE/Khs6JRY4JRhDLyI6JRNHMR5RPS9e + STthSkVbRT9POiZHMh8/LRNBLxVOOi1YRDdYQDNROi1PMyZRNShWOjRUODJQPSxQPSxOOyZHNCBH + LxlKMhxGMRxBLRg+KxFDLxVHMR5WPytcRjVXQTFGPi1KQzFMOCBFMRpEMBY6Jw47KRdRPitfSD5n + T0VlTkRXQDdFMxk4Jw88Iw9AJxNIMBxNNCBHMBVBKxA9JQ5AKBBDLhtIMyBHMSVKNChHNS9KOTJR + PzlOPDVUPzJTPjFRPS9OOixPNClGLCFELyhPOjJXR0hYSElRRUVMPz9ANydANydEMyVHNyhROy9a + QzdaQzlXQDdPOy5JNSlNNypQOi1RQTJWRjdbRT1YQztRQDtOPThORkBTSkVYSDlNPS5JLxhPNB1K + Nx1INBs7Mh87Mh9TQTlRQDhTPChPOSVMMx9IMBxALBk+Khc9Lhk/MBtPOSdUPStPQC5TRDFWQDlP + OjJIOSpGNyhQPj5VQ0NUOzdONTFBMSNBMSNKNTFUPjpTQTlPPjVOPTdIODFDOTNHPThOQDNPQTRJ + OzNNPjdRPDRNODBBMiE9Lh04KRs6Kx09LiFHOCpGOSpHOitJODJRPzpWRT5VRD1XQzVTPjFKNCND + LRw/Khc9KBY+NzNKQz9QQDRBMic/Iw1EJxBJLRZVOCBROB5KMRhFLRlMMx9POCtUPC9QQDRMPDBI + OjJFNy9HOitJPC1QRz5RSD9OPTRAMCg7KhVINyBWRTlaSDxXRj1VRDtUPzFPOy1IOyxOQDFPPThP + PThKMy1AKiQ6JxFEMBlTST9aUEZcSj5UQzdMNydJNCVNNyNKNCE/KxxELyBNNB5MMx1POSdTPCpR + OClNMyVIMyJKNSRUPzJbRjlYQztUPjdMOjFKOTBMMx1UOyRbQC1aPyxQOjBIMilDMCA9Kxs+KR5B + LCFHMSBNNyVTPCpROylPOiZNOCRIMBxBKhY4KRU6KxZELBhTOiVQPSpINSNHMiFQOylYPCxaPS1Q + OipFLyA6JRM3IhA8IxhMMSZBKBRJLxpWQDBfSTliTT5dSDpVPipOOCRJMBdDKhJNNC5YPzlcRThX + QDNXPSxQNyZVOC5VOC5NPC5PPjBRQStNPSdMNx9NOCBOOCRPOSVHMhtDLhdGMSpUPjdbQzxYQDpU + PTNVPjRTPy5KOCdNNRtJMhhKMhxVPCVeTEVjUElfTUdaR0FNPSlAMR4/JQ5AJg9IMRdTOyBJNRpD + LxVBKBJEKhRFLB5MMiREMCNEMCNHMSZMNSpPODFPODFTQTVVRDhYQS1WPytROytFLyBFMSdPOzBX + QD9YQUBWQ0VPPD5FNCdEMyZGNyVKOylOPzVURTtXRj9YR0BWRjhIOStENSJJOydRQDRaSDxhTD5c + RzpWRz1MPTNQPzdcSkFeSTxYRDdUOilUOilQOydNOCRPPCtINSVRQTNNPS9QOipTPCxXPSxUOilN + MyFILx1HMh1IMx5TPyxTPyxWSkFWSkFWQDlPOjJENSRHOSdUPzRXQzhPPzFIOStBMidAMSZNNTFY + QDxUQzpQPzdOPTFMOy9GNS1KOjFKQzNKQzNWQTdXQzhRQDROPTFMNSJFLxxBLBk8JxU/LCBHMydH + NylKOixOOC5ROzFRRDRPQTJOPjJPPzNMOCJJNSBMMx9HLxtJOTJOPTdNPS5DMyU+LAxHNBNPPylX + RzBUPipOOSVMMiJKMSFOOixUPzFXQTpRPDRMOjNHNS9IOjJNPjdOREBOREBOPjBBMiU8MyBGPSlW + Rz9WRz9VRj5OPzhQQDFPPzBUPTNVPjRVPTdTOzRMLh9GKRo1LRhIPylYUUdTTEFWPzNTPDBPOSdU + PStUPC9QOSxMMR5NMh9OOx9PPCBRPTBRPTBJNSlGMiZNNytOOCxUPjlcRkBXPzlTOzRKNyxMOC1O + OixaRTddRTldRTlYPDdMMCtALRg8KRU8JhpGLyNNNypUPTBaQzJaQzJWQzFRPi1HMBZBKxI4KRw1 + JxpGNyhXRzhXQTFQOytXQC5aQzBdQzFVOypHMCRDLCA9JBI6IQ9FKyFQNStOMBhYOiFcRDdhSDtd + TDxVRDRRPi1NOilKNSJGMR5JLCpOMC5POjRTPThXQDBQOipQOihROylNPDBPPjJUQzNUQzNQPSpQ + PSpTPjFTPjFNPSdFNSBMNCtTOzFWRD1WRD1UPTFVPjJPQDdOPzVRPitTPyxRPitVQS5fUUReUENj + TUdeSENJPjNFOi9DLhdBLRZTPihYRC1RPitMOSZIMBhHLxdFLyNIMiY/MCI+LyE/MCJDMyVFOjFH + PDNWRTleTUBdTTVURC1RPilGMx9GMiZOOi1QPzlRQDpRPzlTQDpHOipENydIOiZPQCxYQDRfRzth + SUhjTEpVSERKPjpIOSpKOyxQRjhXTT5dT0FXSTxUQzpMOzJTPDJhST9hTkdaR0BUQTlTQDhUQzNR + QDFPPTdJODFOPTRQPzdQQDFVRTVdTThWRjFaQzBMNSRJMCBONCRORDNORDNPSkBNSD5PQy9IPClA + MSNRQTJaRTpYRDlRRzlKQDJJNStINCpPOjRbRT9URjVRRDNOQDFMPi9GNShHNylKQTVORTlbST1a + SDxRQzBNPixHNyhEMyVFKRVFKRVAKxhPOSVROylPOSdQOytOOSlMPCpQQC5WQTRXQzVPPSZPPSZM + PChGNyNKNCtPOS9MOCtKNypINSFWQy1aT0BYTj9WPzJROy5ONypQOSxPPzFURDVURjdPQTJIOjJF + Ny9INzFINzFQPTtTPz1OPipOPipTRDFYSTdTRzxPRDlUQzpTQTlYRDdXQzVaQzlXQDdWRDtUQTlA + Lxk5KBNHPDFYTUFcUEdVSUBRQS9NPStTQzdVRTlWQDlRPDRQOipPOSlQPidQPidOPS9IOCpKMydM + NChONy1POC5WQDxcRkFUPzRNOS5JNzROOzlOOztUQEBWRD1WRD1TPjFBLiJBLRhALBdBLx9KOCdU + PjdbRT1cSj5YRztVQDNNOSw/LBQ4JQ4yJhc5LB1NRjpVTkFRQDRNPDBYQTVYQTVTPjFDLyM9KRY/ + Kxg5Jg86Jw9DLyVOOi9PMyJXOylbRjleSTxaRDxOOTFHMydGMiZHMSVELiJAKh48JhpBKiZTOjVU + QC9VQTBOPixMPCpKNypNOSxOPjBPPzFOPjBPPzFNRDpKQThNPStOPixPOyVUPylVQzpVQzpRPzdQ + PjVPQDpPQDpQQTpOPzhIQC9ORjRcSUNkUUpdUExYTEdORjRHPy5FPCRBOSFPPzFXRzlVRTdRQTNU + PStROylNOilGMyNDMCA+LBw/MB1JOiZRPTBUPzJeTUdhT0leVEVdU0RXSDNNPipEOixEOixRPDRV + PzhVQDVRPTJFOCtGOSxKPTBWSDtfSD5jTEFdSkpdSkpTRkZGOjpGNS1QPzdbTEReT0dYUUdQST9K + QThJQDdOPzlRQzxhTkdbSEFbRT9hSkVYTj9RRzlWQ0NKODhDMiVQPzFNSD5UT0VaTkVWSkFUQzM+ + LiBELSFONypQRjhWTD1YRj9XRT5IPytAOCRHNS1VQzpYRkBWRD5RR0RJPzxIPTJFOi9JPjdcUEhc + SkFRQDhIPzNIPzNIOSpGNyhGOzJQRTxcSkVYR0FQQThMPTNHNylJOStGLBZEKhREMBdQPCJXQTFU + Pi5TPy5UQC9NPC5HNylKOTBPPTRUPzRVQDVOPTdFNC5HNzBKOjNNOzJNOzJQPzlfTkdfUEhbTERW + RTVQPzBTPjNXQzhYRDdeSTxUSTtUSTtKOjNFNC5IMS1IMS1JPjVQRTxTQzRbSjxiTkxjT01UQzxM + OzRPRDxUSEBXTERTRz9RPzlRPzlWRkNOPjtJMidHMCVXRUdeTE5YSUNURT5QQDJPPzFURjlURjlU + RT5NPjhPOjRMNzFPOzBOOi9QOi1JMydOOCRROydPOSxPOSxTPDtQOjlJODJFMy5HNDRJNzdMNTdV + Pj9aQ0FWPz5TOC1NMihPMSBQMiFNOStRPS9bRENbRENQQDJJOixFMSVDLyNAKRI7JA4/LyJNPC5V + Rj9TRD1ROi5POCxXPzJTOy5JKxZBJA9AJxFBKBI+JQ9ILhdTPS1UPi5KOylTQzBVRDtVRDtTPjBE + MCNBLCBBLCA+Khk/Kxo+KA89Jw9ALB1IMyRJQTJMRDROPTdIODFENCFGNyNJNCVIMyRHNylNPC5J + PjNHPDFOOixRPS9KPCpNPixTQzRURDVQPzBMOyxJOzNMPTVQPzlRQDpHPjJHPjJWSkNcUEhYVElP + SkBKQDBGPCxFPCZFPCZNQzRTSDpRRzVMQTBXQSlTPSVMOyxFNCZHMh1MNyFIOSNRQStVRDhUQzdb + TEVcTUZaUEdYT0ZUSTtRRzlMPChNPSlJOTBPPjVOPi9KOyxEOipEOipMQDhUSD9bSEZWREFXRT9W + RD5UPzJKNyo/MiRTRTVeU0paTkZUSEBQRT1OPzVOPzVGPDdJPzpXR0ZWRkVbSEFeTEVaTkZUSEBX + SEFFNzA4Lh9HPS1USEBbT0deSkpYRUVUPDA8JhtFKhtVOSlaQ0FaQ0FXQzhQPDFIOStJOixIODFW + RT5YRUNVQT9WRkdTQ0RKQDtIPjlGPj1VTUxcTD1PPzFNPjRKPDJHOCpFNShGOzBQRTpaSUhVRURM + PjFIOy5JOSpJOSpIMBxHLxtINSVVQTBWRTlXRjpUQTtUQTtMQTNFOy1JPC1MPi9QQDRRQTVOPTRJ + OTBEOipEOipQPjhTQDpURENaSUhbSkdVRUFQPzNOPTFVPTFYQDRbRjleSTxaSEFXRj9NPTFDMyhF + NClJOS1JPjdMQDlVRD5hT0lpT09eRUVNOzROPDVVR0laTE5VSUFQRT1PPjVVRDtWRT5NPDVJNDBM + NzJYQztXQTpRPzdTQDhRPDdRPDdVQDJVQDJTQDpKOTJNNTJMNDFKNylKNylNOCZNOCZPOSdOOCZP + OCxPOCxTOy5ONypKNCtNNy1HNS9HNS9EMCNPOy1PPTdNOzRTOCxTOCxbPCphQS9YRDlRPTJTQTxT + QTxNOidBLx1FKxZILhlGLxRKMxdTPDBXQDRWPjpTOzdONCRPNSVPOCtKMydILRNFKhBBKRdGLRtF + MCFOOSlXQzVdSDtINChTPjFXQS9YQzBRPSdEMBs5JhA6JxFBLBlDLRpELBhDKxdBLCBIMiZIPDhQ + RD9TPThIMy4+LxxFNSJJMyJIMiFDLSFELiJJNStMOC1NOChPOipKPChJOydRQDhRQDhNOzJGNCxB + MSZFNClRPi1RPi1NOS5KNyxQRT1YTUVbUEpPRT9GPSlDOiZGNSdHNyhNOzVTQDtTQDhTQDhWQy9R + PitMPDBKOy9MOCtUPzJRPzdXRTxTQ0RRQUNVSEZaTUpaTkVWSkFVRjxWRz1QPzBJOSpEOipHPS1H + PjRDOjBGNyhDMyVPPz5aSUhaRkhTP0FRPjxRPjxPOSVIMh9EMi1XRT9XTlFWTVBQQTtOPzlHPDFJ + PjNGOzBFOi9TRkRRRUNaSkRXSEFWSkFXTENUSkFFPDM1MyZAPjBaRk1hTVRiSUZaQT5OOC4+KSBB + LiRYRDlbRENaQ0FUQTtOPDVQOSxTOy5JPjVTRz5VQT9RPjxPPT9QPkBHPzxGPjtKQD9VSklbSEFR + PzlTQTNRQDJGPTFBOS1KPjpVSERcSkRVRD1PPzFPPzFOPS9JOStGMB1IMh9NOSxbRjlXTENVSUBU + RENWRkVOPjtIOTVFOTdJPTtTQTlUQzpQPzNMOy9DOC1ANStNPT5UREVTRkZVSEhYRkRUQT9QPzBO + PS5UOzdWPTlWQDxdR0NbSEZWREFOPDdHNTBGNS1JOTBJODJQPjlaRk1hTVRiSklTPDtKOTdOPDpW + SEpYSk1VRj9TRD1WQDlaRDxTQTNOPS9MOy9OPTFVPixUPStUOS1TOCxVOjFaPjVWPy1VPixNPC5H + NylFMiJGMyNJOixKOy1OPy1QQS9QQC5OPixNNSxPOC5WPShVPCdTPC9ROy5FNCdEMyY/LB9JNShN + PDBOPTFVPTFWPjJjQDdjQDdVPTNPOC5RQDFPPi9ONR1NNBxPNyBYPyhRPCxVPy9UPTBQOi1QNSpQ + NSpaPS1aPS1TPCxMNSZPNyBPNyBNOidOOyhNPC5PPjBaQzlfSD5GMSBPOihaQCtcQy1YPyhTOiM+ + LRQ5KA9FLRlMMx9JNB9IMx5EKx1KMSNPOjJaRDxTPjNFMSdEMR9INSNNNSpIMSY9LCQ/LiZIMSVN + NSlKOCVKOCVFOSZIPClOPzVNPjRJOyM/MRo7KBI4JQ9ALB1FMCFJMyJHMSBFPztTTUhYTEdPQz5K + PitANCJELx5GMSBPOy5VQDNVPy9YQzJVQDVOOi9NNy1NNy1ROjVWPjpTQD5UQT9PQ0NPQ0NRQDtU + Qz1XRjpaSDxWRjhVRTdTQzdKOy9FNyVFNyVEOzI/Ny5BMyJAMiFKOzpaSUhaQT1ONzJJOi5KOy9J + NyZHNCRELyhUPjdbTU9bTU9NRDtHPjVANS1EOTA/Ny5EOzJXPj5VPDxUQTtTQDpVRD5bSUReTElR + Pz1BNy5EOTBYQUBiSklcRkFUPjpMMCNGKx5JOS1WRTlQRD9OQT1OPTFNPDBNNS9QOTJUPjlWQDtT + PTVRPDRMNTdPOTpHPjRKQThNQDxUR0NaRkZaRkZaST1YSDxERjo7PTFJPTlPQz5eRz1YQThWQTNV + QDJRPS9QPC5KNSJOOSVPQTRYSj1VUEZTTkRWRkdWRkdOPThGNTBIODJTQTxYSDxTQzdOOypJNyZE + Myg9LSJGNzNQQD1XRTxWRDtbRTJYQzBXQzVTPjFNNytNNytTPDtcRURcSUxXRUdNOzJHNS1JNShJ + NShMMzNcQ0NiUFZfTlRRPDhHMi5JPTlUR0NYRkZWRERYRDlaRTpdRz9fSUFXQDdQOjBROy5TPC9W + PjFVPTBdQzNbQDFiQDFhPzBbQDFYPi9VQDNNOSw+LRY9LBVROydWPytYRDVWQTNUQzNPPi9ROi5Y + QDRdRTlbQzdUPTNOOC5FNSRBMiFAKBpGLR9QNStTOC1WPjRaQThlRUddPT9MNzJNODNROy9POS1R + PCxdRzdfTj5hTz9dRjlVPjFRPi1TPy5UQC9WQzFiSERdRD9bQzVTOy5UPixWQC5bRTRaRDNRQTVX + RztdR0FWQDtDLhZPOiBbQC9eRDJcQCxYPSlJNCM/KxpBLRhPOiRNPC1GNSdGMx9GMx9VPjFcRThR + QDFFNCZHNR9OPCVPOCtIMSVBLR5DLh9EMCNKNylOOyhRPitMRDRGPi9KQz1MRD5NPiZDNB0+Jg09 + JQw5KBM9LBZELx5DLh1HPDRRRj5XSEBVRj5QPzNFNClDLhtIMyBOOypUQC9TPyxRPitTPDBKNClG + MihKNyxOPDpRPz1VQT9QPTtMPDBOPjJHPDRFOjJPPTtPPTtaRTpbRjtURDFQQC5GOSpFOClBMyxA + Mis8MiM7MSJQPj5aR0dWQTRMOCtIOSdKOylJOi5HOCw+MSNQQzNRTEdTTUhWRTxPPjVGOC5AMilB + OS9EOzFROjNQOTJPPTRPPTRYQDpaQTtRR0RKQD1BOzI+OC9OPzlXSEFRRDdKPTBJNyRINSNTQDhY + Rj1TRz9NQTpHPDNGOzJIMy9MNzJPPTdVQzxUSThNQzFGODBFNy9JOTBKOjFNPDdVRD5aRkZhTU1X + TUdWTEZGQz0/PDdHPDRNQTpWRjpURDhXRjpWRTlPQTJHOitKNypWQTRbTERbTERWUE5RTElTRkFT + RkFKQTlAOC9KOjRXRkBdTD9WRTlMPC1JOitGLyNDLCBJNyZTPy5URDhXRztiTT5fSjxeRjlXPzJI + OCpKOixNPDdUQz1cTEhVRUFKOTBEMipJNSlKNypWOTpiREVlUVFdSUlHNTBEMi1NPT5YSElcSkFW + RTxbST1eTUBjTUdeSENYQThQOjBUPi5XQTFbRT1dRz9jSj5jSj5dTD9XRjpdRD9dRD9YRDlQPDE9 + Kxs6KBhPOihYQzBYRzhVRDRURTJRQzBTPjNeST5iT0ZdSkFOQDNDNSlGMSBALBs8JBY8JBZELSJN + NSpXQTpeSEBhSERVPTlFNCdGNShKPDVPQDpXRj1fTkVlU01eTEZUPzRMOC1WQTNdSDpXTT5YTj9j + UEldSkRXQDdWPzVOPi9VRTVhST9YQThHMydVQDNYQTVQOi5BKhNONR1cRi9eSDFYRTFTPyxKNyFH + Mx5FMBlPOiJMPi9JPC1GOSpFOClQQDRYSDxURTBGOCRHNCBNOiVNOidINSM+LBhDMBxELx5HMiFQ + OihYQS9URDRPPzBQRz5WTURNRC9BOSVAJxE/JhA8Jg4+KA8/Kxg9KRY+NC9MQTxWRz9VRj5QPC5H + MyZALhpGMx9JOStPPjBOPS5MOyxQOi5KNClDLh1NOCZMOy9OPTFUQzdPPjJJOStJOStIMjFIMjFJ + ODFOPDVVQzpXRTxYSDVURDFHPS9EOixJNSlHMydFNClFNClMPztQRD9VQDJOOixKOitPPi9OPixN + PStENyhNPzBHRztOTkFaSkNTRDxKOjFAMChKNypOOi1JOS1NPDBPPzNNPTFTQTVVRDhOQDNNPzJH + PjRBOS9HPjVRSD9NQzFJPy5MOyxQPzBTQTtaSEFVRD1OPTdMQTFHPS1GMCVMNSpEPDlQSEVbUUdP + RjxGOSxBNChDNzJGOjVHPDRRRj5cUEdhVUxaTUpUR0VNPDNIOC9FPjVHQDhVSUFUSEBURT1TRDxV + PzpQOzVGPjtQSEVVTkVXUEdaT05YTk1bRjtVQDVPPjVBMSlPPTdbSEFkTEdaQT1RPzdQPjVJMiZH + MCROOi1WQTRXRkBbSURhUUpeT0haSkNRQztNOStOOixQPzlXRj9cT01RRUNDNC5FNzBDOC9FOjFQ + PkBVQ0VaTUpNQD5FNC5JOTJMQTxQRkBXSTxWSDtWTUNdVElfTE5XREZJPjdIPTVUQzdaSDxbSj5c + TD9dSkFeTENXRzlTQzRiREdoSU1aRkRKODU6Kx04KRtJPC9TRThcSjxYRzlTQzNURDRcRkBeSENf + SURfSURRRDRGOSpONCZGLR87JxM5JRFBLCNMNSxXRj1bSUBbRjtQPDE9NCE5MB09OipHRDNXRUNe + TElfR0RROjdJOS1JOS1WREFeTElfTUpeTEleTENaRz5RPTJRPTJNQTpWSkNYRj1PPTRHMSVNNypJ + OStIOCpAKRJONR1eQTFoSjpeSDVXQS9VPylRPCZKNx9RPSVQQDROPjJGOSpGOSpKPTBVRzpVRi9I + OiRFNx9GOCBMNyFGMRxBLBtAKxpELxxHMh9UOTBdQTlPRjpORTlORTlWTUBWTDtNQzJQMiNHKhs+ + KxVALRZGLR1GLR0/LyRMOy9TQzdXRztVQSxKOCNMOShNOilVQDVVQDVbPzdWOzJQPC9POy5IMh9D + LRpGMiVPOy1OQDFIOyxGNS0+LiY8MiU8MiVHOSNOPylVRDhcSj5jSkBiST9PQDdJOzFKOixFNCdI + MilMNSxIPDpOQT9UQC9OOypKOy1PPzFQOi5POS1IOClOPS5NSDtNSDtXRUVVQ0NKPzRBNyxHNytN + PDBKOixKOixRQDJRQDJXRzhYSDlVQDNVQDNNQC1GOidIOS1TQzdXRjdVRDRUQTlUQTlUQzxcSkRU + RjlRRDdPRTRNQzJJOStMOy1JRD9TTUhWUElMRj9OOixKNyk3MSM4MiRHPThTSENcU0hcU0hcUEdT + Rz5JPjNBNyw/Ny1GPTNMREBTSkdWTUBQRztUQzpNPDNJPENWSE9aUEZVTEFaTU1eUVFdSkFMOjFE + NClDMyhPQDpeT0hqUFBcQ0NVPztbRUBQPzBGNSdJOTNPPjlPRUFYTkphUUpeT0hUTEZIQDtKOTBM + OjFUQUFXRUVPSD9KRDtDMStBMCpEMytIOC9JODpKOTtTPz9QPT1OOi1KNypMOzJVRDteTUBeTUBb + UUdeVUpYQUBQOjlKOjRMOzVVPzhdRz9cTkBeUENkTkhcRkBUQC1WQy9iUFRfTlFUQEVHNDk9LSJD + MidJPzFRRzlWTD1USTtJQDhNRDtVSEhXSkpdRkVbRENRQDpKOjNPPCdNOiVIMxw6JhBBLCNTPDJc + RzpbRjlWRTdJOStBMyBAMh9IOy5WSDtfTE5dSUxVQTBHNCQ/MiZPQTRaQ0RdRkddREZTOjxROTJO + NS9KNypTPjFWRkVURENXQDNTPC9MMRxILhlHMydMOCtFLhVONxxcRDdkTD5bRjtVQDVTPjBRPS9T + PjNTPjNWPzVUPTNMOCpFMSREMipMOjFXQTFPOipMNyNMNyNKNCVDLR5AKxhDLRpFLxxHMR5ROTRb + QT1URT5MPTdIOCxUQzdUTUNPSD5PPCdKOCNKNxtMOBxONCRNMyNJMilONy1QPzlXRj9PPzBNPS5N + PDBQPzNTQzdRQTVXPzNTOy9RPCxPOipJMidBKyBBMiFKOylOPS5MOyxIOClAMCI7Mh84LxxAMiFK + PCpXQTxeSENkTEdkTEdPQDlPQDlPPThMOjRJMi9IMS5FOTROQT1RQDFRQDFKQC9JPy5RPS9OOixI + PTVHPDRIPzNPRjpMRj9IQzxKPDVGODFHOS9KPDJKOixQPzFUQzNVRDRWSDtaTD5YRj1QPjVMPC5I + OStTOy5YQDNYSDpYSDpWRz9VRj5WRT5eTUZaSUZUREBNRDtJQDhKOjNKOjNORUZRSElTTENMRTxM + PypEOCM+NSI8MyA+NC9PRT9aTU1fU1NYTExNQEBKPDJFNy1ANStBNyxNOzlXRUNYTUFUSD1TRThO + QDNVQEVaRUlYTElWSUdXTE1dUVNdTUxMPDtDMiVFNCdKRUBWUExiUEdVRDtUQz1WRT9NPixFNyVE + MyZJOStPQURdT1FjU1RiUVNVSEZJPTtHOTFMPTVUQURVQ0VRRUVJPT1FLyNGMCRHNS1JOC9FNC5G + NS9OPTRKOjFGMiVGMiVINzBUQTtfT0xiUU5jU1FcTEpPPTRGNCxEMyZJOStYQz1hSkVhUUpeT0he + Rj9WPjhOPThYR0FfU05XSkZQPjVHNS1ILShJLilOPjJXRztWRjhRQTNKOyxOPi9WSUVWSUVYRUNV + QT9QPzNOPTFNPSlMPChEMR09KxdBMiRMPC1VRTlQQDROPTRHNy5EMyhEMyhMPz9YTExiTkxUQD5I + NyBBMBpGNytOPjJXQD9XQD9TOC9NMipIMSZHMCVFMClMNy9RPzlTQDpTPStJNCM/KRBBKxJJNSlT + PjFFMBlTPSVYSDVfTzxRQDhIOC9IOCpMOy1NPDNPPjVTQDpTQDpJOihDMyJBLiJGMiZQNSpQNSpR + NyNQNSJKNylFMSQ8KRU9KhY/Kh9FLyRMOTdYRUNVST5JPjNDLidQOzNOR0dOR0dQQzVPQTRQOylT + PStVPytUPipOOixRPS9RRDdPQTRPQTFQQzJTPjNVQDVWRTdRQDJUPSlTPChQPC9NOSxKOitGNSdB + MiFHOCZKOydJOiZPOSxKNChDMB5BLx0/MCNHOCpWRD1fTUZjUUVhT0NPPjVPPjVPPjlJOTNFMiBE + MR9FNSdQQDFURDVVRTdTRThQQzVUQzNKOitIPTJGOzBMPTVQQTpIRDpHQzlJOzFFNy1KOixIOCpP + Oy5XQzVXSEBaSkNaTkZYTUVVRzhNPzBMPC1MPC1VRDRdTDxeTURcSkFVRj9XSEFWRkNcTEhdSkhX + RUNOQT1MPztOPzlMPTdRQUBURENRQUNUREVPQTRNPzJMOSRHNCA/MiRURjddUUlhVU1RSUZIQD1K + PChJOydDNyA+MhxJOTNYR0FdUUlYTUVUSTtQRjhYR0FbSURWTEhUSUZVTlBYUVRXTE1KP0BENCdF + NShJQzpUTURcSkVVRD5VSUBVSUBOPixGNyU+MB1FNyNVRUZlVVZlVVZYSElUOztQODhJODJMOjRO + PDpRPz1UPTxNNzVINCdNOStOPy1PQC5HNR9FMx1FNyVDNCNENCE/MB1GNzVTQ0FbTk5hVFRfTExW + Q0NIOjBBMyo/MShKPDJdSU5jT1RnT1NcRUhROjVROjVRR0RaT0xiTEZWQDtNOilINSVILiNILiNT + PTVbRT1VQDVQPDFRPTBUPzJXR0ZRQUBQOzNTPTVKOitJOSpKNS5IMyxDLh1ELx5AMydHOi1QPzBR + QDFRPz1FMzFGMiZINChPQDpYSUNYRDlINCpFMBtDLhlJOitMPC1WQDxUPjpNOS5KNyxFNSJDMyBE + MyVFNCZIOStMPC5OPTRJOTBALBlIMyBeRjxpUEZJMyBbRC9bT0ZaTkVQRDA9MR8zJhI8LhlJOStQ + PzFUQTlUQTlNPS9FNSg/LCA9Kh5GKxxVOSlUPylVQCpVPipOOCRFMx1BMBpFNSdFNSdIPTRUSD9U + SkBORTtHMCpELSdKPzhPRDxTQTlVRDtVQDNYRDdaQzVXQDNJQDdGPTNKPzRMQDVOQDFPQTJWPzJY + QTRaQzJVPi5TPCxUPS1QPSxNOilJPC1FOClFMB1HMh9HNyhNPC1QOi1POSxPNSVONCRHNCJKOCVX + Rj1hT0ZeT0dbTERTQzdURDhPP0BNPT5EMyY+LiFENyhPQTJWRz9bTERYTUVPRDxOQDFDNSdGOC5G + OC5OPThQPzpPRDxOQztKOjRGNTBJNStNOS5XPjhfRj9aT0lYTkhVSEhVSEhORDNMQTFOPS9UQzRY + SEdiUVBdTUlXR0RKQDtNQz1XTUdfVU9fTUpWREFQPzlRQDpOPzVKPDJRPDdUPjlTQD5VQ0BYPz9V + PDxUPS1ROytMOzRbSUNaTU1YTExPRjpMQzdRPCxOOSlAMyQ+MSJJRD9YU05hUE9YSEdVSUBUSD9c + SkVfTkhYTkpVSkdYTU5XTE1bTk5NQEBFOCtHOi1OQztUSEBORTlPRjpWTUBVTD9PPzFGNylAMSNK + OyxeSkpoVFRfT1BTQ0RRNDVPMjNHNDJJNzRNPDdTQTxNODBIMyxFNClPPjJaSDpVRDVNOR9BLhZA + LB1ELyBHMCdELSREOjlPRURYTk1dU1FaR0lRP0FJOTJBMStHODlXR0hjTlNkT1RfQ0BUODVQOTJW + PjhTSkdWTkpYQztNODBPODNKMy9MNSlNNypXPDFaPjNVPTBTOy5UPjdTPTVMOzJHNy5HMSJJMyRH + Mh9HMh9ALSFDLyM8LRpDMyBHOSFHOSFTOy5XPzJPPi9GNSdFMSVMOCtQQDRPPzNJOyc+MB1MMiBR + OCVRPS9RPS9RPzpNOzVKMixJMStJMiZHMCRINSVKOCdJOi5IOS1OOi1POy5POThdRkVoUE9qU1FM + NyVcRjNdSkVeTEZURDFENCM6KBU4JhM8KhhEMR9TOzRbQzxJPy5ANyZDMRs4JxI7JhdKNCVWRjda + STpaRC9XQS1QPSFKOBxMOyxKOitNPjdRQztUR0NTRkFMNC5BKyVINy5KOTBQQDJURDVaQzdeRzta + SDpVRDVGPzU/OS9JOzFMPTNNPTFPPzNVPjJaQzdYRTNUQC9XQC5QOihMNyVNOCZIOSpFNSdIMyBN + OCRVPjFYQTRWQTNTPjBMPChKOydOOi1XQzVdUUZdUUZWUEBPSTpQQzJTRTRPQDpNPjhENyg9MCJD + MStTQDpVT0pWUExUUE1HREBGPi0+NyZDMyhHOCxKPDVPQDpTPz1PPDpKOjFFNCxBMSlJOTBUQzxd + TEVXVExPTERPRURUSUhPPTRINy5FNSpVRTlaTk9eU1RUR0NNQDxBOjRHPzpXTUddU01cSkVVRD5U + PDlTOzhJPjVJPjVQPjhPPTdOPzlQQTtUQT9RPz1OPDdOPDdNQEBYTExYSElXR0hPPjJOPTFQPzFM + Oy0/NCo8MSdDPj9WUVNfUVRXSUxQR0hRSElYTU5eU1RVT0hOSEFPRT9QRkBWSkNMQDlFNC5GNS9M + PDtMPDtKPzhMQDlVRTlVRTlRQDRHNytEMyVQPzBdSUliTk5YSEdNPTxOOC5IMilFNSpFNSpIOS1N + PTFKOjFHNy4/OzFJRTtRRj5TRz9QOydJNCFMNSRQOihQOCNMMx9JODhVQ0NbSEpcSUxXPzxQOTVH + OTJDNC5FOTdTRkRfSExfSExfQz9cPzxdRT5eRj9WSUdUR0VNOSxJNSlRNyxaPjNbRDNaQzJcRTRa + QzJWOS5VOC1VPTNUPDJMOShJNyZJNyZMOShMOSRINSFHMCdHMCdGMCVMNSpTPS1UPi5YPi9WPC1R + Oy5MNSlIMyBMNyNNPC1KOitHOCJIOSNRPitUQC1eRDRbQDFOPTFJOS1HMitGMSpIMStHMCpKNypO + Oi1OPjJNPTFTPjFTPjFXPkNiSE1kT1RlUFVNOStdSDpVSUFVSUFUQC9KOCdELRQ+KA85KxU6LBZP + OjRYQz1PPytJOiZENBI4KQk5KBNDMRtVPzpfSURbRjlaRThTQy5PPytRPi1QPSxPPi9RQDFUPjla + RD5QPzFHNylFMSQ/LB9HOCxKOy9XQDdeRz1aUEZRSD5JPy5HPSxNNytMNSpIOCpPPjBRQDJXRjha + Rz5WRDtcRjNUPixMNyNOOSVHOCZIOSdMPSlPQCxXRj1cSkFXTT5USTtORjdIQDFRQztURT1WSkNe + U0pWTjxPRzVEPTNJQzlKPzhJPjc9OCk1MCJDMTFYRkZbVVBWUExQTEFIRDpIPClDNyRHMiNPOipQ + PjVTQDhOPDpMOjhFOytDOSlFNCxHNy5QREFYTElTTUZMRj9HQEBNRkZHPDNEOTBENDFWRkNhVFRe + UVFQQD1KOzhHOTFOPzhRUEhVVExVSEhOQUFOODtPOTxIPTRKPzdNPjdNPjdNPjhNPjhNQDxJPTlO + PDpPPTtOPDpWREFaSEFUQzxQPzFUQzRURTJNPixENypAMydGPUNWTVNeUU9XSkhMRUdNRkhVSUpe + U1RWT0VMRTtMPTNOPzVHQDdAOjA/LydBMSlHNTVGNDRINy5KOTBPQDdQQThTPjBOOixMNzFUPjlU + RENVRURRQDtJOTNHMydHMydHOCZFNSRIOS1OPjJNPzJJPC9KPjpOQT1WREFVQ0BURDhTQzdXRjda + SDlaRjJWQy9NPTpRQT5URENOPj1OPDNJOC89NSdAOSpGPjlNRT9VRUFaSUZoT0xnTkpkU0xfTkdf + TUZYRj9MOyxPPi9bSUNhT0heVUheVUhiUERdTD9dRTheRjlUPDBTOy9IOClNPC1cPDJnRjxeQTNX + Oy1KNyxEMCZEMy1IODFQPjVXRTxaRz5UQTlRPDdMNzFHNCJFMiBKOitMOyxRPS9QPC5URTtbTEFh + Tz9bSTpTQTVIOCxEMyZDMiVJNSlINChNPDBQPzNUPjdTPTVXQTFaRDNTQENYRkhjT01kUE5FNSRP + Py1URDhWRjpPPytNPSlFMx1FMx08MRk+MxtMNy9QOzNQPSpPPClEORU5Lgw7JhRHMR5XQDdfSD5W + Sj9USD1URjlRRDdPQTFNPy9KPS5JPC1TPThVPzpKQThHPjRGNyhBMiRBLx1EMR9OOi9XQzhaTUpa + TUpRRTFOQS5KOCVBLx1FMRxNOSNQQDRWRjpdTENcSkFeSjlYRTNTOSZGLRtBLx1INSNOQDNQQzVc + SUlaR0dUREBPPzxIQDtJQTxJPzxUSUZbT0ReU0dMSjdGRTE+OCxEPTFHPDRIPTVFOi8+Myk6NDBO + SERbTkxXSkhTQTtMOzRHOis/MiRAMiFOPy1RPzlMOjNJODJINzFBOis9NSdHNytKOi5UR0NbTkla + RD9TPTlNPTxNPTxFNCxEMytBODdVSkldUVVbT1NNPTxFNTRAPDJIRDpRUE1UU09PQ0BGOjhGMzFK + ODVOPTRQPzdKPDVHOTJFOjJIPTVMOzVOPThHPThIPjlOPThWRT9YRztTQTVUQTlaRz5VSUBUSD9O + PDpDMS9JQERXTlFcUEhTRz9MQDlNQTpQRERbTk5UT0RJRTpMOy9KOi5BMiVBMiVALydBMChEMyhD + MidENyhJPC1MPi9OQDFQQDFOPi9OPDdQPjlQPzlRQDpMPDBJOi5DMiVGNShJOixIOStJPjdNQTpQ + QTtOPzlMPTdRQzxXRUVXRUVWSkNXTERcTEhdTUldSkVcSURbQz5aQT1RQDhPPjVNPixGOCY8MiI/ + NSVKPDVTRD1QRkBYTkhnVldnVldkVU5eT0hfT0NcTD9XSD5fUEZoVFhlUVZrWFNtWlRfU1BXSkhc + Sj5aSDxVPy9RPCxKNylUPzFXRT5jUElaRD5MNzFPNzBNNC5JNC9RPDdYR0BhT0hYTElPQ0BNOzRI + NzBBMidGNytGNylJOixVRDtdTENiUVBhUE9XSTpURjdVPjRPOS9KNylFMSRMOShNOilPPTdTQDpU + PDVUPDVXQDRUPTFKOzxTQ0RhT0llVE5ELx5GMSBJMyhNNytNOSxPOy5JNShGMiVEMR1FMh5JMiZO + NypROi1TOy5JOCFFMx1BMSNGNSdQPzdbSUBWSkFWSkFVRj5TRDxMRDRHPzBFNy1FNy1GOzNKPzhM + QzlMQzlHPjREOzFDNSc/MiQ/NSZPRTRdSkVeTEZURDVNPS9IOClBMSM/KxNBLRVJOi5VRTldTkRe + T0VfUURbTT9POiJJNB1OMx5KMBtNPC5XRjhfTkVUQzpMOy1NPC5HPjVIPzdOQUFXSkpbTkxcT01T + ST9MQzlBMyBENSJFOCtENypFNSpFNSpGNzNVRUFTRkZVSEhROzpMNTRINTNFMjBEMytOPTRMOjhF + MzFGMS1GMS1AMilBMypMNSpROy9VRj9aSkRUPDVPODFMOy1MOy1ENyhBNCZFPztXUU1XUU9QSkhJ + OC9EMipAOTNORkBYTkpYTkpKQTU+NSpIMStNNS9MOzRNPDVNPS9KOy1OPS9QPzFTPTlRPDhJPTlH + OzdNPDVWRT5XRTxYRj1aSD9cSkFXTUlPRUFFODw9MDRIPT5USElWSUlOQUFJPTlHOzdMPDtVRURc + TUNXSD5UPipKNSJHMSZIMidIMSVJMiZEMSFEMSFGNCxOPDNRQzlWRz1VRTlURDhTPjNQPDFPPzNQ + QDRQQDJOPjBMNy9POjJUPjlUPjlTRUdURkhQQD1NPTpKOzhOPjtUREVWRkdXSkZVSERVSEZXSkhY + TEdbTklfSDxdRjpXRztRQTVNPy9HOipGNyhDMyVMOzJYRz5XTkReVUpkWlZiV1ReUFNXSUxcSkFe + TURjU1FjU1FqU1ZuVlpvVlNtVFBbTklXSkZfTURbSD9RPTBPOy5RPDRcRj5YTURbT0ZVPztMNzJR + OzFMNSxJNzRRPjxVQ0NaR0dVRj5PQDlIOy5BNChBLSlJNDBINzFUQTxdSU5hTVFjTUhbRUBRPi1T + Py5aQThROjBOOChKNCVMNSlQOi1QPjVRPzdRPi1QPSxROzFQOjBKOjNUQzxhVFRfU1NBKhVBKhVA + LBY/KxVJMB5PNSNHMxpHMxpGMR5HMh9GMCRMNSlTNStYOzBPPCtNOilPOy5TPjFUQTlfTUReTUdc + SkVYR0FWRT9ORkVGPj1DOC89MipANDBHOzdQPzlTQTtOPzlNPjhDPDA+OCxAMydMPjFXRT9cSURW + RTdQPzFJPSpEOCU+LRQ9LBNANCJRRTFiUU5kVFBhVE9bTklWRjFNPSlNOCBHMhtKOjNWRT5bT0dP + RDxGPi1BOilFOytEOipOPTdWRT5UR0VcT01WSkNPRDxMNydIMyREMSFEMSFDMyBGNyNNPDBTQTVQ + RD9UR0NJPC9ENypFNC9FNC9KNTFMNzJJNC9IMy5FMSdFMSdAMCJEMyVKNCtNNy1URDhYSDxUQC1R + PitMPyxMPyxAPjNAPjNKRkVWUVBVUUxKR0FGMSpHMitEOjdOREBaSEFXRj9OPzVGOC5GMihFMSdA + OC5IPzVPQC5RQzBVRDVTQTNPPT1JODhGPTRGPTRJOjtPP0BYRj1eTENhT0lfTkhXTUlMQT5ALy06 + KSdDOTVOREBRRUNMPz1GQDpAOzRIPT5PREVbSUBWRTxYRDVQPC5OOixOOixQOS1ONytHNyhKOitK + ODVOOzlXRT5fTUZaSD9RQDhOOTNNODJNPTFQQDRTPTVRPDRUPTxROzpPPDxRPj5YRUdYRUdTQz9O + PjtJPTtKPjxOQT1PQz5USD1QRTpQQD1RQT5UR0dYTExWSkFYTURYSEdPPz5PPz5KOzpBNy5ANS1P + PzxfT0xeWEhfWklkVlhfUVRWSUVNQDxRQT5WRkNjUEpoVU9qVlZuWlpkUUxaR0FURDhdTUBjTUdc + RkBUPDVVPTdaRD9dR0NbSEFaR0BaQzVYQTRRQDJNPC5HOCxRQTVVQ0NXRUVTQDpMOjNMNSxFLyZD + LCFJMidNOz1eTE5jT1RfTFBYRDlTPjNRQDFWRTVcRD9ROjVRNytUOS1aQzJbRDNUQzRUQzRRPCxR + PCxROy5OOCtKOTdYRkReUFNbTU9EKRhAJhY+JQ88Iw4/Jw9FLBRELxpFMBtHMhtHMhtGMyFGMyFP + NCpXPDFNPTFMPDBUPzFXQzRXSD5eT0VfUEhcTUVVSUFUSEBOSERKRUBBODI6MCs/NC1BNy9HNy5K + OjFHPDFNQTdKQThIPzVMOzJIOC9PPkFWRUhaQTtaQTtTPyxMOSZQNyRILx1BMSRRQDJfTExqVlZi + VVVbTk5aST1QQDROOSlOOSlOPzlRQzxXTENTRz5MQTNFOy08Mys5MChDMzBQQD1RR0FWTEZUSEBT + Rz9QPzlJOTJBMBpBMBpAMh9FNyNOPTFOPTFPPTtQPjxGOzJBNy4+NS09NCxANStGOzBQOjBPOS9I + MyRDLh8+LSU/LiZDLyVFMSdRRDdVRzpWRjNVRTJMQzlIPzVFOzVIPjlNQUNVSUpYU05VT0pEMyhE + MyhDOTNHPThUQzxTQTtNPy9FOCg/NSg8MiU6NStFQDVOSDlXUUFaUEdUSkFJQzc9NytBOitDOyw/ + NTJDOTVQRz5bUUheU1RXTE1RQDtGNTA/KR4+KB0/OCdMRDJPQDpOPzlFPzlAOzRHPDRNQTpUR0dV + SEhVRURWRkVRQTVTQzdTQzNOPi9MPSdGOCJPOjVWQDxbR0dlUVFaTU1MPz9IOCpJOStNPzBQQzNX + QDdaQzlXQTpTPTVNOzlRPz1TQDtVQz1PPjJNPDBNPDVPPjhNQDxNQDxQPzlRQDpTQDhVQzpVR0xX + SU5TT0xYVVFYUE9NRURUQUFPPT1KOy1IOStWRERnVFRjVUdcTkBUR0NOQT1DOi4/NytJOT5VREln + VFRoVVVnU1NfTExRQTNJOixUSD1cUEVkTEdcRD9XPzVfRz1eRkFcRD9dRT5bQzxdRz9fSUFTRTVM + Pi9KPTBWSDtYRUVXRERTOzdONzJQNSpOMyhIMSVPOCtUQTxdSkVYRz5RQDhPQTFURjVXRzhVRTVV + PjJNNytXOytdQDBiRDlhQzhaQzBXQC5WPShWPShRPTBQPC9OPTdaSEFdTkdYSUNKNCNELh1DKxdA + KRY/KxZBLRhFMB9HMiFINSFHNCBJNB9MNyFQOSxUPC9PQDlOPzhPPjhRQDpXTERYTUVXUEdWT0ZU + TUNQST9WSj9RRjtGOSw1KR08KRxALSBFOClGOSpOPTRTQTlRQDpOPTdRPzdNOzJOOzlTPz1XQzhX + QzhYQTVTPDBRPSdMOCJFMSVPOy5dUE5nWldiVlpeU1ZbSENWRD5ROy9UPTFPPzxTQz9TTENTTENV + Qz1QPjlDODA5LidDLhtMNyNOPTdTQTtQRz5PRj1NQDxHOzdJMydNNypOOSlQOytQPzdNPDNPPTdO + PDVJOS1GNSpDMipEMytAMSNKOyxVPy1YQzBUPS1JMyRBKx9BKx9ALSBHMyZORztRSj5YT0NYT0NR + RUBHOzdKOTtKOTtJOT5VRElcSUlaR0dKPDJENSxENSxKPDJMPTdPQDpHPzxDOzhDOyxAOSpBNTNT + RkRaTUpdUE5cU0lXTkVNRDpGPTNGOSxENyo7MTBBODdMR0hYVFVcU1RRSElJPC8+MSVAKBZEKxlF + OCtRRDdPPjlPPjlGOjhHOzlMOzVHNzFJPj9PREVUQEdXREpORkBORkBUSEBWSkNQPzBJOSpUPTxh + SUhjT09lUVFUQz1HNzFKPDJQQThYRzthT0NeTENcSUBWRT5MOzRFPDNKQTlPRDlRRjtQQzNNPzBQ + PjlPPThNOzlPPTtPPTtPPTtQPjlUQTxRREZVR0lRSk1WT1FYTVBTR0pVRD5TQTxPOS9OOC5YSk1j + VVdYTEdPQz5NOzRNOzRHOi1HOi1QPT1hTU1jVVpkVltcSUxRP0FPPjhQPzlUSkBbUUdhTEBdSD1k + SD9pTURhSkVeSENdSUdYRUNeSU5lUFVXRj9OPTdTRD1dTkdeTElaR0VWPjRROjBNNSxKMypJNC9Q + OzVQPjxRPz1QPzNVRDhdTDxfTj5VSjpKQDBNNyVPOSdXQDRcRTlbRDhcRTlVRTJWRjNcRjVbRTRU + RDRTQzNRPTJXQzhcSURbSENTOy9KMyhHMx5GMh1HLxlHLxlGMSJKNSZOOSdRPCpUOilUOilUPS1Y + QTFTPDJQOjBOPzVOPzVYR0FaSENbTkxaTUpXTkRWTUNeTENaRz5KPCg6LBk/KxZGMRxFOCtFOCtQ + PC5TPjBRQDhPPjVOPDVMOjNKOTJOPDVQQS9URTJTRDFOPy1DRS1DRS1NPDVQPzlbTU9kVlhjVVdd + T1FaSUhXR0ZXQDRUPTFOPTdRQDpORz5UTURUSD9OQzpHQDRDPDBDNyBDNyBMOyxKOitMPTNPQDdO + QztKPzhQPDFRPTJROjBWPjRTQDpPPTdOPjBMPC5GOidANCJFMSRDLyI7MyJIQC5XRzheTj5VRTdM + PC5JMCJILyFDMB5INSNWRz9eT0dbUE1YTkpVRUFIOTVDOTNFOzVMOjpUQUFQREFUR0VMPC5HOCpM + NSxROzFMOzRRQDpPPz5MPDtIODJEMy5IOThVRURVSkVbUEpeVE5bUEpQQTpPQDlKPDJDNCs8LSpD + MzBOQ0RYTU5YT1BNREVKOitFNCZBLRpGMR5JQDdUSkBPPjlNPDdEODNEODNINzBHNS9BOjdHPzxM + QEROQ0ZRRUNTRkRRSElUSkxTQTtJOTJOR0dYUVFnUVZfSk9PPDxGMzNOQENYSk1dUExiVVBjU09c + TEhTQTlJOTBFOzVNQz1ORTxRSD9PRzhMRDRKPjpMPztPPTtRPz1OPj1MPDtKOzxMPD1TQENVQ0VR + SUZQSEVTQ0RTQ0RVRD5TQTxGPjlIQDtaSE5fTlReR0hVPj9MOTdOOzlIOS1KOy9QP0VfTlRcVVda + U1VXRUVPPT1PPjVTQTlaR0BcSUNjSj5tVEd1VVB0VE9pT0hfRj9eRUBhR0NpTVZuUVtUQzxJOTJN + REVbUVNcVFNWTk1XRTxQPjVKOjFBMSlGLylMNC5HOTFKPDRVRj5hUUlnVU5iUElbRT1VPzhOOSNT + PSdcPTljRD9eRz1fSD5bRjtcRzxjTkBhTD5dTDxaSDlPOjJRPDRYRkRYRkRXQTpQOzNMOSRHNCBP + NyBVPCVOOixPOy1MPStMPStTPCxXQDBcQDRkSDxVRDhNPDBMOzJKOjFPQDpRQzxWSUlaTU1dUUlY + TUVaTkZWSkNJQCxBOSVAMRxHOCJKOy1NPS9UPzFUPzFQPzdOPTRIOjBJOzFOOypTPy5QQzNVRzhY + TDhVSDRPRzVPRzVQPjxTQD5XSUxdT1FeT0hdTkdbTklVSERWPjhROjNMOy1OPS9RPzlXRT5USkBP + RjxJRDJKRTNEOCU/MyFDNB9DNB9JOixOPjBNPjRMPTNNPDVOPTdOODdPOThMQDlOQztRRDNKPS1J + OSpJOSpMNSlDLSE/OClJQTJaSENiUEpcSUNUQTtKMyc+KBxDLCFQOS1XSUxdT1FcTlBYSk1OPzVD + NCtHOitJPC1MOzROPTdRQDpRQDpURDhRQTVXQzVWQTRTQDhRPzdWQDxQOzdOOzlFMjBHOTJNPjhV + QzxbSEFXSkhTRkRIQTlJQzo/Ois9OCk6Lyg/NC1OQ0RYTU5XR0ZQQD9NOSxMOCtMNydQOytRR0ZP + RURJOzFMPTNQPjVOPDNJOi5HOCxHOS9JOzFJOjdNPTpORD5VSkVYT1NQR0pMPD1MPD1TTUpcVlRo + UFRdRklNPT5JOjtORk1YUFdeVVZeVVZYSk1URkhPPTdKOTJJOjlTQ0FVRj5bTERUSD9OQzpQPzlR + QDpQPzlNPDVJNzdKODhKOTdOPDpQPTtUQD5TQTtNPDVTPDtUPTxTP0RQPUFFPD1IP0BWRU1YR09U + R0VNQD5JOTJOPTdKOjFKOjFKP0NUSExYU05XUU1VRj9OPzlOPjBRQTNVRDtdTENjUE5qV1V1XVxv + V1ZkTEFeRjxeSERqVE9yWlhqU1FNPDBMOy9NSElaVVZeVlNYUE1TRDxRQztTPCxPOSlMNSlKNChR + OzFbRDpdSk1lU1ViT09XRUVaQzlVPjRMNSZVPi5dPjxjREFiSEFlTEVdSkFhTkVkT0RfSj9jSj1Y + QDNNOS5POzBXRj9YR0BcPzpcPzpVPjFQOi1UPzJXQzVVRDRUQzNRQS9QQC5VQTBWQzFeRjliSTxR + RDRKPS5MMiRJMCJIOCxMOy9PPzxYSEVeTEZjUEphUE1fT0xMQTFFOytIOSdJOihMOy9PPjJQPzFT + QTNHPjRDOjBFOi9JPjNPOSxXQDNVRj5dTkZdVEpXTkVXRj1VRDtVRUFWRkNVSklaT05bSklYSEdW + SUdRRUNQQD9JOjlDOStBOCpGNCxOPDNPRjxMQzlIPTRGOzJDNSc+MSNALxdJOB9NPSlOPipOQDNI + Oy5JOi5MPDBKODhHNDRKOTdQPjxPPjBOPS9JOixHOCpNNypHMSVEMipWRDtYTElbTkxaSENVRD5N + OS4/LCJIMStUPDVXSVBbTVRcSE1VQUZMOzJKOjFFOy1IPjBNOzVOPDdUPjpQOzdQPzpcSkViUEpj + UUxfTz9YSDlQPjVHNS1JNC9JNC9DNC1GODBPPjVVRDtTRkFMPztEPDlEPDlBOy8/OS07MidAOCxN + PTpVRUFbRT9VPzpXPzNVPTFQPzFTQTNXSkhPQ0BHNylMOy1VPTNWPjRFPDJBOS9DOShFOypJOi5O + PjJUREVWRkdUR0dPQ0NPPDpUQD5eVE5fVU9kUU9RPz1IOz1IOz1PSE1YUVZaUFFRSElQQD1MPDlK + OTJMOjNIPzdPRj1eTURlVEpTTD9MRTlMQDhJPjVMOyxJOSpNODBPOjJQPzdRQDhTQTlVRDtTQDpO + PDVMOjNMOjNPPDpPPDpIPTVMQDlTRUlURkpQRT1OQztRQDRQPzNOPjJOPjJOPTdYR0BeU0lbT0ZX + SEBNPjdMPTVPQDlTSENcUUxnW1xoXF1vVl5nTlZaQTtWPjhaSExrWl1rWFteTE5NPjdKPDRPRU1d + U1tlVVRcTEpWRDtXRTxUQzdOPTFGNCxJOC9KOTtWREZbSEhfTU1dRkVWPz5aRDxQOzNHNytUQzdc + Qz5aQDxdRUBcRD9WRz9YSUFlTkRoUEZlRz1TNSxGMSpKNS5XQEFYQUNcQDRfRDhaRDNWQDBWRTdc + SjxYSDpVRTdTRTVRRDRWRTdXRjhhSTxlTkBWRz9MPTVKLyBILR5ALRhEMBtNPDVRQDpYRkRjUE5n + VlNlVVFbRT1OOTFKNxtPOx9UQC9YRTNYQThXQDdJQTJBOitBMidJOi5QPDFbRjteTUdlVE5hVlNa + T0xVR0lNP0FQQD9TQ0FPQ0NYTExbSklYSEdWRTxUQzpOPzlHOTJBMyxBMyw/MSpDNC1GOzNGOzNI + OCxEMyhBMyBENSJHMh9MNyNQQDJVRTdNPy9HOipKOCVNOidFNShAMSRJOC9RPzdTPjNVQDVMPCpJ + OihHMydKNypJOTJcSkRXT0xQSEVYQDpWPjhOOCtIMiZTPjNYRDlaTk9YTU5YQz5TPTlIOCxMOy9J + OzFJOzFJOzNHOTFMOTdOOzlJPj9aTk9qWFxoVlpiU0haSkBOPixENCNHMSZHMSZEMyVIOClTQTJY + RzhXRTxPPTRHPjJFPDBGOSpDNSdBMyJFNyVJOjdTQz9fR0BeRj9dTUBcTD9XSTpXSTpXTT5NQzRJ + NC1QOzNVPjRUPTNFOi9ANStHPS1KQDBOPTRQPzdUQURYRkhURENRQUBPRT9WTEZcVFBdVVFbUUdJ + QDdFOTlKPj5URkpVR0xUREVOPj9JODFGNC5KOjRKOjRJREFQSkheVFBjWFVVT0pKRUBJPjVIPTRK + Oy1MPC5TQDpTQDpVRD5XRkBYRz5aSD9UQTtPPTdOPDVJODFFNzBIOjNHOS9JOzFTP0ZXREpWRT5W + RT5aRDxbRT1aRThYRDdaRjRhTTtcUEhbT0daSkROPzlOPDVRPzlWTEpcUVBnV2FpWmNtU1ViSEpP + PjhRQDpbSU1nVVhkVFBYSEVTQENUQURcSFFkUFpkUE5cSEZURTJVRjNTQzdOPjJFNzBHOTJOPj1R + QUBaR0FbSENWRD5TQDtUQTlPPTRMOCtVQDNbQzlYQDdXQTxVPzpQPzdXRj1iTk5hTU1hQDVPMCZD + LCFJMidUPjpRPDhYQTFdRjVbRjtcRzxbST1eTUBdSkFaRz5YRDVXQzRYRDldSD1hT0NjUUVdTEVU + QzxOOChFLyA9LiBAMSNHNS9NOzRVQT9hTUpjVlFcT0pcSDdPPCtOOSVVPytbRDphST9bR0VWQ0BP + QDdKPDJGNShIOCpRQDJaSDpkUVFnVFRjUFNbSEpQRT1FOjJFNC9HNzFGOC5RQzlaRkZcSEhYQDpW + PjhTPjNJNStBLCNFLyY8LCE9LSJBLCBFLyNJMydIMiY9MR89MR9EMixHNS9VRD1bSUNQQDFIOSpF + MB9HMiFFMx1HNR9JOCFVQytYQy5aRC9TPjBMOCpDNSlHOi1PPjlaSENWTUNNRDpTPDJROzFVQDNY + RDdWRz1URTtcUU5YTkpUPjdJNC1JODFMOjNOPzVKPDJHOi1HOi1OOTNJNC9FOzpUSUhkVl1nWF9i + VVBbTklTPypMOSRMOCJINB9FNSpMPDBcTUNfUEZaTkVTRz5JPSpFOSZHMyZHMyZNNydNNydJOzFU + RTtdUE5dUE5WUExWUExaTUhdUExWTEhMQT5PNzBXPjhWQDlTPTVNPDdJOTNTQTlVRDtRPzdRPzdP + RDtTRz5RRj5QRT1RRUVXSkpcVFNYUE9aST1MPDBNOzRMOjNJQEFKQUNPPjVNPDNOPS9MOy1NOjhO + OzlVQ0VbSEpfT1BjU1RfVExUSEBOPDNPPTRTPThTPThRRj1QRTxUR0NTRkFTRkFUR0NWRT5PPjhI + NzFHNTBBMy1IOjNJOTJMOzRWQUZXQ0ddRkVfSEddSkFdSkFfSUReSENcSUBdSkFhT0ldTEZfTElV + QT9PPjhQPzlUR0VcT01oU1poU1piSEVbQT5ROTlXPj5aTlFhVVhiUElbSUNWQ0VcSEpfSk9iTVFh + TkhaR0FUPzJXQzVTOzFMNCs/MSpGODBVPztYQz5cRD1aQTtUQzpUQzpXQDRROy9XPS5cQTJcQTJd + QzNYQDpYQDpXRT9fTUdiUEdWRTxVOStKLyJDLCFFLiNMNTdQOjtVRTJbSjhdSThdSTheTENfTURe + SEBcRj5aSDxcSj5aRD5eSENfTkdiUElhUERYSDxNPC1BMSM9LSJGNSpANStDOC1NOzRVQzxeTkpf + T0xbTTxQQzJPRTdPRTdWRDtbSD9eRkFaQT1TQzdQQDRKOi5JOS1NQD5WSUdeUVFcT09cTEpXR0ZX + QDRROy9HOipENydHNylRQDJYR0BdTEVURDhQQDRVPTBKMydMMCNGKx4/KxZELxpKMR9MMiBOOChO + OChFNSc/MCJAMCVPPjJVSUBcUEdVSjpKQDBIMyJJNCNINB9OOiRTRC9aSjVfTkFfTkFORDVDOStD + MyhDMyhKPzhYTUVYSDxURDhRPCxWQDBbSEFhTkdeU0pcUEhfVExcUEhbRzVRPi1QPC9POy5MQDhM + QDhPOzBNOS5MOjNGNC5INTxWQ0leUFdfUVhhU1VeUFNdRz9XQTpPQTJGOSpEOzJKQTliVldfVFVX + UU1MRkFFPSs9NSREMCZHMylJNyZNOilNPjdWRz9iUVNfT1BXTk9XTk9YSEddTUxaTkVQRTxWQTdb + RjtYRkROPDpNODNPOjVUSD9TRz5UQzpVRDtORz5QSUBORkBPR0FVSEZVSEZcSUdbSEZaSENOPThN + Ny1NNy1MPDlNPTpPPzNRQTVRQTNQQDJNOz1NOz1VO0FbQEdfTFNkUFdnUEpYQz1KPDJMPTNQOjlV + Pj1VRUFTQz9OQzpNQTlQSkhTTUpTQDpNOzRHMitFMClHMi1MNzFMOjNMOjNWQ0lVQUhWRERbSEhd + TUleTkpeTUdcSkVeTElfTUpdTU5YSEldTUxXR0ZUQD5QPTtWQ0deSk9iUFRhT1NcRkFUPjpUOzdb + QT1eSlFjT1ZkUE5fTElYQz5aRD9bSEpeTE5kTEhbQz9TQTVUQzdUPjdMNy9GODBNPjdbQz9YQD1b + Qz9cREBXRT5UQTtXPzlVPTdfRDhiRjpfSj1kT0FeSERhSkZkTkhlT0lnUUZdSD1MOCJHMx5JLyRO + MyhPNzNUOzhRQy5VRjFcRjNhSjhcSkRcSkRYRz5VRDtTRz5WSkFbSD9eTENfUEZhUUddUUhVSUBT + Qy5KOydFLyNDLSE/LydAMChFNCdPPjBQREFbTkxaTkVXTENVSUFVSUFdRT5dRT5dRjxaQzlbRT1Y + QztNOStKNylMPD1OPj9TSEVTSEVXSD5VRjxTQyxOPihMPC5MPC5WOy9dQTVeSENiTEZaST1WRjpR + Oy5NNypKMh5DKxdJNB1RPCRPPClRPitUPzJWQTRPPi9MOyxFMiBUQC1XTENcUEdVSUFMQDlJPSpG + OidIOiZMPSlcSkFjUUhlTk1lTk1VRDtPPjVJOitENCZFQDdQTEFcSjtYRzhfSD5nT0VhUFFfT1Bf + U1BcT01hVUxdUUhYTj9TSDpRRDRRRDRWPjhXPzlYQThUPTNNOS5JNStKOTlTQEBRR0RVSkdeUU9h + VFFlTk1hSUhRTEdEPjo/NzhIP0BfVldaUFFTSklTSklMPi89MCJAMSBBMiFGNSpMOy9QPjxeTEli + VVNdUE5YU05TTUhYUE9eVlVeVE5RR0FYRkZeTExRSElEOzxDMzBKOzhXR0hWRkdYR0FaSENPSUdP + SUdTRkFUR0NXR0RXR0RMRkFNR0NOQ0RHPD1DMipDMipINzBMOjNTPTVbRT1UQzxUQzxNRDpEOzFI + OTpNPT5YRUliTlNcTUZPQDpHNS1BMChINzFOPDdNPjhKPDVKPDRRQztORENPRURGPCw8MiNELSFF + LiJKNCVQOipPPThNOzVOPj9PP0BOQENTRUdbR0dcSEhhTU9iTlBiUVNfT1BYRUlXREhPR0RQSEVT + Qz9NPTpORUhYT1NeUFVcTlNTRz9OQztWQDtXQTxaSE5fTlReSk9fTFBcSUdXRUNTRUlaTFBfSUFY + QztYQztYQztURjlKPTBNOzROPDVcRD9dRUBbRENcRURWPT1TOjpVPTdWPjhVRjxcTUNpU05rVVBu + UE5rTkxoTk5qUFBoU0deST5QPCZINB9VOC1fQTddRT5TOzRQOylWQC5bRzNiTjpfTkdcSkRbRT9X + QTxTRDxTRDxWRz9cTUVcT0pdUExbSEZWREFfQTdhQzhYQTFNNydBLhZDLxZPOSdROylQPjhbSEFd + SkhbSEZXR0ZaSUhdSkVfTUdeTUZXRj9QPjhQPjhOOCtQOi1PPTdOPDVRPzlUQTtYSDpVRTdTQzNR + QTJOPjJQQDRXQDdbRDpdSkRfTUZfVEpbT0ZKQzFJQTBKOitBMSNNPipWRzJcTDlbSjheTURaSD9V + RTdURDVPPCtTPy5YRztfTkFWRT9MOzVGOCZFNyVIOCxVRDhcUU5iV1RkVFBiUU5YRz5NPDNEMR9D + MB5AOC9ORTxbSUBeTURfVlpiWFxhVVhYTVBYSElYSElYUEpXT0lcT0pXSkZdRz9kTkZeUENfUURb + TERXSEBbRT1RPDRQPjVRPzdORz5TTENbUUdiWE5tXF1kVFVWT09GPz9BOjlNRUReUU9bTkxWSUVX + SkZMPjFDNSk+MBtAMh1GNShRQDJWRUhfTlFbU01XT0lWTkpWTkpcU1RfVldeVlVWTk1eSk9hTVFW + TEhKQD1GMzhRPkNRRUNQREFRR0FRR0FPR0ZNRURMREBNRUFQRkBRR0FKRUBJRD9KPjpGOjVIOC9H + Ny5OPjJURDhaR0BiT0hcTEpRQUBIOy5GOSxIPzVMQzlWQ0dcSE1KQz9DOzhFMys8KyNBMidGNytM + Oy9OPTFOOzlRPjxKOTc/LixDLhs9KRZFLyBJMyRGNyhKOyxOPDdNOzVOPTdOPTdNQz1ORD5YRUNb + R0VeSVBlUFdjTlVjTlVXRUVWRERTRkFWSUVVQ0BTQD5TR0hXTE1YSk9YSk9bQTtWPTdRPzlTQDpW + Q0lhTVReTVViUFhYSElUREVVREdWRUheRj9aQTtcSUNcSUNYRj1OPDNNNC5QODFXRUNaR0VWRD1R + PzlNOjhINTNNNTJROjdWQUZjTlNqU1ZrVFdrU1hkTFFbSEhjUFBiUERWRTlTPjBdSDprTkhvUUxh + TEBPOzBQPSxXRDJaSDpiUEFkU0lfTkVcRj5YQztTQTJPPi9URTtYST9bTkleUU1aTUhTRkFYRDdX + QzVUQzxQPzlNOR9QPCJQOytTPS1WQDtcRkBUR0NUR0NVRURbSklaTUpcT01bSEpXRUdQPzFIOCpM + NydNOChQOTRTOzdQPzdTQTlURjdURjdWSkFUSD9RQDhQPzdURDhXRzthT0hkU0xfU05cT0pUSEBO + QztFPDBFPDBMRTtQST9cTUNbTEFiUUViUUVdTz5cTj1XRjdRQDFfR0NjSkZUQzpJOTBFLyRGMCVK + Oy9aST1bVFRiW1teVVZbUVNVSEZFOTdHMx5FMRw6LyhIPTVWSEpdT1FbWl5VVFhcTEpWRkVKRDpN + RjxaSkNcTUVcT0pYTEdfSUVoUU1eVE5fVU9eTExXRUVRQzlNPjRVPzhTPTVKQz1UTEZfT0xpWFVl + X1thW1ZWU09EQD0+OC5HQDdUTEpTSklYRkBaR0FOPixKOylFNyFFNyFENS5RQztXTlFXTlFYUE9W + Tk1XUFBUTU1dUVNeU1ReU1ZcUFRfU1BbTkxRSkFFPjVIOThRQUBRSD9PRj1TRkFTRkFNRUFKQz9N + Q0FRR0ZUSEBUSEBQQThPQDdOPTRMOzJKPDJJOzFUR0NbTkldTUxfT05XSEBMPTVFNy1GOC5JPjdN + QTpQRT1OQztMQDVEOS5AMiE9Lx48LyBBNCVJOitJOitNOzJOPDNJNCVDLh9EMBtINB9HOSFMPSVE + PypBPShKPDRMPTVTPThXQTxVRj5RQztbSEZcSUddSU5dSU5hSFBjSlNbSEFXRT5VQ0BUQT9TPz1U + QD5XRUNbSEZbSEZaR0VYQztWQDlUQzpUQzpUQ0ZaSExaTFBcTlNXR0hVRUZYQUNaQ0RcRzxcRzxf + TEliTkxYRj1INy5BMypKPDJUR0VbTkxbRT9TPThIOy5GOSxGNSpOPTFXRkBiUEpqVlRqVlRlTlFd + RkldSk1hTlBdSkRXRT5bSENkUUxrUFNlSk1dRjVUPS1UPzJXQzVXRj1hT0ZnU1NkUFBaSENTQTxR + QDJPPjBTRDpYST9bSUNhT0heTk9WRkdQQTpRQztQQD1UREBYQzJVPy9UPjdUPjdUQD5VQT9PRUFR + R0RaQ0ZfSExeSk1iTlBdSkFYRj1QPzNKOi5KOitIOClNPC1TQTJQQTpRQztVRjxbTEFdTEVeTUZa + SENUQz1RQzlVRjxdTEVjUUpfU05fU05bTEVTRD1HPSxMQTBRSD5USkBYTUFaTkNiUERhT0NdTkRa + SkBTQzNRQTJeTUBdTD9aR0BKOTJGLyRHMCVGODBaSkNbVFZfWFtaU1NXUFBQSENAOTNHMiFBLRw3 + LCVIPTVVSkVeVE5WV1BRU0xVRD1RQDpGQzBJRjNRQzxWR0BXSkhVSEZhTVFkUFVfUVRkVlheUU9V + SEZNPDVOPTdRPz1PPTtIRDlOST5eTk9rW1xkX2NeWl1VT0pBPDhDNCNMPStUSD9VSUBaSD9aSD9T + QzRQQDJPQTRKPTBGOjVQRD9VT01VT01VTUxTSklUTEpRSUhUTEpUTEpYTVBXTE9aUEdVTENVRTlM + PDBMQDlTRz9XTENXTENRRj5RRj5QRkBORD5QQD9WRkVdSkhfTUpTRThPQTROPDxMOjpMPDtURENb + TU9eUFNiUVBaSUhOPTFMOy9MOjFNOzJQOzNQOzNKPzdHPDNBNCVAMyQ/MB0/MB1DMidHNytKOy1N + PS9TPDJROzFPOihPOihPOSxPOSxNPC5RQDJKQzNKQzNPQDpOPzlVPztWQDxUQz1WRT9cSkVdTEZk + TkljTUhhTU9hTU9WSUlUR0dWRkNTQz9PPjJNPDBWQ0NbR0deRkNdRUFWRD1aR0BXRztTQzdPQDlT + RDxYRkZbSEhfSUVaRD9UQTxRPzpWRTxhT0ZtVlFqVE9aRDxIMyxHPDRMQDlYTExdUFBhSERTOzdJ + NyJMOSRKNSRQOylYRj9hTkdqVE5oUUxcSURTQDtaSENdTEZbSEhaR0deTEVjUEllTkReRz1YQTFX + QDBTQTJRQDFTSEdcUVBfU1BeUU9UREBKOzhPPjBRQDJPPjJQPzNXREFjT01eU0pTRz9PQ0BMPz1Q + QD9VRUReTkFdTUBbSkdVRUFTQTtNPDVPPzFURDVaQT1fR0NhTU1hTU1iUElaSEFOQzpPRDtQQDFO + Pi9URDVVRTdXRj9bSUNdUUhfVEpfVExfVExbSUNTQTtPRDlXTEBaTkNiVkpeU0pfVExYSUFPQDlI + PylHPihQQThURTtXTENXTENhUEFeTj9aSENYR0FRQDhWRTxbTkleUU1dTD9RQDROOi1EMCQ/OS9R + SkBbVVBdV1NYTElWSUdMRTtDPDJEMSE8Kho0KxtEOilUSUZeVFBVSklRR0ZTQDtRPzpOQzhQRTpO + QzpRRj1VSUFUSEBXSUxcTlBaTUpiVVNdU09USUZUQzpRQDhPPzFNPS9FPjJHQDRXTE1fVFVnXGRe + VFxRTUFDPjNQPCZXQyxXRzldTT5bTEFaSkBURDhRQTVRQDRPPjJQPzlTQTtTSUBXTkVTSklRSUhR + RUBUR0NRRj5PRDxPRURVSklYTUVVSUFRPzdRPzdJRD9UTkldUExcT0pPRDxOQztQP0NRQERUREVY + SElYUE1YUE1XTUlMQT5OOzlPPDpKPjpaTUhiVVVhVFRbSU1KOj1JNCVJNCVPPCtQPSxVPTBUPC9J + OTBHNy4+LyI/MCNBLBtGMB9JNShOOixMOyxQPzBYOzNaPDRWOS9aPDJTPDBUPTFTQDtUQTxQQThQ + QThRQzxQQTtRQztPQDlQQD9VRURXSkpbTk5kTkZjTUVlTE5lTE5WTEpUSUhVRj9PQDpKOTNNOzVX + RUVaR0dbQz5YQDxYRj1bSD9bSURVRD5TQTxYR0FbSklYSEddRz9YQztPPDpUQD5bTklnWlVoVU5k + UUpdRjpPOS1RQDRXRjpcUUxfVU9cTD9TQzdOOSdQOylOOCRNNyNUQD5jT01kUU9cSUdXQEFTPD1Y + QztXQTpRQDhVRDtYST9dTkRhTkhaR0FhST9qU0hRQDRNPDBNSD5RTUNYUEpTSkVQPjhHNS9KNChP + OSxKPTBHOi1QPjxaR0VYTUVPRDxOOCxIMidINzFPPThXTkVeVUxYT1BUSkxVRzpNPzJPPjJRQDRT + Qz9UREBWSkFYTURdU0BYTjxNSDtNSDtRRDRRRDRYST9dTkRiSEhhR0ddUExfU05dVlZbVFRaTk9U + SElXRj9hT0hcUEViVkpdTkRXSD5WPjhTOzREOilGPCtIQTlPSD9VRD5XRkBaT0BcUUNcSUdbSEZY + QUNcRUZaVFFeWFZfVUZRRzlPQTJHOitBPi5PTDtcVUxbVEpXRj1QPzdKOy1ENCdEMR87KRc4LxxE + OydRRkdfVFVVSEZOQT9NPDNOPTRVPj1WPz5NRDtPRj1RRjtPRDlJRD1QSkRYUE1hWFVbU1FTSklO + QT9OQT9VRDtRQDhMQTxNQz1XSU5eUFVkXWJdVltTRzxMQDVdRzdkTj1cVERfV0deTUZaSEFQRTxO + QzpQSDlRSTpURT1QQTpUR0NYTEdTTENORz5NPjdQQTpPPzNPPzNQRkNUSUZWSkFVSUBRRjtPRDlH + RkBUU01dU09YTkpRQDpKOjNNPT5RQUNNQz9XTUlbTkxcT01aSUZKOzhGNSpJOS1KP0NfVFdiWFxb + UVVRQDpDMixINChJNSlTQzROPjBRPi1NOilFMCFALB1FLRlHLxtELhtJMyBKOylOPixQPC5TPjBX + QDRYQTVUPTFVPjJWPzNVPjJTQDpUQTtOQztMQDlPPjhQPzlOQT1OQT1TQz9WRkNVSUpXTE1iUEph + T0ldUE5eUU9bTk5aTU1YRkZRPz9OPzlNPjhdREZeRUdaRD5XQTxcSEZeSkhWRkNUREBaRkRcSEZW + TEpUSUhYR0FTQTxONThXPkBdUE5kV1VnT05jTEpaRTpRPTJRQzxYSUNiVkpjV0xcTD9YSDxNOCRE + LxxDMyJGNyVORD5dU01hT0hcSkRUPjdOOTFTOy9WPjJOPTRRQDhYRj1cSUBaR0VYRkRlUVRtWFtO + PDVINzBNPDBVRDhXTENXTENaQT1PODNJMydHMSVGOidIPClGPTFUSj5USD9OQzpQNyhMMiRGMCFM + NSZXRUNeTElXTE1WSkxQRjRIPi1HNy5IOC9KOTNRPzpURDRWRjdVTjhUTTdPSThNRzVURjlYSj1a + TUpbTkxfTU9aR0leTkpjU09aV1ZYVlVYT1BRSElWTEheVFBdVlZdVlZXTEBJPjNNPC5JOStFOClH + OitOPzVQQThUQzpaSD9XTERbT0deTEldSkhVQUhYRUxcU1RiWFpbV09NSUFQQDJMPC5IQThTTEFa + UEdXTkVKRC5BOyZIOSVHOCRFNBhAMBU9LiNJOi5RRUVWSUlTRDpKPDJHPS9HPS9QQTtPQDpMQzdP + RjpQQThNPjRFPThPR0FYUVFfWFhcVlRTTUpTQ0FXR0ZTRz5OQzpQRz5KQTlMRkRWUE5iWlhcVFNY + SDxcTD9eTUZqWFFfVVFdU09iU0xbTEVXRj1XRj1YT0NbUUVUTUBMRTlTSENWTEZRSD9ORTxNPDdN + PDdHPjJJQDRQRkNTSEVaSENeTUdbTEVRQzxOST9XU0hYTUVVSUFNQTlDOC9NPTpTQz9MREBPR0RT + SkdWTkpdTENUQzpRPTJQPDFXQ05iTVhhVFRVSEhOOSdGMSBIOStOPjBVRDtRQDhOPi9IOSpELyA/ + KxxBLRhELxpBMBZKOR5OPS5TQTJUPjdWQDlXRztaST1WRDtTQDhXQzVVQDNYRj1TQDhJPjNFOi9D + ODBGOzNMQDlNQTpRQzxVRj9RRUBYTEdeUU9fU1BfU05eUU1bT1BbT1BcSUlVQ0NUQTxVQz1iSEVj + SUZhSEVfR0ReSkpdSUlWRD5aR0FfTkhbSURWREFVQ0BRQDtOPThFMjRTP0FeSlFlUVhkUE5dSUdR + QDRPPjJWQ0NcSEhlWlBjV05cSkFTQTlIMh9FLxxJMydQOi1XRT5fTUZbSj5YSDxJPy5EOilOOSlR + PCxVPzhaRDxbQz5bQz5XREZcSEpiVFtfUVhGODFDNC5IOCpNPC5QRjhQRjhbQUFWPT1KOi5GNSpD + NSZHOipNPjRQQThTQzdWRjpTPjFMOCtMMiJPNSVTPz1XREFWTURTSUBaRjROOypDOiZAOCRROytU + PS1VPy9WQDBVSjlVSjlYST9XSD5URjlURjlWTEZbUEpeTkpcTEhcT0pbTklWVU9aWFNaUFRQR0pR + RkdYTU5aVVRVUE9TQzRJOixENB9DMx5IMiZIMiZPOy1WQTNVPzhWQDlXREheSk9aUFFXTk9NQEBO + QUFWTVBcU1ZWTkpKQz9POzBMOC1MRD5TSkVfUElYSUNMRS9DPCdQPSpWQy9PPylOPihIOjJNPjdX + RTxYRj1TQzNJOitEPCtHPy5PRTdTSDpMRDJKQzFKQTlIPzdGPj1QSEdWVFdcWl1cTlBWSEpPR0ZR + SUhGPzdJQzpMPTVJOzNJRD9TTUhkWlZdU09bT0dkWFBjWltnXV5hVVhbT1NfT05dTUxfUEheT0dc + U0hbUUdbTEVYSUNUR0VXSkhVSUFMQDlMQDlJPjdHPjRJQDdPQ0BVSEZdSkhoVVNVUEVKRjtWRz1W + Rz1VRj5RQztGOzJEOTBKOTdOPDpMQT5NQz9XTUdfVU9dUUZYTUFRQDpQPzlXSVBdT1ZcSkRQPzlH + Mh1NOCJPPjVbSUBXTERPRDxJOC9EMio7Kx03Jxk+JxRELBhJMypXQDdYRj1WRDtUPjpXQT1eTUZf + TkddTD9bST1dRT5cRD1dRT5WPjhQOylNOCZIOClHNyhHPDRKPzhQPzlRQDpRQztYSUFWSUdYTElf + U05hVE9dVFVbUVNdSU5XREhVRj9QQTtYRkZeTExlTk9jTE1bSEhUQUFVQ0BbSEZdSkVYRkBTQDhU + QTlRQTVMPDBHMDVYQEZnUVhqVVxhTkdcSUNUPzRRPTJVQ0NeTExiU0piU0pdTD9TQTVOOypQPSxR + PTJVQDVfRkNiSEVaSENcSkVTQTVNPDBNQC1OQS5XSEBeT0dpVEZjTkBdQ0VcQURbSU9dTFFTPyxN + OidPOCtTOy5RPzlVQzxVRDtWRTxPPjhKOjNGOzBGOzBOQDNKPTBTQTlVRDtQPzNNPDBMNydPOipQ + PjhVQzxaRkRWQ0BTQTlKOjFGOSxFOCtOOypUQC9XRDJYRTNURjVTRTRXRkBaSENaSkBVRjxVSUBa + TkVcUUxdU01dVEpbUUhcVk9eWFFcU1RPRkdRQUBWRkVXSkZbTklVQTBPPCtINB1FMRpJMyBHMR5J + OS1UQzdWQTdYRDlWRT9fTkhfV1RaUU5QQTtKPDVXSUxdT1FYSEVQQD1PPjJNPDBOREBRR0RcTE1a + SUpURjlTRThVRzpYSj1bSj5bSj5UQTlQPjVURDhQQDROPjJMPDBBOCpIPjBOQzhXTEBXRjhRQDJT + Rz9MQDlJQERPRklWUE5cVlRfT0xdTUlWUExaVE9QRz5IPzdIOjJIOjJMRUdRSk1eVVZbUVNbU1Fk + XFtqXmJnW15eVFNYTk1eUVFiVVViVVNjVlRdU01bUEpeTkpbSkdUSUZWTEhRSkBNRjxRQzxOPzlM + PDlKOzhQRz1aUEZhVlBlW1VWT0ZMRTxRQTVTQzdURT5QQTtKPDRKPDRFNy1IOjBKOzpJOjlUSUhf + VVRcUVBVSklNQz1MQTxQRkVWTEpYSj1RRDdOQDBRRDNVSEZbTkxTTENJQzpJNyZALh49KBdBLBtB + LRVFMBdNNzVaQ0FbR0VUQD5TPTlYQz5eTE5iT1FjTkBhTD5YRz5XRj1XRj9TQTtXOjBUNy1JOStA + MCNAMilJOzFQPjVVQzpXRj1XRj1VRUZcTE1jVlRnWldiVk5eU0pbUE9TSEdUQT9RPz1OQ0ZXTE9j + U1RiUVNhSkZdR0NdSUxeSk1dR0FXQTxTQzdQQDRVQDVPOzBINzlXRUdoT1VoT1VWRz9PQDlPPjlO + PThNPjhXSEFcTUNbTEFdRz9RPDRKOi5OPTFPPjhWRT5iSkxlTk9dSUxdSUxVPzhNODBMQzlWTUNl + VkxqW1BpVk1jUEdaR0FUQTxcSEheSkpYRTFbRzNYQTVXQDRROjBQOS9QPzFTQTNQPzBQPzBNQzRJ + PzFJPy5FOypKPTBOQDNPPzNMPDBPPCdPPCdPQTFTRTRYRkBWRD5QPzlJOTJNNy1OOC5MOjFWRDth + T0ZcSkFRRDRTRTVUREBXR0RVTkVUTURWRz9YSUFXTUdbUEpaUUxcVE5dVU9eVlBeV05RSkFUQzpU + QzpcSkFfTkVcSjtWRTVPQC5KPCpMOiFJOB9MPTNURTtWRDtVQzpRQzlcTUNeVlNcVFBRRDdHOi1Q + RERXSkpbR0VaRkRTRDpQQThOQztOQztUR0NXSkZUSEBWSkNbTEFdTkRXTERbT0dXSD5MPTNRQzBW + RzRIQTVDPDBDOStJPzFTRz9aTkZcTUVURT1WRkNQQD1ORD5USURXTERaTkZbTkxeUU9XUFBbVFRV + SUFJPjdJOzNHOTFNPD9dTE9jV1tjV1teWl1kX2NoXmRiWF5cT0pUR0NYTU5hVVZhU1dhU1deU0lb + T0ZbUE9YTk1TSklTSklPRDxPRDxMQzdGPTFIOTpHODlNSj5YVkliXFVhW1RaSD9OPTRPPTRTQDhT + RDpQQThPQDdNPjRKPDJJOzFEOixDOStMPDlaSUZUTU9PSEpKQz1FPThMPDlPPzxVRD1UQzxRRjtb + T0RWUExUTklWRz9QQTpQOipDLR47JRk8JhpJNSBUPylWRTxYRz5cSUBUQTlQQDRTQzddTFFkU1hf + U05bTklPR0FPR0FaSkRaSkRbRDdUPTBMPCpENCNFOy1MQTNYQztcRj5YSUFVRj5RR0ZVSkliUU5l + VVFnVlNjU09dU01VSkVTRkFTRkFVR0lbTU9hVFRiVVVlUEVlUEVdTkdbTEVaRz5RPzdUPzRXQzha + QzlTPDJQNzdaPz9hR0NfRkFaRDxVPzhQPT1KODhFNy1KPDJYSj1YSj1bQzxYQDpQOi1VPjFUQT9a + R0VfTkdiUElfTUZhTkdWQTNPOy1QRD9bTklqU1RrVFVlTExfRkZYRUVXREReTEZfTUdhT0ZhT0ZX + UU9XUU9VQz1MOjRKOixKOixTPjNWQTdRRzlUSTtMRTlGPzNHOipJPCxPPzFPPzFPQTFNPy9RRDNW + SDhVSERUR0NRQztKPDRKNSJKNSJMOTlWQ0NfT0xlVVFdTEVaSEFTQDtUQTxUSURUSURVSUFTRz9K + SUFOTUVVTE1WTU5eTk1fT05dUUhVSUBTRDxRQztXRjpfTkFiUEBhTz9cTUNXSD5URjlNPzJPRTNY + TjxfUEZVRjxURTtXSD5dU01fVU9XSTxENypJOzRVRj9fTj9jUUNeU0laTkVRRj5IPTVHPzBTSjtd + UUhbT0ZiU0piU0phUUpeT0hXTzxRSTdTRzxbT0RQTTxFQTFEOS5IPTJXT0lcVE5bTkxUR0VURT1M + PTVPPzxTQz9RR0RYTkpYU1BeWFZdWFdXU1FVRD1MOzRKQTVEOy9KPzdTRz5WTU5cU1RdU1tlW2Nn + VVthT1VTQTtQPzlWSE9dT1ZcU1RbUVNaUEdWTURQSkhWUE5WSkNQRT1ORD5NQz1JQzpBOzI/NC1B + Ny9NSUZdWlZnX19dVlZWRT5PPjhQRT1VSUFRSD5NRDpOQzpOQzpRPTBKNypBNR9GOiNKOjRUQz1R + RUVRRUVKQDtANzFINzBOPDVWRkNbSkdfT0xnVlNfU1BXSkhaRThWQTRRPSdKNyFBMh1GNyFUQzdY + RztYSUFURT1VRjxURTtPPjBWRTdeTVBoVlpiUU5iUU5USUZTSEVXSkhYTElbST1PPjJJOSpKOitU + RT1VRj5WRDtbSD9XSEFWR0BURkhWSEpcTlBdT1FjU1RkVFVfTU1WRERWRz9aSkNbSEpeTE5dUFBh + VFRjUUpeTUZdTUlYSEVYSDxVRTldRjxjTEFfSDVbRDFWQTdUPzRbRT9dR0FfRkFYPztNMipNMipM + OjFQPjVWRTdYRzlXQDRaQzddQDtdQDteRkNkTEhjT09lUVFjTkBhTD5VRTBTQy5bSEZcSUdhTUpi + TkxdSUdXREFWPz5cRURdSkFiT0ZhTk5eTExUVFRUVFRYRkRRPz1KOixOPS9RPi1WQzFbSUBbSUBa + ST1OPjJJOylHOSdMOy1TQTNWRjhVRTdXRj1XRj1bSURaSENXRzlQQDJPOyFOOiBNODBUPjdbTkll + WFRqVE9kTklXRT9UQTxVQ0BTQD5PQURPQURIQ0BJREFRRkdUSEleSERcRkFYR0BWRT5RQztTRDxU + RDhXRzteTUZiUElhVUxdUUhdTkZWRz9VSjxhVkdnVklcTD9RSDxTST1hTkdkUUpdSDpKNylJNDBb + RUBdUExkV1NjXF5cVVdTSEdDOThAOShPRzVkU0llVEpnVlNqWlZoVFRiTk5bTklcT0pbT1BfVFVd + V0dPSTpHPzBNRTVWTU5cU1RYSUNQQTtNOzRQPjhNPjROPzVKP0BUSEldVlhfWFteVlNXT0xRQTNK + Oy1FPS5FPS5GPjlIQDtPR0ZXT05bUE9jWFddU09TSEVIPzVJQDdbSU1nVVhdUVNbT1BUR0dUR0dW + SUlbTk5XSD5OPzVRQTVPPzNGQTc+Oi9BNChIOy5RSkpeV1dnX2JbVFZTRThQQzVaTk9bT1BWREFT + QD5VPzhWQDlVQS5JNyRJNCFPOiZQPDFUPzRRQDhQPzdNPjdJOzNPODRROjdaSExjUVVkUFVjT1Re + SERaRD9WRD1VQzxQQCxNPSlJPy5NQzFbSURbSURaSkRXSEFVST5TRzxOPjJXRztkU1ZpV1trVFNl + Tk1RQztRQztUSUhRR0ZTQTtNPDVNOzJRPzdaRkRXREFURDhWRjpUR0NUR0NWRUhcSk5eSk9iTlNk + U1ZlVFdeT0hURT5YRkBcSURbSEheTExiUFRiUFRhVU1cUEhjUElfTUZYRj9dSkRpUEZnTkRdTTpY + SDVXRj1YRz5aSENcSkVdSUdaRkROOixJNShTOzRWPjhYQTVbRDhXQDRcRTllRz9kRj5jTUVnUEhp + VVdlUVRjTUdfSURYQztXQTpXRUVcSUleTUdaSENcQz5YPztVPztcRkFlTExpT09WTEZaT0leUFNd + T1FcSUNXRT5VPy9RPCxNPC1VRDReTUdeTUdeTUZTQTtJPCxGOSlMPC1URDRVRjxVRjxXSD5VRjxW + SkNYTUVYSj1XSTxaRC9VPytRQzBRQzBaSkNhUUltUVFuU1NkTEhiSUZXRj1VRDtQQD9NPTxJPjdN + QTpTQD5WREFVSjxVSjxXTTxXTTxfSDxcRTlWRDtWRDtaR0BeTEVlVVFiUU5dVVFYUE1YT0VhV01t + W1RhT0hWRz9RQztjUElkUUpYSTdHOSdJNSlbRjlcUU5jWFVkXGNaUVhQRTxBNy5IOCpaSDpjW1pq + YmFpW11rXV9jVlRfU1BaTk9bT1BfTlZoVl5jWFVWTEhTQTtYR0BfUVRhU1VWRz9IOjJIOSpPPzBJ + OzFMPTNNQz1ORD5aUFFbUVNbT0dUSEBNPjRNPjRHPDFEOS5AOjBGPzVVQT9dSUdhVlBjWFNYT0VN + RDpDQDRIRjpYUVFeV1deTk1bSklRPkNWQ0dhSkZfSUVYRzhUQzNXRjdWRTVRRDNMPi5EMytKOjFP + TUxXVVRfWlVUTklOQDNURjlcUFFaTk9bSENWRD5XQTpbRT1TQzNNPS5QQDFRQTJQPzdPPjVOPTFN + PDBNPC1NPC1JNC1QOzNeSkpiTk5dRkdbREVVPzpVPzpVPztXQT1XRzlRQTNTQzRWRjhdTkddTkdd + TUlaSUZcTUZcTUZXR0RYSEVoVlxpV11vVVVlTExQQzVOQDNPRj1KQTlOPDVNOzRPPjJUQzdbRT9b + RT9RRj1QRTxQREFUR0VYTExaTU1fTU9lU1VkVlhhU1VhUE1YSEVfRkhjSUxdSkpfTU1dU1FfVVRh + WFVdVVFbU0NYUEBcSURdSkVrUU5oTkpaSTtWRjhWRz9bTEReTEVfTUZbT0dXTERWQTdUPzRRPTJU + PzRbRDhcRTlYRj1eTENkTkhkTkhiVk5hVU1iVVNfU1BcTE1aSUpVRDtUQzpQRkBPRT9XSEBWRz9T + QzRPPzFQPjlVQz1iSE1kSk9bTEFhUUdfUEldTkdcTkBbTT9XSTpNPzBQQC5VRTJbSEZcSUdbTEVT + RD1PPjJNPDBPQy9VSDRVST5XTEBUTUBRSj5YRj1cSUBeTUdeTUddSDtWQTRRRzVRRzVXSEBaSkNe + TExfTU1iT1FiT1FbTklQRD9MQDlJPjdIPjBHPS9KPTBXSTxWUURWUURbT0RcUEVdTkdbTEVaSkBW + Rz1aSEFcSkRfU05iVVBjVlRbTkxTSUBeVUxnVlVhUE9WRz9WRz9bT0daTkZWRjhIOStBOSFTSTBe + UFNjVVdeW1dQTUlPQy9IPClFPDJdVElnV2FwYWprXWJoWl5iVVNcT01fT05cTEpfUVRoWlxdVlZT + TExPRT9QRkBYTk1eVFNYTURMQDhHOi1OQDNOPDdNOzVBPzRIRjtTTEFXUEZdTT5XRzlTQDhOPDNE + PTQ9Ny4+OytHRDNVRUZaSUpbVFZbVFZVTEFGPTNKRUBTTUhWT09WT09VSERQRD9MQUBTSEdcSkRa + SEFURTtWRz1jUEpfTUdbTT1PQTJENCdJOixNSUFXVExdTkRURTtIQDFRSTpcVVVXUFBRQzlQQThR + RzlWTD1QSDlQSDlVRjxXSD5YST9URTtPOy5OOi1NPS5NPS5JOzNQQTpYSUFVRj5PPzFQQDJKQThK + QThVQzpaRz5YSDxYSDxdTENfTkVkU0xkU0xeU0paTkZaSUpXR0hYRkRaR0VhTVRlUVhjUVVfTlFX + RzhQQDFRQDJOPS9POS9QOjBQPzNUQzdTQTNUQzROQzpQRTxWSUVXSkZXTUxXTUxeUVFiVVVjVVdi + VFZdUFBaTU1iSkxlTk9hTU9lUVRbUVNjWltqWlZkVFBdTDxbSTpeSERjTUhpT1FlTE5WRjhVRTdb + TEFcTUNeTENeTENcSkFdTENdRjpWPzNVPjFXQDNkTEFqUUdlU01jUEpnU1NjT09eVFNdU1FcT0pY + TEdbSklXR0ZTRDxOPzhUQTlWRDtlST5oTEBlSjdbQC1OOSlUPi5bQUZiSE1eU0peU0pdU0RiV0hl + WlBfVEpYUEpQSENPPzBQQDFbSEpdSk1dTkZVRj5QQD1MPDlTRTRVRzdXU0hYVElUTUBPSDxTRTVW + SDlbU01cVE5cTUNURTtQRTxTRz5PRT9PRT9VRUFaSUZaTFBbTVFXT0xQSEVJQTxEPDdJOzFJOzFM + PztUR0NaT0xaT0xVT0pVT0pYTEddUExcUEVXTEBcSj5cSj5YTkhbUEphT0ldTEZVSUFfVExkWlRe + VE5XRj1eTURPSUdKRUNHPjVFPDNHPy5YUD5nVlVpWFdjWFNdU01ORTtHPjRHPD1fVFVuXF9zYWRy + ZGRpXFxeWltTTk9VSkleVFNeVVZhV1hbTkxRRUNJQTBIQC9TSUBYT0ZYTEdQRD9OPTdUQzxVQUFK + ODhBOy9NRjpbU0NcVERfTkVXRj1NPDdJOTNAOC48Myo/NTJMQT5UTU9YUVRbVldVUFFFREA9PDlK + RERTTExXTUdUSURQRz1NRDpNQz9RR0RVTENQRz5PRUFVSkdiVVVhVFRaVERKRTVDOyxEPC1WRz1e + T0VbTEFTRDpJQDRWTUBcW1dTUU5RRjtRRjtWTD1aT0BaUT9aUT9eUU1fU05XUEdRSkFPPzFNPS9Q + PzdQPzdNQD5OQT9RRzlORDVNPihOPylNQzRRRzlYST9cTUNdTENfTkVkUU9nVFFlVVFnVlNdV1BW + UElYSEdVRURXSEBWRz9eR0phSU1cSE9dSVBcSjtcSjtfSURVPzpTPjFPOy5OPDNRPzdXRTxVQzpQ + RTpRRjtbSEhdSkpYTk1aT05hVFFiVVNiVFhjVVpdUE5bTkxfTUphTkxbSklcTEpjUVppV19rVFNo + UE9hSD5lTUNqU1FqU1FlTlFdRklWQTdWQTdaRz5eTENeTUdaSENeTT1bSTpRRDNMPi5TPjBeSTtr + VkpuWE1pUVBoUE9iT0laR0FdSkheTElfUEldTkdaSENVRD5TQTVPPjJdRD1fRj9rT0RyVUlqTkFf + RDhVQDVXQzheSERhSkZiTlNlUVZhVE9oW1ZpYVtlXVdfWFhUTU1KQzNNRTVeTE5hTlBdUUhWSkFT + QTtRQDpRRDNURjVTTk1XU1FbT0ZUSD9NRjBORzFRTEdbVVBeVUpVTEFQQTtURT5ORTxPRj1URjlV + RzpXRkBbSURVTkVRSkFMQzdHPjJFOjFIPTRPRDxVSUFcTEhaSUZRTUNTTkRUSTtaT0BcUEVcUEVa + TkVYTURaTUhaTUheTUdaSENRSElbUVNhWFVdVVFjUEljUElPRkdHPj9OPzhMPTVMQzldVEloXF1k + WFphVUxeU0lPSD5DPDJKOzxdTU5lXVpqYl5nX19jXFxYWFtNTU9OR0lcVVdfVlpcU1ZVRTlMPDBD + PCVIQSpTRz5VSUBUSEBQRT1RQDtQPzpQPkBNOz1DOi5RSDxYVElfW1BhVU1aTkZGPzNBOy8/MiRE + NyhFOzhJPzxVUFFaVVZXU1RKRkdDPzhAPTVQRD9WSUVXSEFVRj9OSERMRkFKQz1RSURYTUVVSUFR + R0FaT0lhV1hiWFpaWFBKSUFJPy9IPi5WRD1hTkdfTUpcSUdPSUVYU05eXVVRUEhQST1PSDxbUD9c + UUBeU0leU0lfU1BcT01aSkNWRz9QQzNURjdUQz1VRD5RQT5TQz9TRDpURTtTQzNRQTJWR0BbTEVe + TVBeTVBhUE9lVVRqWltqWltpXV5lWltfWldYU1BaR0VWREFeTEVaR0BaQ0FaQ0FdRklfSExhT0hi + UElcTUVVRj5NPTFIOS1KPTBRRDdYRz5bSUBXTERYTUVbSEhdSkpbSkdbSkdbTk5cT09hT1NhT1Ni + UU5bSkddSk1aR0lUR0VUR0VlVFprWl9oU1dnUVZnTUhqUExqV1doVVVfSElbREVWQDtUPjlVQ0Bb + SEZfTUdbSENYSUFURT1TRDpRQzlVRDtiUEdqWk1qWk1lT0pkTklcTUVURT1cSUxdSk1kUU9hTkxf + Sj9aRTpRPi1UQC9cSURlU01uVldrVFVhT0NaSDxTQTlVRDtbSENcSURjUFNoVVdoV1hrW1xnWF1l + V1xfUVRVR0lNRC9RSDNdTEZhT0leTURaSD9VRDtTQTlRRDRURjdQTkNWVEhdTkRYST9QSDdNRTNR + Rj5dUUljUUpcSkRKPjxMPz1MQzdPRjpRSDxRSDxYSDxbSj5WT0ZRSkFNRUFJQT5FPChGPSlNRDpR + SD5YT0VWTUNPRjpORTlPRjxTST9dT0FfUURXUEdTTENbSURcSkVYSEdVRURQSEVVTUlcVE5dVU9h + UE9hUE9TRkZNQEBRPDhRPDhUSUheVFNpXFxjVlZbSUNcSkRWTURNRDtMPD1XR0hdV1VqZGJlZGFf + XltdXldPUElPRkdaUFFlVVRfT05QRy5IPydGOiVOQSxURjlQQzVVRD1TQTtXQTpRPDROPzhJOzNF + PzlOSEFcVlRnYV5iXV5aVVZJQDhFPDNGMihINCpJOzROPzlTR0pYTVBTSUpKQUNHPThFOzVPPjhV + RD1WQ0BaRkRUR0dQRERPRT9VSkVcTEpdTUxWTkpaUU5kWlZnXFhnVlNXR0ROPzVVRjxeTUZiUElk + UE5jT01WTU5bUVNhW1hXUU9XSD5cTUNdVElfVkxeU0pcUEheT0hhUUpeTT1XRjdaRThdSDtbRjtW + QTdQPzlVRD1USD9TRz5TRDpVRjxbSEhcSUleTk9iUVNhVFRnWlpqXGNuX2drXWRpW2JlW1pdU1FY + Rz5eTURhTkdcSUNaRTpUPzRYRDdiTT9nVE1lU0xiT0haR0BPOy5NOSxOPjBWRjhfTkFjUUVdSkFa + Rz5YRUNbR0VbR0VbR0VaSExYR0peSk9bR0xbSEZXRUNbSENXRT9QQTpYSUFeUVFhVFRjU1RhUFFd + TEZkU01tXFhlVVFhR0daQEBQPjlWRD5WSUVdUExoUUlkTkZVRURURENXRUNWREFaR0FkUUxiV0Ze + VENhTkVdSkFTQzdPPzNUQEBbR0djUUpfTkdfRz1aQThVPjFUPTBYSEliUVNoVVVkUVFdRzJWQCxP + PTRTQDhcRURfSEdkUFdjT1ZlWFhpXFxqWFxqWFxnVFFYRkRTQTJTQTJbSUReTUdkU0RiUEFdTENX + Rj1UPjdXQTpTTEFUTUNeT0VaSkBTRTVPQTJWRTxeTURlU01fTUdPQDlKPDRKQzNORjdRSDxVTD9Y + Tj1YTj1YUUhXUEdVTEFORTtJPCxMPi5USD9XTENaTkVaTkVMRjdKRTVOQzpPRDtbSkdbSkdbTkxY + TElWSUVVSERVQ0BTQD5QRkBXTUdbWlRbWlReUU9eUU9RQzxOPzlNPjdKPDRTSklfV1ZfWlNcVk9W + TkpXT0xbTklXSkZQRkNVSkdhVVtpXWNlX1tjXVhcXVhTVE9ORkVUTEplTk1hSUhVSjlTSDdWSTVU + RzNbSj5WRjpYRztbST1cRTtUPTNMOjhNOzlNQUVQRUhiWFxpX2NkYmVdW15PQ0BMPz1NOilINSVN + PDdRQDtUSExWSk5VSEZOQT9HPjVFPDNQQTpTRDxYR0FcSkVVRj9VRj9RREZWSEpaTk9dUVNaU1Nb + VFRhW1RiXFVqWFNXRkBQRkNaT0xrWFNrWFNtWFZpVVNcVFNbU1FcVk9bVU5cTD9jU0ZiW1BfWE5b + UUhbUUhnU1BoVFFiUUVeTkFqT09pTk5eST5VQDVTQDhWRDtXTkVWTURUR0NWSUVXSkpUR0dWSUdd + UE5iVlpoXF9rX2VqXmRnU1xpVV5kVFBjU09iU0xhUUpnVE1hTkddSD1WQTddSkRpVk9tXFtnVlVq + TUpdQD5POSVMNSJaR0dnVFRqV1BkUUpcSjxXRjhWQ0BWQ0BbRUBdR0NaRkhaRkhcSE1dSU5hTU1a + RkZUQzxVRD1WRD5YRkBaTU1fU1NeUVFbTk5aTk9lWltrW1xiUVNeQTxaPThWREFaR0VeUU9pXFpp + W01fUURVRjxTRDpVRURTQ0FYRkRiT01hUERYSDxaSDxXRjpPPjBPPjBUQTxeTEZnVE1eTEVYQzJU + Pi5QOjBUPTNXRkleTVBkUU9hTkxfQStWOSNPOjJUPjddQD1iRUFfSlFkT1ZnU1VpVVdqWFxqWFxl + VE1cSkRWRjhPPzFPR0RWTkpjVExnV09hVFFWSUdXPjhWPTdQQDFVRTVbT0ZbT0ZYSj1TRThPRjxW + TUNiT0hkUUpXQzhPOzBQPDFWQTdVSUFbT0dbUUdbUUdbU09aUU5cTEhaSUZTQzNPPzBRRj1XTENY + TUVaTkZOQzpHPDNPPjhQPzlXRkBbSURcSURcSURYQz1YQz1TRD1QQTtWREFeTEleV1peV1piVldb + T1BVRj9JOzRGOzBIPTJVRj9hUUpfXFZeW1VcUU5dU09hU1VdT1FOSEFPSUNiT1pqV2JlWl1kWFxh + WlpWT09NQz9USUZdTUxdTUxcUEhdUUljWlBeVUxfTkhaSENeT0dlVk5eU0lTRz5NPjdNPjdJQERK + QUVfWFtlXmFdW1pbWFdPQDdIOjBMOyxPPi9TQTVRQDRUR0dTRkZORkNKQz9JPjVFOjFRQTVWRjpW + SkFXTENTSUBUSkFQRUZUSElWSE9bTVRcUU5hVlNlW1dkWlZdUUlQRT1USUZdU09pWFVrW1dpWlNj + VE1bUE1eVFBdVU9dVU9WTURlXFNpYV1kXFhaT0xYTkpnWlplWFhkV1VkV1VqVltkUFVdRD1VPDVT + RDxYSUFeT0hbTEVYSUNXSEFWRz9TRDxVRURaSUhlV1xpW19oXmJhV1tbT1BcUFFhUE9hUE9eUU9j + VlRpXFxeUVFYR0FVRD5cT01oW1hqXF5iVFZdRz9RPDRMPjFXSTxkWFpoXF1kV1NXSkZaTD5WSDtP + PTdQPjhURTtVRjxVQUFVQUFVREdYR0paR0lTQENRPzdTQDhWQDtUPjlVSEhhVFRfTUpeTElnUVZq + VVpjUEpTQDtYQDpbQzxeSkhoVFFnVVttW2FpWlNeT0hYQTRXQDNQPzpQPzpWRERdSkpdTkRXSD5a + SDxVRDhPPzFPPzFWRD5dSkVfUEldTkdRQTJQQDFTPjFVQDNbSEpkUVRkUUpdSkRfRTFWPClTOjNa + QDpbQz5eRkFcTEpdTUxfTU9jUFNjV1hlWltjVlFbTklbSjxXRzlbRT1eSEBiUU5nVlNlVVFbSkdY + QztVPzhKPS5OQDFUTURYUUhdTkRcTUNYR0BaSEFTTENYUUhVSjxPRTdOPTdTQTtYSEdfT05cUEha + TkZXTE1VSUpcSUddSkhaSDxRQDRRSTpTSjtQST9TTEFOQzpHPDNOPjJVRTlXRkBbSURcSkVcSkVb + TEFVRjxQRztMQzdQQ0VYSk1eV1paU1VbUE9TSEdTRz5MQDhPPjJJOS1RQDhXRj1cVVVbVFRYTkpc + UU5fVFViVldQSUBNRj1aTk9kWFpkW15lXF9hV1tQR0pIQD9KQ0FcTEpjU1FiVVBjVlFiWFpbUVNa + R0VdSkhdV1NfWlVeWFRaVE9PRjpGPTFBOjRHPzpcTlBrXV9jW1pVTUxRRTFNQC1RQzBRQzBVRTlO + PjJNQDxOQT1NRDtKQTlHPS9FOy1QQDRaST1dTkRcTUNUSkFRSD9MRkRKRUNPRURQRkVRT05bWFdl + XF1fVldaSkNTRDxbTkxnWldlVVRiUVBVUEZVUEZaT0xcUU5cVFNfV1ZhV1toXmJoYWFjXFxcT09Y + TExjV1hjV1hjXFxkXV1kW15dVFdYR0BYR0BeTk9kVFVhUE1aSUZPSD9TTENRRj5OQztRQUBaSUhl + VFpwXmRpXFddUExbSURcSkVaTU1cT09jUVdoVlxlXF9bUVVaR0VWREFXTE1jV1hjWlBeVUxYSDpR + QTNTSEdfVVRpXV5hVVZfT05XR0ZXSD5QQThKOjFNPDNQOzNTPTVWOjhWOjhTPz9TPz9WPjpTOzdR + Oy9POS1WPTdaQDpaRkReSkheTURhT0ZlTk9jTE1hRTxdQTldR0NiTEdhU1VoWlxrV1xzXmNrWlRi + UEpeRjlaQTRQPjhVQzxYRUVcSEhbTT9aTD5aSjVXSDNURC9QQCxYQz5cRkFYTUVXTERXRjdVRDRX + QzVbRjleUVFjVlZcUEVWSj9eRzpaQzVVPjRROzFOQT9VSEZbSEZcSUdaTkVdUUhbV1ReW1dkWlRc + UUxXTENUSD9aRTpfSj9jUEpoVU9nVU9fTkhcSkVVRD5TQDhTQDhXR0RcTEhbTklcT0pdTENdTENU + TUNaU0hQTD5OSTxOQzpPRDtWRUpcSlBeUU1cT0pUTURPSD9XRj9cSkRXRTxTQDhWSDlbTT1YSUFa + SkNUSTtNQzRTQDhVQzpVRj5aSkNVTUlVTUlWSUVVSERRSTpNRTVQREFbTkxaVVRRTUxPR0FMRD5T + RDpRQzlRQTVKOy9PPzNQQDRWT0ZXUEdUTkdaVE1cVVdiW11aT0lQRkBaTlFoXF9nX19oYWFYV1FI + R0FBOjRFPThRSURbU01nVlNoV1RdVVRaUVBYRkRcSUdaVVRcV1ZdWFdYVFNURT1MPTVBOy9DPDBY + TUVpXVVqWlZdTUlQRDBQRDBRRzdUSTlURjdMPi9MPTdNPjhRQzlNPjRGPSdEOyVVRj5eT0dYUEpX + T0lUTklQSkZMRD5JQTxHPzpNRT9PTU5VU1RhWlpbVFRTRkFNQDxVSkldU1FdUUlYTUVVTD9YT0NU + T0VXU0hYUVRcVVdiW11pYmRrXlxnWldXTkRUSkBcT01hVFFkXFtlXVxiXV5bVlddTE9fTlFjV11h + VVteT0dRQztRRj1WSkFTRDxQQTpVRUZeTk9lWl1rX2NlW1pXTUxQQTpURT1aSExbSU1aU1dhWl5p + W2JeUFdWREFUQT9XSkhjVlReV05XUEdORztMRTlPSEhXUFBkVFVeTk9YSEVTQz9TQTVNPDBOPS9O + PS9POCtTOy5VOStWOixQOzNTPTVTPjFPOy5UPTBUPTBaQT1dRUBWSkFXTENbSUNaSEFaR0BbSEFe + RT5jSUNeTkpiUU5jV1hkWFpoW1tpXFxrW1djU09iSjhYQS9OQDNMPjFTRkFVSERWT0NWT0NcTj1W + SDhQPShRPilYQzteSEBbSUNbSUNdRjxeRz1aRD5dR0FaT0lcUUxXRztVRTlaRTpVQDVTQTNQPzFR + RUNbTkxWRkNYSEVYTUFbT0RdVk1hWlBlWFZeUU9YT0VTST9XRjhdTD1YTUVeU0pjU09iUU5dTkdV + Rj9XQTxXQTxVQ0NXRUVbR0xcSE1jTUdnUEpcVUpaU0hUTjxRTDpOSDlNRzhVRURXR0ZYTUVaTkZV + SjpRRzdTRz5WSkFWRT9VRD5aRz5iT0ZcUEhXTERQSUBKRDtQQTtOPzlWREFhTkxdV1NaVE9WSUdW + SUdVRzpTRThUSkFcU0laU1NOR0dPRjxORTtPRDxTRz9YTURWSkFURjdVRzhVTEFYT0VRTkpXVFBa + V1heXF1YVVFQTUlaTU1qXV1iXmRhXWNYVElFQDc4Mx09OSJQSkZcVlFjWFViV1RXT0xbU09YSEVe + TkphVlVfVVRdU09TSEVOQDFOQDE6OSVAPytTTUZiXFVkW1BWTUNMPi9RRDRVRzpWSDtQRC5QRC5I + OStIOStMPTNKPDJFPS5JQTJVTE1dVFVbVldXU1RRSExPRklPRURMQUBGQUNMR0hQTE1aVVZbVlVV + UE9TRThPQTRTSEVcUU5WTU5TSUpUSkFUSkFVTENbUUhWT1RcVVpfW1poY2JnXFZhVlBWTUBRSDxV + SUBfVEpnW15kWFxkWlhdU1FbTU9jVVdnW1xhVVZcSDdWQzFTRTVXSTpRSTdORjNUREVfT1BlXF9p + X2NkU01UQz1KPzhMQDlRQUNcTE1bVlVfW1poV1hhUFFURT1RQztPR0ZVTUxVTUdWTkhUSEBQRT1V + SEhXSkpbSEZVQ0BPPjhMOzRMOy1MOy1QOi5ROy9TOy5WPjFYQyxYQyxPPzFRQTNUPzRTPjNaQThc + RDpfRkFfRkFaST1bSj5YRz5WRTxWRDtdSkFjUEpkUUxhVFFfU1BiVVNfU1BfVVFkWlZpXFpkV1Ve + TT5RQDJJOihOPixURT1XSEBXUEdbVEpjUUNbSTtWQTNWQTNeRkFhSERdSkhdSkhdSkFaRz5VRD1b + SUNbSUBcSkFYRTFYRTFaRTpVQDVTQzNURDRWSUdfU1BQPjVTQDhYSUFbTERdUExiVVBjV1hcUFFX + SkZTRkFURT1WRz9RTEVYU0xhVlBeVE5dSkpWRERTQTxQPzpRQzxURT5aRThbRjlfSUFhSkNbUUdd + VElcU0haUEZQRz5NRDtWSkNaTkZcT0pbTklXSEBWRz9TSkVTSkVXTERXTERhT0loVlBfVkxcU0hT + UEVNSj9PRzhQSDlXRjpiUERkWlRlW1VaUU5RSUZTQDpaR0BWUE5cVlReV1dUTU1RSkBPSD5YT0Zb + UUhkVkheUENfSj1dSDtVTENYT0ZUT05aVVRaV1tbWFxQUE5OTkxbSU1hT1NeW2FfXGJYTVBHPD89 + MyM8MiJNR0NdV1NlWFhkV1dfV1RdVVFiTlNiTlNoVVVjUFBaSD9RQDhQQzVKPTA/PitDQS5NTkdd + XldfWE9QSUBNPjhVRj9eTUZdTEVaSkBRQzlJPC9HOi1JOzRJOzRIPj1QRkVTUFFXVVZcVVdRSk1T + QTlRQDhNQD5NQD5KQDtORD5RR0ZbUE9aU1dRSk9QQzVQQzVTSjtWTj5YTkhWTEZQSENPR0FVSkVV + SkVRTElWUE5dVlhoYWNoXF1fVFVPSDxORztUTklhW1ZqX15oXVxiUU5RQT5UREVeTk9fVVReVFNb + STtdTD1fVEpfVEpVSjpQRjVWREFdSkhbVFReV1daSkROPzlMOjhOPDpRQEZeTVNeVlVhWFdoVVVh + Tk5aRz5XRTxQRz1TST9aTUhXSkZUQz1UQz1aSkRaSkRdTUBYSDxNOSxMOCtFNCdGNShROjBXPzVc + RURhSUhbTERaSkNQRjhQRjhYQztaRDxeRkFkTEdtUVFpTk5fTUZbSEFbQzxYQDpbREVhSUplU1Bl + U1BjU1FjU1FdUExcT0piT01kUU9tW15pV1thT0NRQDRMNSJPOSVRQDpcSkRjV1hpXV5pVVNcSEZf + Sj1hTD5eTEZcSURYTEdXSkZcSUBWRDtRRj1USD9bSD9dSkFaSTRXRzJcRj5aRDxRQDhWRTxaR0Vh + TkxPOy5VQDNYSEVaSUZcUVBfVVRfVldaUFFYTElQREFOPjBOPjBRSD9YT0ZhT0hiUEleTUZYR0BV + RjxOPzVOPi9PPzBWQTNbRjhcTUVaSkNaSkRfUEliUElfTkdPRDxOQztUTUNWT0VfT0xdTUlVRj5U + RT1VTENVTENVTENcU0llVVFnVlNiWlhdVVRVTkVPSD9MRjRNRzVTSjtdVUVfXVFiX1RWVFNKSEdR + PzpYRkBaTk9hVVZkWFpXTE1VST5YTUFdV1NdV1NeV01dVkxiVk1dUUhVTUdVTUdUTkxcVlRbVldY + VFVTU1BJSUdQRUZcUFFiVlpeU1ZaSUhHODc/Lyc/LydJQEFXTk9tWlNtWlNnXV5iWFpcUFReU1Ze + U0laTkVbSjVXRzJVRTdNPS89OCdGQC9UTEhcVFBcUEdVSUBTQDtWRD5hT0hiUElaUEZTST9MPypG + OiVANylGPC5GPT5NREVcUFReU1ZYVElJRTtMPyhMPyhJPjdKPzhNPjhPQDpQSENaUUxbU09TSkdR + QzlURTtUSkBYT0VbVEpYUUhaTkZXTERRSURNRT9OR0dVTk5dVFdlXF9nVVtfTlRMRD5PR0FXUFBf + WFhjW1pjW1pfT1BUREVTR0haTk9iVVNhVFFkTklpU05jW1djW1dbUUhORTxUQzxaSEFbT1BbT1BU + R0NQRD9UQzpXRj1dTUxkVFNlW1piV1ZiV1ReVFBcSUdaR0VYRz5aSD9dTkdaSkRVRj9XSEFdTUBj + U0ZnVUZhT0BVQS5OOyhGOCZIOihRPDdbRT9eTEleTElbSENaR0FXRj9XRj9YSUNaSkRjTlNrVlty + WFVuVVFkU0xcSkRaQTtaQTtjTE1lTk9kVUpkVUphUUdeT0ViUEphT0lkUU9lU1BpV1tpV1tiT0Zc + SUBWPjFROi1UQEdeSlFpV11tW2FnWlpYTExcSUNeTEVeTkpaSUZaSkRXSEFaSUZXR0RaSD9WRTxc + RkFdR0NdSkFdSkFkSkReRT5TQDpYRj9dSU5jT1RPPjBUQzRWREFbSEZhUE1oV1RiV1ZdU1FVTUdO + RkBPQTJMPi9RPzdaRz5bSENdSkVhUERdTUBXTERVSUFRQDFPPi9QRTpYTUFaTUhXSkZbSEZdSkhf + TkhcSkVVRjxURTtWTEZeVE5eVE5YTkhURTtTRDpQRztUSj5XUUpcVk9iVVVpXFxlXF1hV1hdT0FV + RzpORDNPRTROST5cV0xjX1pjX1paWFNJSENTQz9QQD1WT1FfWFtiVVNaTUpdTEZjUUxeV1piW11l + W1doXVpnXV5iWFpUTkdUTkdVT01YU1BhVlVdU1FVTUdPR0FMSENUUEpTTUhTTUhaSD9PPjVENCc/ + MCNBPDhTTUhpWFpwX2FnXWFdVFdVSUpVSUpcUEdYTURfTz9fTz9aSjhTRDFBOCdMQTBVTENbUUhd + TT5XRzlVQzpcSUBbT0ZfVEpdTUlhUE1XRzlNPS9DNyRHOyhHPTxNQ0FbSEhdSkpYT0NKQTVHPy1F + PStIOjBKPDJNPjhPQDpWRkVbSklVTUdTSkVXSEFcTUZdVEpdVEpbVFRbVFReUFNXSUxQRkBMQTxQ + REFTRkRWT09eV1dhU1VbTU9NRURRSUhWT09bVFRhW1ZdV1NeUU1TRkFWRUhdTE9fVExiVk5tWFhu + WlpnXV5nXV5bTEVQQTtOQzpUSD9fTUdhTkhdTkdXSEFXSkhiVVNlW1dlW1diXFdiXFdeXFtaV1Ze + Tk1aSUhcSURdSkVaSkRYSUNUQz1WRT9fT0xuXVpwXlhoVlBhTz9VRDRQPSxRPi1UQz1aSENdSkVe + TEZdRz9aRDxXRT5XRT5WSUdcT01nU1xrV2FuVlVuVlVoWFFfUEldSUljT09qWFxtW15oXFReU0pe + TENfTURkUFBjT09iUVNlVVZkVFNiUVBhTkVdSkFaRTdRPS9PREVWSkxfVFpnW2FiUVBWRkVbSENe + TEZcSkRaSEFXSEFWR0BWREFWREFhRTpdQTdcRD9aQT1eSENlT0lkTEVdRT5RQztXSEBbTU9WSEpJ + Oi5OPjJTQDhYRj1iUEplVE5oWFFlVk9eUU1YTEdNQzFJPy5UPzJbRjlfRDtnSkFbTEFaSkBaT0xW + TEhVQzxUQTtQRkBbUEpfU1NeUVFcT09aTU1YTUVWSkNTSDpTSDpWSUleUVFeVE5YTkhTRDpTRDpN + SDtPSj1YUE1dVVFqVltyXWJrXlxpXFpqVUlkT0RVRjxRQzlRSkpaU1NdW1xhXl9dWE5WUUdRTUFN + SD1RT05fXVxjW1VaUUxaUU5eVlNdVlheV1piWlhnXl1lY2RjYWJWUUdUT0VfU1NeUVFfUVRdT1FQ + TEBRTUFPT0BQUEFcU0lWTURVSUBTRz5PQy9EOCVFPDJWTUNfW1xoY2RoXl9aUFFXRj1XRj1hUUpe + T0hjV05iVk1eT0dTRDxFOCtKPTBTRDxdTkZcTj5XSTpYRDdYRDdXTEBhVUlhUE9iUVBUT0VFQDdH + OitGOSpDPDJGPzVOQzpUSD9YSUFVRj5WSDtPQTRMOyxNPC1QRz5PRj1TSkVRSURXTkRTST9UR0Nd + UExiVVNiVVNbUVVaUFRbT1BVSUpTRkZPQ0NMPztQRD9USUZbUE1dUE5bTkxQSkhOSEZTTExYUVFa + V1ZYVlVkUFBfTExbTEVeT0hbU01cVE5pW11tXmFiXFpXUU9YR0FUQz1TRz5WSkFhUUpjVE1hUUpf + UElnVV1tW2NrXWJvYWVtX1tpXFdjWl1dVFdhTk5hTk5bSURcSkVYTUVaTkZYRkhbSEpoWmFzZGt1 + ZGVvXl9oVkdYRzlYRi5aRy9VQ0NdSkpeTEZeTEZdRT5aQTtXQD9aQ0FbR0xkUFVkU1hkU1hjUFBl + U1NiVVBlWFRpVlhoVVdoXF9jV1tlU01fTUdkSkplTExnUVZoU1dnVlVpWFdnV1BfUElcSUBUQTlR + Pi1QPSxUQzxdTEVpVlhoVVdlTUhhSERaR0FYRkBXRTxXRTxWQ0BWQ0BYPztbQT1nRDtoRTxkSkdk + SkdfTkdfTkdeTj5VRTVVPjRWPzVfRj9YPzlOPDNPPTRRPTJWQTdYTURdUUhhVlBiV1FlVUheTkFR + RzdNQzJXQzRhTD1lUEFpVEVfUEZeT0VdUUlbT0ddTEZfTkhXTUlfVVFnWFtjVVdaUUxVTUdXTUdU + SURPRjxMQzlRRj5cUEhbUE1XTUlWR0BURT5NRjpQST1eTVBjUVVkWlhoXVxqYlxoX1poVU9kUUxa + SkRURT5VTlBYUVRiVlpoXF9jVlFaTUhUSTtWTD1VTUlfV1RjWl1dVFdeVVhfVlpjV1hhVVZdVlZl + Xl5fX11hYV5cUU5YTkpYT1BcU1RbVFRXUFBKSUFNTERTTkRWUUdYUUhXUEdaSUhdTUxVTD9DOi5F + OCtYSj1YXVxfZGNqX15XTUxRRDNVRzdeVE5eVE5jVVdfUVReTElTQD5FOClJPC1TRDxeT0deTEVa + R0BXRjhXRjhcUUNpXk9kWlRhVlBVTkFKRDhKPTBKPTBJPC9KPTBQQzNaTDxeTUZfTkddTEVUQzxM + QzdNRDhTSUBaUEdTTkNOST5USTtVSjxdTkZhUUlXVVZVU1RYTU5YTU5aTUhYTEdVSERNQDxJPTlO + QT1QRD9XSkZUSURTSENKRT5MRj9PRkdQR0hXUFBdVlZfU1BaTUpWSkNTRz9QSkRVT0hkWlRlW1Vk + V1NYTEdVRD1RQDpVRj5eT0deVUxfVk1fU1BfU1BoVFtvW2JyXGFwW19qVlRnU1BiVVVfU1NhT0hf + TkddTUxhUE9eTk1eTk1aR0lcSUxhXF1qZWdwZGVpXV5qVUdlUENkTjtjTTpiSklhSUhjTkBjTkBe + RjxbQzlaQT5cREBXSkpYTExbR0dYRUVbTkleUU1nVlVlVVRjUUxiUEpkVFNiUVBhTkVnVEpnVlNl + VVFnWF1nWF1pW11nWFtlVVFbSkdUPTNQOjBUPTNbRDpYSElhUFFpVlhjUFNkTUNiSkBdRT5cRD1b + RDhbRDhbQz5bQz5fQTplRz9qTUlpTEhkSkpjSUleSkhbR0VXSDNURTBVPjRWPzVVQzpUQTlTQTxR + QDtRPzlTQDpUREVaSUpXT0lbU01kVkhfUURdTUBYSDxVRDtjUUhqXVhrXlplWFRhVE9dUUlfVExc + T0pdUExYUE9hWFdnW15iVlpbUE1VSkdVTENRSD9RRjtOQzhNQzRXTT5cSUdcSUdaR0FUQTxRQztX + SEBeTE5lU1VkWlZpXltqY2NlXl5jV09bT0dWSkNVSUFWTEpdU1FfVldkW1xcVlFaVE9VTEFPRjxP + QURaTE5fVlpnXWFhWlxhWlxkVltiVFhbVlVnYmFoZ2FjYlxdVEleVUpbVVNaVFFXVE5WU01OSEFQ + SkRYTExdUFBcVE5eVlBeUFNhU1VbVU5IQzxDPS5QSjtcXFxjY2NvXl1XR0ZRQzlXSD5lWl9oXGJl + W1pXTUxaR0dVQ0NKOi5NPDBNPzJYSj1dSkhcSUdYTUVaTkZdVVRuZWRpYV1jW1dWT0VTTEFQRTpO + QzhNPDNKOjFTRDxcTUVhVU1iVk5eVFNUSUhJRTtMRz1USUZdU09UTURQSUBNRDtPRj1dTkdjVE1U + U0pRUEhQRkVPRURRSD9RSD9ORztJQzdMPTVOPzhPPzxRQT5NQTpPRDxMQDlOQztRQzxRQzxbTkxd + UE5dUUlYTUVXSkZQRD9OSEFXUUpoWl5kVltkUE5YRUNPRTdRRzlaSkRiU0xeVUxeVUxdVEpeVUxl + Wl9oXGJkWF5jV11jT09fTExYT0VXTkRaTkNaTkNdU09jWFVfTkhYR0FXRUVbSEhbVFZoYWNuYmVn + W15pUVBqU1FpV05kU0lnT0VnT0VoUERiSj5cRDdbQzVaRD5YQz1TRD1URT5VRDhWRTlYTEleUU9o + VFRlUVFeTElhTkxkUVFkUVFkUU9qV1VrW1dtXFhuW11nVFZlWFhkV1djVlFaTUhcQDhbPzdcRD9h + SERdSUlhTU1kVFBiUU5nUEhlT0dlTUhiSUViRjtlST5fRz1iST9hSD5jSkBfR0NkTEdiSUZhSEVd + SUldSUlcTj1XSTlTOzhWPjtXQTpdRz9OPi9QQDFNPjRKPDJMPD1PP0BVREdcSk5jUEpiT0ldTENd + TENbTEVpWlNvYmJwY2NqXV1iVVVaTUpbTkxiUVNfT1BdT1RjVVplWl1hVVhfTU1bSEhVRUFUREBR + Rj5MQDlMPTNURTtcTE1dTU5aSD9XRj1VRD1XRj9cTEpfT05eT0hoWFFrXWJuX2ReWFRQSkZTRDxU + RT1TRz5YTURaTk9jV1hfWldaVFFTTkNKRjtFPz1QSkhbVFZnX2JjW2JjW2JjVVddT1FaU1NlXl5p + YmJiW1tbT0dcUEhdU1FcUVBVTk5WT09PQ0BRRUNUQ0ZXRklTTlFXU1ZdVlZdVlZhXVVTT0dNSUFT + T0dfXV5kYmNpXFdUR0NRREheUFVuX2RpW19dUUlXTERcSkVWRT9NPDNOPTRTSUBWTURWT0VUTUNX + TE1cUFFkWmJqX2hvYWNtXmFcV0lVUENYST9VRjxPPTROPDNRSDxbUUVkXFhnXltfV1FRSURNRDhQ + RztYUE1cVFBUTDxMRDRFPjRKRDpWTEZeVE5aVE9RTEdMRj9HQTtKQDtQRkBQRz5JQDhQQDFPPzBK + OjFMOzJIOC9JOTBHPS9JPzFPPTtTQD5XR0ZbSklWSUdTRkRURENVRURRR0ZdU1FoXGJjV11eTE5Y + RkhTRz5XTENaT0xfVVFdVVRcVFNbUE1cUU5hVF5iVV9eVVhbUVVdSkpYRkZUSEBWSkNaTkNaTkNf + V1ZfV1ZaTUhTRkFTRD1VRj9dVFdpX2NqWFxlVFdoVVdpVlhiWlRfV1FlVE1lVE1qUU5kTEhdSDtX + QzVRQDpTQTtTQTtUQzxURENaSUhaTU1dUFBkTUxjTEpeSjlcSDdhTUplUU9qVlhrV1pqVlRqVlRp + UVBnT05hTk5eTExdT0FWSDtiSUNnTkdpUElnTkdcSkVeTUdhUE9lVVRtVlBtVlBpU01hSkVkQzVp + RzpjRzxkSD1hSEFiSUNcQ0dfRkpkR0RnSUZiTk5lUVFdTD1VRDVWPjhXPzlhSEVrU09OPS5MOyxJ + OTBGNS1HNTVKOTlQPkBVQ0VXR0RbSkdcSkVdTEZhUE1pWFVpXV5rX2FqWltlVVZXT05YUE9eTk1f + T05eTk1jU1FeVVZeVVZcUEhWSkNRRj5QRT1MRD5HPzpMPTVOPzhQQ0dWSE1dTkdWR0BWRD1UQTtX + SU5cTlNXT05dVVRrWl1wXmJcWlhPTUxRQzlNPjRKPS5URjdYTUVfVExeWFZXUU9WSj9PRDlGPDlN + Qz9UTVFfWF1hWlxjXF5dVlhWT1FYVFVkX2FjYWJYVldaTkZaTkZaTU1bTk5QTEpOSUhKPjpHOzdN + RDtNRDtQSkhWUE5eVlViWlhhWlpcVVVTTExXUFBiX2NiX2NlVVZTQ0RWSlBiVlxtXmNnWF1fT0Nc + TD9fTkFeTUBRQDhOPTRUSkFaUEdbT0ZXTENTSkdaUU5jXl1nYmFtY2RuZGVfW01cV0leU0lUSD9R + PzdWRDtbVVNiXFpkX15hXFtdTkZURT1RQzlWRz1dU01cUUxQSDVHPy1KPzdRRj1USURfVU9cU0lV + TENJRD1BPDVJOzRQQTtRQDhUQzpYRztRQDRMOSRKOCNDNyJBNSFEPCpIQC5QQThTRDpTRD1RQzxN + Q0FNQ0FQPj5WRERYTVBiVlplVFpiUFZcSkVYR0FcTUZiU0xiVVNkV1VhVFFbTkxTSEVUSUZUTU1W + T09cUFRaTlFXSkhWSUdYRztcSj5YTEdbTkleV1dfWFhhTUpXREFRQUBaSUhjV1tnW15nVVtoVlxl + U1VnVFZpXFplWFZfU1NfU1NlUVRhTU9XQTxQOzVQPjlUQTxWRDtUQTlVQz1aR0FbT0dbT0diT0le + TEZcRTlbRDhiT0hnVE1qV1prWFtrVFVtVVZqVE9iTEddSUlcSEhcSEhfTExnVFZuW11rXFFhUUdY + R0FYR0FhTU9lUVRpU05oUU1iSj5eRztjRT1kRj5iRj1hRTxdSDtdSDtcQ0dbQUZfSD5jTEFjUFNj + UFNhST9UPTNUOzdcQz5iTlBqVlhMPChHOCRKOi5HNytJNC9POjRKPTBNPzJWRDtbSD9dSkRhTkdh + UFFnVldqXV1pXFxiVVBeUU1bTkxXSkhdTUxhUE9iT0ZkUUhcVFNbU1FRTUFNSD1PPjVQPzdMRTxE + PTRKOjNNPDVPPkFWRUhcTEhcTEhYSUFVRj5WTVBdVFddVVRcVFNjV1tpXWFkXFhWTkpOPS9JOStO + PS9RQDJYTEljVlReWFRYU05fTkVVRDtNPDBUQzdUTEhdVVFiW11iW11dVlhVTlBaU1NkXV1nXl1e + VlVbT0ZbT0ZhUE9bSklPR0FMRD5KPDJMPTNOQDFQQzNTRz9YTUVaUU5eVlNeV1dcVVVUTklbVVBj + WltjWltjU09UREBaTUpkV1VuWlxlUVRlVE1lVE1kVUpjVElXSEFVRj9aTkVdUUhYT0NTST1TRkFa + TUhhWFdrY2JvY2lwZGptYVdjV05bUUhRSD9VRD5hT0llXF9iWFxcWFVUUE1URTtTRDpQRz1YT0Vk + WFBcUEhOQDFFOClRQzxVRj9QSkhcVlReUU9YTElGPjs9NTJFOjFHPDNTQTlcSkFbSTtTQTNOPydJ + OyNDNRxDNRxNPS9XRzleTUBdTD9VRD1PPjhOPj1URENQQ0VURkhWTVBdVFdfU1BdUE5iTUFnUUZo + VVNqV1VtWF1nU1djUE5aR0VQRD9QRD9ORkVTSklYSk1XSUxWTEpWTEpcSkVeTUdYTVBbT1NiVlpj + V1tpUVBiSklUREBRQT5eSkpjT09iVVViVVVjUFBnVFRrV1dnU1NeTVBiUFRjUUxdTEZWPjhPODFR + OzFWPzVaRDxYQztWRD5bSENbTkxdUE5iUU5hUE1dR0NfSUVqV1VvXFpyXlxuW1htU1NqUFBkTVBn + T1NoTlBkSk1hTU9kUFNlV1poWlxpX1VcU0hUSD1TRzxeSERiTEdhST9lTkRoTTtpTjxiSEFfRj9h + ST9hST9eRztdRjpeRUFfRkNeSEBdRz9fTExiTk5eSEBVPzhTPTleSERoVFFqVlRQQCpMPCZNOilH + NCRJNC1OOTFIOSpNPS5TQzNdTT1dSkVfTUdWTk1YUE9iVVVnWlphV05aUEdUREBTQz9TSkdVTUlb + T0ZiVk1iUU5hUE1bTERRQztXRjpXRjpVRjxTRDpRQzlPQDdRQT5WRkNWTkhaUUxdTkdeT0haU1Vf + WFtnW1xqXl9rXWJrXWJhWlBWT0ZRQTNKOy1PPCtRPi1OSEReWFRoW1hhVFFQSkREPjhHPDNKPzdN + SUFTT0deV1dcVVVbU01aUUxcU0llXFNpXFdhVE9bUUVYT0NdVU9XT0lUSD9TRz5MPi5RRDNURDhY + SDxcTEhfT0xeVlNhWFVdVFVYT1BWSkFcUEdhVFFjVlRfTkhWRT9QTUdaVlBiW1tdVlZjVlRtX11q + XVtpXFpbTklaTUhdTkZfUEhaUERPRjpMRzxPSj9iWFxtY2dvZWtyaG5uZWJoX1xnV1BRQzxYRUxp + VVxkW2FhV11VT0hWUElXTTxYTj1cTEhnVlNuW1VhTkhQQCxQQCxTRkFbTkldU09dU09kUFNhTU9I + QDtAOTNGNytKOy9TSUBYT0ZbUEFWTD1TSTRUSjVVRTBQQCxbSUNlVE1hU0VcTkBUQzpUQzpXRkBb + SURYSElXR0hUSkxXTk9YTkpbUE1jV09vY1tuX2JoWlxfVFVaTk9aTUhRRUBUQz1RQDtRQT5TQz9T + R0hWSkxXSU5YSk9YTElaTUpcUFFbT1BjVlRoW1hqWlhkVFNWSkNQRT1WRT9YR0FbT0deU0pjT1Fn + U1VnU1BkUE5hTU1hTU1fTkFXRjpVPjRYQTheRT5fRj9aTkVWSkFWRz9TRDxVSERXSkZcUEhcUEhc + SUdlU1BqXF5qXF5nXFZkWlRlUU9nU1BfTU1kUVFiT0hjUEllTE5tU1VwXV1yXl5yX1ZhT0ZRRzVM + QTBRPzpaR0FlTUhuVVBtVUhqU0ZjSUVdRD9hSEFjSkRaSDxYRztWRD1YRj9bRDpaQzlbSURcSkVb + SD9RPzdUPjpdR0NlU0xlU0xbSTpQPzBRPitOOyhKOy9JOi5IPzNJQDRURT1dTkZeT0hdTkdWSkNY + TUVjUFNnVFZfVVRXTUxYQz1XQTxTRDxURT1cSUdkUU9qVlhpVVdeUU1XSkZbSUBYRz5YT0VdVElf + TUZaR0BXRj1cSkFaSUZbSkdaUUxbU01dVFdjWl1kXWJoYWVvY2dtYWRoW1ZWSUVOQDNJPC9RQy5W + RzJMTURTVEpYV1RbWlZNSklDQD9HPjVKQTlKQz1PR0FcU1ZcU1ZfU05aTUhXVFBaVlNjWlBeVUxe + VUxdVEpcVFBbU09aSkBTRDpNRDhTST1XRj9fTkdeVlNdVVFbVFRbVFRaT0xTSEVRSD9XTkVcUFFc + UFFbTEVWR0BUSkBdVElhV1hhV1heVVtpX2VpW19kVltRTElTTUpXUUFbVUVXVUhKSDxJQzlRSkBa + V1tlY2doYWNqY2VvYWVtXmNiVVVRRUVbR05kUFdfWF1bVFhVTUdYUEpdUUhfVEpdU09kWlZoV1Zd + TUxVST5aTkNfVU9hVlBaT0lYTkhdT1ReUFVQST9GPzVFOClHOitKQz9WTkpfVExdUUlWUURXU0Vb + U0BYUD5dUE5jVlRjU0ZYSDxVRTdYSDphTkViT0ZaTkZXTERRT0RTUEVdU1FlW1pqYWRvZWlnYmFh + XFtaUU5XT0xYTEdVSERTQDtQPjlRQDpPPjhPQDpWR0BbSklcTEpYTk1aT05XTk9bUVNcVFBeVlNk + WFpeU1RbTEVWR0BTQTlRQDhYRj9eTEViTlBfTE5lTUllTUlbSEhaR0dbSEFbSEFaSDxeTUBnT05l + Tk1cUEhWSkNYSj1TRThVRj5YSUFbTERbTERcUVBhVlVjW1pkXFtiXVNdWE5cVFBcVFBfT0xiUU5i + T0ZhTkVcSE9lUVhpWmNvX2l0XVdjTUdUQC1OOyhKPDVTRD1hTkxoVVNiUUNdTT5bQzxWPjhYQztY + QztYQztYQztaQTtbQzxXQTpXQTpeRkFhSEReSTxWQTRTQDtaR0FeTUZeTUZaSkBVRjxYRTNUQC9O + PjBMPC5JQDhKQTlUSUZdU09jU09iUU5aSkNYSUFeTUdiUEpiUU5eTkpfTExVQUFRQztURT1aR0Fk + UUxqVltrV1xiVldeU1RfT05hUE9eWFZjXVtiU0xbTEVbT0ZcUEdbT0RWSj9UUEhUUEhYT1VcU1he + Xl5iYmJoYmpkXmdjWFVWTEhPQTFOQDBRRDRVRzhRTT9XU0VbVkxYVElOST9FQDdHOTJJOzRMPTdU + RT5YTk1aT05bUEpXTUdVT01YU1BiV1FhVlBlVk9oWFFjWFVeVFBTRkRQREFQST9UTUNaTkVhVUxi + WlRcVE5dVVRaUVBYTEdTRkFUSkBaUEZYVFNWUVBXT0lQSENVTD9eVUhlW1doXVpiXV5pZGViVVNY + TElOST5TTkNcVUxeV05YU0xWUElPSUNQSkRWVFddW15iW11rZGdwYmdpW19bT1BVSUpaRkpeSk9c + VVVcVVVcU0ldVEpcVUpcVUpXT05cVFNcVlFbVVBeU1RjV1hkXFteVlVTTENVTkVeU1ZdUVVUTkdQ + SkRIRTRFQTFORkVaUVBfV1FeVlBfWlNeWFFeWFZbVVNdV1VcVlRcU0ZPRjpURTtdTkRkU0xfTkdX + TEBRRjtRSD9USkFaT1dlW2NvZWlqYWRlWFRhVE9fUEhbTERbTERXSEBUQzpRQDhNPDBNPDBTRTha + TD5eTURcSkFcTEpcTEpcT09dUFBcUU5cUU5fVFdaTlFYSEVTQz9NPzJMPjFQPkBbSEpfT0xhUE1f + TUdcSURcRj5cRj5XRj9bSUNdTUliUU5qV1doVVViT09cSUlcSUNYRj9XSEFbTEVdTUleTkpfU1Nf + U1NkWlhnXFtfWlNdV1BaUVBaUVBhTlBjUFNiT0lhTkhhTFBnUVZkWmdvZHJtXF1eTk9RRCtKPSVK + OTJWRD1iUU5kVFBiUUNcTD1dRjxXQDdbRDhYQTVbQz5bQz5bSEFYRj9aRThaRThdRUFfR0RXSDVT + RDFQPzNYRztdSkFfTURaSkNWRz9VRDhTQTVQPzdOPTRJPC1MPi9TRz5fVEprWFhnVFRaTUhTRkFX + SkhaTUpaT0laT0lcT01YTElYSUNVRj9YSEVkVFBnXWNlXGJkWlhiV1ZjU09kVFBhWFdjW1pkW1Bj + Wk9iWlZeVlNdVElWTUNNSj5NSj5PTEZPTEZWV1BdXlddYmNbX2FiVVVaTU1RQTNVRTdUSTtYTj9d + U0FeVENYVEhWUUZRSDxEOy9IOSdKOylMPz1QREFXSkpcT09YVElVUEZOTEBWVEhfV1RfV1RoW1ht + X11lXl5cVVVRSkFIQTlUSUReVE5jVlRjVlRlW1djWFVhWFdYUE9XTERVSUFaUERjWk1iWFpdVFVd + TUlYSEVWTURiWE9lYWRqZWllYV9bVlVaTDxVRzhKSDxUUUVhW1RhW1RdVVRdVVRXSD5VRjxWTU5Y + T1BeWltoY2RpZ2heXF1dUExTRkFTRD1bTEVXUEZbVElkVFBiUU5eU0lcUEdTSklVTUxbUE9fVVRj + V1hlWltdV1BVT0hTSUBWTUReTEleTElUTEZWTkhRTEdQSkZWTU5fVldiVVNhVFFjV09kWFBkWlRe + VE5dVlZbVFRaU0lKRDtUSkFcU0lhVU1aTkZWRTxTQTlRPzpVQz1UUVNeXF1pX2NnXWFkVFNiUVBa + T0lbUEpcT0pXSkZVST5QRTpTQTJWRTVeUU9fU1BjUFBbSEhYRUVYRUVXRUNYRkRXTERXTERXTUdV + SkVaSkNURT1NQTdNQTdPQ0BVSEZhTUpeSkhhSkZeSERbRjhbRjhUSD9YTURjV05qXlVnVFFjUE5f + TUpdSkhfTElbR0VYQz1aRD5aR0BeTEVhTU1lUVFnVlVnVlViVk1fVEpdTUxaSUheSk1fTE5eTEZh + TkhlT0pqVE9pV11yX2VqX15eVFNcTDRURC1VPTdbQzxeTEZhTkhlTz5kTj1jSUNlTEVoU0VeSTxc + Rj5dRz9bSD9aRz5bRjtaRTpWRDtXRTxTPS1RPCxROi5XPzNdSD1hTEBaSkNaSkNXRzlTQzRTQDpP + PTdPOy5POy5TRThdT0FpV1tpV1thVE9XSkZVSkVWTEZXTE1YTU5cSkRdTEVeTk1cTEpdT1FjVVdj + XF5jXF5jV1hkWFplVVRnVlVoV1hpWFpjWFVlW1dkWFxkWFxfVVRaT05USkFPRj1ORTxRSD9UUEhc + WFBfXV5fXV5nVldbSkxYRTNdSThhU0VlV0lhXlNfXVFaVk5WU0pTTDFHQCdUPSlaQy5QSDlRSTpY + TUVcUEhaUU5cVFBUTURXUEdfXFhkYV1nZGNnZGNnXltcVFBPSTpIQzNWSUdkV1VkWFpqXl9hXFti + XVxfVVRYTk1YTUVbT0dfV1ZlXVxpXl1lW1phU1dbTVFVTE1dVFVpY2ltZ21oYWFdVlZcSkFUQzpK + RjtUT0RdXFhhX1xhWlxYUVRXRj1VRDtRRUVYTExdWl9lYmhoZG1dWmJXTkVORTxPRj1XTkVfVEpl + WlBrWlRpV1FiVVBYTEdTRDpYST9eUU9iVVNkWFphVVZeU0lVSUBWSDtYSj1hT0lhT0laTk9YTU5W + T1FWT1FeU1RkWFpfVU9hVlBkXVRlXlVoVVNiT01bT1BfVFVaUUxVTUdVUUlYVU1eVFNaT05TRkRT + RkRXRTxVQzpeVFNnXFtpYmJlXl5hVFFaTUpXVE5cWFNYUUdVTkRXTkFXTkFcSUdiT01kW2FiWF5k + VFBeTkpXRT5VQzxVRj9XSEFVSkVVSkVYTEdXSkZcSUNXRT5VRjxRQzlRQzlYST9oU0doU0dkU0Zd + TD9TRC9URTBRSj5bVEdkXVRkXVRpV1BjUUpdTUlhUE1dSkVXRT9aQThbQzlcSEZfTElhTUpkUE5j + VE1jVE1iUEpiUEpfTUdbSENcTEpcTEpeTExkUVFoVU9uW1VtW150YmV1Y2ltW2FrVkddSDpUPTBV + PjFXR0RkVFBuW1R3Y1x0YV5wXVt0XE5pUURfSURbRT9bRT9cRkBWQDtXQTxYRDlUPzRPNSVTOShU + OitbQDFdRz9eSEBkTkZiTERcSjxVRDVaQzlWPzVQOydOOSVTQTJdTDxnWldoW1hpWlFhUUlWSkFR + Rj1VSERaTUhhT0ZhT0ZdTU5dTU5YT1BdVFVlWltlWlthVFRhVFRjU1FlVVRnVlVnVlVjWFVjWFVn + VVhpV1tiVVVdUFBYRkhWREZOSkdNSUZOSkdaVlNfXV5jYWJkV1NeUU1fT0BkVEVnVlNpWFVqX15l + W1pbVElbVElcTj1dTz5qU0FqU0FdU0FcUUBbUUhbUUhfVFVhVVZbT0ZcUEdeXVdpaGJpaWdnZ2Rn + WlVjVlFWTUNPRjxaSExtW15qYmlpYWheYV9aXFtfVVFaT0xdTkdlVk9kW1xoXl9jXl1cV1ZdVFdY + T1NUT1BbVldrZGltZWppXV5hVVZaTUhVSERJRzxUUUZfW1piXVxfXltWVVFVTD9NRDhORTtbUUdf + W15lYWRkXGNcVFtVTUxIQD9JQzpQSUBeVlBqYlxtX1tqXVhhWlBXUEdTQzNXRzhdV1VfWldnXFtk + WlhiVERYSjtWTUBcU0ZlVE5oVlBcUVBaT05aTE5dT1FdVFVhV1hhXVdhXVdfXlhfXlhiT0lcSURe + TExiT09fT05nVlVnXVNnXVNhVFFcT01VUEZUT0VYST9XSD5lV1xrXWJtYWJlWltbU1FXT05cV1Zf + W1pdVklXUERWT0NVTkFcT09kV1djXGFiW19fVVFbUE1XRztWRjpXRTxYRj1VRUFUREBVRURbSklj + UElcSUNaRThVQDNQRkBdU01oW1ZrXlpiWlRbU01XRzlURDVWTEhiV1RlW1pkWlhoUUliTEReTkpi + UU5fSj9VQDVaQTVeRjphTkhkUUxiT0hhTkdcT01iVVNnU1NkUFBcSURaR0FcTEhiUU5hUE9nVlVq + V1FrWFNtWFtwXF5zXmNvW19qWE9dTENaPy5hRjRkUVF1YmJ1ZGV1ZGV3Y2F1Yl9zYlNnVkdeTEZW + RD5WQDlVPzhXOTRUNTFWOCpTNCdFMB9QOylVPjFXQDNfSDxfSDxiUUVhUERjTD9iSj5jTj9aRTdU + RC1PPylaSDpfTj9nWldlWFZoWFBoWFBcTUNVRjxaTD5cTkBjU09jU09dUVVcUFRWUExcVlFjW1dh + WFViVVBeUU1iU0xiU0xjVlRlWFZlWlFhVU1lWFZlWFZiVk5cUEhVSkdQRkNHR0dFRUVERkVRVFNe + WltkX2FkXFZjW1VoXVxqX15tXmFqXF5vXVdrWlRlWlBoXFNfV1ZjW1pyYV1yYV1pXltlW1djWFNe + VE5fWFtdVlhUTEZbU01pXl11amlpaWtkZGdYVU9bV1FUVEhKSj9USk5jWl1rYmhpX2VeXl5YWFhV + UE9VUE9eVE5kWlRkXV1nX19eW1dXVFBdWFdUT05VUE9cV1ZpYmRoYWNhV1hVTE1QSkZWUExRR0FR + R0FUU01cW1VfXFZbV1FeT0dVRj5QRkBbUEpiVFhlV1xjVVddT1FcTEpOPj1JPz5USUhjXFxqY2Nk + YmFcWlhhVlBWTEZVRj5YSUFcWlhiX15nXV5kW1xfVEhjV0xiV1RqX1xkY19jYl5eWFFQSkRVRUFc + TEhXT05eVlVlV1xrXWJvZGNnXFtcTD1YSDpcSURhTkhdU01kWlRoYl1nYVxnWlpfU1NaVE1YU0xY + T0ZcU0loWl5qXGFhXFtcV1ZaT0lbUEpeV1dhWlpeVlBWTkhYTkhaT0liUFZhT1VdVFViWFpeVFNY + Tk1YTj9VSjxeSEBeSEBVQz1UQTxVSEZbTkxnT05jTEpWRjpURDhaTFBlV1xtZWhtZWhtX19kV1dY + TURUSD9eUFNnWFtuW11qV1pkUUxjUEpkUVFjUFBdTD9aSDxfSj9jTkNqVE9qVE9oT0NjSj5YR0pc + Sk5cT01eUU9dTEVbSUNdSUdhTUpdUExjVlFkWFBnW1NqV1drWFhqWFxqWFxkV1VeUU9pUUdyWk9v + Y2R0aGlzYl5yYV1tYlxuY11uXlRdTkRdRD9YPztNOilQPSxQOihMNSRIMh9JMyBTPCxbRDNeSDhd + RzdkT0BoU0RfTkViUEdjUUVhT0NlVEdfTkFbTT9XSTxeT0hhUUpiVVNlWFZlXlRoYVZnWEpfUURi + Sj5kTUBiUFRpV1teWltcV1hcVUxeV05iWlRiWlRdVVRXT05YTkheVE5dVU9fV1FeV05bVEphV01i + WE5nV01fUEZYTkhUSURJSENHRkBOQ0ZWSk5fVFVlWltnXV5qYWJtY2dpX2NpX2FlXF1nXVBnXVBr + Xl5tX19nX2RqY2hpYmdqY2hnX2RjXGFiVlpdUVVeVFxfVV1aT05hVlVnWF1zZGlrZ2pjXmJcUU5d + U09YUEpUTEZWT1FjXF5qYmlkXGNcV1hXU1RWT1FWT1FaVFFfWldhWlpiW1taVE9YU05aUFFXTk9V + UU5cWFVlXl5jXFxdV1NRTEdPR0FUTEZOQztPRDxUTkdeWFFeV05dVk1OSkNOSkNQTUlTT0xjT1Rl + UVZfVU9WTEZNRUFHPzxGPDtPRURaUVhkXGNlXF9fVlpcUFFXTE1TSklRSUhfW15qZWllXmFdVlhh + VlNjWFVeV1ptZWhyaWVqYl5hT0ZRQDhOQT1QRD9TSEdVSkldVV5nXmhqYWJeVVZaUERUSj5WRz9b + TERdUExjVlFhYWFhYWFkWF5eU1hdUFBdUFBdSkhfTUpjVlZjVlZeVE5dU01dUUldUUlcVVddVlhd + UUlYTUVaT0lbUEpeUVFeUVFeUU1iVVBYUE1WTkpcTUNfUEZjUUxcSkVTRz5QRTxVR0ldT1FiUU5f + T0xaSEFVRD1USk5lXF9vaGpqY2VpXltcUU5VRj5YSUFkVFBtXFhrWFZoVVNhTk5eTExkUE5iTkxi + SkBhST9eSkhiTkxqU1ZqU1ZkTEhiSUZdSUdeSkheTEleTElbTEVeT0hiTEZhSkVeT0dnV09nV09l + Vk5nVE5pVlBnVVhnVVhjVVdjVVdvXFxzX19zYmNwX2FuXFVuXFVuY11tYlxrXU9cTkBYQTRTPC9K + NCNNNyVOOCRPOSVONypTOy5dRTtkTEFlUEVoU0doVU9kUUxiTUFkT0RkTEVlTUZjU09hUE1hVE9b + TkldUE5fU1BdT1RjVVpkXFhrY19tXFhkVFBkVUpjVEllVFdtW15pXFxjVlZiVVBiVVBjWl9lXGJk + VlhYSk1YTEdaTUhcU0heVUpeVlBdVU9iVk5jV09oVVVoVVViVk5eU0pUT0VPSkBTSEdVSklYVVFh + XVpjXmJlYWRtYWdoXGJoXVplW1dkXFhpYV1qYWJpX2FoXWVpXmdlYmhkYWdoYWNhWlxaVVZXU1Rk + VV5kVV5fVlpeVVhlWl1wZGhpZ2heXF1eT0haSkRaTkZaTkZYU05jXVhnY2lfXGJfUVRaTE5YTElb + TkxbVVBaVE9hV1hhV1heVVZdVFVWT09cVVVWUVVaVVhjWl1lXF9eWk9QTEFOSTxOSTxOQzpQRTxX + TUdiV1FhVlNcUU5MRkRPSUdUSUhRR0ZeTk9jU1ReUD9URjVOQzhJPjNNPTxQQD9WSk5fVFdiVVNf + U1BYRkRcSUdRSkpVTk5fW1xpZGVqXF5hU1VaUVBdVVRfWFtwaWtwa2FnYldcSDRTPyxIQDFMRDRM + QTxNQz1UUFhjX2hkW15aUFRYTURVSUBRRjtVST5eTExoVVVoXmJhV1teUFNbTU9YTElXSkhaR0dc + SUldUUlfVExfVVFdU09bUE9hVlViWFxhV1teTExbSEhdTUxiUVBdTkdeT0hhUE1eTkpdT0FdT0Ff + TkVjUUhiVVBfU05aT0xWTEhcSUxeTE5hVE9jVlFdT0FaTD5YUE9kXFtwZGhtYWRrWFZdSkhVRj5c + TUVnVlVtXFtoV1hjU1RaTkZXTERfTEliTkxiSUVeRkFdRkVjTEpnUVtnUVtlUVFeSkpiTERfSUFc + SUddSkhdUFBdUFBfTEliTkxfTU1iT09jUEpjUEphTkhiT0ljUE5jUE5oVVdrWFtyXV90X2JvW1hr + V1VuVlVtVVRwWlRrVU9oU0VbRjlXQTpRPDRQNyZWPCtaQzJbRDNcRTtdRjxhSkZkTklrVFdzW15y + V1xvVVpfSUFfSUFfTUdhTkhcT09cT09eTk9XR0hYSEdXR0ZUTEpaUVBjV1htYWJuX2JnWFtnXFhq + X1xnXWNoXmRnWF1jVVpiVFZkVlhkW2FpX2VqV1VeTEleTURaSD9WSkFcUEddUUhfVEplWFRlWFRp + WFpoV1hiWlheVlVXT0xUTEhYTk1XTUxUU0pXVk5jW1pjW1plWFZkV1ViV1RiV1RhVlVoXVxoYWFf + WFhhVVheU1ZjV1thVVhfVlpbUVVUUVNTUFFeU1hlWl9fV2FdVV5jX2hnY2tuaW1lYWRcUEhTRz9d + UE5hVFFjWlBnXVRpYmdkXWJjVVdbTU9YTk1XTUxcU1RdVFVqX15pXl1kXV9bVFZWUE5WUE5WUE5b + VVNlXF1lXF1oW1hXSkhUSkFORTxPRjxaUEZiT01lU1BfVFdbT1NRQUNTQ0RQREROQUFYTUVdUUld + TjlVRjFURDRPPzBJOzNKPDRVSkVYTkheUU1aTUhXRkBXRkBVSUBYTURbVFRpYmJlXFNbUUhXTUdd + U01eXF9raW1waWlkXV1YRDlVQDVQPzNTQTVQPjhUQTtXU1ZhXF9jWFdbUE9RSD9ORTxVRDtcSkFi + UEpnVU9kV1VfU1BXTERVSUFTRkFVSERXTERXTERaTUpeUU9iV1FhVlBiV1RkWlZpV1tpV1tjU09e + TkpfU1BfU1BcTUVcTUViUEpeTUdeTENfTURlVVRpWFdjWFVjWFVeVlNXT0xaSkRbTEVdV1BdV1Bd + TkdYSUNcUFRhVVhqXV1qXV1nVU5eTUZWSUVhVE9uX2JqXF5oV1ZiUVBYTURYTUReTEVhTkdkT0Rd + SD1cRURjTEpiTlNjT1RhT0ZeTURiSUNhSEFaR0FfTUdkVU5iU0xhTkheTEZdTEZcSkVeTURfTkVh + UE9hUE9jT09iTk5nT1BqU1RvVFRyVlZrUVFrUVFtU1NqUFBoT0VqUUdnUUZiTUFfRztdRTlfQzRi + RTdfRzpiSTxjSkZiSUVeSk1lUVRtVVh7Y2d7YV1wVlNfTkhdTEZYRj1bSD9bTkxaTUpdSkpWRERU + RT5WR0BVTUxWTk1iVFhpW19uYmhtYWdlXVxnXl1jW2RhWGJhVVheU1ZbU01fV1FnXV5qYWJrXFRj + VExhTkVcSUBYSUNXSEFaSEFeTUZoVVduW11nW2FkWF5cVVVYUVFaTkZWSkNbTEVbTEVbVkxeWk9o + XVxhVlVfU1NfU1NdU01eVE5kVltpW19qXF5cTlBeTkpeTkpfUVRhU1VbUE1TSEVTTUhTTUhXUU9d + V1VcU1RbUVNiW11jXF5qYWJlXF1hV01YT0VhVE9kV1NnYldnYldpYV1rY19kXlxeWFZRT05OTEpY + TVNoXGJrYmVuZGhiXVxYVFNUUEpVUUxdUExkV1NqYlxoX1poW1ZeUU1cTD9QQDRPSDxYUUVkVFBk + VFBfU1BbTkxVTENORTxPPT9RP0FWSkFdUUhnU0BkUD5iUEFcSjxKQTVJQDRWTD1aT0BbUUdXTkRX + TERTRz9WSDtWSDtYTVBkWFxhWFVXT0xaSkNdTkZkYWloZG1oY2JeWlhbSTtaSDpaQTRaQTRUQzRW + RTdbTU9iVFZfVExXTERQQzVTRThcTUNjVElpV1FoVlBeVlBcVE5WT0VTTEFWRz9WRz9USEBWSkNf + U1BoW1htX11rXlxjWltiWFppV1tqWFxqXlVjV05fVk1eVUxcSkRbSUNdTUxcTEpfTElnU1BqWltr + W1xiV1RfVVFdUUlaTkZUSj5WTUBdV1BbVU5aUEZVTEFaSE5kU1hlXVplXVppVlRhTkxXT05eVlVl + XF1lXF1nV09hUUlYTUVYTUVjT09lUVFnU1BiTkxiSklkTUxjUEpfTUdfTz9iUUFkTkZiTEReTEVj + UElkU01jUUxiUEddTENaSEFdTEVfU05lWFRkW1FaUEdhSEVhSEVdSkVhTkhrUUprUUpnTUhnTUhr + TEdtTUhoTEBtUEVuVUpuVUptUERvU0ZtVUdqU0VjTkNlUEVjSkdhSEVhTVFlUVZqVVpuWF1yVFBn + SUZfU05XSkZVQzpXRTxbSURaSENWSj9USD1TQTxUQz1QSUlVTk5eV1plXmFpX2FqYWJkYmFlY2Jl + XWlfV2NjVlRhVFFdVU9fV1FjXFxnX19tXFtoV1ZjWFNdU01aTkZVSUFXRT9dSkVdT1FkVlhiW1tb + VFRUTkxUTkxaT0xaT0xiTkxnU1BkWlZlW1dkXV1bVFRWTk1XT05bT0deU0pjV1hpXV5lXVpYUE1Y + TEdbTklYUEpXT0lUTURQSUBUSEBVSUFTTUpXUU9aUU5XT0xbVFRdVlZoW1hrXlxoXVpkWlZjW1pk + XFtiWlhkXFtkXFhoX1xjZF9iY15XUEZRSkBRSExfVlptZWpwaW5kYVtcWFNWUUdTTkRlVVRqWlhu + ZWJtZGFqYl5kXFhhT0hUQzxUTEZfV1FjW1dkXFhhVlNcUU5aVUlNSD1VRD1PPjhVTUdcVE5rX1Rq + XlNnXVNfVkxTTT1QSjteU0ljV05fVkxaUEZTTUZQSkRVRzhXSTpUTEpcVFNdV1VbVVNbTklfU05q + ZWdlYWJqXVhjVlFiUUNiUUNjUUFiUEBYSjpTRTRcSUdhTkxaTkZRRj5VRD1dTEVoXl9rYmNpX1Zo + XlViWlZhWFVdWE5YVElbTERWRz9USkBWTUNlXF9vZWlvZWttY2loXF1hVVZhWF9nXmVtZGFlXVpk + VU1fUEhfTURdSkFWTURbUUhdU09lW1dpXFxqXV1lWFRdUExdTkdYSUNTSUBaUEdfVVRdU1FcTUZY + SUNcTE1nVldoYl9kXlxkUU9dSkhYSk9eUFVeVVheVVhfUEZeT0VdTEVeTUZlUVFjT09fTUdhTkhk + SkZlTEdnUEhpU0pqW1NpWlFvV1ZrVFNkUE5iTkxfT05jU1FkVUpeT0VeTUZnVU5pV11uXGJpXl1f + VVRfTkVcSkFhSEFkTEVlUEVoU0dkTTxlTj1tTkNzVEhuVkxyWk96X1iAZV5+Y197YV10YVduW1Fp + VlBiT0liSUZeRkNdSUxeSk1jSU5kSk9lTT9hSDtcUVBWTEpYRDlWQTdWRkVWRkVPSD9NRj1RQzxR + QzxQRkBUSURRT05dW1pjXl9oY2RjYWJkYmNiWFxcU1ZeVFBfVVFcVFBdVVFiW1tkXV1vXl1wX15p + YV1iWlZdVEpWTURbTERhUUlYU0xeWFFbWlRVVE5TSkdPR0RRTUxXU1FkV1dqXV1nX2JpYmRnY19d + WlZTT0lOSkVTTUpYU1BhWlxnX2JkW1xeVVZeUVFcT09WTkhRSURVSkVUSURVSEZWSUdXTUxWTEpX + SkhYTElbUE9hVlVtWlxtWlxiW11nX2JkXV1iW1tiWlheVlVbVVNfWldbW11dXV9bVEpYUUhXUU9h + W1hrZ2pqZWldXlpcXVhcWFNRTkhaVFFkXlxnZGhraW1uaW1iXWFnU1NkUFBYVVFkYV1oYWFnX19j + W1pdVVRaU1NTTExbSklWRkVXVVhkYmVqaGlraWpraF9hXVVWU0FXVENlW1VlW1ViWlRXT0lRTkhU + UEpeT0VhUUdVTUlbU09hV1tdVFdWU01YVU9dUVVkWFxjVlRkV1VoYVRoYVRvX1VpWk9XTzxTSjhd + TkddTkdaT0xaT0xYTExnWlpuaG5rZWtkXlxeWFZeWFZiXFphW1ZbVVBaUUxNRT9USURdU01lY2dt + am5vZ25oX2djV11iVlxjXWVlX2htY2RpX2FuVlVrVFNjUUxcSkVUSElYTU5jVVxrXWRuYmNoXF1h + VU1dUUleTUdaSENdR0FlT0loVFZoVFZjTEphSUhcUFFlWltnXl1hWFdpUElkTEViUFZoVlxlWFhd + UFBeTENcSUBaST1eTkFhT0lfTkhjSkZjSkZjUEdqV05uXldtXVZwXmJuXF93XmJtVVhpUE1pUE1i + TkxlUU9kVU5kVU5kU0llVEptXF1rW1xlWFRhVE9WTURUSkFdTEZhT0lkU0xlVE1rU0x1XFV/YVuE + ZV+EamWEamV+amR9aWN7Z2l4Y2VyXlxtWldtU05jSUVdRTlYQDRaQT1cRD9eRUBjSUVkTTxhSTlk + UE5eSkheST5YRDlYTElXSkhPRUFQRkNRQztQQTpURTtVRjxTTUpfWldnXGRlW2NjWl9nXWNkV1dh + VFReTk9fT1BdU1FfVVRjWltnXV5vXWFyX2NpYVtkXFZjWFNhVlBlVEpoVk1bVU5cVk9dVlZWT09W + TEpVSklTTk9XU1ReVVhlXF9pXmdpXmdlZGFhX1xTVEpISUBRRklYTVBYWFtfX2JfXV5YVlddVlZb + VFRXUEdORz5MRzxKRjtQRkBTSENRTElRTElTTUhRTEdWTU5bUVNlVVRqWlhiWlhoX15kXV1cVVVW + T0ZVTkVXU1RXU1RcVVphWl5eU1ReU1RfV1ZtZGNvaGprZGdkXFthWFdaV1ZPTUxaVFFjXVtoaGpp + aWtnZGheXF9fWlVeWFRfWlVpY15oYWFlXl5dV1NcVlFWTVBXTlFYTkhYTkhfXV5raWprZ2hpZGVi + XFpdV1VfU05iVVBnXFhpXltjW1pbU1FYTkheVE5eV01hWk9cUVBbUE9dUVVdUVVbVVBaVE9YTk1h + VlVfWFhkXV1zZWNwY2FuZFtjWlBhUEReTkFdVElYT0VWSkxXTE1bT1BlWltnX2RlXmNoW1tjVlZc + WltbWFphVlNfVVFbT0RVST5WTURkW1FyZWlyZWltY2dkW15iVFtjVVxcWGFfXGRrYmVrYmVyYWJq + WltdUE5VSEZVREdcSk5jW2dqYm5wYmRpW11iUElfTkdfTURiT0ZeTUddTEZiT01jUE5kUU9nVFFj + Wl1jWl1jW1ddVVFoVU5pVk9pVFhqVVpnU1VhTU9iSj5eRztcTD9hUEReT0hiU0xkUUxpVlBrW1py + YV90Z2d0Z2d1YWh1YWh5YWJuVldtVEdtVEdoUU1pU05lVVFnVlNoVkdqWElrW1poV1ZnVU9hT0lU + TEpVTUxUTEpUTEphUE1pWFVyXl53Y2N+ZWl+ZWl7aGV9aWd+ZWd+ZWd+aG14YmdzXFZrVU9lTkFe + RztfRTViRzhlTUNlTUNfSDteRzpdRTldRTliT0hcSUNbSUBYRz5bTEVbTEVYRkZVQ0NRQDtTQTxO + Rz1TTEFVTUxcVFNhU1dkVltjWltnXV5oW1hhVFFcUFRXTE9aTlFdUVVjVVdoWlxuX2JyY2VpW11o + WlxpXltkWlZvXl1zYmFdW1pYVlVcVFNaUVBVTUxQSEdQSkZVT0pUTEphWFdkYmVlY2dkYmVfXWFX + VExKRz9RQzxWR0BOTEpcWlhaX1pTWFNYVU9YVU9VTkVORz5PRDlPRDlKRDpKRDpORkNORkNMRUVK + RERQSkhWUE5eVE5nXFZlXVdlXVdiVk1XTENXTT5aT0BbUVNbUVNfVldeVVZfU1teUVpcUFZvY2lu + aW1oY2doXF1lWltfWFtcVVdeWl1fW15oZWlua29oYWFiW1tdVVRhWFdhWlxnX2JpX2NjWl1hVlVb + UE9XTE1dUVNYU0xWUElfX11oaGVkYmNfXV5hWFNeVlBdU09kWlZyZWlzZ2pjYV9VU1FYU05fWlVi + X2NkYmVeVFBbUE1YT0ZbUUhaVE1VT0hUSURWTEZbW1tiYmJwZGhvY2dnYVpdV1BeU0phVU1kWkpe + VEVaR0VaR0VVSklfVVRnXFhkWlZnV1BiU0xjUVVfTlFbUUVXTkFbU0NiWkljW1dpYV1yZWltYWRi + W11eV1pbVFZcVVddVlthWl5oXmJrYmVrY2JjW1peU0pWSkNUR0NaTUhiWmNrY21vXl9pWFpkVFBl + VVFoV1RoV1RhUFFcTE1dUUlfVExlWFZoW1heV1dfWFhlWFhiVVVnWldpXFpnWFtlV1phVFFeUU9n + TkdnTkdlVEdoVkllWFZjVlRjVlRpXFpuZGhwZ2p0X2lyXWdvW19vW19uXFNnVUxrVkprVkpqV1Fo + VU9qV1VnVFFrVkpwW09pWFpqWltnVU9dTEZTSUBUSkFTST9aUEZjUVVwXmJ4ZGd3Y2V3Yl93Yl90 + ZF11ZV55ZGd6ZWh5ZGdvW11tVlFpU05fSDteRzplTUNrU0hpVEhkT0RbSTtYRzldRjpeRztfUEhd + TkZeTURdTENhUE1dTUlfTUdbSENWREFWREFNSD5RTUNUSkBXTkRXTERbT0diWE9tY1pqYl5jW1dh + WlxbVFZYT1NYT1NbUVNiWFprX2FwZGVzXmVvW2JqYWJrYmN1aGhzZWVrX2NkWFxiVFZfUVRXT05P + R0ZRSD9TSUBPR0FUTEZaU1VhWlxjW2RdVV5aTUhRRUBWSTNQRC5JRzxQTkNWVlRUVFFhT1NhT1Nf + UEZcTUNTSDpPRTdQRz1PRjxQRTxNQTlKQUNKQUNRR0ZdU1FbWFdjYV9nZGhdW15eVUxVTENWTEhd + U09fVlpfVlpdVlZdVlZeU1hfVFpcU1ZqYWRoZGphXWNfVlphV1tiW11dVlhbVldfW1xpZ2hoZWdn + XV5eVVZaT0xaT0xaUU5hWFVoXl9iWFpjVlRbTkxbR0xdSU5TTExVTk5fX19paWlhYV5aWldfV1Rc + VFBhWlpnX19wZ2huZGVfXVxVU1FVTk5kXV1tZ21qZGpeUU1YTEdYT0ZbUUhXU0hTTkRPSUNTTUZa + V1tnZGhrYmNoXl9dVEpeVUxeWlhnYmFrXlpbTklTQTtTQTtVSkVcUUxjWFVlW1diWlZhWFViVVNc + T01WVEhcWk5nY19pZWJrZ2hvamtrY2plXWReW1VXVE5XU0dcV0xiV1FjWFNjV1hrX2FwY2NtX19j + XFNYUUhWTEZiV1FuYmVuYmVyZF9rXlppXltqX1xoXVxkWlhhVU1dUUlfVVRlW1poXl9lXF1fV1Re + VlNkWE9nW1FpX2NrYmVlWFhfU1NjVlRkV1VoUE9qU1FtWlNyXlduYV5nWldkWlhrYV9uZGVtY2Rq + V1plU1VkU1hpV11qXVtqXVtyXl5yXl5uWlxpVVdoVVNpVlRuW1VvXFZpW2JiVFtdTkdRQzxNQTpT + Rz9eTENnVEptXFt0Y2J5ZGd0X2JuXVpuXVpwX1x1ZGF5ZGRyXV1pVlhnVFZrVU1tVk5fSUFiTERi + TUFkT0RiUUNcTD1bST1YRzthTEBnUUZdUUleU0pjUEliT0hhUE1hUE1fT1BfT1BaSENaSENTSENV + SkVUSUhXTUxYTU5cUFFoXVxuY2JqYWJnXV5iXVxbVlVcVFNbU1FWVFVeXF1qYWRuZGhzYmNwX2Fu + YmNzZ2h0amtwZ2hzX19tWlppVlRhTkxbT0dYTUVRSD9RSD9QRztTST1WSkxeU1RhVVhfVFdcUEhY + TUVVSUBUSD9NRjpKRDhRTEVTTUZcTEpfT05hU0ViVEZbUUhUSkFUR0VVSEZXR0ZVRURUSUZQRkNR + R0ZeVFNiXGJqZGpoZGpcWF5VVFBWVVFeV1peV1pkWFxjV1taU1VbVFZfVFVfVFViVlxnW2FlYWRi + XWFdVFVdVFVeV1pYUVRVVVVaWlplYmhkYWdeXF9UUVVPTkpRUE1cT0pfU05jWltjWltjW1pcVFNj + T09iTk5PSkxaVVZiX2NnZGhdWlRXVE5aVFFcVlRiXVxlYV9rY2pkXGNdVlZYUVFbUE9lW1pvYmJu + YWFfVEpbT0ZhVUlhVUlaUEdWTURPSj9TTkNfW1pkX15lXVdhWFNYTkhcUUxYVlpoZWlpYVtXT0lW + SDhXSTlXTkFdVEdhXFtlYV9oYWFnX19hV1hcU1RaVlNhXVpqaGlraWpybXBybXBqZGppY2ljW1VY + UEpbVEpjXFNlXlViW1FhWFNlXVdyX2N3ZGhtXmFfUVRcT01lWFZtXmFuX2JvZGNvZGNtYWJrX2Fn + XFtiV1ZkVUpiU0hjWl1qYWRpX2VlXGJfW1BbVkxjW1dtZGF0aGttYWRkVFNfT05jVVdjVVdnVldr + W1x1ZGV4Z2hyZ2VuY2JrYmNtY2RtY1piWE9fUElhUUpjVlZpXFxvXF5rWFtvWl5vWl5nVU9lVE5j + UE5oVVNpV1tuXF9pW19iVFhcT0pVSERVRj9XSEFjT01lUU9tXFtuXVxwV1BrU0xuVU5yWFFtWlRv + XFZuW1FpVk1lVVFoV1RrWFZnVFFdTTpeTjtlUENlUENiUUViUUVhUERjU0ZpWFVpWFVfT0xfT0xi + UEliUElkVFBkVFBiUVNeTk9cU0lbUUhiT01hTkxeTkpfT0xaTlFdUVVtYWRvY2drYmVrYmVnYV5e + WFZdV1BdV1BeV1pjXF5nX2JqY2VoXl9lXF1oYl9vaWdza25vaGprW1poV1ZjVlFcT0pcUUxdU01Q + TEFRTUNaTUhbTklXTE1bT1BYTU5YTU5eVE5eVE5YU0xXUUpUSTtTSDpXRj1bSUBYT0NaUERaV0pe + XE9cV1ZWUVBQSkhOSEZUSEBRRj5USD1TRzxVRj5fUEhhWF9nXmVeWlhWUVBPT01UVFFcVVdcVVde + U1RdUVNVSkdXTUlaUVBbU1FdVFdhV1tiWFxoXmJcVVVYUVFUU01NTEZWU09VUU5eV1xkXWJhWlxX + UFNNSklQTk1fT1BiUVNoWlxqXF5lX11hW1heUU9eUU9WTEpfVVRjXVtjXVtfU05XSkZTTk9YVFVe + WlhkX15jWl1iWFxeWFZbVVNbUVViWFxwZGVuYmNdV1NcVlFpYV1jW1dhTkxcSUdXSEFaSkReW1Nj + X1djXE9dVklVT0hVT0haV1ZkYmFpXVRcUEddTENjUUhnVU9qWFNiW19kXWJqX2hrYWljXF5dVlhb + VVNfWldtZG5uZW90a3hzandvZG1uY2trW1dkVFBoWlxrXV9nYV5jXVtfWldoYl90am5zaW1uWldi + TkxbT1NhVVhuYmV0aGtwYmRuX2JwX15qWlhjWFNeVE5jVE1oWFFrYmV0am5qXmJiVlpfVU9nXFZt + Y2d0am51ZGVtXF1cUEhcUEhhVVhfVFdhV11rYmh1aW14a294a21yZWdyZ2VtYmFlXFNfVk1dUUlj + V09uXVpvXltrXlxqXVttWF9oVFtiUEpkU01nVE5kUUxoVlpvXWFtWlxnVFZkTkZdRz9aSDpYRzlc + SkVfTkhlU1BlU1BqUUptVE1vVU5zWFFuVU5tVE1qWExpV0puXVxtXFtwVlhrUVRjTkBjTkBnUURq + VUdrUU1tU05rVFNyWlh1X2RzXWJfTU1dSkpdTkZfUEhiT01kUU9nU1NjT09bU09YUE1eUU9eUU9j + U1FlVVRkVFVpWFpnX2JrZGdqZGpoYmhlXVphWFVeVlNfV1RhVFRoW1tkX2NnYmVlXF1jWltiXFpo + Yl9tZ21uaG5pXltiV1RjWFdfVVRYT1BaUFFaU0lYUUhYUUhYUUhdTUlYSEVVRDhaSDxcUU5nXFhl + XF1kW1xhUUleT0ddTENeTURfVkxbUUdYV1FeXVdfW1xXU1RORkBHPzpRQzlQQThTRz5XTENNR0BO + SEFWTVNiWF5hVlBVSkVNTEhPTkpYUVRXUFNQRkBQRkBORTlQRztMRz1OST9UTEpYUE9eWlheWlhd + VVFYUE1RSkFORz5USUZVSkdaU1NbVFRfWFhcVVVVTUlQSEVaTUpeUU9jW1dlXVpqXVtoW1hcUUxc + UUxaT0lWTEZiVVNiVVNhUFFdTU5UTkxWUE5aUFFeVVZqWFNpV1FqW1RiU0xcVVdfWFtvZWluZGhe + XF1kYmNoaGhcXFxWTEhOREBWR0BbTEVfWFhjXFxuYVxpXFdeWk9aVUpeWlhkX15rXlpnWlVnV1Br + XFVtXFtlVVRdWFpjXl9qX2hoXWVnVldiUVNaUUxeVlBnYmVtaGttZGtqYmlwZ21zaW9uYWFtX19p + YmdrZGlqXmRnW2FkXWJtZWpzanJzanJkXVRTTENYTVBoXF9uZGpyaG5uZWRtZGNwX15uXVxtXVZn + V1BiWlhqYmFza25waWtkWlhbUE9YU05fWlVkY2hlZGlrYV1jWFVjU1FlVVRhU1dfUVZkVV5rXGVy + ZWt3anB1aWpwZGVuX2JqXF5pWFVoV1RpWFVpWFVrW1pvXl1tX11uYV5tWF1oVFhjSkZfR0NeSERf + SUVjUFBuW1twWlFpU0plST5eQzhXQzVbRjlWRjpbSj5pUExrU05uV09zXFR1Ylx1Ylx1Xlh1Xlhw + XVdtWlRnU1duWl5zWFtuVFZkUUpkUUprU05vVlFrUVFtU1NuVlVvV1ZvXFpwXVthTUpYRUNcSUNh + TkddUExhVE9fU1BeUU9hUE1eTkpcTlBcTlBiTlNkUFVnVVhtW15jX2VqZ21yZWtuYmhpXFpiVVNd + VVFYUE1hTlBqV1ppX2VtY2lkW1xkW1xnW15tYWRoZGpraG5uZV9oX1piXlteW1dfT1BbSkxfTUpj + UE5jU0ZlVUhhUERbSj5XRzJXRzJbVVBnYVxoXmRpX2VkV1ViVVNkWFBoXFRqXVhfU05cVVVdVlZc + U1RTSUpPQDlKPDRRQTVRQTVQRkBUSURURT1VRj5WSkxfVFVfVExWSkNVSkdXTUlbVVNXUU9RSD5R + SD5NRDtJQDhKQTlRSD9PSkBTTkReVFBcUU5YV1FVVE5UT0VPSkBTSEdYTk1cUVBcUVBfUVRkVlhY + UUhTTENjUUhlVEpoXVpuY19lXVxiWlheVUxbUUhcT0pUR0NdU09iV1RdV1NdV1NbUUhaUEddTUlk + VFBqWlZvXltvXVdpV1FdWlZbV1RkXGNrY2pjYV9tamlubmtiYl9VTkFNRjpRSD5bUUdnXWNtY2l1 + amlwZWRpXltjWFVeV1phWlxuX2JrXV9vYmJzZWVyYV9pWFdkWFxtYWRoY2RnYmNlWFZhVFFlVk9r + XFVpX2NvZWlqY2VoYWNuZ2lyam1taGtuaW1uZW1tZGtlWl1kWFxoXWpuY3BvZ3BuZW9iW1FVTkVd + UFBrXl5yY2hwYmdtYmFtYmFqX15tYmFtXFhrW1dkW15oXmJvZWtnXWNjT01eSkhfV1RoX1xyZG1v + YmpqWlZoV1RiVFZkVlhhU1diVFhpW2JvYWhyam1za250aGlpXV5oVlpkU1ZlU1BqV1VvXFpuW1hr + W1xvXl9uYmVtYWRpWFVfT0xbSD9VQzpVRDtYRz5eTE5kUVRlVE5fTkhfRDhdQTVaQT5cREBcRkBk + TkhqV1FzX1p6ZWN7Z2R0Z2JyZF9vXFxwXV1yXl5rWFhqU1FqU1FuV1NqVE9lU0loVUxtVFBrU09q + UFBoTk5tVE9zWlVwWlFuV09hTkhYRkBYRj9bSEFeTkpfT0xdVVRdVVRiUU5iUU5eVFBeVFBeUFVe + UFViV1ZqX15rYWltYmprYWlnXGRkXFhhWFVfU05bTkldU09kWlZoYWFtZWVpXl1oXVxnW15tYWRo + Z2tqaW5tamtraWpnZWpdXGFiVVBaTUhfT0xlVVFnV1BkVU5jVExjVExbU0BcVEFiW11qY2VyaGtw + Z2poX1xiWlZoWl5tXmNrYV1lW1deV1dcVVVTT0xNSUZNQTpIPTVQQThURTtYR0BbSUNVRjxWRz1U + TklYU05cVFNVTUxYSk1bTU9eW1NaVk5USD9PRDtMQTxKQDtOPThTQTxORz1TTEFXTUdaT0ldU1Fa + T05VSkdUSUZWUExaVE9iV1ZhVlVeVlBeVlBcWk5aV0xeW1NlYlprYmVuZGhlXF9fVlpYU0xYU0xX + UEdTTENcT0pqXVhrZWFjXVhfVU9aT0laSkNnV09lY2dqaGttY2RrYmNlXmFeV1poYWVqY2hrZ2p0 + b3N0b3BqZWdaVUlOST5RR0FdU01lYmpva3R3bXB0am5oYWFiW1tcWl1cWl1lXmNoYWVzaHBwZW5w + YmdoWl5lXmFrZGdqZWdlYWJkW15iWFxlXF1oXl9wY2tvYmpoYWVpYmdraW1wbnJta3Bram9vaGpt + ZWhlX1hiXFVlXGJrYmhqY2VlXmFcVUxWT0ZdU01oXVdoXF1pXV5pX2FrYmNwZGVwZGVoW1hlWFZn + W15rX2NyYWJpWFpkUUhnVEpoXmJtY2d1aHBuYWlqV1VqV1VjVlZkV1djVVpnWF1oX2tuZXJ3b3J1 + bnB5ZWNnVFFjU1FiUVBpVlRwXVtzYmNvXl9uXVpvXltoXl9oXl9lVk5WRz9UQzdUQzdTQzdaST1f + TUdhTkhfTUdbSENbRjlYRDdcREBfR0RdSkhlU1ByXmF4ZGd6ZWh5ZGdwXlhyX1pyXWJ3Ymd1YmJo + VVVhUUpfUElnVlVnVlVrWlBqWE9pV1BkU0xeSENiTEZoT0hzWlNvWFNrVU9jT01cSEZaSD9cSkFf + T1BiUVNfUVReUFNfU05jVlFfV1ReVlNeVlVdVVRfVVFkWlZoXWhrYWtrYWlpXmdnXFtkWlhjV09h + VU1fWlNiXFVlXl5pYmJuY19vZGFtXmNqXGFqY2Vyam1wcHBwcHBqaGdjYV9nV1BfUElbU09kXFht + Yl5oXVplXVpiWlZfWlNfWlNlXF9wZ2p3am53am5uZV9qYlxqX15qX15rYV1qX1xiYVtcW1VWTURJ + QDhJPjVIPTRMQzpRSD9fVURkWkhfVEhcUEVUUVBXVVRdVU9aUUxXSkZbTklWVlRYWFZcTUNURTtI + QC5IQC5JPCxPQTFVSjxXTT5aSkReT0hbSkdYSEVVSklXTUxYU05eWFRjVlRhVFFeVlBeVlBaVlNf + XFhiYmJpaWlwaHRwaHRpW11jVVdaU0lcVUxaVE1RTEVaVFxoYmpuaWhkX15kXFheVlNcVk9pY1xv + c3ltcHdvZG1vZG1qZ2NiXlthXFtpZGNoZ25zcnl3a3RtYmpeXE9WVEdTUEViX1RvZ250a3N4a21z + Z2hlYV9jXl1eW1deW1djXF5uZ2l0aXJyZ29yY2hnWF1lXmFqY2VqZGpnYWdnXGRnXGRkYWtoZG9u + ZW9vZ3BvYm1wY25rZWtwanBtaXJuanNzaHNwZXBpY15iXFdjV1hjV1hiWFpdVFVdVEpXTkVbUUVk + W05nXFttYmFzZ2p1aW11aW9vY2lkWFBiVk5pXWNvY2luZV9qYlxpYV1pYV1yaGtuZGhvXl9oV1hn + VU9oVlBnXVRlXFNnWF1rXWJtZHByaXVuaGVqZGJrW1dlVVFhVlNkWlZtX19vYmJvXFxlU1NiVVNk + V1VuXV5qWltoU0VbRjlXQzhWQTdaRTdjTj9jUEdlU0ljSkdfR0RaQzdbRDhbSTthT0BfTkhnVU9v + Xlt1ZGF0YWFvXFxuWlp1YWF+a3J6aG53YWVqVVpfUEleT0hkU1hvXWN1ZGF0Y19qXE5dT0FcREBi + SUZrVU93X1p0W1ZuVVBjVE1eT0hfTkViUEdnVlVnVlVeUU9eUU9hUUpiU0xfVU9fVU9fVVRfVVRa + VFFcVlRfV15iWmFqXmJpXWFnWlpoW1tiV1ZfVVRcVVViW1tlXmFrZGdraWpraWpqYWdnXWNqY2Vu + Z2lzbWp1b21yaWhvZ2VpXltkWlZnXFtpXl1pYV1rY19lYWRkX2NpYV1lXVpkW1xpX2Fza2t0bW1t + Z2JtZ2JtZ2RpY2FtZGFrY19uaGNpY15fVEhRRjtQQDFOPi9KQDtUSURfXVxlY2JkYVhdWlFTUUxa + WFNiVVBdUExcT09bTk5UVFFaWldeU0lbT0ZMRDJMRDJRQzlURTtaSkRdTkdeTEldSkhYTURVSUBT + SENYTkhbUVNeVVZiV1ZhVlVcVFBdVVFVVFBcW1dlZGtwb3dzaHBuY2tkU01dTEZXSkZYTEdcUVBa + T05bVV1pY2trZWtkXmRnW15iVlpcW1dta2h1dHlwb3RtZWprZGlpZGNfW1pfV1RoX1xkZGdtbW90 + amtpX2FdVlZWT09aVlNkYV1vaGpwaWttY2doXmJfXV5eXF1iWlZkXFhqX2h1anN6bnR3anBwYmRl + V1pjWl1rYmVqZG1lX2hhV11iWF5kXGNoX2dtZ21vaW9wYWppWmNjW2JnXmVuY25tYm1nZHJnZHJr + YmNlXF1iW11iW11eWFZUTkxXTkVaUEdeWFRrZWFzZ2h3amt7bnl3aXRzZ21rX2VkV1dqXV11Z2tz + ZGluZWRvZ2VqZWdoY2RuZGhtY2dpWFVnVlNkV1VnWldrYV1qX1xqXGFvYWVzX2pzX2pwZGVrX2Fo + XFRjV09hVlNjWFVrXlxpXFpnU1BeSkhbSkdhUE1tWFtrV1pqU0hjTEFfSj1dSDtoT0htVE1vXltq + WlZkTklfSUVcRzlaRTdWRjphUERiT09tWlpwX2F0Y2RyXV1rV1dvXWF5Z2p+am13Y2VvW1hnU1Bk + UUxlU01qVl9yXWd0YV5uW1hoUUBdRzdkRkdvUFFrVFNzW1p0W1dtVFBhUUpfUEldVVFhWFVnWFtn + WFtjV09fVExdUUheU0ldU01dU01bTk5XSkpWTkpTSkdYTkhbUEpeU1RiVldiVVVlWFhiVVVcT09Y + U05eWFRkWFxwZGhqZ21pZWtoYWVpYmdqZWdqZWdvY2d1aW1vZ2VuZWRpYV1qYl5rYV9pXl1pY15q + ZF9uYmNtYWJqXVtqXVtnYVpqZF1wa210b3BzbWp0bmtva2hraGRqY2NuZ2d0am5tY2dkWlRcUUxb + UD9cUUBPTEZUUEpfX19kZGRpZGNeWlhWT0ZYUUhdUUldUUlaUU5XT0xYUEpcVE5fWE5cVUpVST5U + SD1WSkNcUEheVFBfVVFjT01dSUdTST1ORTlVSUBbT0ZiV1RkWlZjVlRkV1VVT0pWUExXV1dfX19o + Z25ta3N0bW9rZGdlU1BYRkRaR0dfTU1fVU9YTkhjXF5uZ2lqZG1eWGFnW15jV1tdWlRybmh3dHhw + bnJqYmtoX2loY2RiXV5fWFhiW1tlYmhuanBuZ2diW1tYU0xUTkdbVlViXVxoaGpjY2VlX1tiXFdd + W1pbWFdkV1dtX19ya3R3cHl6cHdvZWtnW1xeU1RhV11oXmRiXmdbV19aUFFaUFFfVVRjWFdnYWdr + ZWtqXmJjV1tiVldjV1hlXmNpYmdnZW1kY2ptY2lqYWdlYl5eW1dWU01PTEZWTk1kXFtyaXN6cnt5 + b3N3bXB5a3R3aXJ0Z29tX2hqXl9uYmN1aHB0Z290aGtwZGhqY2VnX2JtY2duZGhtXFhpWFVuXVpy + YV1yX2N0YmVuYmhyZWtyY2hzZGl1Yl9zX11oVk9hT0hkTklpU05oTk5qUFBlTkReRz1bST1jUUVo + VVdnVFZoUFFnT1BnT0VrVEl3XFx5Xl55ZGduWlxiUEFbSTtXRjpbST1bSUNkU0xkV1dpXFx4Y2Vz + XmFtWFZwXFp0Ymh6aG57aW10YmVrV1doVFRoTk5pT09pVVptWF1yWFVoT0xkSDFeQyxlRkRuTkxp + T1FqUFNnU1BiTkxcT0pYTEdfT1BkVFVeXF9fXWFfWldaVFFaTkZYTUVcUEhaTkZXSkZXSkZWTUNR + SD5XRUNbSEZlT0lqVE5pV1FqWFNhVE9cT0pUTkdXUUpfWFhnX19qYmltZGtuY2ttYmptZWhuZ2lu + Z2tyam9ybWtvamlqYWJrYmNuY2JwZWRvZWduZGV4Z2h4Z2hqX1pnXFZiXFdlX1tqZWlzbnJ5cnd3 + b3R3bXBwZ2pqXV1yZGR9cHR5bXBrYV1lW1dhVUliVkpcVk9YU0xeXF1nZGVlX11WUE5XTUdYTkhY + TEdYTEdUTkdUTkdTTExVTk5dU01bUEpXTERdUUlkV1dnWlpnYV5fWldjU09cTEhYTURTRz5VSUBi + Vk1jW1dlXVppXFdhVE9WTkhaUUxaWlxjY2VpZ2hua21paWdhYV5kUVFbSEhVSkdbUE1iV1RhVlNv + Y2dyZWliW11cVVdYT1BkW1xtYWd5bXN3b3Ryam9lXF9iWFxjW2JiWmFeWlhcV1ZiWFxpX2NjXVha + VE9cUEheU0peVVZjWltpYmdnX2RoXl9nXV5oX1xhWFViWFplXF1vZ3BwaHJzZGdpW11fVVFbUE1c + UFRnW15kX2NcV1tYTkhWTEZXT0lcVE5kW2FlXGJfWldeWFZhVVhiVlpnW15pXWFoX2dpYWh1Y2t1 + Y2tuYmNnW1xiV1RcUU5hVE9zZWF5coB7dIN6cHR4bnJ9bXd4aHJzZW5pXGRqXGFuX2RwYWpzY210 + aGlwZGVqYWJqYWJrXWJtXmNqXF5vYWN4ZWl+a29yY2hrXWJkXWJlXmNpW2JuX2dtW1VnVU9nUEhi + TERjSkRkTEVoTkppT0xpU0pnUEhnV09nV09vV1ZwWFdoVVVjUFBnTklrU05uXF90YmV6YmFyWlhl + VEdhT0NjUEdjUEdlTkRoUEZqWFNwXlh0W1dzWlZtVVR0XFt1YWV3Ymd3Yl9yXVtnVU5hT0hcSURd + SkVjTUhnUExnTklnTklvUEZzVEl4VEp6Vk1zVk1pTURfTUdeTEZlTUZiSUNhTUplUU9hV11jWl9f + VFpXTFFWTEZWTEZaU0lbVEpYUEpWTkhTSUBRSD9YR0FcSkVhVFFnWldrY19nXltpWFVhUE1YTU5d + UVNfVV1lW2NoXmJrYmVuZGptY2lvY2RzZ2h0anB0anBzaW9vZWtrZGduZ2l3ZWd5aGl3aG10ZWpy + ZWdvY2RlW1plW1pjW1pnXl1raG5wbXN0cHl4dH13b3RqY2hrYV9vZGN5bXN5bXNzYmFpWFdfWlVc + VlFcW1VbWlRjXl9nYmNkW1FcU0lbTkliVVBhVlBYTkheT0hdTkdYSk1WSEpbSEhbSEhWTEZYTkho + XGJuYmhrZ2pjXmJfVVRfVVRcVE5VTUdjUFBqV1dtXmNzZGlnZ2RdXVtXVFBXVFBbWl5hX2RoYl9z + bWptamllY2JhWFNcVE5eUU1eUU1cUVBhVlVkX2NpZGhfU1BaTUpcTEpnVlVtX210Z3R5bXByZWlf + V1FeVlBfVFdfVFdfV1FdVU9iVVBpXFdoX1piWlRqV1dlU1NnWlprXl5yX2NwXmJrX2NvY2dqY2Nk + XV1fWFtiW11qZG1rZW5pYmJfWFhUT0VTTkRYUEpeVlBfWldhW1hcVE5WTkhXT0xaUU5fWFtkXV9l + XVxkXFtkV1dkV1dfWFhkXV1nXWFuZGhvZG1vZG1uYmhoXGJkVlhfUVRhVlVyZ2V3cHt+eIN9cHd6 + bnR+bnh5aXNyYmtnV2FlWl1uYmVuZW9waHJwaGdzamlvYl9rXlxpX2NoXmJtYmp4bXV6bnJ4a29v + YWNlV1pfU1BlWFZiVVNlWFZqWExnVUhrUU1pT0pqT09uU1NzXmF1YWN3X1pzXFZvXFpyXlx1XGJz + Wl9tVlBlT0lfUEllVk9yXGF0XmN3XVpvVlNqUE1pT0xlT0doUUlpUUdvV01wXVZ1YltyXV1tWFhl + U1BnVFFtWF10X2RzWlVyWFRlVEdeTUBfSUFeSEBlTEdrUU1vVVVzWFh7X2J/Y2WDaGN7YVxuVkxt + VUpoTkllTEdhTkheTEZcSURfTUdlU11kUVxfUVZXSU5YST9aSkBdVEphV05dVEpYT0ZRSDxPRjpX + SEBXSEBdTE9qWFxwZ21qYWdkWFpdUVNaTlFeU1ZcVVdhWlxnXl1pYV9qY2NpYmJpX2NtY2duZW1u + ZW1rYmVrYmVrZGduZ2lyaG50anB0amt0amt0amtuZGVrXWJrXWJoYl9lX11uaHBzbXVycHp3dX93 + a3RtYmpkXlxnYV5ybW5ybW5yZF9lWFRjWFddU1FbWFdeXFtrZWtnYWdkWFBkWFBhWFVoX1xiWFpc + U1RdUExdUExdU1FXTUxcSUNcSUNVTEFXTkRkWmRrYWtpZ2pfXWFeWFZfWldnXFtYTk1hT1VvXWN4 + b3l6cntvbXBhXmJdUUldUUlWV1NVVlFhXl1qaGduY2JrYV9kWlRjWFNlWlFeU0pVTENcU0liWmFi + WmFcT0pTRkFVSEheUVFjXGFoYWVvZG1tYmpkXlpcVlFeUU1cT0pdVEpbUUhcTEhlVVFuYmNyZWdy + ZGJwY2FyY2VzZGdoX15qYmFkXV9vaGpoZWdlY2RhXF9dWFxjYWRpZ2plZWNfX11bVkxXU0hYTk1Y + Tk1fTFBkUFVdUExdUExWTk1XT05cVVpiW19oXGJnW2FkWFxhVVhdVFViWFpjXF5pYmRvaG1waW5v + ZWlpX2NkV1VjVlRqVl15ZGt5cHp6cnt4b3lzanR7a3h3Z3NqWGFlVFxnXWFtY2dvYm1zZXBwZ2hu + ZGVoXVplW1dpXWFuYmV5a3d7bnl5bW5zZ2hoW1ZhVE9lVE5oVlBjU09pWFVvXFZvXFZwWFpvV1hy + WGF3XWV6ZHB9Z3N7Z2R1YV50YWF1YmJ4X2FvV1hkTEVfR0BhUFFqWlt3YWV0XmN0V05qTkVpUE1q + UU5oVU9qV1FtW1V3ZF51aGhyZGRtXFtnVlVlT0dpU0prWFhvXFxwXlduXFVtW0xpV0hiTERfSUFn + TkpwV1R7X2t/Y2+CaG6EanCCbW19aGh4XVpzWFVyVUluUUZoV1hhUFFaSUZdTUliUFhjUVpiVVNa + TUpYTjxbUD5eVFBfVVFdVEpeVUxWSUdYTElYTU5YTU5hUFFqWlttYmptYmpjXl1bVlVRTEdPSUVU + TUNYUUdeVlBkXFZkX15nYmFpYmRqY2VpXmdtYmpwYmdtXmNrX2FrX2FtaGluaWp0bXJ1bnNybW5u + aWpvZG1yZ29waW5uZ2tuaW1ybXBranJycHh4bnJrYmVkXV9jXF5qaGdtamlvaF5lXlVdWlRXVE5a + U1ViW11oZG1oZG1pXl1tYmFzZGd1Z2lpYV1iWlZnXFhoXVpiV1ZcUVBbT0ZcUEdcTUVdTkZfWl9o + YmhrZ2pjXmJoVlprWl1rW1pfT05hVlV3a2p4cHN4cHNzbm1kX15hT0ldTEZVT01bVVNjV1tqXmJt + Y2RrYmNtY2RvZWdwY15jVlFVTEFVTEFbU1peVl1VTE1RSElNR0VXUU9aUFRkW15uX2dwYmlpZGhj + XmJdWFdbVlVcT01cT01fT05tXFtwZ2p3bXB5bXB1aW15am96a3BvamtrZ2hkXV9rZGdpaWlnZ2dk + YmNdW1xjYWJua21wZ2puZGhrY11kXFZcUEhbT0ddUExiVVBiVVNkV1VdV1VbVVNaU1VaU1VcU1Ze + VVhjWl1fVlpiVldjV1hfWF1qY2hwaHRzandzbm9rZ2hoX1xjW1dpX2VzaW96cHd3bXNzaXltY3Nz + Y29vX2tpW19nWF1nWlpuYWFpXV5vY2RyZ29rYWlnXV5kW1xoXmJrYmV0aXJ3a3R1amlwZWRpVVNn + U1BiUU5iUU5pVFhwW193Y2VvXF5rWlRtW1VyXGV0Xmh7ZXJ+aHR7aXJ5Z291aW1zZ2pzWlNlTUZe + RUFjSUZnVE1uW1RvW1hrV1VrVElvV01yV1x0Wl5yYWJyYWJ0YmV4ZWl5ZGl3YmdtXVZoWFFoT0hu + VU5wXV15ZWV+bW57amt7aWJwXldnTUZiSEFwVVx1WmF9YWWEaG2Ea2+GbXCCbmh5ZV94X1VwWE5t + VEZlTT9oWlxfUVRXUEdYUUhaUFRaUFRbUVNWTU5VSUBYTURcUVBeVFNbU1FaUVBaTU1aTU1dU1Fi + V1ZjVlFpXFdrYmhrYmhjXl1bVlVUTklOSERUTEpXT05eVFNiV1ZhV11lXGJtYWJuYmNpYWpqYmtu + YWFhVFReVE5eVE5nX2JvaGpwbXVybndtZ29nYWlnXGRnXGRqYWRuZGhpY2luaG5wanV3cHt6c3hv + aG1lV1phU1VlX2VtZ21raGRnY19eXlFVVUhYU0xeWFFkYmVqaGtqZWRpZGN4ZGd5ZWhtZWhuZ2lw + aG9vZ25pXFdiVVBeWFFhW1RiU0phUUlfWl9lX2VtYWRnW15rXWRqXGNnX1ZcVUxhV1t4bnJ6dXdz + bm9zbm9nYmNiVVNcT01WUE5bVVNiVFhnWF1rYmVtY2dua29yb3N0am5iWFxWRz1WRz1aTk9dUVNb + UE1TSEVKRT5RTEVbTkldUExlWFhqXV1jYWJiX2FfXV5bWFpdUE5dUE5eUFNvYWNwbm9zcHJ1bm5y + amp9bXd+bnh3bXByaGtoYWNoYWNkY2plZGtoXmRkW2FnX2RwaW53Z3NyYm5rYmNlXF1eU0lfVEpi + Vk1lWlBkXFtnXl1jXVhWUExTSEdUSUhaUFRdVFdiVlphVVheWFZcVlRXV1VfX11oZXNpZ3RubXJo + Z2tnYmVkX2NqZG1ya3R3b3R3b3RwZ21oXmRpX2NoXmJpYV1nXltlWFhtX19oY2dvam50am5uZGhn + XFZoXVdqYWJuZGVybnR1cnh1bWduZV9vWFNqVE5eU0pjV09tWlxzX2J1Y2dwXmJrXFVqW1RyX2Nz + YWR4ZWt9anB6bXV5a3R1Z2lnWFtkTD5iSTxjSUNnTUZtVE9yWFRtWFZrV1VtWlpzX194Y2N6ZWV4 + YmdwW19zYWd5Z217Z254Y2pwWlFvWFBqUFVyV1x3YW9/aXiAbW19aWl7ZF9qVE9pSUhpSUh1WmF+ + YmmEaHKJbXeHbXV+ZG17YWF7YWF3XVhzWlVuV0ZjTTxlW1ddU09aUEdaUEdWU09WU09hVFRcT09a + SkRbTEVYUE1YUE1bU09aUU5XT0lWTkhWUElbVU5jWFdpXl1oX15pYV9lXVxiWlhhT0hXRj9WSUlb + Tk5eVFBeVFBcVVdhWlxuWmNyXWdpZGVnYmNlXVxcVFNcUU5eVFBpXWNyZWtwanNtZ29qYWRjWl1p + WFpoV1hnXWFpX2NoX2ltZG5vZG93a3d5cHhwaG9rWFhnVFRkWmJuY2tva3JpZWtiY1pcXVRXVFBV + UU5dXV9jY2VoZGppZWt1Z2tzZGlvYm1uYWtuanNva3RvYl9uYV5qYl5uZWJjV09YTUVcV1ZnYmFo + Xl9lXF1oXmJpX2NkYV1bV1RjXF53b3J6cHJ3bW5ubm5hYWFkXFhdVVFdT1FdT1FWUExWUExfW1xr + Z2hzc3VwcHN1bnNkXWJYSUNcTUZWUVBUT05fTUdbSENQRTxYTURVTUdXT0lYVVFeW1dlXmFjXF5j + Xl9kX2FdUE5fU1BlWl9wZGpvam5pZGhoY2JrZ2V1a3J6cHd3b3JwaWtoXVpjWFViW11iW11lV15n + WF9oWl5rXWJqXmJtYWRoZGFnY19eWk9eWk9eWFFhW1RqY2NuZ2djW1dbU09WSk5WSk5cUFRfVFdj + VVpiVFhhWFdcVFNYVlVaV1ZhYWNjY2VqZG1qZG1oX2dpYWhrY21uZW95a3d4anVuZGpoXmRlXmFn + X2JqY2VqY2VnXmVoX2dnaHBub3hzaW1qYWRoXlVrYlhzZGl4aW54cnp3cHl1Z2luX2JkV1dkV1dl + W1ppXl1rYmNuZGVvZGFtYl5lW1VnXFZzYmN3ZWd4ZWt7aW97aW95Z21vYl1kV1NoT0FnTkBrU09z + WlZ1XFd1XFduWldwXFpzZGl3aG10Z2RyZGJwXV1zX19yX2N4ZWl5Y213YWp0YVpyXldtWlxvXF5w + ZXB1anV9aG16ZWp1XFdlTUhnTUl0WlaAaGuGbXCGaWl6Xl59YWN5XV+CYmOGZWd9ZGh+ZWlwXk5c + SjtkXFthWFdfVk1cU0lWUUdXU0hpWFdoV1ZhUUpeT0hdU09dU09hUE1kVFBaU0lWT0ZUSD9aTkVi + VVNiVVNhVlBkWlRpXltnXFhnVlNdTUlfTkddTEVaT0xcUU5dVVRcVFNhV11jWl9oY2RnYmNjXVtc + VlRbVVNeWFZkXmduaHBva3JtaW9qYlxjW1VlVVFoV1RhU1diVFhjVlRlWFZjV1trX2N0a3NzanJw + Y2FqXVtqXl90aGlybndwbXVwamhoYl9bV1RWU09aU1NfWFhrYmVwZ2pvZWduZGVuY2tuY2tybXBv + am5tamlua2p0bmtvaWdlXlVcVUxiV1RrYV1nZV9fXlhnX2JrZGdpXlthVlNjXF50bW94cHN3b3Jq + ampjY2NnXV5kW1xlWl1hVVhQUUhQUUhXU1RrZ2h0b3N3cnVvbnNkY2hjWltoXl9hX1xYV1RYSUFY + SUFWSkNYTUVRU0xQUUpTT0lXVE5dVFVfVldjXl9jXl9bW1hWVlRaVlxraG5tZGthWF9eVlVkXFtn + Z2d0dHR1c3RraWprW1pkVFNdVFVhV1hhVVZfVFVbU09eVlNhWlBdVk1hW1hjXVtkXFZlXVdlXVpq + Yl5za25rZGdkWlRfVU9cSUdYRkRbTU9iVFZrV2FwXGVoXl9fVldhVlNcUU5iVlpqXmJyZG9yZG9v + Y2dtYWRrYmVuZGhtaXRuanVuZ2trZGlvYWVuX2RyZWlzZ2ppZGhkX2Nram9ram9qYl5kXFhoYl1w + amV4anV6bXh5bnd1anN0a2pvZ2VqXmJpXWFoXmJnXWFtY2dwZ2ptZVxnX1ZhWFVjW1duYmN1aWp9 + aG14Y2h1YmJyXl5uYlhnW1FpW0ppW0pyXlx4ZGJ5ZV51Ylt3ZWJ4Z2N5bXB3am51aWFyZV1vXFxy + Xl5yYWJzYmNyXWdvW2RuXFZtW1VrW1x0Y2R5bW50aGl6YmNyWltoVU5tWlNwX1x3ZWJ1ZGNyYV94 + XVZ1W1R1XV56YmN+aWt/am1+ZVtvV01iTT9aRThrXl5qXV1fV1ZhWFdeUU1fU05lWFRnWlVhV01c + U0hiVVNhVFFjU09kVFBbUUhYT0ZRRjtUSD1XTERfVExfVVFiV1RqWltpWFplWFRhVE9aVERTTT1Q + SENWTkhbTklcT0peVlNiWlZkXV9pYmRlZGFcW1dbV1FhXVdnX2Jyam1wa29zbnJ0Z2dtX19rXlxp + XFpiVVBhVE9kWFBjV09lWFRoW1Z1ZW94aHJyZ2N0aWV3amt3amtybndva3RuaWppZGViWlZYUE1X + TENYTURhW1hlX11oZGFqZ2NvY2dwZGhvZWluZGhua21tamtua2ppZ2VdXldVVk9aVlNjX1xpZV9j + X1ptYmFvZGNnXV5eVVZiWmFuZW1zcHR3dHhwZ2hqYWJnX19kXV1iX2FeXF1UUEpTT0lUT1BlYWJw + aW54cHVyaXBkXGNqZGpuaG5uY11nXFZaTD5aTD5XTk9dVFVeV1dXUFBMSkNRUEhYU1BbVVNeV1pf + WFthW1hcVlRdW1xpZ2hpYmRjXF5iVVNfU1BhY2J0d3Vzb3VtaW9nXV5iWFpkWFplWlteVFBYTkpV + SkdaT0xcVFBeVlNkXFhkXFhoXVdtYlxoaWRqa2duaWhrZ2VtWlNlU0xhSkNcRj5eTEZnVE5rXmd3 + aXJvamlkX15hVUlcUEVkUVxvXGdwZW5uY2tkY19iYV1tZWVuZ2dtaGttaGtwZW5uY2tzaW11a290 + a2huZWJyZ2VyZ2VzZ2pvY2dvXltwX1xvaGh0bW13bXB3bXB3b3JwaWtzaW1vZWlzXl5zXl5uY2Jz + aGd1Z2t4aW5uZFtlXFNlWFZqXVtzZ211aW96Z2d1YmJzYmFyYV9tYVhrX1dzYVp1Y1x6Z2d+amp6 + aWVzYl5waGdzaml0bXJ1bnN4aGFuXldtXVZtXVZwXV9uW11uWmFrV15rWlRuXFZyX2N1Y2dyXlxt + WldnWEpkVkhtWFZ1YV53YmJ1YWF1Y1pyX1ZpVlBtWlRwW2J3YWh+ZWR7Y2JvV0FdRjFdQy9fRTFv + X1hvX1hrX2FqXl9iUVNeTk9eVE5iV1FfW1BeWk9iWlZiWlZfV1RfV1RfU1NXSkpaSDxWRTlVRURa + SUheTk1kVFNtVVZvV1hnXFZfVU9fVEhaTkNYSj1WSDtbTEVdTkddUExdUExfWFhlXl5qZWRkX15f + WldeWFZiW1tpYmJqaGlvbW5wbm9vbW51aWpwZGViW1teV1dnVldpWFppVlhtWlxtW2FwXmRqYl53 + bmp5b3N5b3N6c3hwaW5oYWFjXFxjWlBfVk1eTkpYSEVhVlVoXVxnYV5rZWNvYWVuX2RoX15pYV90 + aGt3am5wZ2hpX2FhW1ZcVlFfWldiXFplX11kXlxpYV9pYV9pXFpkV1VlV1pzZGd3dHh5d3puZGVk + W1xnXV5oXl9fYmFfYmFVU1FOTEpRUE1fXltwZ2p3bXBvZWlnXWFwanNvaXJvZGFlW1dcSkFlVEpf + VldeVVZfVVFeVFBaSUZeTkpcUUxcUUxaU1NaU1NiT09jUFBhV1tpX2NpYV1kXFhhV05dVEpiYWVy + cHVvcHRoaW1vYl1uYVxrY19lXVpYUUdORz1USUZeVFBiXVxnYmFpZGNnYmFpYmJtZWVtaGduaWhr + Y2JqYmFqV1BlU0xfTUZbSEFcUEhfVExkXGVwaHJ0anBvZWtjXFNbVEpkW2FqYWdwaWttZWhlXmFi + W11kXV9oYWNqYWdrYmhwZGhyZWlza250bW9zamdvZ2NwY2FwY2FvYWNrXV9wXGFzXmNwZ2hwZ2hy + aGlwZ2hwa29rZ2pwZGhrX2NwX15yYV9rXWJ4aW57b3N5bXB1ZV1qW1NqVlhwXF55ZGt4Y2p6Z2F0 + YVtrX1drX1duXVpyYV14Y2F9aGV7ZWp6ZGl3ZGpyX2VvZ2VzamlzZGt0ZW15YV9yWlhrW1prW1pw + XFxtWFhoV1RqWlZnV1BrXFVyXmFvXF5tWlNqV1BqVE9rVVBvW1twXFx1XVx1XVx3X1dyW1NoTklp + T0puVVt1XGJ6W1NwUUlhSTddRjNjSDRoTTltX11rXlxtYWRoXF9fU05eUU1hVFFjVlRhV1hkW1xq + Xl9uYmNnXV5kW1xkW1xcU1RlT0ddRz9RRDdTRThYSEViUU5lU1NqV1dlWFZlWFZlWlFjV09dTENV + RDtTSUBRSD9USD9VSUBVTE9fVlplY2dkYmViXWFeWl1eVlNjW1dnYVxpY15raG5uanBwZ2pvZWlt + YmFrYV9pXmdrYWltX2hrXmdkWlRfVU9eXF1ua211c3d3dHh5cnJtZWVqXV1lWFhpWFVjU09XSkZW + SUVYUEpdVU9nXl1pYV9qYl5kXFheWFRlX1tuYmNzZ2huZWJlXVpdVVFaUU5bVVBcVlFjW1dkXFhl + XVdnXlhtWlpuW1tqXmRtYWdzbXV6dH1pamFeX1ZiXlhhXVdbW1tdXV1VU1RQTk9eVVhuZGh3a3d0 + aXRoYWNkXV9uanVva3dtaGlpZGVjV05lWlBfWlNdV1BhVUlfVEhkUVFlU1NnW1xiVldYVElVUEZW + SkNcUEhdVVRnXl1oX1pjW1VnVlViUVBnYWd0bnRzanRwaHJwZ2puZGhraWpqaGleU0dVST5cT01q + XVtta2Vta2VuaWhuaWhza2t1bm5vamlrZ2VqXVhjVlFlVk5jVExjUUhkU0lhV05hV05iWFpqYWJ1 + ZW91ZW9uYWFlWFhkXV9lXmFrZ2hoY2RjXF5iW11hV1tiWFxkWFpkWFpqWF5vXWNtZWhrZGduX2Jr + XV9uXF9uXF9pXltoXVprX2NtYWRtZGNoX15oXmJoXmJpX2VtY2lwY2NnWlpkV1VqXVtvZG11anN5 + bW5yZWd0W1RpUElkUU9pVlRyXWR1YWhzX1ZuW1FrV1VqVlRuWlp0X196ZGl+aG14ZWlyX2NrXV9t + XmFvY2l1aW90ZW1wYmlzX1pvXFZqX1xrYV1tWlBlU0lhT0NhT0NhUERlVUhnVE1nVE1tVlBuV1Fr + U0xtVE1tVVZwWFp0XF91XWFwVlZyV1duVVFyWFVzXFR0XVV3V0xwUUZnT0NoUERuW1VwXVdnX1Zk + XVRlW1ppXl1nW09cUEVdTENhT0ZfU1NlWFhtX19tX19pY2FoYl9oXl9kW1xtXVZnV1BcVkZWUEBY + T0NcU0ZiU0xjVE1kV1dkV1dhV1hjWltlVVRhUE9YT0ZWTURYTURbT0ZaTk9eU1RiXWFhXF9dVlZb + VFRdVVRfV1ZfXFhkYV1nY2ltaW9pX2NpX2NwY2FvYl9oYWNqY2VqY2hqY2hiW11YUVReW2FnY2l4 + b3d5cHhyb3BpZ2hqXVtoW1hlWFhfU1NWTkhTSkVcUU5dU09lWltqXl9pX2NkW15hW1ZjXVhnYmVu + aW1uZGVoXl9cVk9XUUpbT0ddUUlqXVtpXFpoX1poX1ptYWRrX2NrZW5uaHB1b3p1b3ptamtlY2Rh + X1phX1pfW1pbVlVVT01WUE5jWl1yaGt1a29rYmVfXVFhXlNnZ2ltbW9zZ21qXmRoXVdnXFZnW1Fl + WlBrXFFrXFFvYmJtX19nXFZhVlBXT0lVTUdTTUhXUU1hV1hjWltjXVZjXVZpWlFnV09nYmNqZWdq + ZWdwa21vb3JtbW9ubXRubXRkW1BaUEZkWFxyZWl1bnNza3Bya2dwamV1bnB7dHdybnRqZ21tXFtn + VlVnXVNpX1VuXVpuXVplXFNkW1FlXVptZGFoZWdtamtuZGVlXF1nWlpoW1toX2dqYmljXF5iW11f + VlphV1tiV1ZkWlhrX2FvY2RvZWlvZWlrXlxnWldkV1dhVFRhWFViWlZnXWFoXmJpXltkWlZjVlFk + V1NiWFxlXF9tW15oVlppW2JqXGNvZG10aXJ3YmtuWmNuVFhrUVZkV1dtX19zYWR0YmVuW1hpVlRp + V1BoVk9uWlxzXmF0YV5yXlxqWlhpWFdiWFpnXV5wZGV1aWp3ZWRyYV91ZGF1ZGFwZWJyZ2NtYVhi + Vk5iUERdTD9eSTxiTT9iUElqWFFuXlZyYlpwWlRuV1FvV1t3XmJ0YV5yXlxvXlFvXlF0Y199a2h6 + Z2R0YV5zVUZvUUNrUU5zWFV0W1Z0W1ZkXFZkXFZjXFNqY1plXVpaUU5eRzteRztYTURfVEpdW15j + YWRnYmNoY2RpYV9nXl1pYmJpYmJnXFZdU01hV05iWE9jWk9eVUpfVVFfVVFfV1ZiWlhpW11jVVdd + VEpbUUheT0dhUUlfVFVdUVNdU09cUU5hUE1hUE1bVU5YU0xXVk5VVExdVlhpYmRlX11nYV5qY2Nr + ZGRwaGRuZWJrZGdnX2JkW1xeVVZeWl1nYmV4b3l6cntycHVpaG1pXFpoW1hlXFNjWlBhV05YT0Zi + UEljUUpiWlZlXVpkXlxeWFZfVVFnXFhpZGhrZ2prY2JnXl1hXFFaVUphVU1kWFByYWJ1ZGVrZWNr + ZWNtXmVtXmVoY2dtaGt5bnl3a3dwaWtqY2VoaWRhYl1cXFpWVlRYT1BbUVNjW2JoX2dnYmFiXVxi + WlRjW1VlY2dqaGtqYlxkXFZjXFNqY1ptYVduYlhzZWF1aGNzbmNuaV5uYlplWlFcU0hUSkBQSkRU + TkdeWFRlX1tnXlhiWlRdVkxeV01fWFhqY2NoaGpra25qbWtoamlqaXBubXRkX15fW1ptZG51bXdy + bndwbXVza255cnR4dH19eYJ3cnNuaWpnW1xlWltrYV9vZGN1YWV1YWVvYl9tX11qZF9uaGNpZ2hv + bW5vaGhkXV1kV1NjVlFiWF5oXmRlXVxbU1FdSkpeTExdVVRlXVxuZ2l0bW91aWpyZWdvYmJqXV1i + VlphVVhhVlVlW1ppXV5oXF1oXVxkWlhiWE9hV05kVlhkVlhnWFtoWlxnXFtqX15tYmpzaHB1YWVw + XGFoUFFkTU5iUVBvXl1zX2JvXF5rV1dqVlZlWFZnWldpXFxpXFxuX1FtXlBrX1ZrX1ZuXF9zYWR0 + aGl3amt7aGh9aWl9a2p9a2p0aGl1aWpzY1hvX1VuWEpiTT9kSTppTj5rV1d3YmJ1aGVzZWN0Ylxt + W1VvW1hzXlxyXlh0YVt1ZFd5aFt4bWt+c3J/a2t1YmJyU0dvUEVtT01vUU90VlN0VlNnVlVoV1Zp + V1BtW1RoV1hnVldiVEZbTT9XTz9aUUFVVVVfX19pXWFrX2NtXFtrW1pnXFhnXFhqWltoV1hpW11q + XF5oX1plXVdkV1NeUU1bVEpaU0lhVlNhVlNYT0ZbUUhiVVBkV1NiVFZdT1FeT0hdTkdbTklcT0pb + VElaU0hbVEdaU0ZVT0hcVk9iWlRkXFZnYmFuaWh3bm10a2puZWRoX15kXlphW1ZdVlhiW11lZWhy + cnR4c3d3cnV0Z2dtX19pX2FvZWdvaGhjXFxjV0xiVkplXlViW1FlW1dhVlNfTU1nVFRlXmFtZWhu + Y11nXFZoXlVfVk1iVk5qXlZ+a299am50b3Bwa21tY2dpX2NiXWFnYmV0bnd0bndvamluaWhqamhj + Y2FbW1tUVFRWTk1YUE9hWlpkXV1oX1xnXltiWlhiWlhpZGVuaWpoYVZiW1BrYVt0aWN1cm5va2ht + amttamtvcGtub2ptZ2JqZF9jWk9cU0hVRjxXSD5dVEpiWE9tXFtoV1ZhWFNhWFNjWlBpX1ZpY2Fo + Yl9kYV1raGRqaGtvbXBqZWdiXV5pZ2pyb3Nwa29wa29ubXJ0c3h3dX10c3puaWpoY2RoXF9tYWR0 + aG51aW95ZGt3YmlrYmNvZWdvamtybW5wbm9yb3BtamlqaGdpX1ZlXFNfWFheV1dkWlRfVU9kUFBl + UVFkWFpuYmNvbnVta3NwaGRoX1xoXmJnXWFoVFtlUVhcU1ZfVlphWlxhWlxnXFhjWFVhVU1fVExj + WFdjWFdiWlhfV1ZeVE5kWlRrYmVrYmVwXV1pVlZnTkdnTkdkUVFvXFxyXVtuWldzWlZ3XVpwXVdu + W1VvXVZyX1h0aWN3a2WAa2l+aWd6Z2l6Z2l3aWl0Z2d6ZW1+aXB9anB6aG50aWVzaGR6aWV7amd4 + YVhqVExlTUBvVklwXmR5Z217amd1ZGFrYVtqX1pwXVt1Yl93X1dvWFBqV1VuW1hoXmJzaW15bmpz + aGRvU0lqTkVrTkhuUEp0VFN1VVRnXFhiV1RqV1VoVVNpVlhpVlhjWk9dVElcUEVdUUZdVkxkXVNu + YWFtX19pXFxjVlZfVExiVk5lW1dpXltoXl9rYmNrYmNqYWJjXVtbVVNfT0NcTD9YTUVbT0dbT0df + VExkWlZpXltkVlhhU1VjU1FfT05fT0xiUU5jWFNjWFNhVUxdUUhhVU1oXFRjW1VoX1prYmV1a291 + cHJ3cnNoZ2NkY19kY11jYlxjW1dlXVptZWV4cHB9dHt+dX13b3J3b3J4bnJ7cnV9cHdwZGpqYl5p + YV1vY1tpXVVhWFVaUU5aUEdaUEdhV1htY2RtaWFnY1tlX1teWFRlWFZvYl93bXN4bnR1cnhwbXNr + aWhlY2JlYWJjXl9jZ2plaW1wa211cHJzbm9uaWpoXVdfVU9WUUZRTUFeVFBnXFhqYWJqYWJrYmNt + Y2RpZ2VpZ2VnXlhpYVtwZ2p3bXB0b3Nvam5vaGh0bW13bW50amtramdramdpZV9dWlRYUUVTTD9e + U0ppXVVuYV5tX11jX1diXlZlW1dnXFhkXV1iW1tkXV1pYmJpZW5qZ29iX15iX15vamtybW5taGlv + amttcHdwdHp5d3p0cnVyZWllWl1iXWFpZGh0a3V3bnh3bXNwZ21oYWNrZGdvZ3NwaHRyam1waWtw + a2pybWtrZ1tkX1RhV01iWE5hV05hV05hVFRiVVVoXF9tYWRyZ29wZW5vYmJpXFxoWlxiVFZiT09i + T09fUVRfUVRdUVNjV1hqWFFrWlNtW1VqWFNnWlVhVE9hVFFhVFFkVU5qW1RtX11rXlxwXFpqVlRj + UEdiT0ZlU1BvXFppXltuY195ZWV6Z2d4ZV9yX1p1Ylx+amR+b3SCc3iDbnN/am93ZWd1ZGVzZGdw + YmR1Y2l5Z214Y2h3YmdvZGN1aml+cnN9cHJ7Ylt3XVZuW1RzX1h5aGl7amt4ZF1yXldtXFtuXVxz + XFd1Xlp4WlRzVU9fVVFlW1duX2J5am17aGh6Z2dzV0drUEBtVEd0W057WFZ/XFpkV1dkV1dpWFVo + V1RoV1RlVVFhV05fVk1eU0pfVExeVUxiWE9jWFdoXVxlWlthVVZeUU9eUU9kVU5nV1BoW1tqXV1l + Xl5jXFxnXl1eVlVeTEZdSkVVUEZVUEZXUUpbVU5lW1ppXl1qXl9kWFpfWFhbVFReWFZjXVtlX11j + XVtnWldiVVNnV1BqW1RqXV1rXl5rY2p0a3Nyb3Nyb3NtaGlqZWdpZGVoY2RlXVdnXlhlYWJzbm97 + cHuAdYB6dH19d399dXp9dXqCeHt1a293b293b293c29wbWloYl1bVVBUSkBUSkBXVExnY1tkZV5t + bmdqYl5nXltjWFVuY19zcnl4d351dHlvbnNza25uZ2lqY2VjXF5hYWNnZ2lwaHJ5cHpyb3BqaGlk + XFZcVE5QTEBQTEBhVFFtX11zaWpwZ2hvZ2VuZWRraWppZ2hrZGdvaGpva3RybndvaGpqY2VrZWNy + a2l1bnB1bnBvaGhvaGhraWplY2RiWlRaUUxfVVRoXVxpX2VwZ21tZGFoX1xnW1xlWlthWlpjXFxo + XF9qXmJqYWdtY2ltYWRuYmVybXBwa29vaG1waW50bXJ4cHV5dHV1cHJuYmVhVVheXF1pZ2h7bnt7 + bnt3aG1rXWJkWF5lWl9qX2hoXWVpXWFtYWRuZ2l1bnB0aWNuY11eW0lYVURbUUdbUUdfU05hVE9l + VFprWl9oXmJnXWFoV1ZkVFNkVFNfT05iUEpkU01kVFVkVFVlU1NpVlZrW1pwX150Y19tXFhqXVtj + VlRkUVFoVVVuWldtWFZuWlpwXFxyXlhrWFNeU0dhVUlkVU5tXVZrY19vZ2N5aGl4Z2h3ZWd4Z2h6 + Z2mCbnB/c3l+cnh/a2t1YmJtW1RpV1BtXmFyY2VzZ2p3am53ZWd0Y2RtY2lzaW96bXV5a3R3Z15z + Y1twX1x0Y194ZV91Y110W1ZwV1NtWFZrV1VzWFV3XFhzWFhyV1dnVU9uXFZ0X2d/anJ+am14ZGdz + WkxuVUdyWFRzWlV6V1OAXVhrWl9vXWNwX1xuXVpuYWFrXl5lWFRqXVhoXFRkWFBjWlBkW1FfWFtl + XmFjXGFkXWJlUU9iTkxfTkViUEdqV1BuW1RlXVdkXFZnXl1iWlhiTkxkUE5eV01eV01iWlZhWFVl + W1plW1pkXV1iW1teW1dfXFhlXVppYV1nX19nX19uYV5nWldoXFRqXlZpXV5pXV5oXmJwZ2p1bnB3 + b3Jvamlwa2p3amt0aGluX2RoWl5jXFxrZGR3bXN9c3l3c3t1cnp5dXt5dXt7eXh5d3V4dXl5d3p7 + dX5zbXVnYmNaVVZXTkVXTkVXWE9naF5tbWpycm9nZGhnZGhkW2FwZ214dH97eIN1cnhwbXNraG5o + ZGpnZGVlY2RfXGJoZGpycHpwb3lpZGViXV5hWl5kXWJXTk9eVVZrYmVzaW14bnJ1a29rZWNpY2Fj + Y2NkZGRtaGt0b3N0b3Bwa21pXV5oXF1pZGVzbm91cHJ1cHJza2tvaGhtaGluaWpuY19uY19rY2Jr + Y2JwZGh1aW13a2hyZ2NuY2JtYmFnX2JjXF5lXVxjW1ppW19pW19tW2NyX2htaGtzbnJzbm9wa21w + a291cHR6b3h4bXVvYWNlV1piW19qY2h3a3d1anVvXl1iUVBeU0phVU1kWlZnXFhiW11qY2VoZG1t + aXJ3b29waWlpZV1WU0paUEdkW1FnWldiVVNeVFNnXFtkW15eVVhjVlZlWFhoXVxnXFtrXlxrXlxn + W1xlWltrV1xvW19qXF5wYmR1Z2lzZGdwYmRjVVdlU01kUUxqVlZuWlptWFtwXF5uV1FoUUxeUENf + UURjUUVrWk1zXl56ZWV7aGh7aGh7Z2d7Z2d+b3eAcnl5bXByZWlyW1NpU0plT0lpU01tXmF1Z2l3 + a2p1amlyX1hzYVp0aGt3am55bW53amtwZV9rYVtrW1puXVxzXFZuV1FtVUpuVkxrWFNtWlR0W1Z1 + XFdzX1pwXVdrV1VvW1h0Ymh+a3J9bWV5aWJ4YVhwWlFyWlh4X15/ZF+AZWFtXWdzY210am50am50 + a2pvZ2V0ZFxyYlptYVhqXlZnYVpnYVphW1hnYV5pYmJqY2NoVk1iUEdjTkBlUENoWFBpWlFuXlZt + XVVqXlVlWlBqV1BtWlNrXlptX1tuXldqW1RlWFZlWFZdVlZfWFhbU1FdVVRjWltqYWJuZGhvZWlr + YV1jWFVjXVtkXlxlXF9pX2NuYmVvY2d3bW53bW5yb3Byb3B6bnJ3am5vZ2VpYV9vYmJuYWFqY2V1 + bnB1cHR4c3d4d3t3dXp6dXl4c3d4c3d/en6Ad310anBiXVxaVVRYT1BcU1RiYWVycHV5c3tzbXVn + X2RiW19oYWN1bnB6cnB5cG9wa21uaWppa21oamtlZGliYWVfXmNlZGlzbXNwanBoYWFhWlpeV1pf + WFtWT09lXl50b3N0b3N0cHdtaW9oZF5oZF5cX1pcX1ppZWtwbXNya3JtZ21iW1tnX19qaXB3dX16 + eX51dHl0b3BtaGltZWhza25tZWhvaGpybW5rZ2hqYmFqYmFwaWtyam1wamhvaWdoZWRjYV9fXVFb + WE1fVU9lW1VnW15qXmJvZ250a3Ntam5raW1yamp4cHB3b3J0bW9vZWdpX2FoYWNoYWNwZ21wZ21t + XVVtXVVrXFVoWFFjWltlXF1jYWRoZWlpZWtuanB0b3B0b3BwZWJiV1RfWlNnYVprXlpqXVheWFFj + XVZkXFtkXFtnWldpXFppXltqX1xtYWRtYWRtXmFlV1plV1poWlxoWmFvYWh3amt5bW51ZGVkVFVl + U01iT0ljUFBoVVVqW1NrXFRpV1FnVU9jUUVeTUBjU0ZtXE93Ymd+aW59anB9anB7ZWp7ZWp+bnh6 + anR0Y19rW1djWEdhVkVnV1BwYVp3ZWd5aGl0Z2dzZWVzXmN0X2R1Z2l1Z2l5Z2pyX2NoWFBnV09v + XFZ4ZF55Ylx3X1p1XlZ1XlZ1W1t3XFxyXmF0YWN6ZWN3Yl9zW05wWExrYVtzaGJ1aV90aF54Y2Ny + XV11XVx7Y2J9ZGh7Y2dqXGFyY2hvbXByb3N4bnJ0am5wY2FuYV5oZF5oZF5lZF5kY11nY11nY11t + ZGNyaWhyYV9tXFtoVk9pV1BpXlhwZV94ZGR3Y2NwZFttYVduY11zaGJwZ21yaG53Y2VzX2JuXV5r + W1xlWFhdUFBeTUdeTUdkVlhtXmFwZGhwZGhnX19aU1NfVVFkWlZkW1xnXV5oYWFuZ2d1bnB3b3Jz + cG90cnB1bnB1bnBwa21rZ2htX1tqXVhiXV5rZ2hyam96c3h6cn54b3tzbXNvaW90cHl7eIB4dXlw + bnJnXWFaUFRbVldfW1xrbXV1d391bXRoX2dcVlRdV1VjYV9qaGdwaWlyampqZWdnYmNoYmhoYmhi + Y2tiY2tlZGlpaG1yam1tZWhjXVtfWldhVlNiV1RYW1xoamtycHhwb3duZGVnXV5fXlheXVdhXFte + WlhrZW51b3hyam9nX2RfXV5pZ2hra3h3d4N5en5wcnVqampkZGRpX2NtY2dfXltlZGFra2tycnJt + bmlpamVrY19uZWJua21ua21tamtpZ2huZWJkXFhfVVFfVVFfWFhiW1trZGdtZWhuaW1wa29zaW1w + Z2puZ2tuZ2tqZWdoY2RnX2JkXV9pX2FtY2RzY1x0ZF11Y110YlxnX19lXl5kX15pZGNtZWhyam1z + a3B1bnNyaGlpX2FnYmFrZ2VwYmRqXF5fW1pfW1plXF1kW1xoWFFpWlNrW1ptXFtuWmFyXWR0X2Rt + WF1jVVdfUVRjVVppW190a3V1bXd5ZWVtWlpkU0RhT0BdSkRdSkRlVERnVUVoWkxlV0lkUD5nU0Bo + W1t1aGh5bXB5bXB1ZGV3ZWd1Y2t3ZG19anB5Z21yYlttXVZnXFZoXVdrXV9wYmR3ZGh4ZWlyYV1w + X1xvYl9zZWN1aml1amlzYl5pWFVlU0lnVEpvW1h6ZWN9ZWF7ZF97Ylt9Y1x6YmV+ZWl1aGVzZWN5 + Z2F1Y110XlNyXFBrW1dtXFh1Ylt3Y1x4X150XFt1YWF9aGh9ZGV5YWJqXmJwZGh0bXJ1bnN1a3Jv + ZWtrYV9pXl1lXmFpYmRrZ2htaGlvY2dvY2d3ZGp0YmhzZ2pzZ2pvY2RyZWd3amt5bW57cGp3a2Vw + ZV9tYlxtaWVybmp0a3N1bXR6cnB3bm10YmhuXGJuWlppVVVfTkheTUdoV1RyYV1yZWttYWdpVlhl + U1VXT0laUUxdV1VhW1hkWlhuY2JuaG51b3V0cnN3dHV1cHR4c3d4c3dwa29vZGNpXl1iXWFtaGt0 + c313dX+Ac3t+cHlza3BuZ2t3bnh+dX95cnJza2tiW1tUTU1XV1pdXV9vbnNycHVwZV9nXFZXT0lX + T0lcV1hiXV5nZ2doaGhuZ2loYWNdVlhfWFtfX2JeXmFlY2dqaGtua2poZWRqY1pjXFNeVlBcVE5Y + W1xkZ2hwanNuaHBtZGNpYV9dXlpbXFdjXl1qZWRua29tam5uY19jWFVeWlhrZ2Vzcnl0c3p3a3Rr + YWloXF9nW15hV11iWF5aVlNeW1dtY2d1a29wbnJvbXBrZV5oYltraHBuanNya3J1b3Vza25rZGdo + X15iWlheVFBfVVFjXl9nYmNqZ21pZWttaGlqZWdrZGdtZWhrYmNoXl9nXFtpXl1pX2NqYWRtaGly + bW57Z255ZGt3aWdzZWNqYl5oX1xnWldlWFZkYmVkYmVnYmNnYmNtZWhvaGp1ZGNrW1phWlpfWFhi + WlhfV1ZkV1NnWlVvW191YWV7ZWp/aW56ZGtvWmFlU1BjUE5oVlpzYWR3bnV1bXR5ZWhwXV9vVk9r + U0xeTENjUEdqWE9vXVRuXlRtXVNrWlBuXFNzYWd4ZWt5Z2pyX2NpWlNpWlNoW1ttX194Y2V3YmRu + XldrXFVuXV5zYmNyZWlvY2dzX2JzX2J0YVd3Y1p6Z2l6Z2l5am9zZGl1X1RvWk5qU0hpUUdpWFVv + Xlt4Y2F5ZGJ6aGJ9amR+aW59aG16Z2d7aGh7Z2d4Y2N1XlhvWFNtU0xwVk9wXFpzXlx4ZF55ZV+A + aGl+ZWd5YWJ3Xl9wXmR3ZGp5bnl1anVuZGVpX2FeVlVdVVRcVVVkXV1oYWNqY2VqYWdpX2VyYmtt + XWdrZGdwaWt1Z256a3N9c3d+dHh3c29ybmpwZV9uY11uZWR0a2p5bnd7cHl4dXdyb3B0aGttYWRu + YWFlWFhlVE1nVU5rYV9rYV9uaWpqZWdvXl1rW1phUE1jU09jWltkW1xkW2FnXWNpZW5wbXVyc3d0 + dXl3cHt4cn10c3pta3NtYmFoXVxkXV9oYWNub3N3eHt5d3p3dHhraW1pZ2pwbXV4dH1yb3Byb3Bq + YmFnXl1kWFxkWFx0aGt0aGtnX1ViW1BcUU5cUU5cW1dpaGRyb25yb25raWhpZ2VjXl9hXF1hWlxj + XF5qYWRzaW14cHNza25zamdqYl5rXFVoWFFdWFplYWJvaGpuZ2lyaWhuZWRnY19iXltiW11nX2Jr + Z2hvamtuaGVrZWNhXFtnYmF1bXR4b3dwaWtqY2VqXVtqXVtiWlhcVFNbUE1fVVFpYmR0bW91b3h0 + bnduaGNkXlpoXGJtYWdzbXV5c3twcHNtbW9rZGdkXV9fT0xjU09fW1xiXV5lYWRoY2dkYmVlY2do + Yl9oYl9rXl5tX19qXVtrXlxoXF1tYWJraHB5dX59dYR5coB1a29zaW1qX15nXFtnV09kVU1pWFdl + VVRnXFhrYV1wZGVyZWd0X11tWFZpXVVfVExeU0pjV09lWlFoXFRrX2NwZGh4aW56a3B7YWV4XWJu + W1VpVlBrXl54amp5cHh1bXR7aGh1YmJqYVZlXFFdU09iV1RtYmF4bWt4bWd1amRyYltvX1hwYmRt + XmFuW1RpVk9jVUdlV0lnVldtXF1yZGJyZGJ1XVx1XVxrYmVwZ2pyY2VzZGdyZF9yZF95Z2F6aGJ7 + b3N5bXB+aWt0X2JpWlFoWFBpUUdpUUdrW1dwX1x3ZF55Z2F+ZWd+ZWd+ZG1+ZG1+ZGp9Y2l1YWV0 + X2R6YV10W1dwVlNvVVFtWlp0YWF+amh/a2mCbW1/amp4XV1zWFhuX2JyY2V1anhvZHJqX15lW1pe + TElaR0VcTEplVVRnU1NnU1NnVldlVVZnW1xkWFpjXVtnYV5tZWVwaWl1bnB4cHN3cnB1cG90Z2Rr + XlxqYWJwZ2h4bnR7cnh4dH1zb3hwbm9qaGlrZGllXmNoXlVuZFtwYmRvYWNtbWpqamhuZV9pYVto + XFNpXVRjX2VkYWdiYWVoZ2toZ25ta3Nwcnh1d317c3p4b3d0b3NuaW1nXV5kW1xpXFpvYl9ya3J4 + cnhzdXducHJqZGpoYmhta3Nwb3dvdHV0eXp1dXNycm9oZ2FcW1VkXV9lXmFnZV9eXVdlWltiVldo + Y2d1cHR1dXV0dHRwbnJqaGtiYWVjYmdjYl5kY19nY2lwbXN9eIh5dIR1dXhtbW9uaGNnYVxbV1Fh + XVduYmNzZ2hwa2ptaGdoaWJiY1xfWFtiW11qaGlyb3BvbnNqaW5kYV1lYl50anB3bXNtamloZWRu + Y11uY11iW1BcVUpbU01eVlBkYmVua29zbXV1b3h5bmhqX1piVVBnWlVwaW54cHVzcnlwb3dvZWto + XmRjVlRbTkxbVlVdWFdhXF1nYmNoXmJnXWFoW1hnWldrXl5uYWFpYmJtZWVqYWRrYmVtaXR1cn15 + dIN1cH91aHVwY3BuWl5lUVZkU0lkU0lpV1FnVU9kVFBtXFhwXmJzYWR3Y2F1Yl9qW1RjVE1jVE1h + UUpiWlRjW1VpXWFuYmV3amt5bW50Y19vXltrX1doXFRyXmF7aGp9cHR5bXB6Z2d6Z2d1ZFdqWk1j + VVpoWl50Ymh7aW9/a25+am13Z19zY1x1ZGVvXl9tW1FlVEphUUdiU0hoVFtyXWR1YWV3Ymd1YWV0 + X2RzZGl0ZWp5aGd5aGdzaGRzaGR6a3B+b3R9cHJ7b3B+Z2JyW1ZpVVNtWFZrVkpqVUlqVlZvW1t1 + ZGN6aWh/amh+aWd+ZG2CaHB/aW53YWVwXV91YmRzX19uW1tzW1p1XVx0ZF16amN/amqCbW2DamuC + aWp7YVp3XFVnYV5oYl9uZW1rY2poWlxhU1VcSkVWRT9YRkRdSkhYTElcT01YTkpXTUlXTkVdVEpe + UFViVFhkXlpoYl1rZGduZ2l0b3B4c3R1a21wZ2hqYmFoX15zZ211aW94cnh3cHd3b3Jyam1nY2lo + ZGpuYmVvY2dzZGdzZGdvbWttaml0aF9uYlpjW1dkXFhlYWJpZGVnZ2dpaWlvam5wa29va3R4dH16 + dXl0b3NraGJoZF5lXVxoX15qZ2Nva2h0bnR3cHdvb3Jqam1pZGVlYWJqZGptZ21ub3h1d397eoJ7 + eoJ7cnNtY2RcVVVqY2Nqa2dqa2dpY15kXlpkYWl0cHl4eHp7e354c3dwa29nZWpta3BqamppaWll + aXJydX56eod7e4h+fYdycHpwbm9vbW5eXVVYV09rYV94bWt1cHR3cnVvb21jY2FfXFZfXFZqZWd4 + c3Rzcnlta3NkYmVkYmVvZWl0am5nZ2Rra2lyam1waWtvY2RpXV5pX2NoXmJnYWtwanVzcnd1dHl1 + a29lXF9dU1FiV1ZuZGp3bXNzb3hybndwZ21pX2VoW1tkV1diXFdkXlplY2JjYV9oYWFnX19rY2Jq + YmFuYmN0aGlwa290b3NybXBybXB4b3t4b3t3c350cHtyaGtoXmJkVlhiVFZlW1pqX15qX1xoXVpl + VVRqWlhzXmh6ZW96a3N5anJ3Z1xyYlduXlRvX1VyZF9qXVhpXl1vZGN4ZWt4ZWtuYVxoW1ZnXFZl + W1VvXl95aGl5bmp5bmp6a25zZGd0X11vW1hwW190XmN3Y3B7aHWDbXKCa3B7amd6aWV6ZWpwXGFz + WlZuVVFqV1BwXVZ0Ymh5Z216ZW14Y2p0Z2RzZWN0aG51aW95ZGt4Y2pyZGR1aGh6aG6AbnR9cHJ9 + cHKGaWt6XmF0VlN0VlNtV0xrVkptVVh0XF95ZGt/anJ9aWN6Z2F9Z2t7ZWp6ZWV1YWFvW11zXmF0 + X2R0X2R1Yl94ZGJ5ZVx6Z116YmWDam6DamuDamuCaGN5X1tnXFtnXFtrXV9uX2JpXFxkV1ddUE5Y + TElbSEZdSkhXSEBYSUFVT01RTElUTkdYU0xfVFVjV1hjXF5kXV9nXWFnXWFtam5wbnJ3bW51a21w + ZWRrYV9qYl5vZ2N3cnN1cHJ5bXN3anBqYmtqYmtpYmdoYWVoX15uZWRvbW5wbm93a2pvZGNiX2Fd + W1xkW15pX2NnZGNlY2Jvamt1cHJ1c3d3dHh3c3lybnRzbm9uaWpjXFxqY2Nua29wbnJ1dHl0c3h0 + bnRrZWtkYmNiX2FlXl5qY2Nqa29zdHh5eIJ9e4Z/dH1zaHBnX2Jza25wbm9vbW5waGdqYmFkZGdy + cnR4d359e4N7cnh1a3JoZ2tubXJta3Nta3NqbXlwc391dYZ5eYl+fYd6eYN3dHh1c3doX15hWFdr + Y29+dYJ6d4JybnlpaWlkZGRYWE1VVUljX1x0cG16c4JyanloZG1hXWVqXmJvY2dpanBvcHdvbXBw + bnJ0a2hvZ2NuZGVwZ2hlYWRwa29wdHptcHduaWhhXFtnXFtqX15vYm14anVzbnJuaW1uZ2drZGRq + YmFqYmFrZ2VpZGNpZGVpZGVpZGVpZGVtaGdtaGd0ZWp3aG1zaHV1anh3b3R1bnN0aXJ1anN5b3N5 + b3NvaWJiXFVeVFNhVlVqYWRuZGhrYmNqYWJqXV1oW1tyXmt4ZHJ5a3R9b3h7cmR1a151ZGF5aGR5 + a2tyZGRuXGJ1Y2l6bnJ3am5yYWJqWltoW1tpXFxuYmV1aW15b3B4bm95am1zZGdyXWJyXWJ4Ymd4 + Ymd6a3N9bnWCbm6Cbm6Ca3B9Z2t6aGt0YmV1XlpzXFdzX2J7aGp7b3B5bW54ZGR1YmJzZGdzZGd1 + Z2t3aG15ZGl4Y2h3YWV4Ymd3aG96a3N9bXd6anR+X1x5W1dzVU90VlBtVlBuV1FvVVV1W1t3Y2V/ + a259aWd5ZWN6ZW15ZGt3Y2F1Yl9zW1puVlVyV1NzWFRyWlh3Xl14YVt5Ylx3Y2F+amiCbnB+am19 + Y1h5X1VjT1ZjT1ZlVFppV11nXlthWFVoV1RqWlZnU1BjT01cTkBYSj1USj5RSDxVTD9cU0ZeVFNh + VlVeV1diW1tiWlhnXl1qZWltaGt3bXB4bnJyaGluZGVvZF5vZF5yam1za25/aXV9Z3NvYmJtX19k + XV1jXFxhXFFhXFFnZ2dubm53bXBwZ2piX2FbWFpfWFtjXF5lYWJkX2Fyam9za3BycHpzcntycnRu + bnB1bnBza25nYmFqZWRraW1vbXBzcndzcndyaXBqYmliXV5bVldbVVNdV1VhYWFubm5yc3d1d3p/ + d4N5cH1qZWlzbnJ4dXl4dXl1bnBza25paWtycnR3dX16eYB/eH13b3Rrbm1ucG9ybndraHBuanNz + b3hwcIB3d4d9eoh5d4R5dXt4dHpzZGluX2RubXd3dX90dX5qa3RpZ2ViX15YVU1XVExkZGdwcHNu + bnBoaGplY2dbWFxjW1dtZGFwcH50dIJubXRubXRwaWt1bnBzanRvZ3BqYmluZW1oZ2tkY2htYl5u + Y194a293am5uZGhwZ2prZGlpYmdrZGdvaGpqaWVta2hraWpraWptY2dvZWlyY2V1Z2ltamtyb3B5 + bXBzZ2pvZG1zaHB0b3Bzbm93bXByaGt1a293bXBwaWlkXV1hVlNoXVpzZ2h1aWp0aGluYmNuYWFv + YmJrXWRzZGt3a3d6b3p+dHV3bW53aGp3aGp7b3N6bnJ6aG59anB+cnV3am5zX19rWFhqWFxqWFxq + XWV0Z291a214bm96aWh1ZGNvYWNvYWN0Y2R0Y2R+am2Db3KDb3KCbnB7amt5aGl5ZWNzX11wX1x0 + Y195bXN9cHd6bm91aWp1XlpuV1NrWFtuW114XmR5X2V0YWNvXF5vWl5yXGFwY253aXR7bXJ9bnN/ + ZVt+ZFp5ZV93Y11tXVNtXVNzV1p4XF55Y2h/aW57aml5aGd7ZWp5Y2h+Y2V3XF51WE9wVEppUExv + VlFzV1d4XFx0Ylx0Ylx3Y2F+amh/a255ZWh6YVR3XVBtX2hiVV1oVlpnVVhlX1hoYltuZV9vZ2Fo + YVdkXVRiVk1fVEpYTj9aT0BfVExjV09kV1dlWFhkWFplWltpV1tuXF9nXFttYmFybXB4c3d1cHJy + bW5yaGlyaGlyam13b3J/anR7Z3ByZF9qXVhfXVBaV0peUVFeUVFlXF9zaW17b3N4a29qYWJlXF1k + W15kW15eXF9lY2duaW1vam5ranJvbnVuanBqZ21vZWlwZ2puZ2duZ2dvZ251bXRyc3tvcHlwbm9q + aGlkX1VhXFFbWE1aV0xdV1BjXVZqYml0a3N1dHtubXRnY2lraG53dX13dX10b3N0b3NwanB0bnR7 + dYCCe4d9eX93c3lta3Bwb3RwbXVtaXJram9qaW5rbnpvcn51d310dXt5dX55dX5wZ21yaG54b3t9 + dIB0c3pqaXBtaWVkYV1VVlFdXlpvbXB3dHhpZ2hjYWJpYmRfWFtkYmNraWpzeINwdYBzanJuZW10 + aXR6b3p3aG1tXmNlV1pkVlhjVVpnWF1uY2t1anN4bXV4bXVyam1nX2JpX2NoXmJpX2NyaGtybW5y + bW5wa21rZ2hrYmVoXmJqYWRzaW11anN3a3R0am5wZ2puZGpvZWtyb3NqaGtoZWdqaGlranJqaXBq + Z21iXmRnYV5rZWNza25za25yY2VwYmRvYl9tX11tXF1tXF1yXmt6Z3R5bnd1anN5ZGt5ZGt1a295 + b3N4bnJ3bXB9bXd6anR5ZWhtWlxoXVpoXVpnWFtuX2Jtamtwbm90aWVtYl5rY2JuZWR0Z2dzZWV5 + Z2p9am6Aa3B9aG15ZWN3Y2F0X19zXl5zXmN5ZGl5bnt9cn99am53ZGhvXFVkUUpqUVdtVFpzVl10 + V150XFtzW1ppWFpqWltqWF5yX2V4Y2p+aXCAam+EbnN+c294bWlyYVRqWk1qV1FuW1VwX15yYV9z + YmNwX2F0XmN5Y2h9aWN4ZF54XlB0W01uV0ZqVENyVFF6XFp0Ylx3ZF55XmF9YmR7Z2R4Y2F0XFFu + VkxqZWlhXF9rWFhqV1drXlxvYl9uaGVtZ2RtZF5oX1pkV1NnWlVlVEppV05iWlRkXFZqXmJoXF9k + W15lXF9vXWFqWFxiV1FkWlRkZGRubm51bnB0bW9ybXBwa29za3B3b3R7bnd5a3RzaGRuY19jXVZe + WFFcVVVcVVVkWFBuYlpyY2V0ZWhuZWJqYl5oYWFoYWFoY2RtaGlvaG1uZ2tuaWpuaWpzZ210aG5y + Z29zaHByZWlyZWlrZW50bnd0cHtva3d3bXB3bXBwZ2puZGhoXVpdU09fTkdhT0hjXGFyam93b3J1 + bnBvamtwa210cHt1cn1yb3Nyb3Nva3J3c3mAeoOCe4R5c3lya3JtZG5vZ3BubXJqaW5ta3BqaW5p + am5wcnVucnVvc3dzd31ucnhtaW9va3Jzb3p6d4JvbW5qaGlnX19pYmJnX2Jyam1wcnhzdHppYmJc + VVVhVVhhVVhoYmhya3JwdHpydXt0anBwZ210c315eIJ9aWtvXF5oW1hkV1ViVlpoXF9uZW13bnV1 + bXR1bXRyaGlpX2FlXGJnXWNpYmduZ2tzbnJwa29waWtqY2VqYWRrYmVpY2lwanBuZ2tuZ2tyam1y + am1raWpraWpwa29taGtrYmVtY2dtYm1vZG9pYmdpYmdoYWFqY2NyaGt1a293ZWRyYV9yYV9wX15v + XFxoVVVqXmR3anB3a3d0aXR4ZWt4ZWt1anN6b3h3bm1zaml1a3J0anB5Z21vXWNoV1RkVFBqWlty + YWJ0b3N0b3N6aWhzYmFzXWJ4Ymd1Z2l1Z2l5bW54a215am16a257Z2d3YmJ1XlpyW1ZrXl5wY2N4 + anN6bXV4ZGdyXmFlU0lfTURiTk5kUFBnU1dtWF1wWFdwWFdrVU9qVE5lWlBlWlBwXmR4ZWt+bnqC + cn6DcnN6aWp1XFdqUU1yVFB3WFVyXVt1YV5zX19vXFxyX2N1Y2d0Z2d5a2t6Z194ZF11X1BwW0xv + WFN3X1p9ZV19ZV2AYl97XVt+Y157YVxuVkxqU0hlYWJjXl9pXV5pXV5oXmJpX2NpY2FlX11lW1Vl + W1VjVlFlWFRlWlBqXlVtXVZtXVZtXF1qWltnW15tYWRpX2FpX2FeWk9dWE5fW1xpZGVwaWlyampw + Z2p0am51a290am51bXd4b3l4bnJwZ2pqYWRpX2NkWFpjV1hjWElnXE1vX1dyYlpwZWJyZ2N0Z2R4 + amhybW5wa21yZG1yZG1wZGVyZWdyaG50anByaXVyaXVzYWdvXWNpZGhybXBvaXJuaHB4aHJ6anR0 + a3h3bnpwa29oY2diU0xhUUpfW1xqZWdzZ2hzZ2hwaWtyam1vbnNubXJwbXNzb3V4b3d9dHt/e4J9 + eX9zc3Vqam1tZWhyam1tbnJoaW1taW9uanBpaWtpaWtqaW5ubXJzb3puanVraG5qZ21ranJ1dHtq + aGdhXl1tY2RzaWptamtyb3BudXNudXNrY19cVFBfT1BqWlttZWp0bXJ1b3V3cHd3a3d0aXR4d354 + d355bW5yZWdtX1trXlpjWltoXl9oZGFva2hwaW5waW5pZGVlYWJkXGVjW2RjWl9tY2lwaWtvaGpr + ZGdqY2VrYmVqYWRpX2NtY2dqYWJqYWJzZGl1Z2tyaGtwZ2puZGhqYWRtYWRvY2dtX2huYWltY2dq + YWRtYWRtYWR1aW93anBzZ2huYmNrY19tZGFqWlhiUVBlWGFzZW54bXh3a3d4ZWl7aW17cH57cH54 + bWtwZWRyY2hzZGlzZ2puYmVvW1tpVVVkXWJrZGlwanNzbXV4Y2huWl5yWF56YWd4a210aGl4a294 + a296a3N6a3N6aGtwXmJyW1ZzXFdvXFxuW1t0Ymp6aHB4X15vV1ZnTkdiSUNiSkloUE9uWF14Ymdw + XV1vXFxtWlNpVk9rVU1qVExtW2F0Ymh7bXR/cHiAa256ZWh4XV93XF57XVt9Xlx1XV55YWJ0X190 + X190YWN0YWN4ZWl1Y2d4ZGR4ZGR1YltzX1h1XFdzWlV6Y159ZWF6X2J4XV94Xld0W1RqUUVlTUBj + V1tkWFxkWlZkWlZpV1tkU1ZdVEpdVEpdUUleU0piUU5iUU5hVE9nWlVrWFttWlxlWFhlWFhrV2F1 + YWpoZWRlY2JnXlhiWlRfV1ZiWlhqY2VtZWhramdramdza2tza2twZXB0aXR5a3d0Z3JtZWhrZGdt + YWJoXF1oWFFtXVZyYWJ4Z2h1Z2l6a255b3N5b3N4cHVza3BqY2VpYmRvaGp1bnBzb3hzb3h0bnlw + anVoXl9pX2FpYmRuZ2lpZGVqZWduanBwbXNua290cnV0cHtraHNpVVxiTlVjW1ppYV9taGdqZWRp + YWhqYmlpZW5uanNyanlyanlzand3bnp5eIJ4d4B7d3pvam5oY2RpZGVnZWpnZWpraWptamtuZGVr + YmNrYmVyaGtubXRpaG9tZWpvaG1ubnBvb3Jqam1kZGdvZG93a3dzcntubXd0dX5vcHllX1hbVU5l + X1hvaWJraG5raG54bXh5bnl3bnhzanRycHV0c3h5cnR4cHNybmplYl5iWlRkXFZrZ1xtaF1tZF5n + XlhjX1piXlheU1RbT1BXUVdlX2VuY2tvZG1rY11lXVdjXVhkXlpoXF9pXWFnX19qY2NzZ2pyZWlq + X2hoXWVoX2lrY21yZWlyZWluX2RpW19qXl9oXF1nWF1tXmNyY2p3aG9uY2tvZG1taGtpZGhoXVxd + U1FdV1BoYlt0bW91bnB4bXp5bnt9c4d9c4d6a251Z2lyY2hvYWVwZGhtYWRtXmFqXF5qXmR0aG57 + a3h6and4Y2hqVltuWF13YWV0amt5b3CCc3p9bnV/bXN+a3J5a2tzZWVyXlhoVU9oW1hoW1hwXGN4 + Y2p1Y11uXFZuV1FpU01wVVV0WFh0Ymp9anN7bXJ0ZWpwXVtwXVtvV1hqU1RqVlhwXF5zYWd9anB/ + am16ZWh1YmR6Z2mAaGd/Z2V6X2J4XV9zV1dyVlZzW1xzW1xyXV1yXV11Xlp4YVx1Y110Ylx3X1d1 + XlZ5Yl14YVx5XmNwVltyVE5wU01rTUFtTkNhUFFkVFVlVVRlVVRpWFVkVFBdUUlcUEhdTkdcTUZe + Tk9hUFFiUVNkVFVqWlZqWlZqXV1pXFxtXmF0ZWhwbXVraHB0Y19vXltiVk5fVExiWlZlXVpqZ15r + aF9rY11pYVtuXGJyX2VwZGpwZGppZ2ppZ2prYmhrYmhzZ215bXN4bXV5bnd6cHd4bnR1bXR1bXR3 + bnh0a3VrZ2huaWpwa2p1cG90cnNwbm9tZWpqY2hoYWNoYWNoXmJnXWFqY2VqY2VraWpwbm9ua21w + bm9zc3VwcHNrZWFoYl1qZWdrZ2hqaGlpZ2hnX2JoYWNoY2duaW1uZW9qYmtnYmNuaWp0c3pzcnl6 + c3Vza25tZ2RkXlxhX2RlZGlraWpqaGlyaWVtZGFyZ2V3a2pwcHBvb29uZGp0anBybnd0cHl1bnN0 + bXJ4bXh3a3dzb3hwbXV4d4B0c31nY11kYVtzbnJ3cnV1cnpybnd4b3l9dH51b3VzbXNybnd3c3t6 + dH17dX53cnBkX15tX111aGVyaWhuZWRpZFpkX1VeVlBdVU9iVFhiVFhdVFVkW1xuZ2dyampwZV9r + YVtpXlhnXFZjWFdnXFtiX2NraW1rZ2plYWRhXVpiXltnX2RrZGltY2drYmVkXFhiWlZlXFNkW1Fo + Wl5wYmd5Y295Y29waWlwaWlzbm1uaWhpWFViUU5kXFhrY190a3V1bXd4bXp4bXp6bn94a317Z25z + XmVuXF9vXWFrYmVpX2NuY19qX1xtXF11ZGV4a293am5yXVtoVFFtWFt0X2J1aW1/c3eEdH6AcHp7 + bXJ6a3B6aWh3ZWR0YWNuW11vXFxvXFxyXmF4ZGd9YmR3XF5yYV1zYl53YmR5ZGd0am56cHR9bnN4 + aW54Z2NwX1xuW1hnVFFoVFZrV1puX2d6a3N/am19aGp4ZGR7aGh7aGV4ZGJ4XFxwVVVqT1ZrUFdp + VVNoVFFqUFBrUVFvV1ZtVVRwWlFyW1NwWlRzXFZ3V110VVt4WFpuT1BrTUVtTkZvUEhyU0pfT05n + VlVnWF9nWF9jWltfVldeU0pdUUlbUUVcU0ZhUE1kVFBnVlVlVVRnXVRtY1puYWFvYmJqYWRyaGt3 + bnh3bnh1Z2ltXmFhWFVeVlNjW1dqYl5wZ2hwZ2hrYV9rYV9uXFZtW1VrXlxuYV5iX15fXVxjXF5p + YmR6bXWAc3t7c3p5cHh3b3JuZ2lyZ3R0aXd1a3t3bX1zbnJzbnJzcG9zcG9zbWVqZF1kXlxkXlxn + XWFpX2NpYV9jW1ptYWJwZGVybW50b3BzbnJ0b3N1bXR3bnVqampvb290b3B0b3B0c21ramRkYVtu + amRvaGh0bW1lY2diX2NjYV9nZGNuaHB3cHl6cnt4b3lyam9rZGljYmliYWhoZGpuanBuaGNrZWF1 + aWp3amt0cG1ybmpwZ21zaW9ya3d5c354b3d5cHh+coN6bn93cHt3cHt3dX90c31uaGVuaGV6d394 + dH15dYB0cHt5bnt5bntzaHN0aXR0bW95cnR5d3p1c3dzamltZGN1anN9cnp9dIB1bXlqaGlkYmNq + XVtkV1VlWFZjVlRiV1RoXVpyb3N4dXl5cG1zamdwX15tXFtnXFtrYV9pZWtuanBrX2NlWl1hWFdk + XFtrZGdqY2VqZWlnYmVjXVthW1hjV1hlWlttYWJvY2RyZGR0Z2dyam15cnR5c3lvaW9rW1pkVFNo + X15uZWRzanJ3bnV3bXN1a3J7cHl6b3h5Z2prWl1nVFRoVVVoW1tpXFxlXlVnX1ZkX2FpZGVzaHBu + Y2ttWldpVlRoVFhzXmN3b3R7dHmAdHp+cnh3bXN0anBwZ2hyaGl5a2tvYmJrXFRuXlZ0YWF4ZGR+ + Y2h7YWV1ZGF1ZGF1Y2d3ZGhyaG54bnR9anB3ZGp5ZWN1Yl9qXVhlWFRtWlprWFhvYWh4aXB6Z2R3 + Y2F1YmJ3Y2N6ZWN1YV5vWFNpU01iTlNjT1RkUVFnVFRlUU9qVlRvVVVvVVVuVUptVElvUU5yVFBw + UVNvUFF3VlFzU05lTUNlTUNtUERtUERhV1toXmJuZ2ttZWpnYmFjXl1iVVNcT01eU0piVk5uWmFw + XGNwY2NqXV1lXVprY19vY2RvY2RqY2VuZ2lqa3JtbnRwZ2pwZ2ppYV1hWFVjV1htYWJrZGdrZGdo + X1plXVdkWFBnW1NlWFRlWFRiXFpcVlRhXF1oY2Rzb3h3c3t6cHdzaW9tY2RtY2RwZ21yaG5vam50 + b3N1cHJ3cnN1dXVycnJuaGNoYl1pXl1rYV9nX19oYWFoYWFnX19rZ2Vwa2pybXBybXBzaW10am5z + bm93cnN7eH5+eoB7eXp5d3h4d3Bwb2lzc3V1dXh1c3RzcHJpZWtkYWdiXGJfWl9fXmNram9ycnJz + c3Nza3BvaG1hW2FdV11jX2VkYWduZGVuZGVtYWR3am51b3V3cHd1c3draW1taXR1cn1wb3lzcnt4 + d4Bzcntta3NjYml0a3V6cnt3b3R1bnN6dH14cnp1cnpybnd6bXV7bnd1cHRvam5ubm50dHR5c3l4 + cnhyam1waWt4b3t/d4OEeYJ6b3hybnRwbXNuZ2tpYmdqZG1oYmpiXmRqZ21zdHp1d31yb3BvbW5p + YV9oX15nX2JtZWhtaW9qZ21pXV5jV1hfVVRkWlhoZGFoZGFrYV1jWFVoVVVnVFRnUVhwW2JrY2Jt + ZGNuZ2dtZWVwbXh3c35ubnBkZGdnYV5pY2FzaW14bnJ3bnV1bXR3bnh1bXd6cn55cH15bW5wZGVp + WlNqW1RpXltrYV1zYVtwXlhrXV9wYmRzZGlwYmdrXlxnWldkV1dpXFxvamt0b3B3bXB0am5tY2dr + YmVuZGhzaW1yaGlqYWJtW1FqWE9tWFhzXl54ZWt4ZWt3ZWd1ZGVwY2NwY2N4ZWt7aW99Z2t5Y2h5 + YWJ1XV5rW1dqWlZyXV9wXF50Ymp1Y2t6Y154YVx1XFd1XFd3XVZyWFFkU0ZiUEReTE5jUFNqV1pr + WFtqVE9nUExnTUZnTUZlSENpTEZwTkxyT01yUU91VVN+W1Z5VlFyVUxrT0ZpSUVwUExqY2VtZWhz + aWpzaWp1Z2lyY2VrYV9lW1pnWlVwY15raW1qaGtyaGltY2RuYV5rXlxtWlpuW1toYl9rZWNoaGpq + am1qaW5paG1tYl5nXFhoW1hvYl9oYWFvaGhtZ19pY1xrXlpuYVxwYVprXFViW1tYUVFfWFhtZWV1 + cnh1cnh1a29tY2dpX2NrYmVvamtvamtwZ213bXN3cnV3cnV1d31yc3lyaGlnXV5lXF1pX2FpX2Nt + Y2dyZWluYmVpaWlra2t0a3N0a3NwaWl0bW1wcHB1dXV/eX+DfYOAfoJ3dHh6eHl9ent/e4KAfYN5 + dX55dX5vb3JlZWhjXl9fW1xdXV1paWlvb29qampwaW5waW5nX2JhWlxpYmdrZGlwZW5wZW5rY21v + Z3B0cHt3c35zbm9oY2RnYWtwanVvbnhycHpzcnlwb3doYl9jXVtpZ2pyb3N3cnV3cnV4dHpzb3V4 + c3dwa29vaXJwanNwanB0bnR5b3N9c3d5c3l1b3V0anB1a3J9cn+EeYd/en53cnV1dHtycHh1bXd0 + a3VoaHRoaHRkam9la3Bvc3twdH1wa21iXV5iVVNnWldjXF5tZWhuaWprZ2hlXVxeVlVfU1NnWlpv + ZGFwZWJtXVVoWFBlUU9lUU9hU1dqXGFqYWd0anB3aGp0ZWh5a3R6bXV0am5vZWluZGV0amt6cnl4 + b3d0cHdybnR5a3d4anV1anh3a3l6b3hzaHByXl53Y2N0Z2dzZWV3aWRwY15yXV10X19wYmRuX2Jt + Yl5pXlttXF1wX2FvZWt1a3J1aWpzZ2huYVxvYl1uZGhyaGt3aWRwY150W1RwV1BtW1VyX1p3ZGh5 + Z2p9aGp6ZWh3Y2N1YmJ0X2R4Y2h7Z2l1YWNzW1pyWlhrWFZrWFZlW1dlW1dzXmN1YWV3XlRuVkxr + U0huVUpwV01uVUpnT0NoUERhTU1kUFBuVVFtVFBnTkdhSEFfSj9fSj9oRz1vTkRyT011U1B0VU16 + W1N7XVt5W1h0XFFvV01wVVV4XFxlY2Rtamt3b293b297a3V9bXd4a29zZ2ptZGFtZGFpaWlqampu + aWptaGlpZGNeWlhdUUhbT0ZeUVFkV1doXF1pXV5qY2VvaGpoYVdlXlVpXlhtYlxyY2h4aW5ua2pt + amluaWhuaWhzamltZGNrXlxlWFZiV1RqX1xvbXBzcHR4a29uYmVvYWhyY2pwaWtwaWt1anV5bnlz + cnt3dX94d4BzcntwbWRpZV1kY11jYlxrZGluZ2tyY2VyY2VlZWVtbW15b3N1a29ycG10c29wcHB3 + d3eCen+AeX6DeIN7cHt5d4Z+e4uIf4yEe4h7e4l4eIZ5bndtYmpkXV1fWFhhV1hjWltkY2hlZGlq + YmltZGtrYV9qX15pYWhwaG90bndzbXVta3NranJ1cnh4dHpyam1hWlxcWGFoZG1tZ3JwanV1dHly + cHVnYVpcVk9fYVxnaGNpaWltbW11b3V0bnRzbm1qZWRnYWlpY2tlZGtta3N7c3p3bnV6bnJ5bXBz + aHN0aXR9cIKCdYeAeoB1b3VwaG9yaXBvbnhqaXNvZWtrYmhnZGhtam5ycn5vb3twaGdjW1phVlBf + VU9jWl1tY2duaWhqZWRpX2FjWltnWlprXl5wa21vamttZGFjW1djU1FkVFNlWFZtX11yZWl4a290 + aGlyZWd3amt5bW53bXBwZ2p0aG59cHd7d4Z4c4J7cnV4bnJ5Z296aHB4anN5a3R4bXV4bXV7aGh+ + amp7bXJ6a3B0aGltYWJzW1xzW1xwXGFzXmNvXl1wX15yXWJ4Y2h1Z2t1Z2t4aWt4aWtzY1twYVh0 + aWh4bWt6bWhzZWF1XlpzXFdwXFxyXV14Y2V6ZWh9YmR9YmR1YWFzXl5wXmR0Ymh5ZGd6ZWhzX110 + YV5zXFdpU05nVUhpV0prW1dtXFhwWE5oUEZrT0RwVEhzW05yWk1qVUloU0doTU9pTlBqUUVpUERj + TEFeRz1fR0BiSUNjSj5rU0ZtU05tU050W1B4XlR3Xl11XVx0XVdzXFZ4XGGAZGltX193aWl4a3J7 + b3WAdHh/c3d9cHR1aW1zaGRtYl5pZWJraGRnYmFlYV9oYWFfWFhdVElYT0VdTUljU09lV1pqXF5w + XmJwXmJvXltuXVpqXVhtX1t0ZWh4aWt5b3B3bW50b3N1cHR3bXByaGtwaGJnXlhjX1ppZV9wbnJ1 + c3d7b3N4a293am5vY2dtY2RuZGVvZWl1a290c316eYN+fYJ9e4B6enpycnJvb29wcHB3a3RtYmpp + X2FtY2RvaWd4cm91c3dua29tam5pZ2pwcHN3d3l/dH19cnp5bnl6b3p5dIR9eIh7eH53c3lzb3pv + a3dpXmtnXGlhW1RdV1BfXltfXlteXF9dW15hWlxkXV9pYmJrZGRtZWhza253dHhvbXBtamtua21w + b3dzcnltZWhjXF5dWmJkYWlkYWloZG1ybnd0cHlqY2VXUFNbWFpdW1xcWlhhXl1pYWhzanJtZWho + YWNdV1BdV1BeWlhnYmFtaGt1cHR3bW5uZGVnX2JqY2V6cIJ/dYd1cHJuaWppYV9pYV9oY2JnYmFn + XWFiWFxiW11nX2JoZ2tta3BybW5qZWdjW1dfV1RkW15vZWlwZWRqX15jWl1nXWFoW1ttX19wanN0 + bndyampqY2NkWE9lWlBjXF5rZGd4anN7bnd0bmtzbWpzb3VybnR1bnNtZWpzZ2p7b3N+d4Z7dIN7 + cHl1anN4ZWt1Y2l0ZWpzZGl6a25+b3J/cHWDdHmCc3p6a3NwZV9pXlhzW1p1XVxvW19wXGFuXVxy + YV93ZGh5Z2p5Z2p3ZGhyZ2VzaGd0Y190Y190aG55bXOAbnJ9am59ZGh7Y2dtXVNrXFF3Y2N3Y2N3 + Xl9yWltwVlttU1doV1huXV50ZWp3aG11Y11yX1ptVE1nTkdnVUhnVUhvW1twXFxuW1FtWlBvXFVz + X1h5ZV93Y11wV1BuVU5nTUZiSEFoTEBjRzxhQzljRTtfQThkRjxoST5nSD1jSj1lTT9rU0xzWlN0 + WlZ5Xlt5XWJ3W194W2SAY21rW1pvXl11Ym19aXR7c396cn53cHl1b3h5a2lzZWNtZGFwaGRrYmVr + YmVrYmVnXWFkXFZiWlRjWFNkWlRkWlZpXltzX111Yl95Z211Y2luY2JuY2JuYmNzZ2h6cHd/dXt7 + d3h5dHV5b3N4bnJyb3BtamtubWdvbmh3cHd+eH6AdYB+c355c351b3p0bnRya3Jya3J3cHd7dX56 + dH14e4R7f4h/gId6e4J6enp6enp+c3t3a3RqZF9qZF9rZ2h5dHV1c3Rwbm9rZ2VqZWR1cnp/e4R/ + dXt7cnh0a3N3bnV3bnV7c3p3cHl1b3huZGhnXWFnWFtnWFtlXl5tZWVpaWtjY2VhXVpYVVFhVVZn + W1xuaG50bnR3b354cH90cHdpZWtqY2hvaG1qbXlucH1tZWhkXV9fW1xfW1xnXmhnXmhua29yb3Nu + Z2deV1ddV1BbVU5YVU1fXFRlY2dvbXBzaHNuY25iW11jXF5fXFZkYVtlYmhqZ21yaG5tY2llX11o + Yl9uY3BwZXNya3dwanVwZXBwZXBtZWhqY2VoY2JlYV9kXV9qY2VuZ2lrZGdrZ2VkX15lXF1lXF1l + XVxoX15vZGFrYV1jWltiWFplV1xrXWJ3bX55b4B5bm10aWhoWFFpWlNoX15uZWR4bXV7cHl5cnd0 + bXJybXtzbn1zbXNtZ21rZGlwaW56b3p9cn15cnRza251aWpwZGVoX1xtZGF6a3B/cHWCdH2Ac3uA + bW13Y2NqXVhoW1ZyWlt0XF1uXV5tXF1qWltyYWJzZWN6bWp6Z2d4ZGR1Y2d0YmVzZ211aW94anN5 + a3R7Z257Z25+am14ZGdvY1dyZVp6b2t+c29+aW50X2RwV01lTUNiT1FvXF5zZGl5am95ZWVwXV1r + VU1lT0dpVEhrVkpuV1FvWFNwWlRzXFZwXGF4Y2h6Z2RyXlxyWk9tVUpnSj5jRztkTD5hSDtlST1o + TD9nRzlqSjxtTT5uTj9jTTxkTj1oUU1uV1N1Wlp1Wlp1V1V3WFZyVFB3WFVlWFZlWFZpW190ZWp4 + cH97dIN6dXl5dHh6b256b251b210bmtwZ2hyaGlqYmFnXl1pXltrYV1qXVhqXVhnYV5pY2F0Y2R5 + aGl1cHJ5dHV3b3Jyam1tZWVvaGhyam96c3h6eHd5d3V9c3l7cnh1cHRuaW11bm51bm53cnV7d3p6 + dXd4c3R3c3l7eH5+eXp6dXd1c3d1c3d9dH57c314eIZ7e4l+fYR+fYSEgIeEgIeDfYh9d4J1bWtr + Y2JqZWl1cHR0dHRzc3NwaW5yam96eYB9e4N6dXd5dHVwaW50bXJzb3p7eIN6b3h1anNvZF5jWFNj + VlFtX1tra2t0dHRzcHRpZ2plXF1eVVZiVVVpXFxua291c3d3c3tzb3htZWplXmNhW1hnYV5jY2Np + aWlnY2llYmhfW1xdWFpkWlhoXVxnZ2dqampyaXBnXmVkXV1eV1dlX1tuaGNzb3VwbXNubXdubXdl + YmhnY2lnYVxlX1tkZGRiYmJvZWtuZGpoXl9oXl9lXl5nX19tZWVtZWVtZWpyam9vZ25vZ25uZ2tu + Z2tuZ2lqY2VyY2hwYmdrYmVoXmJnXltpYV1rZFtpYlhoXFBpXVFoXFNnW1FnWFtrXV95bnl5bnl5 + Z2p3ZGhyX2NvXWFuYWl1aHB4dH94dH97c3p3bnV4bXV3a3RraWhpZ2VpX2FqYWJzaHB5bnd4b3dz + anJyaGlrYmNlXmNpYmd0am59c3eAdHh4a293ZGhuXF9tXFtrW1p0XmNzXWJvW1htWFZjVlZpXFxq + XVt1aGV9amR7aWN4ZF5vXFZwXGF1YWV1X255Y3J6aHB5Z295a2t4amp3aWd4amh6c3N7dHSAa3B6 + ZWpwWlRuV1FpVVVyXV1zYWR4ZWl7aGV0YV5tVVRnT05jUEdlU0loVU5tWlN0W1Z5X1t3YWV9Z2t7 + aV90YlhzXEhuV0RqTT5oSjxoVD9oVD9uVkVtVURtUERtUERtUUFvVERpUURlTkBlVEduXE91XFd0 + W1ZwU09vUU5qUUdtVElqWFNvXVduYWF0Z2dycHh1dHt7c3qAeH+Ad3p9c3d+d3t5cnd7a3V5aXNv + Xl1uXVxoW1ZoW1ZpXltrYV1lXmFrZGdyZWd6bm95dHh5dHh4bXV3a3Rzbm9zbm91bXR6cnmAeoB+ + eH5+eH5+eH57c3p0a3N1a3J1a3J4cHV4cHV1bXR4b3d0c316eYN6d313c3l1dH51dH54d353dX10 + cHt4dH94d357eoJ9eoh+e4l+c36AdYB6c3Vyam1vY2l3anB1c3R1c3Rya3d0bnl5dYB9eYR7eX10 + cnVzbm91cHJuanNzb3h1cnhybnRwaWlqY2NnX2JuZ2ltcHRwdHh5d3hvbW5pXVVpXVVkXGNtZGtu + bXJwb3RwcnhpanBrYmVpX2NjXl1nYmFvZWd1a21uanBqZ21uYmVvY2dqX15nXFtrX2NwZGhyZ3Jy + Z3JoZWdqaGlvb293d3d9fX90dHdta3VycHpzcntvbnhwaWtqY2VjY2NkZGRuaWpuaWpuYmNpXV5k + XV9oYWNwZ2hwZ2hrYmVtY2dtZGtvZ25vZWtuZGpwaW5uZ2twXmJwXmJpX2FoXl9pX2NrYmVuZWRw + aGdtZF5uZV9uYlprX1doYWFrZGR1bXR3bnV4a210aGl3ZGp1Y2lyaXN5cHp5dYB9eYR/dH17cHl3 + aG9yY2pvZGNyZ2VzaGdzaGd4a3J4a3Jua29pZ2ppX2FjWltkWFxpXWFvZ25zanJ5am90ZWpuXVxq + WlhlXF1lXF1qYVduZFt1XlhwWlRpWFVnVlNkW1x3bW5+b3J+b3J6aGJwXlhyWl10XF91YWp4Y217 + aW97aW99aGh7Z2d9aGqAa25+b3R/cHWCbXR9aG96X2J3XF5yWl10XF90YmV4ZWl7amd4Z2NyXVto + VFFiU0xiU0xkUUpoVU5tVUpvV01yXlx6Z2R5ZV95ZV9wWkZuV0RzV0VwVUNwWExvV0p5WEd6Wkh0 + VUp1VkxvV0RvV0RvVk94Xld/Z2WGbWuHa2SAZV51WklrUEBqTkNvU0dwX2FyYWJ0Z2d4amp1cHR4 + c3d/cn2HeYSAeX5+d3uAeoB/eX97dYB0bnl4ZGdwXV9oXFRlWlFpW11tXmFlX11nYV5tY2d1a293 + c3l0cHd4bXV3a3RzcHJ0cnN0cHd1cnh9d396dH15dYB5dYB7c311bXd1a291a290bndzbXV0bXJ1 + bnNzb3hzb3h4cn13cHtzcH5zcH5vcn5tb3tzZ216bnR4aXB7bXR5cH17c394bXV6b3h5b3VyaG50 + aGt1aW1vbnNvbnNqaXBranJ0bnl/eYR7eX16eHt6eHt0cnV1bnN3b3R1dXh3d3l5cnR0bW9wanB0 + bnR0dXtzdHpzdHhub3NqZ2Nva2hvbnV1dHt4dH11cnp0a3hwaHRvZWlqYWRjX1xpZWJ1a3J+dHp4 + cHN3b3J0a3NyaXBlY2RjYWJuX2d0ZW1zZW5vYmpoYmhrZWtzanJ9dHt6eHt3dHhranJoZ25qanpv + b39zbXVya3RpZGVqZWdraW1raW1rZ2plYWRhYWNra259d396dH1tamtoZWdkYWdkYWdtX2pwY25q + Y2hza3BzaW1qYWRrX2FtYWJqZGp1b3V9cHR7b3N9a219a21zaW1vZWlrZ2hrZ2h4anN6bXV6c3V6 + c3V5b3VyaG5ubXRwb3d4c4J9eId6d31zb3VzYmNrW1xtX191aGh5b3B3bW56bm97b3B0b25taGdr + W1doV1RbV1RfXFhvYm15a3d5am9yY2hwXFxvW1tvXWF4ZWlwZ2hzaWp5bmp1amdwX15pWFdrY2J1 + bWt3b3J1bnB4ZGRtWlpuWlptWFhwYml4aXB7bm56bW2AaGeCaWh+a3KAbnR+cnN7b3B+aWd9aGV1 + YWNuWlxtWlNtWlNuXVxyYV94YVt0XVdpVlBhTkhhSkNdRz9dRjxhST9iTEdnUEx3XF5/ZGd/ZWJ9 + Y195YU94X051XU91XU90W050W059XVN7XFF1XE9vVklrVEBqUz90VFOCYV+Ha3CNcneNbmiIaWN4 + W05rT0NqTEBuT0RzZGl0ZWpuZ2lpYmRvamt1cHJ7bneDdX59c3d5b3N7dHl+d3uAeH99dHt5Z29z + YWloX1xlXVppW11lV1ppV05kU0lpV1tyX2N0a3h3bnpzaW9wZ21qaGttam5uanNybnd1b3VzbXNy + a3J5c3l7dX54cnpwa21uaWpwanBwanByam9uZ2tvaGpuZ2lwZW5yZ29zanR4b3lvc3ltcHdwa21z + bm9yZGRvYmJwZGp0aG5ya3RwanNyaXBvZ250aGt0aGtzanR0a3VwaWtvaGpzbXN6dHqDeX+Ge4KH + f4SCen9/cHV+b3R9eHt+eX1+d3l9dXh4c3d5dHh4eHp5eXt7dX50bndvZG10aXJ4b3t+dYJ+d4Z9 + dYR9b3h6bXV3a2h0aWVqaGltamt1cnqCfod/en56dXl3bnp3bnppbm1na2pqYmlvZ254a29uYmVl + Wl1uYmVuZ2t7dHl4c3Rzbm9tZ2JqZF9pZHRwa3tva3RtaXJqZWdlYWJrZGlvaG1zZGtqXGNbX2tr + cH2EgpR9eox4eHhzc3NqZWljXmJwYmlyY2ppZWtzb3V7bnd5a3RuZGhrYmVtaXR3c357eIB7eICA + cnSEdXiAdHh0aGtwZGhuYmVzaHB5bnd6d319eX97dXt0bnRwa29ybXBycn94eIZ3eoBvc3ltXVZo + WFFqXVt0Z2R5dHV5dHWCc3h/cHV3bm1waGduW1FoVUxjU09nVlNuY2t0aXJzZ21tYWdpVVpvW191 + YWV9aG16bXp7bnuCc3h/cHV0ZWhvYWNyY2h1Z2t4bm90amt6Y15vWFRqV1FtWlRvYWN1Z2mAbW2A + bW2Ea2+Ea29/anKAa3N/bm17aml4Y2F3Yl95Wl1yU1ZpVlBpVlBrWFFwXVZzXU9rVkhlTkBeRzpe + QzdbPzNbQzdbQzdfQz9qTUlyWl15YWR/aGKAaWODaWSCaGOEZFqCYld/X1R/X1R/X1d+XlZ7XlFz + VklvTzxtTTp0T06EXl2Oa3CUcHWIbWiDaGN7Wk5wT0RrSkNzUUl0am5tY2dnZV9jYlxrZ2Vwa2p3 + a3d4bXh3a2p1aml3bW51a214bXp/dIJ5ZXV4ZHR3Y25yXmlrXFVkVU5nUD9nUD9qWFFzYVpzaGd3 + a2pwYmRoWlxjXWNfWl9jW2RnXmhvZWdwZ2h1aHN6bXh5a3R5a3RwaGdtZGNrYmhyaG5waHJtZG5u + ZW9yaXN0bW9za250a3N1bXR3dXp3dXpvbnVvbnV1Z2ttXmNuW11uW11uZ2dyamp0anByaG51aml0 + aWh0bXJza3BoY2JlYV9qaWV0c295eH9/foaHfoaDeoJ3bXN3bXN7en+CgIaCgIZ/foN9d31/eX95 + eIJ6eYODe4t1bn10ZW1yY2pybnR5dXt/eYR9d4J7c39+dYJ9eHl5dHV4dH19eYJ6eYB/foaAfYN+ + eoB5cHp3bnhubXJwb3RvbXBzcHR1a29vZWlwXVdpVlBtXmN1Z2t1bnNwaW5tY2RoXl9rXWJuX2Ro + XmJuZGhlY2JhXl1pYV9uZWRwX15qWlhoYm17dYCJh5aGg5KIgoiAeoB3bXBrYmVqXmJwZGhtaXJ4 + dH1+cHt5a3dzZ2pwZGhyaXV/d4OEfomEfomLd4SMeIaDeIB3a3RvaWdlX11qZG11b3h5dX5+eoN+ + d3d3b29zaWp0amtycHh5eH97eoR4d4B1Y2drWl1vYl94amh7cnV+dHh/cHV7bXJ1a21wZ2hvXFVk + UUpnU1VpVVduXmhyYmtvXWFuXF9pWFptXF1wY2F7bmt+bn2AcH+Db3qEcHt9am56aGt0Y2RwX2F6 + bW14amp1Y11vXVdwWE5tVUptWldzX119am6Cb3N+b3R9bnN4Z2h5aGl7Z2R5ZGJ1YV50X115XGNy + VVxoUE9nT05pU01uV1FvWkxoU0VoST5iRDleQDVaPDFaRDNYQzJfRztlTUBtVlB4YVt7Z2l/am2I + cGqJcmuHbV+AZ1p6YVZ5X1V6YVZ6YVZ5XUpvVEFtSjlwTjxvUU97XVuHbnKIb3OJdW9+amR+XlRt + TkRrSj9vTkN5bXBvY2dkYVtcWFNiWlhqYmFrZW5uaHB0aGlwZGVvZWdwZ2hwZ211a3J7ZXJ+aHR4 + aXB1Z25tYl5kWlZkUUhlU0lqXVttX11wZV9wZV9oXVxiV1ZjV1tfVFdjWl1jWl1qXl9tYWJqZWlw + a293anB6bnRvZ2VtZGNvZWlwZ2puZ2lwaWtvZ25waG9zanR0a3Vzb3pva3d3b3R1bnNvbXBua29v + Y2RtYWJrXl5yZGR0bmt0bmt1bWtyaWh3aGp0ZWhqal5paV1kXlxiXFpkXlxvaWd5eH1+fYKCeYCA + eH94c3d3cnV5eoCDhIuCho59gIl+eoZ9eYR+e4l+e4mAeoBya3JwY2FyZGJvbWt5d3V4eHp3d3l0 + b350b356d396d397dXt/eX97eH5/e4KAfYh7eIN4dHp1cnhta3Vta3VvaHhyanp3bXB4bnJ3Y2Fw + XVtuW11uW11zZ2pyZWltY2dtY2drY2JnXl1iV1ZjWFdbWFpfXV5tZWVvaGhtY2RqYWJyY2p+b3eD + gJKDgJKGe4yDeYl9bnBzZGdkWmJrYWlyaXV9dIB+dHp4bnRzZGdtXmFuZHR7coKHfY2Ifo6EeH6I + e4KCe4R1b3huZ2lkXV9kX290b396dYR/eomEeoB9c3lyaGlzaWpzb3V6d32Ce4R6dH15aXVyYm5w + Ymd5am96b3h9cnqEeH6AdHp6cHdyaG5yYlpuXlZtX19tX19vXWF0YmVzYl5uXVpuX2RvYWV1ZGN9 + a2p/anKAa3OEb3mCbXd9Z2t1X2RyXV9zXmF0Z2R1aGV0aWNtYlxzX19vXFxuXV5uXV55Z21+a3J5 + am93aG10Y2R1ZGV9aWN+amR7aGh1YmJ1XFVrU0xjSj5hSDxlTkRqU0hrVElpUUdtTTpoSDVhRDFc + Py1aPStiRTJhRDVnSTtpV0dzYVB5Y2qDbXSGcHWHcneGa2F7Yld0W05yWEx+YVd+YVd+XFB1VEhy + TjlvTDdwV1B7YluHbnKJcHSIbXKGam9/YlZyVUlwTUNvTEF9cHdyZWtjXVhdV1NeW1VkYVtrYmht + Y2luZGhvZWluZ2tuZ2tyaGl0amt5bXB6bnJ3a3d3a3d4bmRtY1poXUpqX01uYmNyZWd0a2pyaWhp + Y15eWFRhVFRhVFRjWFdpXl1rYmNvZWdqaGtqaGtzaHB4bXV0bXJ0bXJza3B0bXJ1bXRwaG9wZ21z + aW9yam9vaG1uZW1vZ250anBzaW9oaGVpaWduYmNvY2RtZWhyam10bWN3b2V5b3B3bW55bW5yZWdq + al5ra19vY1thVU1iWE9kW1F3c3l7eH5+d4Z9dYR4cHV6c3h4eIiCgpJ/go54eod7d4Z7d4aCf42A + fox+eXpvamtyaWhyaWh3c3l9eX97en94d3tua21lY2RtZGtzanJ1bXR3bnV3cHd6dHqAfYZ6d394 + eX1vcHRranRpaHJtZ3JvaXR4bXiCd4KCdXd+cnN4amhrXlxvYmJzZWVvZWdyaGlqaGdpZ2VpY15b + VVBdW1xkYmNtaXJ3c3t5b3V3bXN9cn19cn19eoiCf42Gf4aCe4KDd3p0aGtjW1dqYl5vZ259dHt9 + dIB5cH10bXJpYmdqZGp4cnh/eIiCeouAfYaAfYaAfoJ1c3dvZ2VnXl1nX2Rza3B6d4KAfYiCeYB5 + cHh5b3NzaW1ybnd6d3+Ed39+cHl6bXh5a3d4a294a296c4N9dYaCen99dXp7bnd3aXJ1aGV1aGVz + Z2pyZWlzZGlzZGlyYV9wX15uX2JwYmR5aGd7aml6Z2R/a2l6bnJ4a299aG91YWhuWl5uWl5wYmR1 + Z2l0anB1a3J5am9yY2h0Y2JyYV93aG14aW55aGd0Y2J0Y2J4Z2V9bnN/cHWAc3N5a2t3XlFuVkll + TT9cRDdhST9oUEZzWlZ0W1dzVUFuUD1qTDRkRi9kRzduUD9vVU50WlNrW05wX1N6YWuEanWDbXKC + a3CCX1R5V0x0V051WE9/X1d/X1d/XEx/XEx5VEV4U0R4XV+CZ2mHbm+JcHKIbXKIbXKAZ1yAZ1x9 + Xk91V0h3c3tuanNjYlpcW1NjVlFjVlFlWFhtX19zX191YmJwZGhvY2dtaGtvam50bW14cHB6dH17 + dX6Eb3R/am90aF54a2J4cHV5cneAcnd9bnNpYmJhWlphVlVjWFdpXWFvY2dzZ2p1aW1taGtrZ2p3 + cHl5c3t/cn2CdH90cHlybnd5cnR5cnRyaGtuZGhzZGdzZGdtZWhoYWNuX2RuX2RqYWJvZWd0aGl4 + a210b253cnB6dXd/ent/eX9+eH56en15eXt3c21ybmh0aWNtYlxuWlpoVFR3a3l/dIKAeIR/d4N6 + c3V6c3V/fY6DgJJ/eId4cH9zb3p4dH9/fYuCf42Ae39zbnJ1a215b3B4d4B9e4aHeYJ+cHlwaWlk + XV1oYWNpYmRoZWlpZ2prZW5tZ291cnp0cHl3dXp0c3h3b3Ryam9oZGpoZGpwb3mDgox/gpB+gI6C + f4NzcHR3am53am5vbnNvbnNzaHB3a3RvaGhkXV1rZGlza3B6cnt+dX+Ad31+dHp7dYB/eYR5eIJ/ + foiIfpCHfY6Hd4Z6anlnXFtpXl1kaGtwdHh7eoR4d4Byb3BnZGVoX15uZWR1bXl/d4OCfoeCfoeG + gIJ4c3R3am5wZGhnX2RvaG15eIJ/foiEe4iDeoeAe395dHh0bXJ4cHWAc4B9b314b3d0a3N4a3J4 + a3J6c4N9dYaAeIR7c39+a3R4ZW5zaW1zaW17bXJ7bXJ5ZGl0X2RvW1ttWFhuYV5tX11yYV9uXVx4 + X157Y2J5Z295Z293Ymd0X2RyXV1uWlp1YWh+aXB7bXR6a3N4aW50ZWpyZWdwZGV5bXB7b3N9a2h3 + ZWJ5ZGR+aWmAbneDcHmEdXh7bW9+ZVdyWkxqSjpkRTRlTkRtVUpzXlx0X114W050V0pvVT5wVj9v + Vk91XFV9YmKAZWV6Z2F5ZV+AZGmHam+HbWl+ZGF+YUp6XUd1X1F9Z1iGa2iHbWmEalx9Y1V7XUx9 + Xk1/ZGGEaWWGameJbmqIb3CEa22HaGKHaGKHZFqAXlR5bnl4bXhwZWRlW1pjWlBkW1FpX2FrYmNz + YmF1ZGNzYmNyYWJpX2NtY2d3aWd6bWp7cH6AdYOCeH5/dXt5cnJ1bm6CdXuDd32DdX5+cHlwZ2pr + YmVrY2JrY2J0Ymh5Z211aW94a3Jwa21wa215c357dYCAdYCCd4J3dX13dX11cnh1cnh1bnNza3Bw + bXVuanN0ZG50ZG51Y2dyX2N0aGl5bW53b3R0bXJzc3V1dXh6eHt/fYCDfYaEfoeCgIt7eoR6eHt3 + dHhzbm9uaWpvYWVpW193bX2Ad4d+eoN4dH16eHt9en51fYh5gIx1cnptaXJrY2p0a3N9e4Z/foh6 + eX5ycHVyb3N3dHh4d356eYCEfYx+d4Zwb3RoZ2tvXWNvXWNrX2NpXWFtW15uXF9wY2t3aXJrb3Vw + dHp+eX11cHRqZ21kYWdvb3uAgI1+g5J+g5KCfol7eIN0bnd1b3h5dX55dX5zanJzanJ3am5wZGhw + aG93bnV4dH97eIN7dXt9d32Cd4SCd4R/eId9dYR9eox+e42Eeot5b39uZW1oX2dlY2Ryb3B7dYB+ + eINybW5taGltX1tqXVhnYmN1cHJ/eIeAeYh9eHt3cnV1a29uZGhoX2twaHR7eIOAfYiHfoiGfYeC + e4d6dH93b3RwaW5zbXh0bnl3a3R0aXJ0bW9yam11c4J6eId6c4Z1boB0YmhuXGJyXGF4Ymd6bW14 + ampzZWNlWFZnUUZoU0dpWlFrXFRuXldrXFVwXFp0X119ZGWCaWp5aGl3ZWdwX2FtXF1yY2h6a3B9 + bnN7bXJ/am17Z2l4Y2V4Y2V7bW97bW97aGh0YWF0ZW19bnWGcHiGcHiEbnN/aW6AZ1p4XlFyU0dp + Sj9uU1N3W1uDY2SDY2R9Y1h9Y1h6XVF5XFB0W1Z5X1t9ZGh/Z2p9ZGV+ZWd/Z2iDamuDb2h9aWJ5 + YVN9ZFZ/a2WGcmuNcneMcHWMamiIZ2R/YlZ/YlaCY12CY12CY1+HaGSDamuGbW6EaWSEaWSGY1h+ + XFF+c4B5bnt0aGtyZWlvYmJyZGRtam5vbXB3aG13aG1vZWdrYmNlXl5lXl5qX1xwZWJ6b32DeIaI + eoODdX55d3h6eHl/dH+AdYB9d394cnp4aWt0ZWhwa21wa211a296cHR7a3V5aXNza3B4cHVzcnt5 + eIJ5eH94d354d353dX16eX54d3t3dX9ycHp0dIRycoJ3bnp1bXlyaG5tY2lyaGt3bXB6dH15c3t5 + dHh3cnV5cnJ7dHR6d3+AfYaCeomCeol9eIh5dIR0c3p0c3p0aXJtYmp5bneAdX5/eYJ9d39/d4CD + eoR4foN4foN3dHVua21nYmNuaWpteH5yfYN3eXp3eXp9eHl4c3R4cnh5c3l7eYt+e416eIZ1c4Bz + aW1wZ2pyaGtrYmVqX15qX15lXWRyaXBzb3p3c35+c3t4bXVwb3dkY2prb3h5fYaCgpKDg5SAe4t7 + d4Z3bX14bn56eYN7eoR4cnhwanB0am5zaW1zcHR1c3d1dHl4d3t9d397dX6Ad4iAd4h1cnp3c3t+ + dIaEeoyCfYx5dINwdHprb3Vra2ttbW15dYCAfYh3cnNwa21qZGJoYl9nWlpyZGRzb3p5dYB+cnV6 + bnJvZWdrYmNpXmlyZ3JydX53eoN6eYB9e4N6eoh7e4l1cnhuanBzZW5zZW5rYmhtY2lyaGtvZWlv + ZXV4bn55cHp0a3VzYmFoV1ZqVVptV1x1YWV5ZGl4YVhkTkZjTDlkTTprU0xwV1BzXFd0XVh1Ylx9 + aWOAaGmAaGl/a2t+amp3Y2FyXlxvYWV1Z2t0amt7cnN6bWhyZF91Y2d3ZGh9aG9/anJ6ZWp3Ymd6 + aG57aW+Eb3eGcHh/a2t9aWl9YWNyVlhuUE1wU09yWF56YWd/ZWuAZ216Z2d9aWmCaWh9ZGN9Xlt9 + Xlt/Y2OCZWV+Y2WCZ2l/amp+aWmDa2eDa2eGa2iIbmqMc3KNdHOUc3mQb3WEameDaWV/ZF97YVx7 + ZF96Y16CY19/YV16YmGAaGeDZVx/YliAX0x6WkZ6and6and1a21yaGluYWlzZW53bnh5cHp4bXV5 + bndzbm1wa2pzZ2pqXmJtX110Z2R4bXh/dH+AeIKAeIJ5dHh3cnV1cnh5dXt+eXp6dXd5cG14b2tz + a3B0bXJ3a3R3a3R1bXR0a3NybXBvam5uaHNya3dwb3lzcnt7c317c317eIN7eIN4c4J0b350bnly + a3dtaW9ybnRzaWp3bW51a3J+dHqAdYN9cn96a250ZWhzamlwaGdyb3NvbXB0anB3bXN3a3l6b314 + dHp0cHd0bnRzbXN5b3N7cnV5dX56d3+AdYCCd4J5eYZ+fot7eoJzcnlraHBuanNzcnl3dX15eH17 + en96en11dXh0cnVzcHRybX16dYZ6eYN3dX96dXd+eXqDeoJ4b3dvZ25qYmlzbXh6dH95d4R5d4R0 + c3p4d351bXdrY21iY2dyc3d5e4h+gI2Ae4t0b351Z2t0ZWpqaW55eH16cHRzaW1yaGtvZWlwbXN0 + cHd4cnh3cHd4b3t5cH15d4R+e4l0cnNyb3B5c36AeoZ7eoR6eYN6e394eX1zcnd0c3h/eouCfY1/ + d355cHhyaXBtZGtnX2JoYWNya3RzbXV1bWtvZ2VwYmRtXmFoXF9oXF9qaXB3dX13dX14d354d4B6 + eYN5d4R3dIJ7b3VyZWt0X2JrV1prWFtuW11tXWlyYm54anV4anV7amlqWlhlUVRqVlh1ZXR6anmD + ZGJ4Wld0V0xzVkp1XVx3Xl11ZGV5aGl9aWmAbW2GcHCEb2+CcG2CcG2AaGd7Y2J1ZV53Z195a2t/ + cnKDb299aWlzZ21vY2l0Z293aXJ4Y2p5ZGt9aG99aG+Gb3eGb3eDamt+ZWdzW1pvV1ZvVlF3XVh4 + XmR7Ymh/ZWJ/ZWJ/ZW6Ga3SDaml6YmF+XmKAYWSDYl2GZF9+Y2N+Y2N7aml+bWuGam2Ha26HaXOI + anSIbWiGamWGaWmGaWmDaWKAZ19+ZGF9Y19/ZWF3XVh3Wk50V0x3XVh7Yl1/YV1+X1x7W0l0VEN+ + b3d9bnV4b3dyaXBnYV5qZGJ0Z295a3R4bXV6b3h3bXB0am54a3JzZ213ZWd6aWp4a3KAdHqAeoN+ + eIB7dHd4cHNzbXN3cHd+eIB+eIB+cHl5a3RuamdpZWJuZ2tuZ2tuZ2tuZ2twZ2pvZWlqY2VuZ2lu + aG5wanB5bnl6b3p6b313a3l1bXd0a3VwaHRuZXJyam91bnN5bm17cG96cn6AeIR/eId0bXtyZWd0 + aGlvZ2VtZGNqZWlpZGhvam5wa29zbnJ4c3d1cnhybnRycHVycHV1b3V7dXt+eIOCe4eCeYN+dX96 + eIZ/fYt7en96eX51dH50c31wbXh1cn1+e4uCf46Afox6eIZ0dHJycm9va3Jzb3V1c4B6eIaDf4iD + f4iCf4N1c3dybndzb3h4cn14cn1zcntvbnh1bXd4b3lyaXBpYWheXVpubWl1d397fYaAe4tybXtv + Z2VvZ2VqZWd1cHJ5cHp3bnhwa21vamt3bXN5b3V7dHl6c3h0cHlzb3h5eoN9fod7eXpzcHJybnR5 + dXt6eod9fYl7d4Z6dYR3coB6dYSAe4x/eouAe394c3dvZWdoXl9pXl1pXl1oYWVwaW51cHJzbm9z + aWpvZWdkXFtiWlhoZ25zcnl3dXp6eX53c3l1cnh0dIB7e4iEe4OAeH97b3BvY2RuXF9pV1toXGJu + Ymh0aGt0aGt5bW5wZGVuWF1wW19wanVzbXh9aWd4ZGJ4YVt5Ylx6Z2d7aGh9aWeCbmuEcnqHdH2I + dXt/bXN6bW1/cnJ/am1+aWt9aWt9aWt7bnd/cnqCc3p7bXR3a2pvZGNyYWJwX2FyX2V4ZWt6aG59 + anCDbnOCbXJ/ZWJ5X1xtWlBrWE9vWFR1Xlp5X2h6YWl9YmR/ZGd/Z2qGbXCDaWSAZ2KDaG2Gam+Q + cGqMbWd+Y155Xlp6YmF7Y2KCZ2uIbXKEa22CaWqEZWJ+X1x9YWODZ2mCamR9ZV+CZ2eAZWWCZFh4 + W09yVUlzVkp3XlB/Z1iDaGN9Yl1+W0p4VUV+dHp7cnh5bW5zZ2huYmNtYWJtYWRvY2dzaHB3a3R0 + bnl3cHt5b391a3t5bXN7b3V6bXiCdH+CeYZ+dYJ7cHl6b3h3bXN5b3V+eH5+eH6Hc4CDb31wb2tk + Y19kXV9nX2JrY21waHJuZW1vZ25rZGlqY2hpY2trZW5waHJzanRyam9uZ2t1a291a29waHRuZXJ3 + aXJ5a3R5b3N6cHR5dX56d399eX9raG5nXV5oXl9pXV5rX2FtY2doXmJqY2VuZ2lwbm9yb3BvbW5u + a214c3d1cHR0cn99eoh/eol/eol7d4Z3coB6eod/f4x+fYd6eYN3dX1ycHhubXJ1dHmHgpGHgpF/ + foh5eIJ0c3pycHhvaXJzbXVzdHp6e4KCfoeAfYZ9fX93d3lzcnlzcnl5c351b3pzbnJvam51Z2t4 + aW5qY2VoYWNrXWJ4aW51dHt7eoJ1dHlqaW5rY2JrY2JqY2NvaGh5c3t0bndrZWtqZGp7b3WDd32D + eoJ/d35zcntwb3l3eYZ7fot6c3N1bm5vb21zc3B4eX95eoB7d4Z7d4Z+eIODfYiEf5CDfo6HgId5 + c3lqYlxkXFZpW11uX2JpYWhwaG93a3d7cHt3cnNzbm9kX15hXFtnZGhua291cnh7eH50c3hzcnd3 + cHt7dYB7eX1+e397endwb2tzaGJvZF5tZWhyam13bW50amt4a294a294ZWt0YmhzbXVzbXV5a2l6 + bWp5ZWN6Z2R7aGp/a26Db2+GcnKGc3mMeX+Cc3p9bnV6aG55Z215a2t7bm5+b3J9bnB/b3l+bnh7 + b3N6bnJ9aWt3Y2VzWl9yWF5vXWFyX2N0YmV5Z2p9a2h3ZWJ6XVF7XlNrWkltW0pyV1p0Wlx5XmN6 + X2R4Y2F7Z2R/Z2qGbXCJbW+OcnSJc32OeIKUe3eOd3J+a2J0Ylh7Yl5+ZGF/ZWuDaW99aGV3Yl97 + XlN5XFB0W1d9Y19/Z2qCaW2CZ2J+Y15/YVF3WEl0VFN6Wlh/Z2WJcG+NdHWDamuCYU94V0Z5eH14 + d3uAdHp+cnh5Z21vXWNwY2FzZWNwaGd0a2p1dXV4eHh9d4KCe4d7cHt4bXh5bXB7b3N9dHt7c3p6 + b3p5bnl1a293bXB5cHh7c3p/dIJ7cH5va3RpZW5pX2NqYWRrZ2prZ2puaG5pY2lpX2VtY2llYmhk + YWdnaG5panBvamtrZ2hvZWtrYmhtZHBqYm5vYmpyZG1vaGp0bW93bnh5cHp4c3Rzbm9uYmNrX2Fw + Y2twY2tzaWpuZGVzYmN0Y2RvamtuaWpybXB1cHR1cnh4dHp1dH55eIKAfo17eYh4dYN0cn90c31/ + foh/fYt6eIZ6e4J4eX95dX59eYKEf46Ae4t7eIBybnd0cHd0cHdvbW5yb3B4dYR9eol/e4d6d4Jv + a3R5dX53eIB4eYJ4cn1zbXhuaWptaGluZ2luZ2lrX2NlWl1jWl9nXWN1bXd/d4Bwb2loZ2FvZGFz + aGRtZWhtZWh1cnhva3JtX2hwY2t5cH2CeYaGfo5/eIh1c4Bwbnt1dYJ5eYZ5cnR1bnB1bnBza25v + a3RuanNtbnRvcHd0c3p4d357eYiCf46Eg41wb3ljY1dfX1RtY2dyaGt0a3h0a3h7bXSGd36Ad317 + cnhqZGJfWldqXl9vY2R0bnR3cHdva3JybnRya3d1b3p4dXl6eHt6eXVycG13aWl4amp6a3B7bXJ1 + bXR3bnV0aXJ3a3R9aG97Z257bXR+b3d/cnJ/cnJ/bm16aWh6aGt7aW1+cnh/c3mEdH6JeYODdHd5 + am13YmR0X2J5Y2h7ZWp7b3B6bm+AbneCb3iCbm6EcHCDbmt4Y2F5XltyV1RtWlNpVk9pWlNwYVp5 + ZV51Ylt7YVx7YVx/ZWJ6YV13XVp0W1d7X2J/Y2WAaGuAaGuAanJ/aXCEaG2NcHWJd32NeoCOfXmI + d3N9bWV3Z193Y113Y115YWJ9ZGV9Y1x4Xld1WE10V0xvVlN4Xlt+ZF+CaGN/ZVt+ZFp/Y1B7X013 + WFZ/YV6CbXeGcHqIa25/Y2WAXFN6Vk1+eXp9eHl9d317dXt4aWt4aWt5Z215Z213amt7b3B4c3R4 + c3R5c3t/eYJ4cnp1b3h0bW91bnB4b3d+dX1+dX17c3qAbnR/bXN3b3J4cHN0cHd1cnh+bnp7a3h0 + aGtwZGhvaG1za3BwZ21wZ21qY2VqY2VqXmJqXmJrX2VrX2VuX2JuX2JtX19vYmJzXmVwXGNuX2dv + YWhzYWR1Y2d5Z216aG55bW53amtvZ2NwaGR0bW9za251a21wZ2hzYWR1Y2dnZ2dtbW10b3N7d3p7 + dYB6dH9wb3R3dXp/eYSAeoaDeoJ1bXRybnd7eIB9eol+e4t9fYl6eod6eYN4d4CCf457eYh7dX5w + anN0b3Nwa29qaXBycHh9e5B/fpJ7eH54dHpwb3d5eH99e4Z9e4ZzcndqaW53ZGp4ZWtwZ2hrYmNq + XmJoXF9lXmFlXmFuY2t1anNwY2FrXlxqY2V1bnB3bXNzaW91bXRzanJuZW9waHJ1a3+CeIyEeI2I + e5F9eYJ1cnp7coJ9c4N5bW54a21zaW1tY2dnZGhkYmVqZWl0b3NvbnVzcnlwd4h4fpCCgIt6eYN1 + b21tZ2Ryam14cHN/dH97cHt6cHSDeX2Ef4OCfYB0a2pkXFtqXGFyY2hvbW5vbW51a3JzaW9zanRy + aXNybXB0b3N4bm9wZ2h9anB9anB3cnN4c3R5bXB3am5waWtuZ2l4ZGd5ZWh4anN7bnd/a2mAbWp4 + bWd0aWN9ZGN5YV9+ZG2DaXJ7bnmDdYCDdHd5am11Y2lrWl9vYWN1Z2l6bnR7b3V6bnR5bXN9aGh/ + amp+amh4ZGJ4YlZyXFBrVU1qVExpVlBtWlR1W116X2J9aGWCbWqDcnB6aWh4Xlp5X1t6X2KAZWiH + anKHanKCa3CAam+CaW2Dam6Cb3WLeH6JeHSCcG2Abmh7aWN5X1x5X1x6YVx7Yl16YVp5X1h0XFFv + V01yWlt5YWJ+aFqAalyEbWSCamJ/Z1h5YVNyV1N6X1uAaXWDa3iEZGiAYWR9W1NyUEh9dXh7dHd9 + dHt+dX17dHR9dXWAcH2AcH17cHl9cnp4cnp5c3t/dH+Cd4J7cHl6b3h0b3B1cHJycHh4d355eH11 + dHl1bXd0a3VzaW1zaW1wZ2pzaW2AanR/aXN6a3N/cHh9cn15bnl3bXByaGtrYV9nXFtkVlhnWFtq + WFxoVlptWlxrWFtoV1RrW1dtXFhrW1dpV1ttW15zXmFyXV9zZ2h1aWp4ZWl5Z2pwamh0bmt0bW9y + am1waWluZ2dyZ2V1amlraWpvbW56bXqDdYN6cnt1bXdqbnJydXl/foZ+fYSCen11bnBqZG13cHl6 + c4OAeYl/fYx+e4t6eYB5eH9/fYt9eoiAeIJzanRqaGlraWpqa3RzdH2CfYyEf45zdHhub3N0bneA + eoN/fYyAfo1yb3BpZ2hvZ2V4b25vbW5lY2RlXF9qYWRuZWRuZWRvam5vam5vZGNuY2JtaW95dXt/ + en5+eX1ycnJvb29oZXNraXd4coh/eZCHfY2DeYl+eoN3c3t7c3p6cnl4b253bm13a2hyZ2NlX1tl + X1toX2duZW1tZ3J0bnl5dISEf5CHgIl9d3+AdHh9cHR+cniDd32AeIJ7c313dHV5d3h+e3+AfoJ3 + bW5pX2FqYWdwZ21yaGl0amt0aGtyZWluX2RrXWJqXF5wYmRyZWdwZGV4aXB9bnV4c3R4c3R0a2Vq + YlxvYmJvYmJ1YWh6ZW1/anSAa3WCbmd/a2R9Z1t6ZFh5Yl14YVx6YmV+ZWl9bnV/cHiEb3l+aXNz + YWRvXWFwY2N4amp/cHiCc3qDbXJ6ZGl7Z2d6ZWV3ZWR0Y2J7Ylt1XFVuV1NqVE9tVlFyW1Z4XV1/ + ZGSHa2uNcnKMc3eIb3OCZ194XVZ3XmJ9ZGiAa3CCbXJ/amp/amp9aGV7Z2R/a26CbnB/am1+aWt6 + Z2F4ZF5/YV1/YV15XleAZV5+Y1x6X1h+ZVt+ZVuCZ2OCZ2OAaFuCaVyGbmmHb2p9Y1h1XFF0VlN6 + XFiHZW6JaHCIZGJ/XFp6VUhzTkF1bXR4b3d7c39+dYJ/eYKDfYaEeYKHe4R/dYZ9c4N/eYJ/eYKD + dYCGeIN+dX19dHt0b25uaWhvaG1yam90a3N3bnVza250bW90ZWhvYWN1aGV3aWd5Z299anN7b3N9 + cHSGcoKEcIB3cnVybXB1ZGFwX1xtWlptWlppWFVlVVFjU09jU09oW1ZpXFdqV05qV05pVk9pVk9u + Wlp0X191Z2l3aGp3aG11Z2tyaGl1a214cHV5cnd4b2twaGRza2tza2t1b3V3cHd7c397c39yam9p + YmduanB3c3mCgo59fYl+eXp0b3BwZWRzaGd1bXR1bXR6c4N+d4d6eIZ4dYN/e4SAfYZ+d3l4cHNv + bW5ua21rbXBzdHh7eIB5dX5zb3pzb3p1b3qDfYh+eoZ/e4d7cnN1a211c3R5d3h1dXhvb3JqaGtr + aW17d3h6dXd5bm14bWt0bW91bnB3eIB+f4iEgId/e4Jyb3Bwbm9ta3Vwb3l3dIZ/fY6Gf4iGf4iD + gox9e4Z9c3d3bXB6cHR9c3d3b3JvaGppX2FpX2FuY19vZGFtY2lyaG5yZ354bYR9dYR7dIN7dX55 + c3uDeIaGeoiCd4R5bntva3d3c35+fYJ/foOAd3ptY2dkYmNwbm93bXB0am5wYmRvYWNtXFhuXVpu + YV5uYV51Y2l1Y2l1ZXJ7a3h6cHR4bnJ3bWNvZVxvYWVwYmd3Ymt7Z3B3ZGp6aG59a2p9a2p9ZWF7 + ZF9+Y2OCZ2eDZ3OAZHCAbnd/bXV9aG19aG10YmhyX2V1YWV9aG1+aW6DbnOEa2p7Y2J1XWFzW151 + Ylx6Z2F6ZWh9aGp7YVpwVk9uVUhwV0p3XF6CZ2mGcHWOeX6IdXmDcHSAaWN0XVdzX196Z2d/Z2iA + aGl/ZWJ7Yl55ZGJ6ZWN9aGh/amqAa2t/amp+amR+amSAZV59Ylt6X1iAZV6DaGODaGOGaWmEaGiG + amV/ZF9+Y16CZ2KEa2GEa2GAYVh9XVV5Wl15Wl1+X12AYl95Wk50VUl0Tz50Tz51a3J3bXN7cHl9 + cnp9cnqCd3+DeIOEeYSGd4iHeImHeoCDd317cnV/dXl+eIB+eIB9cHJ5bW54ampwY2NzZXB0Z3Jy + ZWd0aGlyZGJzZWN0aWV5bmp0aGl1aWp1a211a219b299b291b3V1b3V4bnR3bXN7amt1ZGVvYl1u + YVxvYl9wY2FvYl1qXVhrWlBrWlBtXFtrW1pyXmF5ZWh3amt4a210aGtzZ2pzaGd0aWh+cHmCdH2D + eX99c3l5d3h5d3h4dHp0cHd1cnh1cnhyaXBnXmVrZGd0bW96eId+e4t/dIJ5bnt3aG1tXmNtaXJy + bnd4dH94dH9+eIB7dX5+eIN7dYB5cnd6c3hzbm9wa21qam1vb3J6dHp9d31ybnRzb3V0c32Dgox/ + f4J7e35+dHh/dXl/e4KEgId9entyb3BqZ21wbXOEgImEgImAdHWCdXd7cHl7cHl6eX6Dgod/foZ1 + dHt0am53bXBvbXB0cnV4dYSAfo2Df4iEgImAf4l+fYdta2hqaWV3b3R+d3t3dHhwbnJwanBtZ21y + aG5vZWtwZGhyZWlwaW51bnN7dYB7dYB3coB7d4aDeoeAeIR5cndyam9zaXl9c4N+e4mAfox/en5w + a29tZG51bXd3aXJ0Z290Y2RuXV5vXl1tXFtrXV9wYmR3ZGp1Y2lwZ2p1a296bm95bW55bmhzaGJv + YmJvYmJ3YmlyXWR1XVx5YV9/a2WDb2mGcHCHcnKGcHWIc3iIcH+EbXuHcnmCbXR4ZGd0YWNuXVpv + XltzYWR3ZGh+a3SCb3iAaGd9ZGN4YVt1Xlh3X1t9ZWF6ZWV5ZGR7Yld1XFFzWkx1XE54Y2qAa3N+ + dX2GfYSGdHWAb3B+ZF15X1h0YVtyXlh9Y1+AZ2N+ZFp7Yld6YV17Yl56Y16AaWSAZ1+AZ1+CaGGC + aGF9Y1x9Y1x7YVp+Y1yCaW2GbXCIbW+EaWt/ZF97YVx6Wld/XlyDZF6AYlx5X1V3XVN3WFN1V1F3 + XVp6YV14WE51VkxyTTxyTTx3aG93aG95am95am93bXN6cHd5bnd9cnqDc32GdX+Cd3+AdX53dHV4 + dXd4dH95dYCAcnl7bXR3ZWRvXl1rXlxuYV5rYmVuZGhzaW90anB0b3N3cnVyam1vaGprY2JvZ2V3 + aG10ZWp1aHN4anV0cnV1c3d5cnd1bnNuZGVrYmNwZWJzaGRyZGJuYV5tYWJrX2FqYWRqYWRzaGd3 + a2p9b215a2l5YV93Xl11Y2d9am6Ed4SEd4SEe4h/d4N/en6Ae396eHt5d3p6cnl6cnl0anptY3Np + ZGVybW55c3mAeoCDd31/c3l0am5wZ2puanVybnl0c3p1dHt7cHt+c36AdYN7cH55cnR5cnR1bnN1 + bnNvamt4c3SDeIB9cnp3cHd0bnRzcnl7eoJ5fYN4e4J9en6Cf4OIg5KEf46GfYR1bXRwaHJ4b3mH + g4yDf4iEd3+HeYKAd3p9c3d7eX2AfoJ+eoB1cnh4bnJ+dHh6c3h4cHV9dYSGfo2Dfo19eId6eod5 + eYZwbm1oZWR3b296c3N4eHh0dHR0a3N0a3NwaW5uZ2tvZG1uY2ttaXJzb3hzb3pzb3p3b3J7dHd+ + dHqCeH55dHVtaGltZG55cHp/eouCfY2AeoZ5c350ZWp0ZWp6bXV4anN6aWhuXVxuXF9rWl1yXWJ4 + Y2h1ZGNwX15wZWR0aWh5am9/cHWCdXd5bW5wZWJoXVpqXVhoW1ZzW153XmJ/ZWuGa3KJdHmLdXqL + e4CNfoOMfYKHeH2IcneAam9zYmNtXF1qVlhvW11wY2FzZWN+bnh/b3l9aWt9aWt4X2F3Xl95ZV96 + Z2GCZ2d+Y2N7ZFx6Y1t1XFV4Xld9aG2DbnN/dXl9c3d+amN6Z19+ZFp/ZVt7Yl54Xlt9Yl2AZWF+ + ZGGDaWWIbW+Lb3KEb2+CbW2HamqIa2uHbWiGa2eCamJ6Y1t7YWGDaGh/bXCDcHSLb3KDaGp5X1N1 + XE91WE97XlWCZ199Ylt1XU9vV0l0TkV0TkVzWFRzWFR7WEZ5VkR7Uz51TTl3bXNvZWt1YWN3YmRw + Ymd0ZWp4anN4anODcHeDcHd6dXl4c3d3bm15cG9vb3J0dHeAc4B/cn91Z25wYmlvXFpqV1VkXWJu + Z2tybXB3cnV1a29uZGhjXVteWFZkWlhoXVxuXV5vXl91Y2d5Z2p0bXJ1bnNwaWttZWhqYl5tZGFr + amdvbmp1bWl0a2hrZ2hrZ2hrZGdtZWh3bXN7cniDdXV7bm57ZFx1XlZ0bXJ9dXp/fYyAfo1+eoZ/ + e4eAf4d9e4N6en15eXt7eIN5dYB0aXJqX2hpZGN0b251dXh3d3l4dH95dYB4cHVza3BzbXVwanNu + anNwbXV1bXR1bXR1cn13c359gISChomEfoSCe4J4cnp6dH1+eoZ4dH9zcHRtam5ybnd1cnp4d357 + eoJ+e3+Gg4eGhI6Af4mDeIZ7cH54anOAc3uHgIyIgo2Df4iDf4h9e4Z3dX96eYN/foh+eoN/e4R4 + dH19eYJ+c359cn2EeImLfpCAeX55cndzcH9wbn1qaGtraW14cnh+eH59eHt0b3NyaGlvZWdpYmJn + X19jWltjWltkX2FqZWdoYl9lX11lZ11ub2V5b3N+dHh1b21rZWNoXF1wZGV4aHR+bnp/eId+d4Z/ + cHV5am93am55bXB5b2VtY1pwXFxyXV15ZXB9aXR0aWhtYmFvXl10Y2J9aG+DbnWIdXuCb3V5aGdv + Xl1qWlhpWFdvVlx1XGJ7ZW2DbXSEeXiJfn2Nf4iMfoeMeYKJd3+EbnV7ZW15YWJ1XV5vXl90Y2R9 + anB/bXN9bXd9bXd3anByZWtwXVdzX1p5Yl15Yl1/YV57XVt0W1Z1XFdzXFd3X1t4ZF2Cbmd/b2d/ + b2d+a1x/bV2IcGuIcGuLa2iIaWWEbWeIcGqJdHmMd3uSdX2Qc3qRdHmLbnOJameQcG2LcnWGbXCE + Y15/Xlp+Xl+CYmN/a2WEcGqCaWh4X150VENuTj1wUE54V1V0YVp4ZF11XE5wV0luT0VrTUNyU0h3 + V011V0hzVUZ4U0F4U0F1c3Rwbm9tZWVnX19rXl5wY2NuZGpwZ213b3J5cnR5cHh3bnV0aWV4bWlz + bm95dHWAeYh/eId7cHl3a3R0ZF1vX1hrYmVwZ2pvbW5wbm9zaGRrYV1jV05kWE9nXVRlXFNjW1pk + XFtrYmhwZ21zZ2pyZWlvZGFuY19rXl5wY2Nvamt0b3B5cnR5cnR0bW90bW9yam1za255cHp7c313 + bW5zaWpvZ2FuZV9waWt/eHqDgoyDgoyCeYOHfoiDfo1/eol+eIN5c356eIZ+e4l7cnNzaWpzaW15 + b3N6dH15c3t5dIN5dIN4dHpybnR4a29zZ2prZ2pwa29wa21zbm9wbXNzb3WAhI2Hi5SGh41/gIdz + c3VwcHN6b3h9cnp6dHpwanBzbXNzbXN4dHp/e4KDgISCf4N9foR9foR/dH1+c3t6bXh/cn2DfYiH + gIyCg4yDhI2AeYh/eId4e4R6fod6eX57en9+fYd+fYd9dH56cnt6eIZ/fYuCd3V4bWtqYWRpX2No + YWFuZ2dzdH15eoN4dHpva3JqZVtpZFptXFhoV1RlVFdkU1ZjVVplV1xkXFhiWlZlYV9uaWhtaXJy + bnd4b2lzamRpYV1oX1xpXWN1aW+AeoaAeoaCc3qAcnl7b3B5bW5/b2d1ZV1wXlh3ZF54bXV3a3Rz + Z2puYmVqXV1wY2N7Z2uAa3CEdXp+b3R1ZGNoV1ZkUVFjUFBoUFFuVld3YmmAa3N/dXmEen6If4mH + foiHen6Dd3qHcnl/anJ/amp+aWl7aW96aG53anB1aW96a256a254Z2h1ZGV1XFd3XVh5Ylx4YVt4 + XlpyWFRwW09vWk5tVFBuVVFzXFd5Yl2CamSGbmiDb3KHc3WNeH2OeX6Od3KLc26Eb22Ic3CJc3iJ + c3iNcHOLbnCNa2qLaWiEaW6Lb3SMcHOJbnCIZVqAXlN4Xlt6YV17aWN5Z2F5YVRvV0puTjtvTzxt + T0xwU09wWlF1XlZ7XUl1V0RzU0RvT0BvU0ZyVUh1VEh0U0dzVEl0VUp6b3p6b3p7b3BzZ2huYV5u + YV5rYmVuZGh1bnN4cHV7cnh6cHd7bW95am10am54bnJ+cH6Ac4B6dHp5c3l+am17aGp0ZWp1Z2tw + Z2hpX2FnXVRkW1FlW1drYV1rYVtlW1VkV1dqXV1yXml0YWtrZGdqY2VuY11rYVttX1t1aGNwbnJ7 + eX1+fYR9e4OAd3p9c3d7cnV5b3N4b3l5cHp3a2p1amluaGVqZGJqY2V3b3J9e4OAf4eDeIaIfYuH + gIyEfomAeoN+eICCf5F/fY6EeYKAdX54cnh7dXt6eYB1dHt6eYB7eoJ/dH93a3d4aW53aG1/anKC + bXRyam1vaGpuZ2t3b3R/fYuGg5GEgIx7eIN1dXVubm50b3N6dXl1dHlzcnd4cHV0bXJzcnd6eX5/ + eX9/eX+DeX+Ad31+dX16cnl7cH5+c4CDfo6Ae4yEgpGIhpWGfYmEe4h9eYKAfYaGgoiHg4mEhox9 + foR5cnd5cnd3dXqCgIaAenhwamhqXlNrX1RoYltuaGF3dX9+fYeAe31zbm90aWNwZV9vZWdvZWdq + XGFlV1xjVlRoW1hfW1xhXF1nXWNtY2lwaHR3bnqDcnOAb3B3ZWRuXVxkW15nXWF0c314d4B9eYR/ + e4eEdXh+b3KCbmt/a2l5aGR6aWV9c3l4bnR0aGtvY2dvXl90Y2R5ZWN+amiAdHp9cHd1ZV5nV1Bj + UUphT0hpT0hvVU5zYWR+a2+Cd3WNgoCQg4mMf4aJc3iDbXKEanCEanCAam9/aW5+aXB9aG99a216 + aWp7aGh9aWl6Z2d4ZGR9Yl5+Y197Z2R6ZWN6Y110XVdrVkpoU0dtVElrU0huVFR5Xl5+ZGGGa2iH + cHqHcHqEcHOIdHeIcGqGbmiEbnWEbnWDbnOEb3SCaGOAZ2KAZ2KGa2eIcnmJc3qJcHKIb3CCX1R0 + U0d0WlV9Yl1/ZV54Xld+WkZ3Uz9uTUFyUEVrU0xwV1BwWExzW055WkR1VkByTkRvTEFyUUN0VEV0 + UEZ0UEZ3UUV5VEd7c397c3+Ac354anVvaGpuZ2lwZGhvY2dzZ213anB6bnJ9cHR5b3V3bXN3am54 + a293a3R3a3R5bnd+c3t/b3t/b3t3bXN3bXN3am5yZWlqWlhqWlhlWl1rX2NqYl5tZGFlXFNjWlBo + WlxqXF5jXGFoYWVrYmNqYWJtYWJ3amt4b3eAeH97eoR6eYN7c315cHp4cHV1bnN0anBzaW9yaF5u + ZFttX11rXlxnYmNrZ2h7d3V/enmCe4KGf4aCfol+eoZ7dXt7dXuCgo6GhpKIg5KJhJSCg4x+f4h7 + eoJ0c3p4cn16dH97eIN9eYSAeISDeoeAeIR9dIBza3p0bXtvZ3N6cn6Afo2Cf456eYNta3Vya3Ry + a3R5c353cHtzcHRyb3N1cHRzbnJ3dHh5d3p9c3l7cnh9dHt7c3p5dIN5dINybnl1cn2AfpCGg5WD + gpaIh5uAeYh7dIN7dYCAeoZ/f42IiJaDgol6eYBycnJqampza3B4cHV9c3d3bXByZGJvYl9qYlxt + ZF5zcnd9e4CAeIJ+dX9+cnh/c3l5dX5zb3hyZWtpXWNjWFVnXFhjW1VhWFNiVVVlWFhpYWp1bXd4 + cn15c351a29wZ2pvZWluZGh3cHl5c3t9eIeCfYyEe4h/d4OEdXiAcnR/bm1/bm2Cc3h7bXJ5Z19y + X1hwXFp1YV55ZWiGcnSGd35/cHh+ZF9uVVBhUD1cTDloTklwVlF3ZWSDcnCIeXuOf4KQgo2LfYiE + cnh+a3KAbW17aGh9aWt5ZWh5am96a3B/a2l+amh9ZGV/Z2h9ZGN6YmF6ZWN+aWd+anWEcHuIc3V5 + ZGdvV0ppUUVoUTxvWENvWFB0XVV+ZF+DaWSDbmuGcG6Db2l/a2WDaGSDaGR6Y299ZXKEb3KCbW97 + ZF53X1p0YV5+amiIdHeNeXuIbmmCaGN9Xlh4WlR1XWGCaW2DaWR5X1t5VT9zTzpvT0p3VlFyWEp0 + W016WE14Vkp1U0NvTT1zSEB0SUF4UDx7VD9zTzx0UD17Uz6AV0N9cHR7b3N4cHNza251a290am5v + YmJyZGRzZWV1aGh6bnR9cHd5cHh1bXR1bnNyam91anV3a3d1bnN6c3h9dIB/d4N9dH57c317bnl1 + aHNiXVNeWk9hWlxqY2VzaGRwZWJrXlxkV1ViVk5kWFBjVlRnWldrXlxtX11yZWd4a216b3h9cnp3 + cnV0b3N4bWt1aml0aGt0aGt3bW5zaWpwa2pybWtyZGJtX11pYV1tZGF5bm2Cd3WEfoSIgoiDgol7 + eoJzcHR1c3d6eId9eomHf5CIgJGGhI6Af4l+e31yb3B1bnN3b3R1cnp4dH16d317eH57eIN7eIN3 + cHl3cHl6cIJ/dYd/eYR7dYB0b3Bwa210bnl4cn1+dHp5b3Vyam9uZ2tuZ2tyam94a297b3N7c3J+ + dXR9dXp7dHl4dYN1c4Bwb3R3dXqCf42EgpCIhpWIhpV/eId7dIN7d4eCfY2DgJCJh5aEgpB5d4R0 + cnNraWp4a219cHJ4cm91b21vZ2V0a2p0aWVwZWJvaHd4cH99dHt/d359c3d6cHRybnduanNwZWJo + XVphVU1iVk5kWlZlW1doXFNtYVdqYmFvZ2Vya3dzbXhza3Byam90am5yaGt0anB3bXN5b39+dISA + eIR9dICAdHp9cHeCcHKGdHWDdHl+b3R+aW54Y2hwXlh3ZF57bXKGd3uLeoR/b3l7Yl5tVFBnTkBd + RThkTEdyWFR4ZHKJdYOOgIyQgo2NgISLfoKGb3d5Y2p3YmJyXV13Y2V1YmR0aGt1aW1/amh9aGV9 + ZGh+ZWl5ZGJ5ZGJ6aWp9a22Da4KLc4mRd32LcHeCX1VzUUdrUTluVDtvV0l3XlB7aGKAbWd/amp/ + amp+aWd+aWeCXlqAXVh9YmKAZWWAZ199Y1x1XVByWk1wXVRzX1aDbmuEb22CaGR9Y193YVN1X1F0 + X2J/am2CaVt5YVN3XEV5Xkd9Y16AZ2J9Y1Z5X1N+VEx3TUVvTT10UUF5UEV9VEiAW0x6VUZ0TD50 + TD55UDqAV0B6aWp4Z2h0bW91bnB5bXB4a29vY2drX2NzX2J1YmR5bW56bm94b255cG9zcHJyb3Bz + aWp0amt0b3B0b3B3c3l7eH6CeYaAeIR+cHl1aHBiX1RhXlNqX2hwZW53bXN4bnR3YW1rVmJlUEVi + TUFfT0BlVUZoWFBtXVV0ZWh4aWt5bXB5bXB4bWlzaGR3a2V0aWNwZ2p1a295cHh9dHt5dXt6d315 + bW54a210ZWp3aG11bXd6cnuAfYaGgouGgJB6dYRzbXV1b3h4c3d6dXl+eXqDfn+Mg42Hfoh+e31z + cHJyZWlyZWlza253b3J6d4J5dYB1b4Z1b4Z0b35wa3p4bn99c4R+dX95cHpvZWltY2dzanR6cnuD + dHt9bnVyZGRtX19tYmFzaGd5am9+b3R+dX2CeYB/eX99d313dHhyb3Nybnl+eoaJhpGIhJCIg5KI + g5KDeIB+c3t9eoiCf42HhpCLiZSGhI5+fYd6cHdyaG56Z3KAbXh9dXh3b3J1cHJ4c3R3bXBzaW1v + ZWtyaG50bXKDe4CAeXt3b3JybW5rZ2hrXlptX1tpV1BkU0xpXFxqXV1vXWF0YmV1aGh0Z2duZGpv + ZWtzaW14bnJ4bXh1anVyaGtwZ2p0Z296bXV7cH57cH54bXV4bXV+cnWMf4OGe3+CeHt5bm14bWtz + Yl55aGR9b3iEd3+LeoR+bnh5X1hzWlNwWEdpUUBtW1V3ZF59cn2Lf4uNf42Nf42Gend+c29/am1z + XmF0W1RzWlN1XFh4Xlt5Z2F6aGJ+amR9aWN+aWmCbW1+am1+am1+b3KDdHeLd4SLd4SSeXqMc3SD + YVZ5V01vV0RwWEV3XFd9Yl1/ZWF/ZWGDaWWDaWV5YV93Xl17W1Z/XlqCZ2KAZWF+ZFp5X1V6V1N5 + VlF0XFF3XlSDa2WCamR/ZGd+Y2V5Yl13X1t6YWuCaHOEZFqAYVZ7XFSCYlp/ZWKEameGZFCDYk5+ + VESAVkZ3U0h5VUp9W1OAXlaCXlB7WEp3Tj50TDx6Tz5/VEN3ZGp4ZWtwaWlwaWl4ZW53ZG1vYWVv + YWVvY2dwZGhua29vbXB0am53bXByb3Byb3B0am5yaGt1amd4bWl5cnR+d3mAfYh/e4eHeYJ3aXJy + ZV1yZV13aG15am94b3d4b3d5bXNwZGpuWldrV1VoXlVqYVdzZWN9b215dHV3cnN6cHJ6cHJ6bW10 + Z2d3Y2N1YmJvZWt4bnR4dH1+eoN/fYt9eoh9eHl1cHJ1Y2dwXmJkanJvdX2Cf46Cf46EeYR9cn14 + bXV4bXV+d3t9dXp7dHl9dXqAdIaDd4h9ent0cnN3aWlyZGRqaGdraWhwZ2pzaW1vZG9wZXBtaHdv + anl1bXR5cHh4bnJyaGtuYmVtYWR3Z3N+bnqAdHp+cnh3bm1yaWhvZWlwZ2ptbW90dHd9e4aEg42C + fYyCfYx+d3t5cnd1bn1/eIeIh5uMi5+Eg4t+fYSDeIB+c3t6e4KEhoyGg5KJh5aHgpKCfY2AdX56 + b3h4d357eoKGeoZ9cn13c3l+eoB+fn56enpyamprZGRwZGh9cHR6cHR4bnJ4a29yZWlyYV1rW1dt + XE9qWk1qWlhyYV90Y2R1ZGV0ZWh0ZWhyX2h3ZG15a3d+cHt7cHt1anVyaGtwZ2puaW1ybXB0am53 + bXB4a297b3N+dHqGe4KJfX6AdHVwamVtZ2JwX1x5aGSCcHKDcnODbmt7Z2R9Y2mCaG59Z2t4Ymdw + XmR6aG6Ac4CDdYOHc35/a3d6amN6amN+amN7aGF/Z1x9ZFp3YWV9Z2uAam+Aam99aGh9aGh9aGV9 + aGV5aGl7amt7amuAb3CCdH2Ed3+MeneCcG1/ZVh/ZVh9Xlh+X1p4YVt7ZF6EbWiHb2qNcm2Ha2d6 + Y1FvWEdzWk13XVB/ZGGDaGSEal99Y1h7Vkd9V0h4XlR+ZFqDb2WAbWOCamV+Z2J6XVR9X1Z+XmSG + ZWuGZ2SJamiGamqHa2uGameGameHZ1uIaFyEYU5/XEl7VkV7VkV7Wk6CX1SMYlaDWk59VEZ5UEN7 + Vkl+WExlV1ppW11vXFpuW1hvW19vW19qXGFtXmNtXmNtXmNtYWdyZWtyYm51ZXJ6aHB6aHB5ZGt4 + Y2p1aGV3aWd3bW57cnN/d4CCeYOCc3h5am91aGVyZGJwa2pzbm16dHp7dXt5dHV0b3ByZWl0aGt5 + am19bnB7dHR/eHh7dHd9dXh9dXh9dXiHdHiCb3N6aWp0Y2RzaW94bnSEcICIdISGgJCEf45/ent4 + c3R4ZV9zYVtrZXB1b3p+e4t+e4t+eH56dHp9cHd/c3mDeICDeICDdX6CdH19dH59dH57eX15d3p6 + dG91b2pyampqY2NoYWNqY2VnYmVqZWlrY2pvZ25wa290b3N5bmp0aWVuY11uY111a296cHSAeXuA + eXt7d3h6dXd5b3N1a29waGd3bm2DfYONh42Mho6DfYaDd32CdXt5cId+dYyHhpqLiZ6Dgox+fYd7 + eIN5dYB0dXt7fYODgJCJh5aGgJF/eot5eoB3eH57en+Af4SAd3p7cnV5dHiAe3+CfoR5dXt5am1u + X2JrXWJzZGltZ21vaW93amt4a214bWl1amd4ZV51Y1xyX1p4ZV93ZWJ5aGR0Z2d0Z2dyY2V0ZWh4 + a3J/c3l+bnh4aHJuYmVwZGhrZ2prZ2ptZWVtZWVyaGl1a214cnp+eIB+dHp5b3VyZWdqXl9tWlN1 + Ylt6aWp+bW5+a2V7aWN4a3J+cniAdHV+cnN7aW17aW2Cb3iEcnqAb3B7amt3aWR7bmmDb22EcG6G + cmuEcGp6bXV7bneCa3iAaneCaG5/ZWt5ZV93Y113Yl90X115YWKCaWp/cHWCc3iLdXWLdXWRcm6R + cm6Jb2iGa2SGa2SIbmeOeH+UfYSWgICMd3eHaVx+YVR1Vk57XFR+aG2Ca3CGameCZ2OCZFiCZFiA + a26HcnSLd3eHc3OEamN7Ylt4Vkp5V0x3W1t+YmKEaGqJbW+Eb2+Eb2+Ha2eDaGODaVyEal2EZVR9 + Xk16VkB6VkCAXFWEX1iMYViEWlF+VER6UEB7U0eAV0xrVVBvWFRpWlNqW1RuWlptWFhwWFpvV1ht + WFtuWlxvWl5wW19vW2J0X2d0Ymh0Ymh7Z2t6ZWp0YmV0YmV9am6EcnV+eX19eHuDb297aGh1ZGN0 + Y2JyaGl6cHKAdX6Cd39/c3d7b3N4a3J6bnR7b3N+cnV6eHl7eXqEeHuGeX2GeX+AdHqGeICHeYJ/ + c3d6bnJ+a3KCb3WCbnmEcHuHeoyJfY6Cf4N3dHh1aGVyZGJqaGtzcHR7dYB6dH94dH14dH13bnV5 + cHh7c32AeIKDeX+CeH5/eH1/eH19dHuCeYCIfn+DeXqAdXR3a2pvZWltY2doYWVqY2hwZGVtYWJz + bm97d3iAd3p+dHh4cm11b2qDe4CCen9+e39+e3+Je4SGeICCen91bnNyYWJ0Y2R1eHmGiImHh4mC + goR+dHh7cnV1a3+Ad4uLgpmLgpmDgI59eoh1dH5ycHpycHV6eX6DgI6Jh5WIg5Z/eo14dYN1c4B7 + d4aAe4t7d3h4c3R4cHN9dXh/en57d3p4bWltYl5oV1htXF1lXF9oXmJzZGl5am94bnJ6cHR5bW55 + bW54bWl7cG16b2l6b2l+amh6Z2R0ZWp4aW54bXV1anN5bXB3am5vYmJuYWFtYWJtYWJtY2dtY2du + ZWRwaGd4anV7bnl7b3V1aW9tX1tpXFdrWE9uW1FvZGN3a2p5bm15bm1+b3SDdHmGeHOAc25+bW5+ + bW59bnB+b3KAbWp/a2l3b3J6c3WEd3+GeICLeH6LeH6Ed4SGeIaJcn6Hb3uEaG+AZGt+Ymd9YWV6 + YmF4X15zX2J4ZGd+aW6DbnOMd3mQen2ReoKVfoaUe3WOd3CIc3OIc3OQeISZgI2ahImSfYKIcGh6 + Y1t7W1iCYV6Ga3eHbXiGam2Gam1/bm2Ab26IdX6LeICMdX2IcnmNaViEYVB9W1B7Wk91Wlp/Y2OA + a2uEb2+Hb2mGbmiIamGHaV+Ial6HaV2JY1aGX1N/W1CEX1WGYl2HY16JZFp/W1B5UT11TjpwTkB5 + VkhuXFZwXlhtX1twY151Y11vXVd0XFtyWlhtW15tW15tXF1uXV5vW1t3YmJ1aGh4amp7cG95bm1v + Z2VwaGd0bXJ5cnd9eHl+eXqCcHJ7amt0aF90aF9zaWp6cHKAc35+cHt7bm56bW15bW59cHKAdHWD + d3iCe4KCe4KGeICHeYKEeHmCdXd+eX2DfoKEd4KAc35/c3l7b3V6a257bW+Cc4SGd4h7eoJzcnlz + a25waWtyaG55b3V7cH55bnt5cH13bnpwcHNwcHN1bXR5cHh7cHuAdYB/eId9dYR+d4aDe4uDfYaI + gouLfoKEeHt6cHRzaW1wZ2puZGhuYmVrX2NuanCDf4aMf5WGeY57eIN1cn2CeIiEeouDeIOEeYSH + gImIgouHg4l5dXtyXWJyXWJ0c3qGhIyHg4l/e4KAeHR+dXJzbXh7dYCHfZGLgJWGf4t/eYRycHht + a3N1b3h7dX6AfoyGg5GIhpV/fYx0cHlwbXV+c36AdYB5d3h3dHV4cHN9dXh5d3V6eHd5b2VvZVxp + XVRlWlBoW1ZpXFduZGh1a297b3V9cHd5cHh5cHh5cHh9dHuEeHmDd3iDdXN7bmt3bXB1a299bXl1 + ZXJ3am50aGtwXV9uW11uXF9wXmJtYWJtYWJqYmFtZGN4Y2p5ZGt7aW10YmVuXFNoVk1qV1FvXFZ0 + X2R6ZWqCbXR/anJ5a3d+cHuHc3WAbW96bm94a22Aa3CCbXJ+am2CbnB/cn+DdYOMeIaMeIaNeIKM + d4CGeICGeICGd35/cHh/a259aWuDaGp/ZGd1YmJ1YmJ1Y113ZF57Y2eCaW2HcHiReoKQgIaSg4iS + foCJdXiHbm+LcnORdYiafpGWgpCMeIaIcGiCamKAZ2OAZ2ODcHeCb3WHbm2GbWuJcHSJcHSJc3iL + dHmMb2+GaWmLaF+EYlp5V1p5V1p0WF17X2SCZ2KIbWiLcGOGa16Eal+Eal+Eal+Ga2GJZ1uIZVqC + YV6DYl+HZWGEY16OZFSIXk59UzlySC9ySThzSjlyYV13ZWJzaGd1aml1bWl0a2h6bW15a2t1amlz + aGdzZWVwY2N0Y2R5aGl6bnR/c3l7dHd1bnBva2hwbWl0bnR5c3l7eIN6d4KCbXJ/am90a2p0a2p1 + b215c3B5b3B3bW56bWp7bmt6bnJ+cnV6cnl6cnl9dICCeYaGeoOCd3+Gd3t/cHV7cHl+c3t/dH17 + cHl7cnV3bXByampyamp/b3uDc395cnd4cHV3am53am5yZ291anN4bnR1a3J0anB1a3JtaW9taW9r + ZGRvaGhza3B6c3h7eoJ6eYB+eIOAeoaEeouIfo6MgIyIfYh7eIBzb3h1anVwZXBrZGRpYmJuanWA + fYiNhpWJgpF4dH93c35/eYR/eYSDdYOGeIaIgJGNhpaDhpJ5e4hua21qaGl3c35/e4eMhpGHgIyE + fYJ+d3t0bW94cHN/dIKIfYuJg46Efol1dXVzc3N1bXR7c3qDfYaJg4yHhJZ+e414c3Jzbm14b3d5 + cHh+eX19eHt1c3R3dHV5d3p3dHh4cGd3b2V1aV1vY1duXlZqW1NpYmRza256bnJ5bXB4bnR6cHd7 + cnWCeHuGfYSEe4OIenWDdXB+c3J5bm17aHN7aHN7aW13ZGh1XVxzW1pvXF5yXmFuXV5vXl9vYl9v + Yl9zX195ZWV3aWRyZF9wXVZwXVZ1Xlh7ZF5+am1/a26Aa3B/am9+b3KAcnSEc3SAb3CCcG2CcG2I + dHeGcnSAbnSCb3WDbniGcHqHdHqGc3mIdXmGc3eGd3uIeX6Jd32AbnR+aWt6ZWh+aWd6ZWN1YWF0 + X19wXVtyXlx1XFd/ZWGEbnOSe4CRgomSg4uSfniJdW+GZ2GLa2WNdYKSeoeSeoeMdICLcmeDal9+ + aW6CbXKEc3SCcHKEa22GbW6IbnSJb3WJcG+JcG+Lal6IaFyCY2F/YV5/XFp7WFZ5W1h+X12GZGKI + Z2SLaF+HZFyDZF6CY12EZV+HaGKHZFiDYVV+XViCYVyHY2GEYV6MYVCDWEh+VDx5TzhyTDNzTTR5 + ZWh7aGp6anR7a3V6dHp5c3l+dHh7cnV5cnR4cHN4aWt1Z2l3aGp5am1+c3uAdX5/dXd5b3BzaW10 + am53aG99bnV3c3l1cnh/cHV9bnN/cHV9bnN5b3N5b3N4bm93bW5+bWuCcG97cG97cG94bm90amt7 + bW9+b3KGeoODeICJeHmEc3R6bnR5bXN9anB6aG55bm1zaGdtY2duZGh4aW59bnN9cHR+cnV7bmt6 + bWpvZWlvZWl0aG53anB3am53am5zZ2pzZ2pvZWdwZ2hvaml3cnB+eX1/en6He4SCd3+AdX6DeICD + fo6Ef5CAfox7eYd4cn1rZXBvZF5vZF5wb3R/foOMhJeEfZBua3pzcH96eIl5d4h+dYKCeYaHepCO + gpeIhpWCf451c3Rwbm96cICDeYmLg5KMhJSHgId/eX90bXJ1bnN5cHqIf4mLhJCJg456e4R1d39y + b315d4R/eYSLhJCGg5GAfox9eHd1cG9zb3V6d31/eYR+eIN5dXtzb3V4dXd4dXd6dXd6dXd7b3N1 + aW1zYlVvXlFtYWRzZ2p4a215bW56aWh7aml6a26AcnSHe4mJfoyMfomMfomDeX1+dHh6aG55Z214 + aWt0ZWh9ZGN6YmF0YVpuW1RpWlFqW1NvXFxwXV11XVx7Y2J1aGh1aGh6Y1t7ZFx5ZWV/a2uCc3iG + d3uGc3eEcnWGcHOGcHODdHmGd3uNfoCMfX+Oe3+Jd3qAcnd+b3SCbnCEcHOAdHh+cnV6cHR7cnWG + d36IeYCEdXp6a3B9ZGN7Y2J3Y1p3Y1p3XFxyV1dwXFpzXlx3Xl+AaGmEcH6Qe4mSf4aSf4aSeG2I + bmN/ZGSHa2uMd3uRe4CRd32Nc3mEbWSAaWF/bm+DcnOLc26GbmmEaWmGamqHbm+Hbm+IbWiJbmmO + a2GLaF2EZ12AY1qAXlR9W1B6Wld/XlyHZWOJaGWLZ2KGYl2AX1uHZWGHaV2HaV2JaFiCYVGAXFGE + X1WDYViEYlqGXUiCWkWEW0SEW0SCXUmCXUl+b3SAcneCc3iAcneDeoKCeYCAd32Ad31/eHh9dXV5 + b3N5b3N7b3V9cHeAdYN/dIJ+eoB6d311a29zaW11Z2t3aG1waWt3b3J+cniGeX+IeIKEdH6AdHh+ + cnV7cHl5bneEcHCEcHCAc3N/cnJ7b3B4a217cnN/dXeHfYOGe4KEeoB9c3l5bmpzaGR3Ymd4Y2h1 + YWFwXFxoWlxpW11vYWV5am+AcnSCc3V+cnN4a21vZ2VtZGN0amt3bW55cnJ0bW1zbm90b3B4bXV3 + a3Rwbm90cnN7cnWHfYCHgoZ/en51bnN5cnd/eIiEfY2Hf5CIgJF7c3ppYWhoXVpuY191dH6DgoyJ + fYOAdHpqZWRqZWRubXJwb3R0c3h4d3uCfZCHgpWRh5eGe4x9eYJ9eYKEe4iJgI2MhJSNhpWIgJGD + e4x4cnp4cnp7eYeDgI6Lg5SMhJWEgIx7eIN1cn14dH+Ae4yGgJGIgJGHf5CGgIR7d3p6c4OHf5CI + go2HgIyAeH96cnl7cnh+dHp+e3+AfoKGgIJ6dXd3aFpvYVNzYmN1ZGV5am16a26CaWqDamt9aG9/ + anKDdYOMfoyNgJaOgpeNgISDd3p0amtvZWdyY2p3aG9/a257aGp4ZFtvXFNrWlNrWlNvXFVwXVZ5 + Yl17ZF94aF96amJ/a2mAbWqAc3OGeHiEeoCJf4aHen6EeHuAcnmCc3qHdH2NeoOOg4yNgouSf4aI + dXuEcHCGcnKCcnuEdH6Dd31+cnh7aW1+a2+DcHeHdHqEeHl+cnN+amF/a2KAb25/bm17Z2d0X19z + YVt0Ylx9aG2DbnOJeYiNfYyQgIONfoCEcmR9al16Z2eHc3OLfoSQg4mQd3iIb3CEbWSAaWGAbW2D + b2+Jb2uHbWmCZ2KDaGOIa26Ia26JbmqOc2+UdHKRcm+Jb2qGa2d+X057XUx9WleCXlyEZV+HaGKI + Z2KEY16GYl+OamiMaV6Nal+LaVWHZVGDY1eHZ1uIZFaIZFaMZ1OMZ1OMZViNZ1qOalqUb16CdXmD + d3qGeX2Dd3qGeoOEeYKHeYKGeICHeoCGeX+CeHt/dXl+dHV+dHV9cnp5bnd4eYJ1d391a21uZGVu + YWFvYmJvaGh4cHCCdH+HeYSGe4KDeX+Cc3V/cHN+b3d/cHh/dH2Cd3+EeoCCeH59dXp6c3h+dHiA + d3qAfYaAfYZ9e4B3dXp4b251bWt0ZWhzZGdvXltuXVppXVFoXFBvXWF+a2+HdHqJd317d3h4c3Ry + am1yam15cnd7dHl4dXdzcHJ0bnd6dH16d4J5dYB1eHl3eXqCdXuNgIeIg4eAe395bXN3anB3bnh/ + d4CCgIuCgIt9c3RtY2RpYmJza2t9eoiAfoyDdXV7bm5yampyampvam5uaW1zbnJ0b3ODe4uGfo2G + gJGDfo5/fYuDgI6HhpCIh5GMhJWMhJWDgpZ9e5B5c356dH9+e42Cf5GDfpGIg5aGgot/e4R5dYB5 + dYB+e4l/fYuGfo2Gfo2JgI1+dYKAdIeIe46LgoyGfYd9dH56cnuAbneGc3uDgoyIh5GOho2DeoJ+ + b3R5am91bnB4cHOAcnmAcnl/dHN/dHN/cnJ7bm57c32Ee4aGf5aMhp2OhIuIfoR+bW53ZWduZGVz + aWp/cnJ7bm59aWd5ZWN0YlxyX1pwYVpwYVp1ZGF7amd/b2iAcGmDbnOEb3R/d36GfYSGf4aIgoiG + e4KDeX+Gc3mEcniAd3qHfYCIf4eMg4uQgIiHeH+Jc3iLdHmCeYaDeoeLd4KEcHuAa26CbW9+a3SA + bneAc3ODdXWHc3CJdXOLdXWGcHB+amh4ZGJ3Y1x3Y1x9Z26Gb3eHdYiOfZCSfYSNeH+EbmJ/aV14 + a2+CdXmJe4SQgouRdXWMcHCEal+CaF2AbWqEcG6JcHKIb3CIaWOIaWOQbm2Qbm2OcnKRdHSSd3OS + d3OJdW+Hc21+ZVF7Y097XFGCYleDaVuDaVuEaWKAZV6CaGSHbWmLbV+Nb2KMa1+Ma1+Ia1uJbVyM + aFeMaFeMaFWMaFWOamWUb2qUc2qWdW2AdHiDd3qAd32Ad32Hd4OGdYKIdH+JdYCIeIKHd4CEe4OC + eYCAeXt+d3l9c3R7cnN+eIB/eYJ5cnJuZ2dtZGFvZ2N3bXB6cHR/eX+Ce4KHen6GeX2CdXl/c3d/ + dXuDeX+Gf4iHgImEe4aEe4aAdYB/dH9+eX17d3qAdX6AdX6CeHt+dHh6bnJ6bnJ4a211aWpvZ2Nt + ZGFwZFhzZ1tlZF5vbmh9c3l/dXt+dHh9c3d4bnJ3bXB6b3iAdX6AeX5+d3t3cHl4cnp0d4N0d4N7 + en9+fYKAeoCGf4aHg4x+eoN9b3p5a3d3bXCDeX2GhIyEg4t9dXVyampoaW11d3qEg41/foh9dXV4 + cHB/c3l/c3l5bXB6bnJ1c3d0cnV+foCDg4aDgJKEgpSCf46Cf46HhJSJh5aJgpGLg5KDfYh/eYR6 + b3p6b3p7c4l/d42Dd4iIe42GfYeCeYN7c313bnh1dH53dX+AdYOEeYd7eIN4dH93coR/eo2He4R/ + dH14bnR5b3V+cniEeH6Ng5WQhpeQiZKAeoOEd4J9b3p5bnd9cnp/eHp+d3l+eXqAe32Lfn+GeXqA + dYN/dIKId42Ne5KMgI6IfYuEb3R6ZWp5Z2p7aW1+cnN+cnN+c3J5bm13aWd0Z2R1ZGF1ZGF7amuD + cnOAcnR/cHODdHmEdXqDfYiHgIyJgIiIf4eEen5/dXmAbnKAbnJ/cnKDdXWIf4eIf4eQfYOEcnh/ + cHiAcnmEeYeJfoyQe4eHc36GcnSCbnB/aXB/aXCCa3OLdHuMd36LdX2JeHmGdHWDb2l7aGJ5Ylp4 + YVh6YmODamuGb36OeIeNeHqJdHeAbWN/a2J+b3SDdHmOeISSe4iQdHeJbnCAZ1+AZ1+HbWiMcm2J + b2uJb2uMcGmLb2iLcnCJcG+NdHWReHmSeX2Qd3qIdG6GcmuDZ1aAZFSAY1aEZ1qGa16Eal2CaVyC + aVyGamOJbmeNbWSObmWLbWGLbWGLal+JaV6OaFuOaFuIaVeLa1qScG6Vc3CZdG+adXCAcneCc3iD + dYODdYOLdIOJc4KGd36DdHuDd32GeX+EeYSCd4KEd3+DdX6AeHeCeXh9eX9/e4J/dH15bnd4cHN5 + cnR6b3p7cHt9eHmCfX6De4CDe4CAd3qCeHt/en6Ef4OHfoaIf4eEeoCDeX+DdX6Ed39+dX99dH5/ + c3d+cnV+dHV9c3R/dHN/dHODcnB/bm17bXJ7bXJ/a2t+amp1aml5bm14cHV5cnd7cnh3bXN5a2l6 + bWp/c3mGeX+Deod/d4N3cnN3cnN1c3d7eX1+eoB9eX95eH1+fYJ/eId+d4Z5cH10a3h1cHSDfoKD + hI2HiJF5eoNvcHl3bniEe4aLhI2Ce4R9eYKAfYaGgouAfYaDe4CCen+De36AeXuDgI6AfoyDf5WA + fZKGe42IfpCCgpCCgpCEfY1/eIh7cHl6b3h3aGpzZGdya3J1b3V6b3qCd4KHeYJ/cnp+a297aW11 + anN5bnd9cHeAdHp3dHh4dXl9eX+CfoSGfn55cnJ4amp6bW19dHuEe4OIg5SLhpaUhIyLe4OIe4KH + eoCEdXqGd3uIeXuJen2CfX6GgIKLgomJgIiNeoOIdX6HcnuLdX+Mg4uIf4eHen55bXB5am2AcnSH + eHqEdXh/dHB9cm56Z2l6Z2l9aWN9aWN+cnWEeHt+dHh7cnV/cnqDdX6EfomIgo2Lf4iMgImGeXp+ + cnOAa2t5ZGR6Z2eIdHSJfomLf4uNeH+Eb3eEb22Hcm+IeoaQgo2Qg4mLfoSLdXiHcnSAaGt+ZWl+ + aXCEb3eMd4CNeIKNeHiIc3ODa2d7ZF91Xlh6Y119ZWGDa2eLdX2Md36Mc3SGbW6AaWR/aGN9aG2A + a3CIc3qLdX2Mc3eGbXCCZ2l/ZGeDammIb26Jb2iJb2iMdG6Od3CJdHKLdXOJdXiLd3mLdXiJdHeL + b2uEaWV+YVV/YlZ/ZV6IbmeJcHKEa22La2WJamSEaWKJbmeNbWSNbWSMbmSLbWONbWSMa2OOZ16N + ZV2QblyRb12Ub22RbWqRaGWRaGWCc3qCc3qEdICHd4OEd4KCdH+EcnqDcHmAdHqAdHqEd3+Ed3+G + eX+Ie4KDe36EfX+DfYOHgIeHeoCCdXt6b3p6b3p1bXRzanJ3bXN7cnh9dXqAeX6GeX+GeX+Ce4KE + foSHe4SEeYKDeX9+dHp+cnV+cnV9cHd9cHd7b3OCdXmAd3iCeHmEdXqEdXqAdX6AdX6GeX2EeHuI + dXmCb3N7amt9a217cG17cG17bm59b294aW57bXJ9dICDeoeEeYKAdX56dXl0b3Nyb3B4dXd/eH1+ + d3t6c3N1bm55a3d4anV0bXJza3Bwb3R6eX56eYCAf4d5dXtzb3V3bnqCeYaIgJCCeol7d4aDfo2H + hJSGg5KDfo2Dfo2Gf4iHgImDf4uAfYh7eYh4dYSAdYCAdYB9eoiAfox/d4B/d4B/cnp7bnd1Z2ty + Y2h3am56bnJ4cnh7dXuGeX99cHd5bW59cHJ6bnJ7b3N4bXV6b3h5d3h7eXp/foOAf4SAe316dXd1 + a216cHJ+dISIfo6LiZGIh46NgIeIe4KIfoSJf4aIe4KJfYOLeoSLeoSAfoKAfoKHfoiIf4mIeIKE + dH6AcneHeH2JgoeLg4iHf395cnJ7b3B+cnOMeX2MeX2Je3uCdHR7amt6aWp/amiAa2mCdXuIe4J+ + d3l9dXh7bnmAc36EeouHfY2Lf4iMgImId3WAb256aGF6aGF5a2mHeXeHfoaJgIiMeX+EcniAbW+E + cHOGdYKLeoeOf4SLe4CId3WGdHN6a253aGp4aW57bXKHcnmLdX2MdG6IcGqGbWuCaWh9Y16CaGN+ + a2WEcmuJdHuJdHuLcnWGbXCAZ2KAZ2KCZW2HanKLcnWMc3eIbW+DaGp+ZF2CaGGGbWuIb26Nc2+O + dHCNdHONdHOJdHKLdXOIc3CNeHWUdHKOb22GZ2GDZF5/ZVuDaV6Ha2iSd3OOeH2Jc3iIbl+EalyD + ZVqLbWGObmKMa1+ObWiObWiLal+HZ1yGZV2GZV2Nal+Oa2GUa2OQaF+QZVqQZVqAcHqCcnuDdYCE + d4J9dH57c31+cH5+cH57cnh6cHd+dHp+dHqGdX+IeIKDeoKDeoKCe4SGf4iEe4N+dX15bnd1anNy + aGtwZ2p0aWh9cnB/dXeEenuHeYSGeIODeIaDeIaCd4SCd4SAd3h+dHV7dXN4cm9+cHB/cnJ6cnuC + eYODfYOEfoSIeoaIeoaHfoiIf4mIgouHgImIfYiAdYCCc3V/cHN+d3d9dXV7b3N7b3N1aW99cHd/ + dYaDeYmDeoSDeoR/eX95c3l4c3R1cHJ5dHV5dHV3am5zZ2pwZGVrX2FtY2luZGpwZW55bnd4cnh7 + dXt4bXV0aXJ1aXp7b4B/eYSAeoaAeIKGfYeGg5GHhJKEgIyDf4uIfo6LgJF/e4d9eYR6dHp3cHd6 + cnt6cnt4dYSAfo1/dYZ9c4OAc4B/cn93b3R0bXJ6a3B4aW5zbXN5c3l+cnV6bnJ1bXR4b3d9cnp9 + cnp5cHh5cHh1cnh5dXuCgIaEg4iDe356c3V5cnd+d3uCeomEfYyEf46Ig5KJhIiHgoaLhI2IgouL + eoeLeoeIgIaLg4iGf4iDfYaGeIaEd4R/dH9/dH9/d4OCeYaJg4mMhoyJgoKAeXl9c3eAd3qQgIaS + g4iOgoaDd3p9b210Z2R6aG6AbnSJeoKJeoJ/c3R9cHJ4a297b3ODeICHe4SQgo2LfYiGd3l+b3J4 + Z2V7aml+cnWEeHuIfYuJfoyOeYOGcHp+b3KDdHeIdH+JdYCOe4SJd3+HdXeHdXd+cnh4a3J9aG2A + a3CEbnqHcH2EcmuHdG6GcnKEcHCEa22Hbm+DbnWEb3eJdHmIc3iIc3OGcHCAbWN/a2KDaGiIbW2N + bmuQcG6Ha2d/ZF96YVODaVuDb2WHc2mQdXuQdXuRdHeMb3KLcnWOdXmOdXmReHuSd3KMcGuEZFyA + YViDY2SLamuLb2+WenqWeX6Qc3iLal6EZFiCYVyGZF+MZWSSa2qScGuScGuIal2CZFd/YlaAY1eL + a2WLa2WSbWOUbmSUaF+RZV16bXp9b311bXd3bnh3b3R3b3R6b3p4bXh7cG95bm14b256cnCAcnmG + d36Cd4KCd4J9eYR/e4eAeX59dXp6a25wYmRyZGR1aGh1bnOCen+HeYKJe4SHe4eGeoaGeIOHeYSC + eIiGe4yHe4SDeICAeX59dXqAd32Ad31/d4OCeYaAe4uGgJCIgouIgouMg4uJgIiIg5KHgpGNg5WE + eox/e4eEgIyLhomHgoZ7e3tycnJyZWd0aGl4b3l6cnuCeomAeYiAeoB+eH59eHd4c3J1c3R0cnNw + YmRvYWNoYWNlXmFlXF1oXl9vXWF5Z2p3bW54bm90aGt1aW1wYmlzZGt3bXB9c3eAeIKEe4aIhpSE + gpCCfYCEf4OLgJGMgpJ/fYt5d4R7c314b3l5b396cIB3c4h9eY56d4J1cn19cnqAdX57eIN1cn13 + bXBtY2duZGVzaWp1aWp5bW50anB3bXN7eYd7eYd6cn51bXlycHp4d4CEe4aJgIuEfX+AeXuDfYOG + f4aCfYx+eYiCfoeIhI2If4mMg42LhIuGf4aEeoCGe4KGgISIg4eLhI2Gf4iHfYB9c3d4cnp7dX5/ + eomCfYyGg5GLiJaRiY6EfYKAdYOHe4mQgpCShJKViI6NgId/cm11aGN9aG+DbnWMe4aMe4aAeXt3 + b3J7amt+bW6DdHuNfoaOf5GJeoyHeHp+b3J+amqEcHCCc3WEdXiJe4SHeYKGcHiDbnV9bnN/cHWG + b3eIcnmJdHmDbnN/cHWAcnd9bnV9bnV/cHWEdXqIdXuHdHqGeHWHeXeIdHSHc3OHbm+GbW6AcneD + dHmIdHeJdXiLdXiGcHOEb2+HcnKHcm+Ic3CMcHCJbm6Ibmp+ZGF7Yl6CaGSCb3OMeX2MdXqLdHmL + b2uIbWmJa3OOcHiUdX2WeH+UeHiOc3OHbWKEal+EaGiNcHCReHuWfYCWd3OOb2uLaVqIZ1eCX1WG + Y1iHZ2iQb3CUeHOUeHOLcmOCaVuCY12IaWONdHWWfX6deHeXc3KUb2GRbV54aHJ4aHJyaGtyaGt1 + aWp6bm9+cnh7b3V7bW97bW95b3B6cHJ6cHd7cnh+bnqCcn5/eX+AeoCEd3+Ac3t5b3B3bW55bXN9 + cHd+eoOEgImHf4SEfYKGfoOHf4SHe4SEeYKEeYeGeoiIgouGf4iGeoOHe4SEe4ODeoJ/d36DeoKH + e4mJfoyJf5CMgpKMho6IgouLh52Df5WHfoiAeIJ6eIaAfoyMho6Mho6Cf4N4dXlyZGRwY2N0aGt3 + am5/c3d/c3eAeISCeYaDeX2DeX19dXh7dHd3amt1aWpvY2dpXWFpV1FqWFNjYlxubWd5cnR6c3V4 + ZWt1Y2ltX19tX19wZGh9cHSCeYOEe4aDf4uAfYiGeoaIfYiHfY6DeYt4c4JybXt3cHd1b3V3cnV4 + c3d6cIB+dIR3c3t3c3uCeYCGfYSHfoiDeoSAd3p1a29zYVtwXlhvZGF0aWV3am59cHR+eH6DfYOD + eIN5bnl0b354c4KDeYmLgJGHfoiGfYeJg4yLhI2Ee4Z+dX+HgImJg4yJgIuMg42LhIuHgIeCf4OE + goaEgIeEgIeEgpCGg5GMgoaGe397c3p7c3p5d4R7eYeDe46JgpWQg5WJfY6IeYuRgpSQh5SOhpKU + iZCLgIeCdWt6bmR9aG+Eb3eLeoeMe4iGe397cnWAbnJ9am5/c3mIe4KNfYmJeYaNeXmIdHSDb3KD + b3KDcHSEcnWJeYOIeIKIdXl/bXB+aWt+aWuCbXSDbnWEc3R+bW5/bXWCb3iAbnSGc3mGeX+JfYOJ + d3qJd3qNe32LeXqJdXiHc3WIbXKIbXKCc3WGd3mJdXWJdXWNdHWHbm+IbXKLb3SHc3WGcnSIa2uH + amqDaml+ZWR7Y2J+ZWR+a3SIdX6ReHuLcnWEaW6Ha3CHanSMb3mRd32UeX+Re3uJdHSJb2iHbWWG + aWuJbW+OdHqQdXuRcm+La2mHZFyDYVh9XVGDY1eIaGmVdHWWeXuUd3mScGGLaVqIZGKOamiQd3ia + gIKheXWZcm6RbVyQa1twZ2pvZWl0Z2J0Z2J6aGt+a2+Acnd9bnN9bnB9bnB5b3N5b3N7cnV9c3d+ + a3KAbnSDe36De36De4t/eId7eIN7eIN6dYZ+eYmHfouJgI2Jg4mLhIuLgomJgIiEgId+eoCEfoSG + f4aIgouLhI2LgoyIf4mHf4KGfoCHen6JfYCGgISEf4OIfo6Ifo6Dfo2Ef46GgJR+eYyAdX59cnp5 + dX6AfYaNg5SNg5SGgo16d4J5ZWVwXV1vZ2N0a2h6c3N7dHR/dH+Cd4KEfoSIgoiCgoSDg4aAd3h4 + bm91aWpvY2RtWlRqV1FoY2R7d3h/dXt6cHdyY2hqXGFnW1FoXFNrX2N9cHSAdYOEeYeAf4d6eYB7 + d4Z/eomCeIl9c4R0a3NyaXB4cHV4cHV5d3h6eHl7c31/d4B6cn5/d4N/foiCgIuIh46Hho2EgoZ6 + eHt7amd3ZWJwY2F3aWd+cHmGeICAfYaHg4yGgIR7d3p4cn14cn2AeYiMhJSHhJKDgI6LhpWJhJSH + eYJ+cHl+eoaCfomNh42Nh42Lh42IhIuHgIeHgIeIfYaGeoOGf4iIgouQgo2OgIyDd319cHd7cHt/ + dH+CdYiHeo2HfY2Ge4yMeo2UgpWNiZWMiJSUjJGNhouHe3V6b2l/Z2iEa22IeoOOgImNfoOGd3t6 + a254aWt6c3WAeXuJen2MfX+SfoCQe36JdHmIc3iDdHeEdXiHeYeIeoiLeXh+bWt/ZGd+Y2WAbnSE + cniGdHWDcnOCbXKDbnOCb3WHdHqHeYKIeoOIe32Ie32Jen2MfX+Me3OEdGuHbm+LcnOLdXqMd3uI + d3OGdHCHbnKGbXCGcHCDbm6DbmuCbWqEa2qEa2qGaWmCZWWAZGeCZWiDbXSGb3eLcnCHbm2GZWmE + ZGiEanCHbXONd36QeYCHeHqCc3WHa2iIbWmHbWmGa2iLb3SOc3iMbWeDZF5/W1R9WFF+W1iGYl+E + Z26UdX2Xd32Uc3mVaWSJXlp9Yl6IbWmQdHeXe36adXCSbmmOZ12OZ11uX2dvYWh3Y2V5ZWh5Z29/ + bXWAdHiAdHiAc3OAc3N9dHN9dHN9dXh7dHd6cHR7cnV/d36CeYCAd4d/dYZ+d4Z/eIeEeoyHfY6J + foeLf4iIf4mLgoyEg42Eg42HfoiCeYOCe4eCe4eDfpGIg5aNhpaJgpKHhIiDgISDeICEeYKEeYKD + eICDfYODfYODfYOCe4J/d359dHuDdHmCc3h7eH6Df4aLgoyIf4mAf4l9e4Z+cGt6bWh7cG99cnB+ + dHp+dHp/eX+Ce4KAe4uGgJCIiZKMjZaHhIiCf4N7cnNzaWpuX2JwYmR5cH1/d4ODd316bnRqY1pk + XVRqXlZuYlplXF1zaWp5bnl+c35/dH1+c3t6dHp+eH6AdYN3a3lvbW5tamt0b3N7d3p9eId7d4Z5 + dYB5dYB9c4N/dYZ9eoyAfpCHhJaIhpeJhpGCfol+c3J6b257b3B6bm+AeYiEfYyGfo2IgJCJgIiD + eoKAcneCc3iAe4yIg5SOh5eJgpKRh5mQhpeGdYJ6and6cnl7c3qGgo2MiJSGgouCfoeEfYyHf46J + foeCd3+GeX2JfYCHhouGhIl+fYJzcnd5bXN/c3l+c36DeIN/eYSCe4eAeYiGfo2If4mQh5GSjJKM + hoyMf4B+cnN+amSCbmiEeHuOgoaOgoaDd3p6bW14amp4bnKDeX2LgIKRh4iNg4mQhoyOgoaIe3+G + d3uCc3h/cn+GeIaNeXuEcHOCaGSIbmqMd4CVf4mUfoaRe4OIdHeDb3J+cnOCdXeIeYCQgIiUgISN + en6Qe3SQe3SNfXSJeXCJdHSMd3eJd3+Jd3+Gcm+Db22EaWmDaGiIaWOHaGKDaV6Eal+EaWSHa2eH + amqDZ2d/Z2qAaGuCaW2GbXCJb2uCaGSAYl6CY1+CZWiGaWuIcneLdHmJcG+Hbm2Eal+Eal+Ham+E + aG2Hbm+JcHKHblyAaFZ/XE57WEp6WliGZGOJbXeVeIKaeHWVc3COZ2GMZF6DZGKMbWqSb3SRbnOQ + al+MZ1yMZ1+NaGFtXF1wX2FyXl53Y2N4ZWl+a29+b3R+b3R+cnN/c3R/dXl/dXmGeICDdX57d3h5 + dHWCdH2CdH1+c3t/dH1/dH+AdYCDeICIfYaJe4SOgImLf4uOg46IgouJg4yHe4mCd4SAdYCCd4KE + eoyMgpSMhpGJg46LgomEe4OAeoB/eX+HeH+EdX2Ed3+DdX5+dHh/dXl/eHp/eHqHeH+Gd36CfYCD + foKLfYaLfYaCf4OCf4OEenuCeHl6eHt1c3d+c3uAdX59en5+e3+EfY2MhJWSkqGQkJ6Mi5WLiZSC + f4Bwbm9uZGp0anB+eIN7dYB9eHtzbnJpZV9oZF5yZF9wY15vY1twZFx6bnJ+cnV/c3d+cnV/dH2A + dX6Dd313anBpZWtpZWtwaW56c3h7eIB7eIB6c3h6c3h6c3V7dHd7dYCAeoaHfY6Jf5GJg46Igo2A + eXt9dXh/c3mAdHqEfYyGfo2JfY6JfY6NhIyJgIiAd3p/dXmCfY2JhJWRh5uOhJmNhpmOh5qHeoB4 + a3J1bWt+dXSDfo2LhpWMgImIfYaDe4uGfo2IeoOHeYKCd3+EeYKGhImGhIl/foZ1dHt0anB4bnR4 + bXV9cnp9cnp7cHl7cHmAdX6GeIaLfYuNh5COiJGOgoiDd31+bW5/bm9/eHqJgoSOe4SIdX6CcG97 + aml5am2DdHeMhImUjJGUjZaSjJWSgoyJeYODdHuAcnmEcHuIdH+MeX2Gc3eAa26HcnSNe46SgJSU + hIyQgIiMd3mDbnB+b3J/cHOCdXuOgoiSe4COeH2OfXuQfn2Qen2Md3mNd3uOeH2Od4aMdIOLcGuE + amWGZ2OGZ2OIamGJa2KEa16GbV+IaWOJamSHaGSHaGSAaGt+ZWmDaWWGa2iMbmKHaV2JY2KMZWSI + aGuIaGuNcm6Ncm6Lb2iGamOCZ1+AZV5/ZGmDaG2AbWOEcGeHbV+CaFt/XVN5V011VFaDYWOLbnOS + dXqXeW+SdGqJaGOLaWSLa2mQcG6ObmWMa2OIaVeHaFaIZVqJZ1twXVt0YV5zYmN4Z2h4bWt4bWt+ + a297aW14bnR6cHd+d3uAeX6IeISHd4N+dX97c31+cnV7b3N4bnJ5b3N9cHR7b3N+dHiDeX2Me4aM + e4aNf4uOgIyJgpGLg5KEfYyAeYiCd4SAdYOGeYyLfpGMg42If4mNfYeDc319dHt9dHuCdH2CdH1/ + dH19cnp/c3eEeHuEe4iIf4yMf4aMf4aHfYCIfoKJfYCMf4OIf4eJgIiOf4eLe4OCfYB6dXl+d3uA + eX6AeoOCe4SHeo2NgJSOjJuSkJ+QkJ6Ojp2JiJJ1dH50anB6cHd7dXt4cnh1bnB0bW9taW9ybnR+ + dGp6cGd1a2J0amGAcnSAcnSDeX2DeX2CeYB/d36CdXl6bnJoZGppZWtvZ254b3dzcHJ4dXd5dHV3 + cnN4bnJ6cHR4dXl6eHuAeX6De4CGf4aIgoiAfoJ9en6CeH6EeoCHgImIgouJfoyLf42Qh5SMg5CA + e4t/eomAeoaIgo2MhJSMhJSMiJSMiJSHeYR9b3p6bm+CdXeGfYmLgo6LgIeDeX+AeoOEfoeDeIOC + d4J/dH+AdYCDeYuDeYuAeH94b3d1a290am53am53am55bW53amt4Z2N4Z2N3anB/c3mGfYmMg5CL + g4iJgod9cHJ5bW59c3eHfYCLfoSHeoCDb297aGh3aG2Cc3iNhIyVjJSXjpmSiZSRgomGd35/cm16 + bWh+a3KHdHqIeIKGdX+Cc3WGd3mJfoyRhpSWiJGRg4yOeXuEb3KDbXKCa3B/c3eJfYCSe4OReoKO + f4KNfoCUeYKRd3+Rd32OdHqMdYKMdYKJcm2Da2eGamOIbWWLcGuLcGuLc22JcmuJbmqLb2uMaWuL + aGqGZ2SEZWOEZV+GZ2GOa1+Oa1+NamKOa2OObWiMamWIbWiJbmmGa2eDaWSDZF6AYlx6YVx+ZF9+ + ZF+Ga2eIal6GaFx+X1B5W0x1U06GYl2NbW6Uc3SSc22MbWeHZWGIZ2KObWqRb22Mb1yNcF2HaVyG + aFuGZ1WHaFZ/amqCbW17bXJ9bnN5bW55bW56bW14ampzaW13bXB6cHR5b3OEcH6Hc4CDdIaEdYd7 + b3V3anB1ZGN3ZWR5bXB+cnV/dIKDeIaHeYKHeYKLfoSMf4aGgJGEf5CCfYx+eYh/eHp7dHeAdYCI + fYiIg4eEf4ODd3p9cHR9bXmAcH19d4J/eYSAeoOAeoODeoeMg5CLhpaMh5eOhpKMg5CJgIiIf4eL + f4uMgIyQhJCNgo2Ug42OfoiJfYCCdXmAdHiCdXmCfYCIg4eHfoaLgomHho2Mi5KNkJ6OkZ+RkJd/ + foZ+d3l9dXh1c3Jyb25wa210b3B4bXV+c3uAd3h/dXd7d3qAe3+IfYuGeoiMgImLf4iGf4aAeoCA + e394c3d3dHh0cnV1b3V9d317c3p6cnl6dXR5dHN4bnJ4bnJ7dHl+d3uAeoaDfYiHfoaGfYSCe4KD + fYODeX+HfYOJgI2If4yHe4mMgI6LiJeLiJeIgJF+d4d+dIR/dYaGeoaIfYiMhpGMhpGHfYB9c3d5 + b3B+dHV/e4KEgIeHf4R+d3t/dH2DeICAeIJ9dH6AcHp+bnh6cIB5b393b291bm50aGl0aGl6ZWp6 + ZWp6a3B6a3B5a2l3aWdvYWV3aG1/c3mLfoSJf4OJf4N+cnh5bXN9b3iDdX6GeIOEd4J/bm95aGl7 + Z26Ic3qLfpGUh5qSjJeNh5KQgIOHeHp/bm95aGl3bXN7cniIeIKHd4CEen6HfYCJfoeSh5CViIyS + homRe3uIc3OCZ2eAZWWCaWqJcHKNeIKUfoiWgIuWgIuUgISQfYCRd32QdXuQdYCOdH+Hbm2CaWiG + amONcmqQd3WQd3WQdXuRd32OeXuNeHqUcm+Na2mJY2KIYmGGaW6LbnOWdW2Xd26VdW+RcmuRcGiQ + b2eMa2ONbWSLaWSIZ2KEZFp/X1V5WlF6W1N/XFeHY16IYl6LZGGAYVZ+XlSAXFGIY1iMbWeOb2mM + bmSIamGGZGKDYl+MamiScG6Ucm2Ucm2Rd2uOdGmNbVaIaFGCc3WCc3WAdHp/c3l7b3V9cHd9bnN5 + am95Z214ZWt5aGl7amuCa32Jc4SEeYSAdYB5bXB1aW13aG19bnN/cnqDdX6DeICDeICGeX2Ie3+M + fYKLe4CGfo2IgJCGfo6De4x/en57d3qGeIaMfoyNgo2GeoZ/eHp6c3V+c35+c36DfYaGf4iJgIuM + g42JgpGNhpWJgpKLg5SMg42Mg42HgIeIgoiJgIuNhI6Ng5SNg5SOhpCNhI6Jgod/eH1/dXmAd3qH + fYONg4mHgIeHgIeHho2NjJSSkJ+VkqKSjpeIhI2Je4eGeIN+eXp4c3R0b3B3cnOAe3+Ef4OAfYZ/ + e4SDfYaLhI2Lg5KHf46If4mGfYeCe4SCe4SEgIeEgIeAfYiDf4uGeICIeoOAeoaDfYiEeH6Dd317 + d3p4c3d7dXt+eH59dH6AeIKDfYaCe4SEfYKHf4R/e4J/e4KJgIiLgomEeYKLf4iHh5WHh5WHe4mD + eIZ/dH1+c3t+eIOGf4uGhIyDgomIfoJ/dXl6cHJ/dXeDeoSEe4aCeol9dYSGd36DdHuAeoN+eICD + d31+cnh5bXB1aW11aGh3aWl3ZWR4Z2V9aG2Aa3CDc3+EdICCc3iAcnd0aGtyZWl6bXWGeICAfoKA + foKGb3R7ZWp1aW16bnKCcnuAcHqCbXR7Z25+a3SHdH2Jf5SNg5eOhpCLgoyQfn+Id3iAa2t6ZWV0 + ZWp6a3CCdH+Ed4KEeHuGeX2LeH6VgoiZg4uVf4eUenuJcHJ+a155Z1qAZ2KHbWiLdHmSe4CXgIuX + gIuXg4aSfoCOeH+Nd36JdHmHcneHamqDZ2eIbmmMcm2UeH2Xe4CWen+UeH2Uen6Qd3qOb2mHaGKJ + ZWGIZF+HamqNcHCVeXuXe36VenWQdXCUdWmOcGSNaGGMZ1+JZF2JZF2CZFd9X1N5Wk96W1B6WlV9 + XFeEY16IZ2KEZFyAYViEZFyHZ16JbmmLb2qIamGGaF6EY16DYl2MammScG+aeHeaeHeheXWbdHCU + b16MaFd5dHV3cnN6c3V9dXh6dXl7d3p/c3l5bXN5ZWh6Z2l4aW5/cHV/a3mEcH6CdXt/c3l1Z2lz + ZGd1ZXJ+bnqAdX6DeICHgoaHgoaJgIiJgIiMf4OMf4OEfoeEfoeIf4yHfouEe4OGfYSEfY2JgpKO + gIyIeoaHeH2Gd3uGd3uHeH2DgI6EgpCIhJCIhJCLhIuJg4mIf4mLgoyJfomMgIyIg4eIg4eIgoiL + hIuLhI2OiJGMi5WMi5WHhouAf4SIfoKIfoKGgouIhI2EgImHg4yGhI6LiZSUjqKWkaWWkpuNiZKQ + h5SOhpKGhIl9e4B5dXt6d32HfouNhJGMg42Mg42Ih5GHhpCIgouDfYaAeoN+eICCd4SJfoyNg5eQ + hpqNhpmIgJSMho6Mho6Ifo6EeouDeIOEeYSDe4CCen+Ae39+eX1+dHh/dXmAeoOCe4SJf4OLgISI + g4eDfoKHf4SGfoN/d4CCeYN/eouGgJGEfoSCe4KDd32HeoCAfYaEgImEg4iAf4SIe3+EeHuDe3uI + gICLgoyGfYeHeIuHeIt+dX2GfYSEf46Ef46GgIR9eHt7aml1ZGN1YmJ5ZWVuZWRuZWRyaGt7cnWE + eImMf5GMfoeGeIBzamlpYV90aXR7cHuAeoOCe4R+b3J3aGp3Y2V4ZGd3bXB3bXCAbnR3ZGp4ZG+E + cHuLe46NfpGRfoSNeoCIenqDdXWDb21/a2l6a256a25+cniCdXuDdHeEdXiLdX+OeYOSfYSRe4OS + eXiLcnCAb2J+bV99bWWGdW6ReHuWfYCUgIeWg4mVgoaSf4OQfYOOe4KNdHiJcHSJamSGZ2GIb3CL + cnORen+Se4CXen+Ze4CSeXqNdHWEaWV7YV2DYl2IZ2KLbm6SdXWSe4CSe4CaeHWScG6UcGiOa2OO + Z2GJYlyEYVyIZF+HZFyDYVh5XU16Xk56WlV7W1aCY1+GZ2OHZWOIZ2SGZ2SLa2mLa2mOb22LbWGD + ZVqDX1uEYVyMaGORbWiXdXSbeXiZd3SUcm+Sa16JY1Z6b256b259cm5+c293dHV5d3iAdHh9cHR7 + aW1+a2+Dd3qHen6Jd3qLeHuHcnt+aXNzZGl1Z2t6bnKAdHiDfoKHgoaGg5GHhJKLg5KLg5KMhImN + houLg4iJgoeLf4iMgImMgI6Og5GHh5WIiJaQiZKLhI2Sf4aMeX+Dd3qGeX2EgIeIhIuJiJKHhpCJ + hIaOiYuOg4yOg4yOg46Og46Mg4uIf4eMfoeOgImRiJKUi5WVkJ+Ujp6Oi5SJho6LgomMg4uLhpWE + f46GhI6CgIuCgpCHh5WSjqWWkqiWkaKUjp+VjZ6Si5uOjZWLiZGHfoiEe4aNgJSQg5aMhJSHf46G + go2Hg46GfoOAeX59b22DdXODfYiNh5KLgpuLgpuEfYyDe4uJgpKNhpaLg5KEfYx/d4CCeYOGeoiG + eoiAeoB9d31/dH2Cd39/e4eGgo2Mg42NhI6Lf4iIfYaDe4CCen+CeH6Ad319c4R+dIZ+d4aAeYh+ + eoOEgImIgo2HgIyEgId/e4KGe3+IfoKHg4mJhoyOhJaMgpSNgpCHe4mGgoiHg4mJh5WIhpSJhIiC + fYB9aWt1YmR5ZWiAbW9/bm+Ab3B0am54bnKGd4iVhpeOho2LgomGdW59bWV5Z21/bXN/d4B+dX9/ + am17Z2l6ZWN7Z2R5a2t9b2+Ab3B6aWp9Y26Ga3eMeYKUgImRfoSLeH6Ed3eDdXWIdHeEcHOAbW97 + aGp/aXB/aXB/am2Eb3KHcHqHcHqMdX2QeYCOd3KLc26Db22IdHKLeH6MeX+Re4CVf4SOg4KQhIOS + fYKSfYKQfYOOe4KOdXSMc3KOb2uMbWmIc3ONeHiZfX+ZfX+VeXuUeHqReHeSeXiEamV6YVx9XliE + ZV+Gb3SNd3uQen2Qen2ScmeQb2SUa2OSamKOaV+LZVyGYl2HY16HY16EYVx7XUx1V0Z3VU16WFB+ + X1qCY12Lam6NbXCQdG+JbmmLa2WQcGqHbWKDaV5/XVODYVaGaFuLbV+RdHSUd3eWc2iQbWKLZFWJ + Y1R5am97bXJ9cHJ/c3R+dHh+dHiAcneCc3h/c3mDd32Gf4iGf4iMeYKLeIB/dHN1aml4aWt5am16 + cHSCeHuIfYiMgIyLg5KJgpGLg5SNhpaOiJGMho6NhouMhImJgIiMg4uOhpCOhpCJiZaLi5eUjZSQ + iZCMhImGfoOCeH6HfYOJgoeNhouLhIuLhIuOh4yOh4yMg5COhpKLh5KLh5KMg5CMg5CNhJGOhpKR + iZ2UjJ+VkqGSkJ6SjJeMhpGSiZaUi5eQh46Mg4uJhIiCfYCGhI6NjJaUkqeWlaqVkKGNiJmLhpWN + iJeQjZuOjJqRg5GJe4mLgo6OhpKLg5SGfo6DfYiDfYiIeIKAcHp9anB/bXODe4uMhJSEgpB+e4l7 + dHR/eHiCe4eHgIyEfoeAeoN5c3l/eX9/d359dHt7c319dH57c39/d4OCeomGfo2GgJGLhpaQh5SM + g5CJhIaGgIKCdH+DdYB9d317dXt4c4J6dYR+fYeCgIuMg4uHfoaDe4CAeX6EeYKLf4iMiJSQjJeS + iJmQhpaJho6Hg4yMho6Nh5CQh5GRiJKQg4eIe395bm13a2p9cHSEeHuDc3+Dc394bWt4bWuAbXqS + foyUiJGRho6NfoCCc3V/am+CbXJ/cHV/cHV/amp6ZWV4ZGd9aWuAb3CCcHJ/bXB5Z2p4Y2iAa3CJ + d32NeoCOf4SHeH2AcneAcneHdHqCb3WDbmt+aWd9aGV6ZWN7Z2d+aWmDbnCIc3WMdYKNd4OMc3KG + bWuCbXKGcHWMeYKRfoeRgoeRgoeXgoyWgIuUfoaOeYCOeX6NeH2OeX6Md3uLd3CHc22LdXqNeH2X + e36ZfX+Zf36WfXuXfn2SeXiLbWOCZFt6X1t/ZF+Ca3OLdHuUd3eUd3eOcGeLbWONa2mMamiQbWSL + aF+JZ1yEYleGY1iGY1iDYUx+XEd4U0R5VEV+XUyHZVSOa26VcnSZem2UdWiLa2WMbWeHa2SEaWKG + Y1iEYleLaF2RbmOSdXqUd3uXb2eQaF+LYVCJX097aW9/bXOAcneCc3iCdH2Ac3t/dH2DeICEfYyH + f46JiJKHhpCOf4eDdHt1bm5vaGh4a217b3B9c3eHfYCIgIOJgoSMg42LgoyLgJGMgpKOiJSNh5KM + hoyJg4mJg4yLhI2Nh5CNh5CLh5CNiZKNjJSQjpaOjZeLiZSJhIaEf4CHfouJgI2Hf46Lg5KRiJWN + hJGHgIyMhpGIh5GLiZSMgpSNg5WNhpaQiJmSi56UjJ+RkJqQjpmUiZqOhJWShpeXi52RiJCOho2I + goiCe4KIgJCRiZmQiKeQiKeOg5GHe4mGgoiMiI6Rjp6QjZ2Qg5aIe46EeoyJf5GJfoeEeYJ/d4B/ + d4CIeIeCcoB6bnJ5bXCDeYmGe4x+eX15dHh1b216dHJ/dXuAd31/eHp6c3V4b256cnB6dHJ5c3B7 + c3J6cnB4b3d7c3qCeYCHfoaGgJGLhpaUiZuSiJqQiZCJg4mGeoaCd4J/eYR+eIN6cnt1bXd7cHmD + eICMe4aIeIKDd3p/c3eDdYCMfomOh5aUjJuRi5SLhI2GhI6LiZSOhpKOhpKOg46ViZWXh5GNfYeC + dXuAdHqAeoaEfomCfoR7eH55b2V3bWN+aW6LdXqMgI6QhJKJgoSHf4KHdXSGdHN+cml6bmV9aWd5 + ZWN5ZGd/am2Eb3KHcnSCb3N+a297aGp/a26Cc3qJeoKUfoiLdX+CbmuCbmuEcnWDcHSAdGt9cGh9 + aWl3Y2N3ZFt6aF6EbnOMdXqRfoeOe4SMfn6HeXmGcG6Hcm+Jd32Sf4aUgImRfoeWgpCVgI6WgIiS + fYSOeXuLdXiMd3mOeXuNeXeNeXeQeYCReoKVe3qVe3qVf4KVf4KWgoSOen2ObmOGZVt/YVuDZF6C + a3CMdXqRdXiRdXiMcmeHbWKJb2uJb2uMamWJaGOIZ1eHZVaJZ1yNal+LaFOCX0p+VER6UEB+WEyI + YlWManWXdYCefXSZeG+Vbl6QaVqOamWQa2eMZ1+IY1yMaGeSbm2WeG6Vd22RbmWMaWGIY1iIY1iD + bnWIc3qAeX5/eH1/dH9/dH9/eYKGf4iGgJCEf46Mg4uIf4eEeXiAdXR7b3B9cHKHenuLfn+LfYaL + fYaGgo2JhpGLhI2LhI2MhJWJgpKOh5aOh5aNhI6NhI6LhJCLhJCGgo2EgIyIg5KNiJeOjJqQjZuS + i5qRiZmSiZSLgoyJeYaIeISCeIiDeYmHe4SIfYaDgomIh46NhJGNhJGGhI6HhpCLhI2QiZKSiZaU + i5eSjpqOi5aOhpCOhpCRh5eSiJmRiZmQiJeJhJSCfYyHeoyJfY6GfYeGfYeDe36Hf4KGh42QkZeW + lKaUkaOMh5aDfo2DfYODfYOEd4KAc354dHp9eX+IeoaGeIOAe399eHt/dH+EeYR9eHd4c3J9cHR/ + c3d/c3mAdHqAd3h7cnN5bmp7cG1/dHCAdXKCen2AeXt7b3N6bnJ/d36CeYCIfYuMgI6QhpeWjJ6W + i5SMgImHfoiCeYOEe4OAeH9+dHp3bXN6a3B/cHWGd36IeYCEc3SEc3SCdXeGeXqMhpGRi5aOhpKJ + gI2Jf5GIfpCLf4uQhJCQgouRg4yVgouOe4SIeIKLeoSLhIuMhoyNh42Gf4aEdGl9bWJ5a2l/cm+D + eX+IfoSLgIeJf4aLfoKHen5/c2l3amFzYVtzYVt3ZGh+a2+Ic3iLdXqLd3mEcHOAa26DbnCEcnqL + eICNeoCIdXuCcG9+bWuAbnKIdXmEd3SCdHJ9cm54bWl6aGGAbmeGcm+Ld3SRe4OVf4eVf4eQeoKM + eHiNeXmQeoSRe4aUfYSSe4ONg4mNg4mUgISQfYCNdHOIb26McniUeX+Re4CRe4CQd3qNdHiQdHCO + c2+JdHmSfYKagIKVe32NcF+GaViAaF2AaF2Eb3KLdXiMcmqLcGmHb2mHb2mNbW6Obm+Ob12Ob12N + a1eMalaMa1+NbWGQaVeLZFODWkN7Uzx6VkOCXUmHZWSVc3Kee3eee3eXb2eUa2ORaGiOZWWJaV6I + aF2LaWeQbmuUcm+ScG6Ra2KQamGNYlGOY1ODe4CIgIaGfYeEe4aDeICCd3+Je4eOgIyMgpSGe42C + eYN+dX9+cnOCdXeGe32Jf4CShoyOgoiQgo2Qgo2LgJGLgJGJgpKIgJGIgo2MhpGLiJaLiJaRho6R + ho6Lgo6Lgo6Jf5GJf5GMh5eQi5uUjJ+VjaGWjJ6Vi52WhpCRgIuNeYSEcHt7dHd7dHeCd3+JfoeM + ho6Mho6NhI6NhI6GgoiGgoiLf4iNgouUi5eVjJmQjJWJho6JgIuIf4mIgJGNhpaMhp2LhJuIfo6G + e4yCeYaGfYmCfoSIhIuNh5KRi5aJjJ2RlKWdlaiZkaWMhpGHgIyCfol/e4d9dHt9dHt7d3qDfoKH + fY6IfpCLgomHfoaEgImEgImDg4Z6en2CeHuGe3+De36De35/fYB9en55cnJ+d3d/en6Ig4eGgouD + f4iCd3N5bmp7dHl9dXqAeH+DeoKLf42NgpCXiZKShI2HfoaDeoKGfoOAeX56eHl0cnN+bW6DcnOI + eX6HeH2GeHiEd3eEeG+LfnWJgIiOho2RgomJeoKEe4iEe4iNgIeOgoiOfoiSgoyOgoiIe4KGeX+I + e4KJfomQhJCVh5CShI2MgHqLf3mId3WCcG+Ad3iHfX6Qg4eRhIiRhIuJfYOCdHJ6bWpzX1hyXld4 + amqAc3OIeXuIeXuMeX+HdHp/bm2Ab26Cc3iHeH2Jd3qHdHiDcnOCcHKGcHOMd3mQfYONeoCId3h/ + bm9+amh/a2mIenqNf3+SgoyVhI6UhIyRgomQen+OeX6MfX+MfX+Qen+NeH2IeX6Le4CLe36Gd3mH + c2uAbWWGa3KQdXuNeoCQfYOOeniIdHKHbWWLcGmNdHiXfoKdf4KZe36IdWWHdGSAbmGAbmGIb3CL + cnOMcmqJb2iGbmWGbmWSb2SVcmeSc2GRcl+QcGGRcmKQdWiUeWuUc2eObmKLaFOHZE9/XEl/XEmH + Z16ObmWeeXifenmZdWqUcGWRbmWOa2OIbmOHbWKMammMammQa2mSbmuOZ12MZFuOY1OOY1OMgIyL + f4uJe4eIeoaHeYSHeYSMfomMfomLeomGdYSCc3iDdHmDd3iJfX6Mg4uOho2Qh5GNhI6MgIyMgIyJ + fY6JfY6LfpGGeYyAeoOJg4yHiJGIiZKRiJCNhIyHfoiIf4mEf46GgJCIg5aMh5qOjJ6OjJ6OiZ2N + iJuSh5KQhJCMe4aCcnuCd3WHe3qLgoyMg42ShJCOgIyIfoSLgIeJgoeHf4SIfYaMgImNi5mNi5mO + hIuIfoSDe4CEfYKJfoyOg5GJh5aJh5aIhJCEgIyHfouJgI2Ef46Mh5aNhpmOh5qMi5+QjqOOi6GM + iJ6JfoyJfoyLf4iJfoeCeYCEe4OCfoeCfoeIe46OgpWNgo2RhpGLiZSHhpCGh4uEhomDf4aHg4mD + f4aDf4Z/gISAgoZ7eHR/e3iGgJCLhpWQiJmLg5SCf351c3J5dHV7d3h7dHR6c3OAeoaEfomUhpGR + g46EgIl9eYJ7eIN6d4J6d31zb3V5bmqAdXKJeoKJeoKEen6HfYCLfn+NgIKLg4iNhouQgIaMfYKC + eH6DeX+Cen2EfX+IfoSLgIeHfYOCeH6DcHeGc3mIeIeOfo2OiJGQiZKJhIOMh4aQfYCJd3qJd3qL + eHuQg4eViIyUiZCMgoiDeXp6cHJ6ZFh5Y1eCb3ONen6NfoaMfYSLeICCb3h/b2d/b2eEc2+HdXKJ + dHmHcneJdHKJdHKMd3uLdXqQfYaOe4SQenqHcnKGam2Lb3KIe4KNgIeUg42Ug42Wg4ySf4iNen6O + e3+OfXuQfn2MeX2HdHiLcHmOdH2Md3mGcHOAbmh/bWeDam6NdHiOeYCNeH+NeXOEcGqCZ1+Ha2SQ + c3iWeX6Wen+VeX6Hc2mMeG6Nem2IdWiLdXWGcHCMcmqJb2iJaV6IaF2Nb2OQcmWObmWObmWRb2qR + b2qSdGqXeW+WeGqWeGqZdGGQa1iJaFaEY1GIZVuJZ1yScG6Zd3SeenKZdW2RcmKJaluCaV6GbWKM + Z2mLZWiSbWORa2KLZFWGX1CJXk6LX0+IeYyGd4mCcnuCcnuDb3qDb3qHd4OLeoeJfYOHeoCHfYCH + fYCLgISNg4eJho6Jho6Rg4yOgImGeX+EeH6Ed4SEd4SDeIOAdYCAd32Jf4aJiJKNjJaRho6QhI2M + f4aJfYOIeoaJe4eIf4yLgo6NhpWIgJCQgpCQgpCOhpKQh5SHg4x/e4R/foOHhouQiJeOh5aUhIyL + e4OIeX6QgIaIg4eJhIiMg42Qh5GNiZWNiZWLgIeJf4aIg4eMh4uLh5KIhJCHhJSIhpWEg42CgIuG + gJSIg5aMhpGOiJSSiZaQh5SNh5KNh5KQfpKQfpKLgoyMg42LhomOiY2LiZGIh46Df4iDf4iJg4yN + h5CLhJCMhpGNiZWMiJSLhIuMhoyLgoyLgoyDf4iIhI2IhoeIhoeCgH2Dgn6Ng5SVi5uWkJuRi5aH + h4d4eHh9b3iCdH1/c3d6bnKCdIKHeYeLgJGMgpKLfYt/cn96b3p6b3p7cnV5b3OCc3iGd3uLgIeI + foSGe4KLgIeNhI6NhI6Mh4uNiIyNg4eJf4N/dXl7cnV/c3eDd3qEeXiJfn2GeHWAc3B+cnV/c3eD + c32LeoSSiI6Vi5GUiJGUiJGOhIuHfYOEd3SEd3SShI2XiZKXiZKQgouMfX+AcnR5a2l9b22AdX6G + eoONfYyLeomIdHeCbnCAcGWGdWqMeHWNeXeOen2JdXiHdXSHdXSOeH2OeH2QeoKOeYCOdXmHbnKH + a2uLb2+Ie4KOgoiQg4SOgoOSfYSOeYCQfYCOe3+Lf36MgH+LdXqDbnOEanCDaW+EameGa2iAbWN+ + amF7aGqDb3KNeXuRfX+SeW6NdGmHbmOGbWKObnSXd32Ve3+Zf4OVgICXg4OXfn2UenmReHuMc3eR + cHKNbW6HaGKIaWOMa22Qb3CRb2qRb2qNbmqMbWmOcGeUdWuVdW+VdW+UdG6Wd3CUcm2ScGuMbmGH + aVyRcm6UdHCQdHCMcG2Nal6JZ1uGaF6LbWOLaWeGZGKRbmWRbmWOZU6HXkeEXEeHXkmCcnuAcHp9 + bXd+bniEb3eHcnmHeoCJfYOIfo6MgpKMg5CIf4yMfomNf4uLf4iNgouOgICHeXmEc3KGdHOAbneD + cHl+dHiAd3qCdXmMf4OOiZmNiJeQh46Qh46Le4CHeH2EeHuEeHuDeoKEe4OGeoiHe4mIfYuLf42S + h5KUiJSMiJSHg46JiJKMi5WQjJWMiJGOhIaJf4CJf4aNg4mOiJSOiJSQh5SRiJWSjJeRi5aLgJGL + gJGLhpmNiJuOiZqMh5eCfomAfYh/eYKAeoOJfZCNgJSLg5SOh5eRh5eQhpaOho2LgomIfYuGeoiA + f4mIh5GNh5KRi5aOiZmOiZmLh5KDf4uIg5SLhpaJhpGLh5KQhI2Rho6OhIuQhoyQh5GOhpCNh5CM + ho6Qh5GOhpCDgISHhIiOiJSUjZmRjZaOi5SOiJF+eIB5cHp7c32Cc3qCc3qDb32MeIaJfoyJfoyJ + fYOAdHp6a3B7bXJ9cHR6bnJ/dH2EeYKIgIaHf4SEfX+JgoSSiZaQh5SJhpGJhpGLhomIg4eIe32H + ent+dHV9c3R/dHOIfXuIfXmDeHSDd3iDd3iEb3eLdX2Nf4iVh5CaiZaZiJWQhoyHfYODdXOJe3mS + g5WZiZubiJGUgImLd3mHc3V/dXuAd32GeX+GeX+Hen6EeHuHcm+Eb22HcneMd3uNfYmNfYmSf4OR + foKJen2EdXiJc3qMdX2OenqMeHiLcnOGbW6EcGqGcmuHeH+MfYSQen+Md3uMdXqMdXqQeYCReoKQ + fYOMeX+Qc3WLbnB/ZV53XVZ+ZFqCaF2DaV5/ZVt7Z2eAa2uJdHeQen2RfXWOenONdXCNdXCQc3WS + dXiRe4OWgIiZgoyZgoydf4SXen+Qd3iMc3SRcHeNbXOObWuObWuMcHWQdHmUdWmSdGiSb2eQbWSO + bmWUc2qUcGiRbmWObWqRb22Rb22WdHKQcmiNb2WQbm2Rb26RdXKMcG2NaF2JZFqGY1eMaV2IaVqI + aVqRameVbmqSaVGHXkeGWkSGWkSAc3uCdH17bnl9b3qEb3eJdHuIe3+Mf4OMhoyNh42ShI2OgImL + f4uMgIyMe4uMe4uLfX1/cnKEcHCCbm59am5/bXB7b3OAdHh/c3mJfYOLhJCNh5KNhouMhImIeXuD + dHd9c3R/dXeEeoCEeoCEeYSHe4eJgIiOho2Ui5WSiZSNiZKMiJGShpmViJuUjZmRi5aNiImRjI2R + i5GQiZCUi5eUi5eSi5qSi5qSi5qOh5aLhIuMhoyRjJ2RjJ2OiZmJhJSAeXt9dXh9dXqAeX6He4SJ + foeHf46MhJSOhJWNg5SNhJGMg5CAfYZ9eYJ7en+HhouRh5eUiZqSi5qRiZmMhpGGf4uHhJSJh5aJ + hJSLhpWVh5CUho6RjJCOiY2NhpWQiJeUjJ2RiZqJgpKIgJF/e4SDf4iIf4yVjJmRjZmOi5aMiI5/ + e4J4eHh3d3d/c3SDd3iIdXmQfYCJf4aIfoSGeICAc3t7aW19am56bnJ7b3OCdH+Je4eHf4KEfX+D + fYOMhoyWi5mRhpSLgoyJgIuMho6Jg4yLf4iHe4SAeXt7dHeDdX6LfYaNfoCLe36LfoKMf4OHc3WH + c3WGeICNf4iWiJGZi5SShoeIe32DeHeLf36RhJaWiZueiJKVf4mGd3mGd3l/eH1/eH2HeHqGd3mE + c3KDcnCCbW2Dbm6Ic3qOeYCNgpCOg5GUfoaOeYCLdX2GcHiIbneMcnqHdHiHdHiCbnCEcHN+cG5+ + cG6Gd3mJen2Oen2IdHeIcGuJcm2NeoCQfYOOfoiLeoSSdXiJbW9+ZVh1XVB7YleCaF2EaWWDaGSC + aGSEameIcneOeH2Sf4ORfoKUeHqRdXiOc3OOc3ONeHWQeniaf4abgIedgIaVeX6Qc3WIa26JbW+J + bW+NbmuOb22Oc3OWenqVeHiSdXWWb2uUbWmQbWSSb2eRbmKQbWGQal+Ra2GMbmKOcGSMb16Mb16Q + bW+UcHOVdGuScmmQa12NaVuHYVGHYVGGZ1eGZ1eOamiQa2mSaFqMYlSMX0yNYU2Ee4OAeH99dXp+ + d3uDd32GeX+LfYaOgImMh5aLhpWShI2QgouNg4mMgoiHgImIgouHfYB7cnV+cnV4a297amt6aWp5 + a2l7bmt7bXKEdXqHeYKOgImOh4yNhouCe3d9d3J7eXh+e3qGfoCIgIOJfoeMgImQiZKUjZaSjJeU + jZmOi5SLh5CWhpWXh5aViZWXjJeVjJaXjpmSkJ+OjJuRiJWSiZaOiZmRjJuXi52Uh5mNhI6SiZSZ + kaKZkaKVjJaJgIt/fXt6eHd+cniEeH6CeHuAd3p9d32DfYOHfY6OhJaRh5mQhpeEfoR7dXt9eX+J + hoyOhpCQh5GRiZqOh5eLgJKIfpCIg5KLhpWJhJWQi5uUjp6VkJ+RlKKMjp2OiJSNh5KUjJuQiJeH + fYOAd314bnJ+dHiAd4eOhJWMiZeNi5mLh42AfYN4eHh5eXmEfX+GfoCLgIKMgoOIfYaLf4iIeIKC + cnt6b257cG95bXCCdXmIeoOOgImNfoOIeX6IeYuXiJqbkp+SiZaLfoKGeX2IgouMho6Hho2Hho2L + fYaGeICIeYCMfYSShoyRhIuUh42ShoyLfX1/cnKCdXmMf4OWiJSZi5aUh4uNgISIeoOMfoeOhJWW + jJ2dh46Re4OCdXd+cnN9c3eAd3qGeHiGeHiAcnR/cHN/cHWDdHmMeIaOeoiNe46LeYyLeH6Gc3mE + b2+CbW2Eb22Hcm+IeX6IeX6CdHR/cnJ9cnB+c3KLdX2LdX2Je3eCdG+AbmeGc2uGd36Le4OSg4uS + g4uWgH6NeHWHbV+AZ1qEZWKIaWWHa2eHa2eHbWiHbWiJcHKNdHWMeX2QfYCXfoKVe3+Sd3OMcG2J + cm2NdXCXe4CZfYKZf36SeXiOc2+IbWmDZ2uDZ2uEbWeIcGqMb2+Ud3eUeXSRd3KZc2uSbWWLamKM + a2ORbV6OalyMaFeJZVWGaFyJa1+LbWGLbWGNa2mQbmuUcGiWc2qXcmiOaV+NY1eIXlOHXVGIXlOL + ZVyLZVySa1qRaliUalWUalWHfoaEe4ODeX+DeX+DeICEeYKHfoiJgIuLhpmMh5qNhJGJgI2HgImE + foeCfoeEgImCen97dHl/c3l7b3V6bWp7bmt6bW1+cHCAa3CGcHWMeX+Wg4mUiJSNgo2Ae32CfX6A + f4SDgoeJhIiJhIiLg4aOh4mQjJeUkJuUjJuSi5qNh5CNh5CRiJWSiZaVjpeZkpuWlKaUkaOSkKKR + jqGVi5uVi5uVjpqVjpqWi5mQhJKJf5CUiZqXkJ+VjZ2WiJGNf4h9ent7eXp/dXmDeX1/enl9eHd5 + b3N9c3eDeIOOg46QhpqQhpqEgIyAfYiAeoCHgIeIgoiNh42MhpGIgo2He4eJfomJg46MhpGGgo2N + iZWUjp6WkaGSkp+MjJmGf4uHgIyNh42IgoiAd3h9c3R6a26AcnR+d3uIgIaNh5KSjJeMh4uAe39+ + d3mAeXuHfYOJf4aIhoeLiImJgIiJgIiJeYOGdX99cmt7cGp6bW2Ed3eEeoCIfoSJen+Jen+LeomX + h5aXkKGRiZqJgH99dHOCd4KHe4eHfY2Jf5CIeYCHeH+HcnmNeH+Igo2LhJCRiJCQh46Nf3+Ed3eG + c3eQfYCXiZWajJeUhpGNf4uJe4eLfYiOho2Ui5KVh4SMfnuAc3B9b22DdHeGd3mNen6LeHuEcniD + cHeDcHeHdHqJeYaIeISJeoKDdHuDb29+amp9aGp9aGqGbmmNdXCMfX+NfoCLenOCcmp+a2+Cb3OL + dX2Md36NeXmHc3OAbmiCb2mEb3mIc32OeISVfouagISXfoKRd2uJb2SGa2eIbmmDb2WCbmSCamKC + amKAaGeHbm2Hc3WMeHqQe3WSfniQd2mGbV+CaWiGbWuOcnmQc3qSeXiQd3WRcm+MbWp/ZGF9Yl6E + Y16HZWGGaWmMb2+Ld22MeG6ScmeNbWKJaV2Lal6Na1yMaluJaFaGZFOJZVeOalyQamGOaV+NaF2R + a2GRaWOVbWeQal+Qal+OZFSNY1OIXk6GXEyIZVuJZ1yNZVyOZ12OaVWUblqGeoaEeYSLd4KIdH+H + eH2Jen+LgoyNhI6Qh5SQh5SQgpCJe4mEeYeGeoiAeIKGfYeEeoCCeH5/dXt6cHd5b3N9c3d+cnV+ + cnWDdHmGd3uJeoKQgIiUg5CNfYmHeoCMf4aMhJWNhpaJhpGIhJCLhomQi46SiZaXjpuRiZqQiJmN + h5KMhpGQh5SUi5eUkZ+VkqGXkaiRi6KOjJ6LiJqWjJ2Vi5uWjZqUi5eQhJKLf42JgpGUjJuXjZ6W + jJ2Rh42Jf4aCfoeCfoeEgoaIhomDgIJ+e31+cHB9b29/d36LgomMhpGLhJCHgImDfYaIe4KNgIeM + goiNg4mEfoeAeoOCe4KGf4aMgIyMgIyIf4eQh46UlKGXl6WWkpuOi5SIfoSIfoSMhISGfn59dHB/ + d3OAdHiGeX2GfoCIgIOIgouSjJWSiImLgIKDe3uDe3uHfoaOho2JiJCJiJCNhJGLgo6JeYOGdX9/ + dHN6b253a2V+c219enuAfn+Mf4OHen6He4eRhpGWjp6RiZmJfX6EeHmAdHqCdXuHd4aJeYiDeX+A + d317cG+AdXSHe4SMgImOiJGOiJGShomEeHuLe4CSg4iWi5mViZeMf5GEeImDdX6Je4SOh4mRiYya + iISQfnqMc3eIb3OGdHWNe32Rg4OOgICJdHmCbXKEa22NdHWMenmLeXiMeHqEcHOAZV57YVp5Xlt+ + Y1+Da2eOd3KUgISSf4ORfXqLd3SGbXCDam6DbnWLdX2OeH2Jc3iDb2mAbWeAa3WEb3mMdYSSe4uV + f4SWgIaOen2NeXuLeHKIdW+GdGd/bmF+ZVt/Z1yDYl2EY16GamqNcnKOeXeRe3mSeW6NdGmIbWiH + a2eHbXOMcniSd3eRdXWScG6LaWd/YVt/YVt+ZFqAZ1yGZGKObWqLdGWLdGWRb1+Qbl6NaF2SbWKO + bmKNbWGRb1uLaVWOZ2GVbWeQbWGSb2ONaF6OaV+LamKQb2eOaV6UbmOValqQZVWHYk5/W0eJXlaM + YViJZFuMZ12RZ1uWa1+Gd36DdHuCcnt/b3l+dX1/d36GfYeMg42OhpKMg5COfoiHd4CAc3t+cHl9 + b3iAc3uGd36EdX2AdHqAdHqAdYCEeYSGeX+HeoCIeIKIeIKMeYKLeICHeoCGeX+Cd3+IfYaJf5GN + g5WLhJCGf4uEfomLhJCMg5CRiJWOh5eMhJWLgomLgomVh5KZi5aVjZ2VjZ2Ui5eQh5SRhpGQhJCO + hpCMg42NgpCJfoyMgoiLgIeLiJaQjZuUiZqSiJmOgImIeoOIfYuLf42MhpGQiZWJho6AfYZ9cnCA + dXR+e3+EgoaMg42LgoyIf4eEe4OGfYeIf4mMg42Mg42HfoiGfYeHfoaJgIiMgoiJf4aGgJCOiZmV + laKamqeUkJuNiZWLe4OJeoKHf4KCen2CeHmEenuHfoaHfoaIgoiLhIuMg42VjJaXjpmVjJaLiIyJ + h4uJiJCMi5KWiJaXiZeUiJaQhJKLe4CEdXp6bm96bm99b2qCdG+Ie3+Mf4OGfoOGfoOHfoaOho2S + jJWRi5SMgoaGe3+IdXuDcHd+cnh/c3l+b3R+b3R+c2+DeHSHf4KNhoiSh5CSh5CRg4yMfoeUf4ua + hpGVjpeSjJWJe4SCdH2AcneHeH2Jf4aRh42Uh4uQg4eNeH+GcHiDdHeMfX+NhouOh4yNe32CcHJ+ + bmOHd2uLfnWNgHiLfnWAdGt9Y1x5X1h1XFF4XlSDb22RfXqWf4eUfYSRe4OIc3qHanKAZGt/amqG + cHCLeHuJd3qEb22CbWp+aWt/am2HbnKQd3qQeYCSe4ORe4aQeoSQe3uMeHiNdGeHbmGIZVuGY1iI + aF+IaF+Ha2uMcHCIdHeMeHqXfoKReHuOc26IbWiDam6Ib3OScnOUc3SWdGSLaVqAXlaAXlZ6YVZ6 + YVZ+Y1+EaWWHbWKLcGWSa1yRaluRbWqWcm+Wd3CXeHKUdGSQcGGQaWWRameRbmWQbWSNZV+NZV+H + ZFyNamKIZVuMaV6LaFCLaFCEXk2AW0mDWkmEW0qCWEqCWEqMX1eSZV2AbnJ+a297bXJ7bXJ7cHuA + dYCHeYSNf4uOg5GJfoyHeYKEd39/dHB6b2t7b3B/c3SGd3mGd3mEeHuGeX2He4eIfYiJgIiLgomO + goiHeoCHdHiCb3OCcHKAb3B4bnJ/dXmEe4iIf4yNf4iIeoOGd3uHeH2IfYuLf42IgouHgImLg4iL + g4iSiI6Vi5GVjJaUi5WSjJKNh42Lh42JhoyJgoeIgIaJe4SMfoeNhIyRiJCRjJ+Qi56OhJaMgpSG + d36Gd36IfoSIfoSMhpGQiZWQh5SNhJGCd3+EeYKCe4SHgImLf4uEeYSCdXmIe3+LgoyQh5GQiZWM + hpGDfYOGf4aHg4yJho6NgouIfYaJg46VjpqalJ+fmaWVjpeLhI2Ef4CEf4CHgoaCfYCGfoCHf4KG + goiJhoyLhI2Nh5CLg5aRiZ2UkaOSkKKOjJuMiZmNiZWOi5aUhJaVhpeUiJGWi5SXhoSJeHd5bW59 + cHJ/c3SGeXqHfYCLgISHf4SIgIaGe3+Jf4OVgouWg4yWg4ySf4iLfn+GeXp+c299cm57cnN9c3R+ + eX2Ef4OLhomRjJCUiJGRho6QgouOgImRg4yXiZKVkJSUjpKNf3qGeHN+bWt/bm2HeH+Sg4uRho6R + ho6QgIiIeYCEeH6NgIeQhJCSh5KRfXeJdW+CcG+LeXiQhomQhomOg3+EeXV7a2F1ZVt0YlV3ZFeC + c3WOf4KXgomVf4eUfoCOeXuNdHWGbW57aGV9aWd+b3SEdXqHcnSHcnSGbmmDa2eDaGSJbmqLcHmQ + dX6QdX6SeICSfXqRe3mScmWLal6IZVqJZ1uJb2SHbWKMcm6OdHCIc3WOeXuWeYCUd36QdW6IbmeH + Z2iHZ2iNa2mQbmuUcGiMaWGGX1CCXE15WlF1Vk57XFSEZFyGamWLb2qUb2GUb2GUcm+aeHWbe3md + fXqXeGiRcmKRbV6RbV6Sb2SQbWKJaFiEY1SDX02HY1CEXVSEXVSEXEeGXUiDW0aCWkV/V0WAWEaA + VkaDWEiGXEmMYk9/cnJ+cHB9aG9+aXCCa3iGb3uJc3+OeISNfpCOf5GMfYSGd35/cnJ7bm56cHR+ + dHiGeXqHenuIeX6IeX6Lf4iOg4yIhI2IhI2Ng4eGe3+AdGh7b2N9bWV6amN3aWeDdXOEeoCHfYOI + foKHfYCHdHiIdXmEeoCIfoSJgIiHfoaIgoiMhoyRiJCUi5KXjJeWi5aQi46NiIyJhoyJhoyJf4aL + gIeIf4mMg42Rh5uWjKGVkKGRjJ2LhIuIgoiDd3qAdHiCfX6GgIKLhI2QiZKRiJKRiJKJg4mGf4aI + f4mNhI6Lg4iEfYKCeH6LgIeQiZWVjpqUjZaNh5CEgImEgImHhouMi5CMgoiJf4aMhJSWjp6alaWa + laWRkZSGhoiIhICMiISMhIeJgoSIg4SJhIaMh4uOiY2OiI6Nh42JgpWQiJuUjaWSjKOQi5uMh5eM + iI6MiI6NgpCSh5WVjZ2XkJ+WiIiIenp7cG99cnB/d36If4eIf4eLgomLfoSHeoCDd3iEeHmRe4OV + f4eai5KZiZGShoeMf4CCc3V+b3J/c3SCdXd+eoOJho6Nh5CUjZaViJqUh5mQhJCNgo2ShI2ajJWX + jpmVjJaWhn6Me3R9amN/bWWLeH6Sf4aRiJKSiZSUh42Qg4mIe3+ShomSh5CSh5CUenuNdHWHc3CN + eXeSiI6WjJKRh4iLgIKId3N+bWl6aF5+a2KDd32Mf4aXgomVf4eXfYOUeX+OenqMeHiAbmh7aWN+ + aW6HcneJdHSIc3OJbW2GaWmCZ2eDaGiGbW6JcHKJcG+Mc3KReXOSenSUdGSLa1yHZ16IaF+Lc26N + dXCOd3KNdXCNcm2UeHOVeXmWenqUeWuNc2WJaGOEY16HaGSHaGSNal+Nal+NY1eHXVF9Vk5+V0+D + WFCHXFSHaGWNbmuVc26XdXCXd3qben6de3ObenKdeGSbd2ORbmKQbWGObVuObVuLaFB+XEV+VUCA + V0OCVkCEWEODWD6CVz2GVz6HWD+DWkOEW0SCWEqDWkyCWkCGXUSHeH+Gd36EcHCDb2+GcHWIc3iJ + d3+Oe4SNf42QgpCSg4uJeoKDdHeGd3mDeX2Ge3+Een6DeX2Jen+Jen+LfYuRg5GJhpGMiJSQhomI + foJ/c2d5bWF1aml3a2p/a26Hc3WHeYKIeoOEe4aCeYOEeHuAdHiEd3+IeoOGf4iHgImMg42OhpCS + i5CVjZKZjZaZjZaRiJCRiJCNh5KJg46LfoSMf4aLhI2Ri5SVjJmVjJmViZWUiJSNg4SLgIKGe3+A + d3p+eYiDfo2Ig5KLhpWRiJKQh5GOh4yNhouRiJWOhpKLh5CJho6IhpSOjJqSkZuVlJ6VkZ2VkZ2J + hpGJhpGLiZGHho2If4mJgIuMhJWXkKGelKaakKKSiZSOhpCOho2SiZGViZKUiJGMh4uNiIyNiIyO + iY2NiZWMiJSOh5aNhpWRh5uQhpqNg5SOhJWIhIuJhoyLgo6OhpKQkJ6WlqWSkpWEhIeJeHmMenuL + g4aUjI6UiZCOhIuNen6Gc3eGc3eGc3eLfYaQgouZjJ6bjqGWi5SQhI2JfYODd32EcHOJdXiNhIyU + i5KWjp6XkJ+XjZ6SiJmNgo2MgIyNf4iUho6UjZmWkJuZjI2Mf4CAb25/bm2IeoiQgpCQh5GOhpCW + g4mVgoiJf4OSiIyWi5SViZKUgoOJeHmHdXeNe32Uh42bjpWeiJCXgomUen6Mc3eAbW+Ld3mNf4uU + hpGWgoKUf3+QfYCQfYCRg36Rg36JdXOAbWqEaGiGaWmDb3KIdHeMcm6Ga2iCZ2d/ZGSDaGOIbWiG + bmmIcGuNcHCUd3eUeHCMcGmIaF+NbWSRdHuUd36Rd3ONc2+McGmOc2uUd3eWeXmXeHSVdXKHa2eA + ZWGEZV+GZ2GIaF2Ma2GNaVaHY1CDW0aAWESCXk6DX0+JZ1yMaV6RcmuUdG6RdXKVeXWeeHCXcmqW + cGWadGmVb2WUbmSSbl+Qa12MaVGAXkeAVUGAVUGEVUCGVkGHWD+IWkCNXUiRYUyUY06VZE+OY0qH + XESIWD2JWj6MgoiMgoiMf4OHen6HdH2IdX6JeoKNfoaLfYuMfoyOgImLfYaJfYOIe4KJd32LeH6H + en6GeX2Hen6Ie3+JeoKNfoaRfoeVgouOhIuLgIeDdXB+cGt7bXJ/cHWDdHeIeXuIe4KGeX+GdX+E + dH6EeHt/c3eDdHuHeH+DfYiHgIyLhI2OiJGWi5SWi5SXjpuVjJmRhpGQhJCLgomLgomNgouOg4yR + iJKUi5WSjpWRjZSSiZGSiZGUjZSQiZCMh4iDfn9+eoaCfomHg4yIhI2LgoyMg42Ug42Ug42Sh5WS + h5WNhpWOh5aQiZWSjJeSkJ6WlKKUkJuSjpqNhJGOhpKJhpF+eoaAd32EeoCHgpKUjp+akqOWjp+X + iZWXiZWRiZmRiZmVh5KWiJSSh5KRhpGMiJGQjJWSi5qSi5qQh5SOhpKNhouLg4iHfYOEeoCAe4uE + f46LhJCQiZWOiZmZlKOZlZuOi5GShomRhIiUiJGZjZaUh4uQg4eQe3mEcG6CbmuGcm+Gf4aNh42Z + jp+XjZ6ViZeRhpSLg4iGfoOMeX2QfYCVjJmVjJmWjJ2XjZ6SjJeNh5KHf4KEfX+Jen+QgIaOiJGV + jpeVjZKNhouGeX+AdHqHfpWOhp2Qh46NhIyQgIOQgIONg4eSiIyZiJWaiZaUgIeIdXuHcneLdXqX + g46diJSih5Kdgo2OeH2Jc3iEd3eLfX2Sf4iVgouXgoKVf3+Re4OSfYSRhoSRhoSRgHmHd2+Ha2eC + Z2KEa2qIb26McHOGam2EaWKCZ1+Eal2IbmGIbWiIbWiLc2qReXCRd3KOdG+Sb2eXdGuXdYCaeIOV + eX6RdXqLb2iIbWWQcG6ZeXeXe3uWenqMcGuGamWEY16GZF+IaFyLal6JaluLa1yGZU+DY02EZFqH + Z1yIaVqJaluQbWGSb2OOb2uRcm6ab16UaViSaFeRZ1aSa16Wb2KObmORcGWRblaHZE2GXkN/WD2H + WD2JWz+OX0SNXkOOXkmRYUyaZUqeaU6ZaFCRYUmHWDqLXD2Nh5CMho6Ngo2He4eHeYKHeYKEeHuH + en6Ie3+Mf4OSgoyMe4aEeYSDeIOJdHeLdXiId3iJeHmEeHuHen6GeXqHenuLe4OSg4uMhpGJg46H + f4KDe36HeH+IeYCGeoOHe4SJf4OEen6IeX6HeH2EeHmAdHWCdHSDdXWAd32EeoCEf4OMh4uVjJSX + jpaQjJWMiJGOho2JgIiJgIiMg4uQiZKQiZKSiZaVjJmRjZaSjpeRjZaUkJmWkaKUjp+SjJWNh5CD + gISIhomHhIiDgISGfoCGfoCMfoeUho6Qi5qSjZ2Li5mIiJaJiJCNjJSQjZuRjp2MiZeLiJaMgImJ + foeCfYB6dXl/dHOHe3qHg46NiZWRjZmOi5aSiJqUiZuRi5aQiZWQh5GSiZSQiZCQiZCQiZKRi5SV + iZWXjJeUjZaUjZaLiIyJh4uGgH+Ae3qEeYKGeoOMg5CLgo6Ri5aZkp6XlJ+SjpqRiJKSiZSXjJWa + jpeUjI6Oh4mOeXeJdHKHdG6Jd3CCfoeNiZKXkqaUjqKQh5GOhpCOg4yJfoeQgouShI2VjZ6Si5uM + iZeLiJaQh5SMg5CHfYCEen6Een6IfoKShJCZi5aZi5SXiZKNgouMgImLhpaNiJmSi5CQiI2SfYSQ + eoKLg4aOh4mVh5WZi5mWgIOLdXiEcGqJdW+MfYSXiJCZho6Wg4ySe4OMdX2Jen+NfoOUfoaWgIib + f4Sbf4SUfoaUfoaRhIiRhIiWgoKLd3eLcGWCaF2CaWqIb3CLcnOJcHKLbWOHaV+Eal+IbmOOb22O + b22QdG+Ncm2Od3CSenSSeHCVenOWeYCVeH+UeHqNcnSIZ2KIZ2KHamqRdHSUe3eReXSRcGiJaWF/ + X1d+XlaCYlaEZFiIa1uIa1uJaFiJaFiMbmKNb2ONcF+JbVyOaFaMZVSIamGLbWORbliNalWLZU+I + Y02OY1ORZVWOaV6SbWKVcF2JZVOHYT+DXTyHXkOJYUWUZEqSY0mVZE2ZaFCaa0yfcFCXaE6RYkiI + XUCHXD+SiJmOhJWOhpKNhJGMgIyLf4uIgIOEfX+Ie3+JfYCLeoeLeoeMeX+MeX+MeHiLd3eHeXeE + d3SDdXWEd3eIdXmHdHiGf4iIgouJgpKJgpKNf4iOgImDf4aIhIuMhpGJg46OgoaLfoKIe3+Hen6G + dHOEc3KDdXOGeHWHdHiMeX2NgIKXi4yWjJKWjJKRh42QhoyGfYSJgIiEfomHgIyJf5CLgJGOhpKM + g5CLgo6NhJGWjJ2akKGUkaGQjZ2SjZ2OiZmLh42Hg4mGg4d/fYCCeHuGe3+Qf46Xh5aSiJmSiJmR + iJCLgomJhoyQjJKVjJaRiJKLhIuHgIeMf4aIe4J5dHV4c3SCd3WGenmHg4mNiZCSjJWQiZKRh5eR + h5eOhpCQh5GSiZGVjJSQiZCQiZCVi5GWjJKXjJqWi5mSkJ6WlKKWkJmRi5SIiY2AgoaGeX2Ie3+C + en2AeXuEfomMhpGViZKWi5SSh5CViZKWjpSakpedjZWVho2SfYKRe4CSf4aSf4aQh5SVjJmXkKGR + iZqJgIiLgomJfoeJfoeOg5GNgpCViZeRhpSMhoyHgIeLgIeMgoiHf4KGfoCEf4CGgIKOfouWhpKR + hpSSh5WNhI6Mg42RiJWVjJmXjZSRh42QeX6Nd3uJe4mQgpCUg5KXh5aRgoSIeXuGbmmEbWiIdXmS + f4OShomRhIiWf4eWf4eUhIySg4uVgoaWg4eVf4KVf4KSf4OSf4OQgIaVhouVf4SSfYKNc2uDaWKD + aW+IbnSLcnCMc3KLcGWGa2GEaWWLb2uMcG2Lb2uLaWeObWqNc2+VeneWfnmagn2dgoiZfoSSdXWG + aWmAYVZ5Wk93XViGa2eNbmqUdHCWc2qOa2OJY1SAW0x/Wk2CXE+LZFONZ1WNal6Nal6ObWqXdXOS + eGmJb2GJZ02EYkiEY1SIZ1eOaleOaleNaFGNaFGQZVOSaFWOaFaOaFaSa1qSa1qOZESOZESRZFCU + Z1OZblaUaVGVaVCUaE+Xa1OablWWak2SZ0mMYkGMYkGVi52Vi52UiZuUiZuMh5eJhJWIhJCEgIyI + foSJf4aMe4iLeoeLfoSNgIeJfn2IfXuJen2Jen2LeXiMenmNeH2JdHmLe4OLe4OJgIuLgoyMg4uR + iJCOiJGOiJGVjJaRiJKRgoSNfoCHf4SGfoOLeH6LeH6GeX2JfYCHfYOJf4aQgouVh5CVh5CVh5CQ + gouLfYaDeoKDeoKCdYeDd4iIeISIeISHen6JfYCOgoiRhIuUi5eZkJ2Zkp6Zkp6akZmVjJSQh5SN + hJGMg4uJgIiAdX6DeICLfpGQg5aRhpSMgI6MgoiLgIeLh42MiI6Oho2Mg4uHfoiGfYeIgIZ/eH2D + d3p/c3eIe3+LfoKDgISJh4uOi5SOi5SSiJmRh5eSjJeRi5aSjJeWkJuUjZSSjJKZjZmZjZmWjp6U + jJuRjp2WlKKWlZ2SkZmOjZeIh5GHfYCCeHt+dXJ+dXKEen6LgISRhIiViIyUiZCUiZCUjZaWkJmX + jJWUiJGWiJGUho6Qh46Qh46SjJeXkZ2ZjZaUiJGNg4eMgoaMf4ONgISNhIyMg4uUho6Rg4yQg4SL + fn+Ng4SNg4SLg4iLg4iJgoSGfoCJeoyQgJKOg4yQhI2OhIuQhoyQh5SRiJWUjpKRjJCRfoSLeH6I + eISOfouSgo6Xh5SVgoiOe4KJdXWHc3OId3WQfn2Vg4SWhIaSg4iUhImXhI2Zho6Zg4aahIeVgIOU + f4KWfYCWfYCUfoaXgombf4SVeX6Oc2uDaGGDamuIb3CLcnCMc3KDcGOAbmGAbWeGcmuLb2qJbmmM + a2GIaF2IbmmQdXCZe36bfoCbf4SXe4CSd2+EaWKDYlN6Wkp0V0x7XlOHZFyRbmWQb2SJaV6IZFSA + XU1/W0WAXEaNY1eQZVqIZVqIZVqNa2eUcm2ZenCQcmiNakeAXjyCXUmLZVGRbV6Ub2GWbVeWbVeX + a1uWalqUaleSaVaSbVaUbleUak6Uak6Wa1aWa1abdWGVb1uVa1GWbVOeblGiclWdck+Wa0mRY0OQ + YkGVi5uWjJ2WjKGWjKGQi5qMh5aOh5aMhJSOgoOOgoONgouLf4iLe42MfY6LgIeJf4aMf4OOgoaM + fYSNfoaOe4KIdXuIdXuLeH6JgIuNhI6QiZKRi5SRiJWSiZaWi5mUiJaMgImHe4SGgISHgoaNgIeM + f4aJf4aLgIeHe4mJfoyOgI6Nf42Of4eNfoaHen6EeHt+dHV9c3SDdHmDdHmIc3qIc3qAeX6Hf4SQ + hoyUiZCZkJqdlJ6dlp+alJ2WkJmOiJGQh46NhIyLhIuHgId/d36CeYCLhomMh4uQhomJf4OMhISN + hoaMjIyIiIiJf4aLgIeGfYSEe4OHf399dXV7dHeCen2JfoeNgouHgIeIgoiQiZWQiZWQjJeNiZWQ + i5qRjJuUjp6SjZ2Zkp6XkZ2elKadkqWQiJeNhpWNiJeQi5qSkZuQjpmQjJeIhJCJg4mDfYOCenqA + eXmDeX2HfYCMgoONg4SMhImQiI2UjJuZkaGWkJmXkZqdjJudjJuVjpeSjJWQjJWUkJmajJWWiJGR + h4uNg4eJf4OJf4OEgIeJhoyViZKUiJGViImOgoORh42SiI6RhpGUiJSSgoyLeoSHeH2Jen+LfoSN + gIeMgImLf4iLgoyMg42Oho2SiZGRgoeMfYKEdXiJen2Mf4aShoyWg4mWg4mUfoaQeoKNeoCOe4KS + f4aXhIuXh5GXh5Gah5CXhI2ag4iag4iZhIeZhIebgoOXfn+Wf4SZgoeagISWfYCVd22GaF6CaGGJ + b2iNdW2MdGuHbmGCaVyCamKJcmmMcmeHbWKLaVeIZ1WGa2eLcGuUeHSXe3iVeneQdXKSdGeJa16H + Y1B+W0h0VkV1V0aAX1CGZFWHZ16DY1uCY1F+X06CX0qLaFOQamOUbmeRb1+ObV2LbliQc12Vem+R + d2uWb0yEXjyEXEWNZE2RbmWWc2qZdGGadWKbdGKWb12ZbVyVaViRal2UbV+WcFyXcl2XcluXcluh + dWSid2WbdWGadF+idVyjd12hclGeb0+XaEWUZEGRiJKVjJaVjpqVjpqSjpqSjpqWjZqRiJWNhouM + hImJe4mIeoiHe4SIfYaMgoaMgoaNhoiNhoiOhIuLgIeJf4CCeHmCc3iDdHmHeYKQgouQh5GOhpCW + iJSWiJSajJqVh5WOgoiIe4KIeoOLfYaIf4yMg5CHfoiGfYeEe4iEe4iIfoKJf4OJe3uIenqEeHt+ + cnV+bWt+bWt9am6AbnKDbnWHcnmAeoaIgo2Og4yUiJGXjJebkJuZkp6SjJeLiIyLiIyShoyRhIuM + hoyMhoyHgoOGgIKJhIiQi46QiIuJgoSRh4uOhIiMiYuMiYuUh42OgoiMh4uLhomLgISGe39+e3+E + goaOiJGMho6OgImLfYaLhI2Nh5CQiZWOiJSQhpaUiZqXkJ+Wjp6bkaKdkqOekquXjKWOh4yGfoOG + foOIgIaLiZSJiJKMhpGNh5KOiI6QiZCJhoyJhoyNhI6LgoyOgoiMf4aIgoiLhIuSh5KZjZmZkJed + lJuikaGhkJ+ajpeWi5SSjJWSjJWbjZabjZaWjJKUiZCJgoeGfoODf4iMiJGXjJeXjJeUiJGUiJGX + iZKZi5SajJWXiZKVgoiRfoSIenqGeHiGdX+Hd4CHeYKJe4SMg4uLgomMgImRho6VgouSf4iNeH2L + dXqGeIONf4uVgoiWg4mZg4uZg4uRgoeOf4SOf4eSg4uejZqbi5eZjJCUh4uSg4aVhoiai5KdjZWa + jIyUhoaXgoSXgoSXgIaWf4SWe26Jb2KHalqLbl2MdGuNdW2OcmGHalqGa2GLcGWJb2GIbl+HZ1uH + Z1uJbmqNcm6MdG6NdW+SdGqMbmSLa1yIaVqQZ1SJYU6AX0x7W0d+W02AXU+DXlSAXFF+X1CAYlOH + ZFiQbWGadHefeXuZem6UdWmQd2iSeWqSeW6Ve3CadF2MZ1CJY1GOaFaSc22VdW+ad2qbeGudeWGZ + dV2ec2KZbl2NaVuOalyObVuScF6XcGGddWWfeGWje2mheWeheWeme2WnfWemeV2jd1ubcE6UaUeR + iJKUi5WVjJmUi5eVi5uZjp+XjZ6UiZqOhpCJgIuEd3+CdH2Ee4OHfoaOfoiRgIuSg4uUhIyOh4yL + g4iDe3t/eHh+c3KAdXSDdX6Nf4iNhouNhouWg4yWg4yXh5SXh5SNgo2DeIOGeX+LfoSHeYeMfoyE + e4aAeIKCeYaCeYaEeoCDeX+EdXiCc3WDdHl/cHV9b217bmt6b25+c3KEb3SIc3iJe4mQgpCSh5CU + iJGVjZ6Si5uOho2Mg4uOhIiNg4eWgoSZhIeShoyRhIuMgoiNg4mNh42SjJKUi5KRiJCUjI6RiYyR + jZaWkpuajpqXjJeSjpeNiZKVi5GOhIuGgouMiJGQjZuOjJqNf4iLfYaEgoaGg4eJhIiIg4eNhI6R + iJKSkZaSkZaVlp2Wl56elqaVjZ2RiYyHf4KGd3mJen2Nh42Nh42LhI2OiJGRi5aWkJuVjpqSjJeO + iJSOiJSQhomOhIiMh4uNiIySi5CWjpSZkJ2flqOilqKflJ+fkpmajZSUiZCUiZCajJWbjZaajpeW + i5SOhIiJf4OJf4aRh42XjpmakZuVjpeRi5SVjJaWjZeakJaZjpWShomQg4eGd3mGd3mHdH2Gc3uH + eYKJe4SGfoCHf4KLgISMgoaRhIiQg4eUfoOMd3uGd3uLe4CRgoSRgoSZhoybiI6Uh4uQg4eQfYOU + gIeXh5GdjJadkJGShoeUenuVe32ajJWhkpuikpeai5CahIyWgIiXe4CXe4CZenCUdWuJb2SMcmeM + cGmOc2uQcmiMbmSJbmmJbmmJb2GIbl+Ga2GEal+MbWmQcG2SdGeUdWiScF6MaliJaFaHZVSMaFeN + aViJaV2GZVqIZFZ/XE6DWE2DWE2DXU6DXU6IYlWSa16ed3eheXmdfnSXeW+SeHOUeXSUeHOXe3eX + c1+NaVaQbl6WdGSdeW6deW6ZeWedfWqhe2ihe2ihdV2ec1uVb1uRa1eOaleQa1iUaVuab2GbdWuf + eW+leG+meXClfW2heWmidF2jdV6edFqacFaVh5CWiJGSiJmSiJmUiZqZjp+XjpuVjJmUg5COfouG + d3uEdXqJeoKLe4ORgI2Ug5CWgo2Wgo2QgIiNfoaHeHqDdHeAc3OAc3OAd32MgoiOhIiOhIiQg4eQ + g4eNhIyOho2Oe4SIdX6GdHWGdHV/dXt+dHqAcnmCc3qHeYSEd4KHdH2LeICLdX2HcnmHdHqCb3WC + bnCAbW9/dHOAdXSEdXiHeHqIfYiNgo2Qh5SSiZaUiJaOg5GMh4uNiIyRiY6QiI2SiI6Vi5GWjpSR + iY6Mg42Mg42MhpGUjZmWkJmZkpuZkpuXkZqakqOdlaaWkaKRjJ2RkZ+SkqGUkZ+Ni5mLiJeNi5qQ + i5qOiZmLgIeJf4aCf4CAfn+Ig4eLhomOiY2OiY2Oi5GUkJaUkpqSkZmZlaGVkZ2RjpCEgoOHen6N + gISOhpCQh5GQh5GQh5GViZeajp2akZuXjpmSiZSSiZSSjJWQiZKQiZKRi5SVjJSSiZGRkJWZl52e + l56dlp2bjpKWiY2Si42RiYybjpWdkJaZkJeWjZWWh4yRgoeJe3uQgoKajZSekZeVjpWRi5GViZKZ + jZablJmXkJWUh4uMf4OGd3mCc3WHcHWCa3B+b3R/cHV/dXmGe3+JfYCNgISOgoiRhIuVf4eQeoKN + eH2OeX6Rg4ORg4OXiI2XiI2SiIyNg4eQg4eRhIiSgoyXh5GejpaUhIyQen2LdXibhJSjjJunlJ2j + kJmahImUfoOSeXiVe3qWenOUeHCRc2mRc2mQcGqQcGqLc22Lc22Ic3CIc3CQcmWLbWGGZ2GHaGKJ + b2SOdGmXd2qWdWmVc2ORb1+RaliOaFaRbmOUcGWMbmSLbWOOalqDX0+CXUmAXEiHXUiJX0qLZVuR + a2GWdW2aeXCde3ObenKbeG+ZdW2adGqZc2mUbV2QaVqRal2XcGObdWqdd2udd2uie3Clf3CmgHKj + eGeec2KbcFiSaFCLYUmNY0yQaVqOaFiRaWOXb2mdd2+dd2+bdGefeGqid2OleWWfdFyXbVWRiJKQ + h5GVhpmai56bjZmekJudjpqbjZmShJCJe4eLe4CNfoOJf4aLgIeOho2Mg4uRg4yQgouMgoaLgISE + eHmDd3iCdG+Ed3KIe3+ShomUh42Uh42NgouJfoeLhomIg4eMeHiIdHSGc2mEcmh+cG5+cG6DbnWE + b3d/c3d+cnWAcnmGd36CdXuEeH6EdH6GdX+EeHuDd3qIeXuJen2EfX2EfX2Hf4SHf4SJgIiNhIyN + houOh4yOiI6SjJKUjJ2UjJ2ZjqGZjqGXkJ+UjJuRi5SLhI2Qh5SXjpuUkZ+VkqGUlKKUlKKalaiZ + lKeSjaGUjqKZkKqZkKqSi56NhpmJhpGSjpqQjpaQjpaSi5CRiY6GgouGgouMgI6Lf42OiY2Qi46U + i5WVjJaXjJeXjJeWjZqZkJ2NjZCHh4mGg4eIhomMhJSQiJeRiJKQh5GUiJaZjZuhkqGdjp2djpqW + iJSOiZmRjJuVjZ2Wjp6XjpaVjJSVkZedmZ+el6GVjpeRiY6Si5CUjJGXkJWekp6bkJuXkZ2XkZ2V + i5GRh42Jg4CMhoOVjZCXkJKVkpaSkJSVi5GXjZSdlZqakpeXi5GOgoiGeHiHeXmDdXV+cHCEcHOD + b3KGdHWGdHWIdXuMeX+RfoeUgImUgIeQfYOOe4KQfYOOgoaMf4OVf4eWgIiZhoyVgoiSg4uQgIiL + eoSSgoybjJSVho2SfoCMeHqQfYadiZKilJ2jlZ6hjImVgH6LdXWMd3eSdXWSdXWLd3CNeXOMeHWL + d3SQeHKOd3CMeHqJdXiOdGeGa16EaWKEaWKLbWOUdWuWenWVeXSVdW+UdG6Vb2SSbWKVb2SVb2SS + cmmQb2eQa1uQa1uJZUqDX0WJYUyNZE+JZFqMZ1yUa2KddGqeem+deW6XdGiSb2OSa16UbV+UbVuQ + aVeSa16bdGeXdWOXdWOddWiheWuhd3Sme3muf3eoenKjdWGXalaMYk2JX0qJX02LYU6OY1ONYlGS + aFqZbl+fdWKhd2OedF6hd2GhdFuablWLiZSNjJaZiZuejqGekp6dkZ2XjpuUi5eOhpCLgoyLhJCM + hpGMhoyNh42OiI6MhoyMhImJgoeQgIORgoSMfn6HeXmGfXmIf3uOgoaShomNhouNhouIg4eIg4eJ + hIiGgISJfX6EeHmDd26Dd26Ac3B/cm+CcHKAb3CDbnWAa3OCbnmEcHuDd32HeoCJen2NfoCNfoaQ + gIiLgIeOhIuJgoSLg4aLfX2Je3uCeHuEen6Mf4OViIyVjpWWkJaai52bjJ6ZjqGZjqGXkKGSi5uQ + h5SMg5CQh5SZkJ2blKOdlaWWkaKZlKWZlqaVkqKRjp2UkZ+akqaWjqKWi5aSh5KUiJGXjJWWkJuX + kZ2Ujp6SjZ2NjJSJiJCLhpaQi5uQjJWNiZKQiZWVjpqUjZmUjZmSjJeUjZmRi5GMhoyIhIuLh42O + hpCRiJKSiZSRiJKSjJWVjpeakKGelKWbkaKXjZ6RjJuNiJeRjZmUkJuZkJqXjpmalJ+fmaWfkZqZ + i5SVh5CVh5CXjZ6bkaKZlKeXkqaXlJ+Wkp6WkJmRi5SRhIuViI6ZkJeXjpaVjpeVjpeUi5WVjJaa + kZmZkJeXjJeSh5KLgIKHfX6HeHqIeXuHeHqHeHqGdHWEc3SEeHmIe32SfYKVf4SRgoSNfoCNeoOM + eYKQeoKMd36Re36UfoCXgIiZgomRgoSOf4KLeICOe4SZhJCXg46WgoSRfX+Qe36Xg4ahjJejjpqh + jIyXg4OSeXqQd3iSd3eRdXWQd3iUenuRfX2RfX2VeXuUeHqWe4KVeoCNd2eDbV2CZ1+DaGGJameQ + cG2WeneWenebenKaeXCZdWmZdWmVcmWXdGiZdGWUb2GRa1WUbleRbVyOalqQaVqNZ1eIZFaIZFaS + Z1iZbV6Zc2ibdWqWcmGUb16UaFqUaFqLa1eNblqOcGOWeGqZd2eee2ubdGSbdGShdG+nenWsg3mr + gnioe2qfc2KSaVSIX0qIXkeMYkqLYUyNY06QYlWRY1aZbliab1qdclqmemKhdFubb1aJiJKOjZeW + jZqbkp+dkKabjqWVi5uOhJWNh5COiJGUjJ2UjJ2SiJmRh5eQhJCNgo2Oh4eOh4eWiIaShIKRgoeM + fYKLgIeQhoyUho6Uho6Oh4yMhImGgH+JhIOMgoaMgoaLgIeGe4KGenmGenmCdXd/c3R+b3KAcnSC + a3B/aW6CbXSGcHiGe32LgIKMgoaMgoaQg4eViIyRiY6Si5COiY2Ig4eGd3mDdHd7c3J/d3WQfYaX + hI2Wi5SZjZaZi5SZi5SWkJuZkp6UkaGMiZmOg4yMgImOi5aUkJuZlKWalaaXkqKZlKOZl6KWlZ+U + kZ+SkJ6XlaOVkqGXkZqUjZaVjJSXjpaZkp6dlqKalaiWkaWUjp+OiZqRi6KZkqqSkZmJiJCMiJGR + jZaVjpqUjZmOiJSQiZWQiZCNh42JhIiMh4uOho2RiJCRiY6RiY6SiZGWjZWdl6idl6ialaaWkaKU + kJaLh42Ri5GVjpWXjpmZkJqalJ2dlp+akJaUiZCXi5GXi5GakZ6flqOblqaXkqKUkJuVkZ2XkZ2U + jZmSiI6Vi5GakZuelZ+ZkJqWjZeZkp6VjpqakZuelZ+ZjZmWi5aUhpGRg46OgoiMf4aMfYKMfYKJ + en+Gd3uEeH6HeoCUfYSWf4eQgIOMfX+LdXqNeH2OeH2MdXqOeH2Se4CSf4OVgoaUgISQfYCOfXuL + eXiMf4aUh42ZhISVgICOen2RfX+dhpChiZSdh4mahIeUf4KSfoCWfXuReHeVeHqZe36WgoSVgIOX + e3uWenqWfX6WfX6Od2KEbViAY1aCZFeLaWSRb2qVeXuWen2fenmfenmbeG2ad2uXdGuXdGuZdGGV + cF2RbliZdV+Vc3CUcm+Wc2iWc2iSb1qJZ1GQZEyVaVCZcmKac2OZc16WcFyRZU2NYkmGZ1WMbVuO + dGeWe26bem+ZeG2edWuddGqeeHClfnenhIKnhIKqfm2memmedFeQZ0qIX0GIX0GLYkiOZUyNX1CI + W0ySY0maalCeclimeV+hc16ecFyNgo2UiJSViZKViZKXiZKVh5CNhIyLgomQiZCUjZSWiZ2WiZ2W + i5aNgo2Qg4mRhIuSiIyVi46UiY2SiIyVhI6SgoyRho6ViZKXh5GXh5GVh5CRg4yJgoeLg4iUgImV + gouNg4mMgoiLg4OJgoKGe3+Een6Ie3+Dd3p+b3J+b3KGb3eJc3qNfoOVhouRi5GQiZCUiJGUiJGV + jpWSjJKOjpGGhoiDfn17d3V4bm9/dXeQeoSXgoySh5CSh5CQiZKSjJWWjZeVjJaOi5GHg4mMgIyN + go2Qi5uSjZ6Wjp+Wjp+XkKGakqOblqealaaVkZ2VkZ2WlKOZlqaVkZ2VkZ2VjJSXjpaZlqWbmaeh + mayelqqajqeXjKWbkKudkayWlZqMi5COiI6UjZSVkZqSjpeOiJGOiJGOiI6MhoyOhIuQhoyQh46R + iJCLh42NiZCUi5KUi5Kdl6eblqafl6eakqKXjJeSh5KRiJCUi5KVjpqWkJualaWXkqKZkpuRi5SW + iZCXi5GbkJuekp6hkaOejqGZjJ6ZjJ6bkaOWjJ6XkZ2Zkp6bkaObkaOZjJ6WiZuXjpmWjZeakZ6e + laKalJ2UjZaVhI6VhI6Rh4uQhomSg4iUhImVgIyOeoaNfoOOf4SRhIiRhIiRhoKLf3uNeXuLd3mL + dXiMd3mLd3eOenqOe4KRfoSRfX2Sfn6JeHeEc3J/cnqIeoOXgIiWf4eUgISNen6Vf4eahIybhIme + h4yUhImUhImXgoSRe36SeXiWfXuXfoKXfoKWenqUeHiUenuUenuUdWmNb2ODZViCZFeLaWSRb2qU + eHOXe3eZeXedfXqaeXCaeXCaeW6aeW6adWSZdGOZd2KaeGOZeHmbenudeniZd3SZcmSUbV+Va1GW + bVOVa1idc1+ec2Kec2KSaU2LYkaHYk6OaVWSdGqdfnSbeGuZdWmddWWbdGSad2ubeG2ff32lhIKo + gnqngHmleWGab1eNYkeLX0WLXkiLXkiJW0SJW0SJWz+ZaU2Wa1uid2WidWShdGOSfYeWgIuRgIuS + goyOgIyIeoaIe4KOgoiNhIyVjJSZjZuWi5mWiZCQg4mVgouWg4ySiI6XjZSVjJaVjJaSh5KUiJSV + h5KVh5KSh5KRhpGOhpCOhpCVhI6Ug42Vh5CZi5SRiZmSi5qLiZSIh5GIgIaHf4SLfoSAdHp9cHR/ + c3eIc3qRe4ORg4yWiJGXjJWViZKXiZKXiZKRjZaRjZaVjpWOiI6JhIZ/ent6cHR+dHiVeoOaf4iU + ho6Rg4yMhoyMhoyNhI6JgIuHf4KGfoCJgoSOh4mQiZKUjZaViZeWi5mUjp6ZlKOelqedlaaVkKGV + kKGWkKeXkaiWlKKWlKKalJ2dlp+mnaqlm6ijl6ahlaObjqKbjqKhlKqhlKqalZmRjJCNhIyUi5KQ + jpaRkJeRjZSOi5GMhoyOiI6UhImUhImQh5GQh5GNiZCLh42QiZCQiZCUkaGXlaWfkqWajZ+ajJqV + h5WNhIyRiJCUiJSViZWXkJ+Wjp6UjZSNh42Oh4yUjJGajpeekpujjp+hjJ2aiZmZiJeZjp+XjZ6Z + jp+akKGbjqKZjJ+VjJaRiJKSh5KViZWXkZ2blaGZkJqSiZSShoyRhIuVho2ZiZGZjJKZjJKZhJCU + f4uShISRg4OViIyViIyUiYuOhIaOeYCJdHuHcneLdXqMd3uSfYKRfoSRfoSWf4SRen+Ld3mGcnR9 + aWuHc3WNeoCVgoiVf4KQen2Qen2Re36WhIaaiImXhI2VgouXgn+SfXqReXCVfXSagn2WfnmQdW6O + dG2QdHeSd3mQdG+Ncm2JaliIaVeJa2KQcmiXeW+ZenCad26beG+XeWuXeWuhfXKifnObfXCZem6d + e2+bem6be3mff32ifXibd3KZcmSXcGOSa1qVblyRb12aeGWfemueeWqXcl2NaFSJZVORbVqXd26e + fXSdd2uadGmWc2ead2qad2uWc2ideXujf4KmfnqogH2ne2qdcmGba0+XaEySYk+LW0iHXEGHXEGH + XUaSaFCWcGWbdWqic2Web2KNeoCJd32GdX+GdX+EeH6AdHqEcniLeH6IfYaNgouUi5WVjJaXiJCU + hIyQgIiUhIyUi5WakZubkJuWi5aSh5KSh5KSh5WRhpSNh5CLhI2LgoyOhpCQh46Qh46SjJWWkJmW + jaWWjaWRiZqNhpaIg4eDfoKAd3p+dHiJdXWEcHCHen6NgISVho2XiJCXjJWUiJGUi5KSiZGQiZWU + jZmZjZmXjJeXh5aLeomDb2+GcnKQfYOWg4mXiZKXiZKNh5CMho6Gg4d/fYCDg4OHh4eMh4uRjJCW + kJmVjpeSjJeRi5aVkJ+dl6eblKWdlaadlaadlaaal6eZlqaZmaeZmaefl6eblKOimqqlnaymnaqh + l6WXkqOZlKWalaiZlKeVkpaQjZGOh4mNhoiRi5aWkJuSjpqNiZWMg5COhpKQg4mOgoiOhpCQh5GR + i5GNh42Nh5COiJGQiJeQiJeVjZ2Si5qUi5WSiZSQg4mViI6Uh42ShoyVjJaXjpmUiZCLgIeRhIaV + iImWjJKdkpmllqKekJuSiZSSiZSUkJuRjZmZi5aekJuikZ6hkJ2UjIyQiIiOho2RiJCWjZeelZ+i + lJ2djpeRhIaShoeXiZKXiZKZi5SZi5SXiJCUhIyXhI2Zho6XiZKbjZaZi5SShI2Jd3+LeICIdXuL + eH6QeoKWgIiWg4ySf4iXgIiReoKQeHOJcm1+amOHc2uIeXuNfoCWf4SVfoOQenqRe3uRgoSVhoiX + iIuVhoibf3+UeHiSenSWfniWg3uSf3iSeW6JcGWIbW2Jbm6OdG+Nc26NbWGMa1+QcGqVdW+WenOU + eHCbeG2ZdWqUeWuXfW+ff3mjg32ffXiee3ehe3ehe3ehfnuif32he22bd2iXbluacF2Wb2KVbmGU + c2iaeW6dfnCdfnCdeWOVclyObmKScmWZeG2efXKZd2SUcl+RbmOXdGmec2ehdWmfdXOieHWienem + fnqleWifdGOjblOfak+ZZ1GSYUyQYUeNXkWJX0qNY06Xc2SXc2Sdc1+WbVqJd3+Abnd9a217amt7 + bm57bm5/a26GcnSIeXuRgoSOi5aOi5aNhouMhImRhIiViIyUjZaWkJmdkJaViI6RhIuRhIuOgImQ + gouJf4aIfoSEfoSJg4mHg4mMiI6Mi5WQjpmWjp+blKWXjpaMg4uJen2Gd3mCdHKDdXOAc3CCdHKG + e3+MgoaRhIiWiY2bjJSWh46Rho6Og4yQiZKSjJWdkqWbkaOVi5+IfpKEd3SLfXqMhImVjZKfjp6e + jZ2OhpKHfouHfYCEen6JiYyOjpGbkJ6flKKZlKWVkKGSh5KSh5KVjZ2akqKZlqWZlqWblKOdlaWb + maeal6adma+ZlauWlqeWlqedl6ifmqufl6ifl6iXlaOSkJ6Wjp6Wjp6SjpWMiI6MhIeLg4aOi5SN + iZKRjp2OjJqXjJeUiJSOgoiQg4mJg4mMhoyMhoyMhoyIf4eLgomNgouNgouOg46RhpGRiY6RiY6U + hImSg4iUhImUhImQiI2UjJGWh4yOf4SOgoOViImWjJCdkpaimaGakZmRho6Og4ySiZSRiJKWi5aZ + jZmmlaKfjpuVi4yRh4iJgIuOhpCRhpSbkJ6ekpudkZqViIyWiY2XjJeWi5aXiZKWiJGah42XhIuV + gI6ahpSWi5aWi5afjJWXhI2QfYOMeX+HdHqHdHqOeH+Se4OWgIiWgIiSfYKMd3uLd22IdGqDb2WI + dGqIdHSNeXmOeX6Qen+Oen2Qe36UfoaahIyhh4aehIObf3qUeHOVeneVeneNf3qNf3qUeXKEamOD + aGGEaWKEaWKGamOIbmONc2iSeHSWe3iZfXmWeneWd3COb2mUcm2denWbgHmeg3uef3ObfXCfeHSi + enejfnmlf3qlemSbclyRZ1GValWXbWGbcGSaeW6ffnOhf3SigHWffWqaeGWXeWuVd2mWe3Caf3SX + d1uLak+JZVeQa12ZcmKZcmKUblqadF+ddWiheWuld1+idF2icleeblSda1aZaFOUZE2NXkeIXEaO + YkyRb1+XdWWedFqXblSLdHuGb3eCamV/aGN7b2V5bWN5bmp/dHCHeHqQgIORi5aRi5aNh42Nh42Z + hoyah42XjJeXjJebjpKViIyRgoeQgIaNgIKMf4CHfn2DenmHfYOIfoSMhIeRiYyQiZKVjpebjqGe + kaOZjpWRh42OfXuJeHeLeXiJeHd+dXJ/d3ODeneJgH2RgoSVhoiai5CXiI2SiIyUiY2SjpeWkpub + lqealaaRjJuJhJSJen+Of4SRi5aalJ+ekaObjqGVho2Le4ODfn2Mh4aSjpqZlaGel6+fmbCelqqa + kqaUiJGRho6SjJeZkp6ZkaWZkaWdlKGdlKGal6abmaeem66XlaeWlqWZmaebmaifnayem66ZlqiW + kpuQjJWXiZKXiZKVjpWQiZCMhImMhImRh42UiZCSjpqSjpqXkZ2UjZmQi46Mh4uOgoiJfYOGeoOH + e4SJfYCNgISRgoeNfoOOf4eUhIyRg4yShI2XhIuWg4mZhoyVgoiSiI6Rh42Vho2RgomShomXi46W + jpSakpelmaWekp6Sh5CNgouOg4yRho6Sh5WWi5mdkZqflJ2dkJSXi46ShoyRhIuOg5GUiJaZi5ae + kJuUiJGUiJGZjZmWi5aVi46UiY2ai5CWh4yRgomVho2Vh5KVh5KbjJSZiZGVg4SLeXqIdXmHdHiN + eHiOeXmSfoCVgIOUenmOdXSGcmqGcmqJcG+LcnCMd3mQen2Wen+UeH2SeX2Uen6SfYSZg4ufhICd + gn6aenSSc22OdG+UeXSQf3iSgnqWe3SGa2R/YVuAYlyCY12EZV+JameRcm6WeXuZe36ZeXWXeHSW + d3OQcG2Xc26deHOihoKfg3+igHibenKaeHObeXSifXilf3qfeGWVblySaVSOZVCQal+WcGWZd3Kh + fnmjgHujgHuffWqaeGWWeWWXemede3OigHihemOSbVaRYVCQX0+OaFuOaFuQZ0+WbVWXc1+eeWWh + dWSid2Wjd1ueclaablOXa1CUZEqVZUyRYUyOXkmSZ16bb2edc1iacFaLdHmEbnOCbWqHcm+Cd3V+ + c3J+b3SEdXqJe3uRg4OOhpCOhpCJhpGNiZWXiZKXiZKZjZmZjZmXjZGUiY2QfnqUgn6Lg4OJgoKJ + gH+Ee3qHfYCIfoKOhIiRh4uUi5eVjJmZkaGZkaGXkZqSjJWJgoKJgoKMhImIgIaHenuEeHmEeXOR + hn+Vh4KXiYSbiJGdiZKViZWXjJeXkqKblqaZmaeWlqWUkpeNjJGOh4ySi5CWkKeblayelqaWjp6S + hISMfn6Lh42VkZefmqqemaidma+fm7KhlqibkaORiJCQh46NiZWQjJeWjJ2XjZ6bkp+dlKGal6af + nauhm6yblqeXkqKWkaGbmaiem6uem6qbmaeZkZaSi5CWiY2ViIyWkJmSjJWOho2Oho2RhpGUiJSW + kJaZkpmXkqaXkqaWkp6Oi5aah5CSf4iGeX2Ie3+Le4COf4SOgoaNgISQg4eQg4eWhpKWhpKWh4yZ + iY6Xi46Uh4uSi5CQiI2Zho6Zho6UiJSXjJeWjp6ZkaGhl5+elZ2XkJKSi42OhIiNg4eNhI6RiJKU + jJudlaWdkpmXjZSXiI2Sg4iNf4uUhpGWh5mai52SiZSVjJaZkZaWjpSZjpCVi4yXjZGSiIyNgoCL + f36RgomUhIyai5KbjJSViImOgoONe32Id3iIc3iMd3uWf4SWf4SVfXSSenKHc2uIdG2JdHSMd3eN + eHqRe36WeH+SdHuMc3KMc3KNe3qVg4KbgoabgoaWenWOc26RdXWVeXmRfXeWgnubgHWRd2uJaFiA + X1B6XEp/YU+DaGOOc26VeHibfn6Vem+Vem+adXCUb2qScmmXd26bf3ufg3+hf3SXd2uXeW2Vd2qa + eW6de3Cfe2+beGuVdWGRcl2QcFyQcFybd3She3mjf3Sjf3SeeG6Zc2mZdWqdeW6he22mgHKhe2iW + cl6UYliOXVSIXk6HXU2QY02SZU+Sa1qfeGWle3Kof3WnfnSieW+eclSVaUyRY0SUZUaSZVGRZFCR + ZFCWaVWXbVqXbVqEd3SGeHWMfYKOf4SLhIuJg4mQgouLfYaOe4KSf4aRg46UhpGQhJCQhJCQhoyR + h42ViZeUiJaSjJWRi5SShomUh4uQi4yOiYuOiYuNiImNg4eLgISRh42UiZCUi5eakZ6XlJ+alqKf + lKKajp2VjpWWkJaVjJSNhIyMgoaJf4OMf4OWiY2Vi5GZjpWbjZaajJWZkJqZkJqZkJqdlJ6alaaa + laaZlaGVkZ2XkJ+XkJ+WkaGblqadlp2SjJKLgn6Lgn6Vi52flaelnbCimq6fmbCfmbCdlqKXkZ2O + ho2Qh46NiJmNiJmZiJeaiZmZjZmbkJuVlJ6enaeimqqdlaWWkp6Wkp6alqKdmaWdm6aenaebkp2W + jZeWjZWRiJCZlJeVkJSQjJWOi5SUjZmVjpqXlJ+bl6Oblqeblqebl6GXlJ2djZCVhoiJen2HeHqJ + fYOMf4aOhIiNg4eShoeShoeZho6Wg4yViIybjpKWjZWUi5KUiJGUiJGXiJCZiZGZkJqXjpmXkZ2S + jJeWkJmblZ6ZjZaWi5SQhoyOhIuLgoyMg42ViZeXjJqdjJmfjpuZi5aVh5KOeYCQeoKQgouShI2Q + h46RiJCWjJKdkpmfkZqdjpedjZWZiZGUhIeIeXuQen+Re4CWg4mZhoySgoyQf4mOe3+MeX2MeHiN + eXmRe3mWgH6Xf3eVfXSSeHOSeHORe3mUfnuUfoCUfoCZe4COcneAbmF/bV+Lc26Ue3eXgoKXgoKU + eXKSeHCVe32SeXqVeHiZe3uhf3ebenKWb1+LZFWAXEaCXUd/ZViMcmSSd3mZfX+Uem+Qd2uVcmeS + b2SUcHOZdXiXfXWbgHmjf3SdeW6bd3SXc3CZem6dfnKlf3qmgHujg3+efnqVdGuVdGuac3Kienmi + eW+jenCecmWWal6UbV+ZcmSab2OhdWmfeW6adGmValeLYU6DWD6CVz2HWEGQYUmRZ1SfdGGnf3uq + gn6nfnSnfnSjeFaWa0qRYkiUZEqVZE+WZVCZaVGXaFCVZFGVZFGJfYCQg4eUh42Uh42Oi5GNiZCU + iZCNg4mQfYCQfYCNf4iOgImQf4mOfoiOeYOQeoSOg5GRhpSQjJeMiJSUiZCZjpWXjpaVjJSVkI6Q + i4mOiYuOiYuUiJGUiJGXiZWdjpqekaOfkqWjlKajlKadlaWblKOZkaGUjJuQiZKNh5CSjJeXkZ2a + kZuflqGbkpqakZmXkJ+XkJ+akZudlJ6dlqKhmqahlaOekqGajJqajJqZkp6blaGZlJeOiY2Mg4KM + g4KXiJufkKOll6uhlKeelaKhl6WalJ2XkZqWi5aRhpGRi5SOiJGWi5aXjJeVjJadlJ6ZlaGfm6ee + maqXkqOUjJuUjJuXkqKdl6eemayhm6+hmayblKeWkaGVkJ+dmaKZlZ6SkZuSkZuWkp6VkZ2dlKGi + maafmqqdl6ebmqWVlJ6akZuVjJaOhIiHfYCHeoCJfYOQg4mRhIuUhImWh4yXiI2VhouWiZCdkJaX + jZGVi46XiJCWh46Xh5Sbi5eWjJ2XjZ6Wi5SSh5CUjp6WkaGZjZaWi5SVhouRgoeNfoOOf4SRgIuZ + iJKeiZeeiZeSh5CNgouJd32LeH6LeH6NeoCNfoOOf4SVho2bjJSbjZmdjpqfiJCbhIyagIKReHmN + eXeQe3mWgIiWgIiReoSUfYeUfoOMd3uNeHiRe3uSfneVgHmXg32ZhH6Zg4CZg4Cah4uXhIiXg4aW + goSVeHiOcnKCbmR7aF6HbWmQdXKVe32Ve32We3eXfXiXfoKUen6ZfXmafnqfgHeae3KZdGGRbVqN + Z1WNZ1WGaF6Nb2WRdHSXenqSeW6Mc2iOb12La1qRc2eZem6af3Seg3ilgHihfXSddXKddXKZenCh + gnijfnuog4CnhIOmg4Kienmed3Wfc26jd3KleW2ne2+fcl+VaFaNZE+RaFOWaFuaa16ddWiZcmSZ + b1yUaleMZEGGXjyEVzmLXT6QZFSfc2KjfXKngHWqfWuoe2qieFibclOaaVGWZU6aaU2aaU2ZZ1GZ + Z1GXYUmUXUaUho6WiJGUiJSXjJeZkJqVjJaQjJKMiI6NgISIe3+HeoCIe4KIeYCHeH+IdXmLeHuR + gomVho2ViZeQhJKZi5afkZ2bkJ6XjJqXkJWVjZKSiI6Vi5GVjJaUi5Wdjp2fkZ+dkqWil6qil6ij + maqfl6iblKWalaaVkKGWjp6Wjp6ZlKOalaWfmaWhmqaXlqGVlJ6XkZ2UjZmZjJ6dkKKimqqhmaij + l6OdkZ2diJSdiJSUi5eWjZqajJWShI2Ng4eQhomSh5KZjZmilqWbkJ6alJ2ZkpuWkJuXkZ2XjJqS + h5WRi5SQiZKUi5WUi5WSiZSakZualaWfmqqdkqWZjqGWh5mXiJqXkZ2dlqKlmq+lmq+hmaydlaiX + l6iZmaqjm6ufl6eblaGZkp6VkJ+Ujp6blKWfl6ibmaiWlKOUkaGUkaGXlaOVkqGViZKMgImGeX+H + eoCUfoiZg42Vh5CWiJGWiY2WiY2OjJCSkJSWjJKWjJKai5KWh46XiZKdjpeZkJ2Ui5eRiY6QiI2W + jJ2Zjp+bjZaWiJGWiIiRg4ONf32Nf32MfYSUhIyZiJKXh5GShoeMf4CJdXiHc3WJdHmMd3uHeHqE + dXiOeYOVf4mUiY2ZjpKih42bgIeUfn6QenqNe32MenuOeH2QeX6SeX2Qd3qMeHiMeHiQe3WUf3mW + hICaiISbhoueiI2ajZGajZGejZeaiZSdh46ahIyZfneOdG2CaGF9Y1yEaWSNcm2Sd3eVeXmff32h + gH6WgIOVf4KVenWUeXSae3KZenCVdWWSc2OUc2qRcGiOb2mUdG6WeG6WeG6ScmWObmKNa1qMaliQ + bWKZdWqifXungoCmgoSifoCdeHOdeHOZeXeefnuifoCqhoiui4mnhIOqe3Old26idWmjd2qieW+j + enCedF6WbVeQZEmNYkeUZ1OZa1eecmOecmOec1+bcF2XbUyQZUWLYkSJYUOMZ1yadGmmfm6mfm6o + d2OndWKec1Gab06da0+XZ0qdaE2ibVGea1adalWZY0aXYkWajJeWiJSXiZebjZuWjqKWjqKSkZmM + i5KNgIeJfYOGcnKDb2+AbnKCb3OCdHSEd3eJen+MfYKMgIyJfomRiJKZkJqdjp2hkqGXjpuWjZqW + iZCViI6QiZKRi5SUjJ2Wjp+akqaelqqbmaial6eelqedlaaZlqiXlaealaaalaahmqafmaWblKWV + jZ6LiZGJiJCRho6UiJGWjZqakZ6al6eVkqKVkZ2Oi5aLg4aRiYyRi5aVjpqajp2UiJaIhomIhomO + h4mUjI6XkZeSjJKSkJ6VkqGekJ6djp2XkZ2UjZmQiZCOiI6OhpCRiJKQiZWUjZmZjqGflaeblKOb + lKOXiZKWiJGVjJmZkJ2fl6ihmaqemayalailmqynna+emayfmq6jnaialJ+Ujp6RjJuVkKGUjp+S + kJ+Rjp6SjJeWkJuZlqaXlaWVjJaIf4mMd36LdX2Of4eVho2Xh5Sbi5edhpKfiJWNi46OjJCbi5Wb + i5WViI6RhIuViZKXjJWWjZWUi5KOhIuOhIuSh5CSh5CViI6RhIuUh4iShoeUh4uShomMe4aMe4aN + f4iNf4iVgICVgICSfnuJdXOJbnCJbnCJdHSIc3OJdXWXg4ORiYmUjIyaiImSgIKQe3uQe3uSf4OU + gISRgoSQgIOQe3WMeHKHcm+NeHWNeHWUfnuWh4yejpSdjZWdjZWejZehkJqbkJuZjZmhi5Cbhoua + f3iQdW6Ja1+HaV2IbWmNcm6aeHObeXShf4CjgoObgoaXfoKSd2+NcmqRdXCVeXSQdWiQdWiWd3OZ + eXWafnmZfXiVe22Qd2iVc2ORb1+NaVaIZFGJZFqOaV6XeYChgomnhI2lgouaeXCScmmScG6XdXOh + gH6oiIavi4KwjIOofmWfdV2fdV+jeWOlgHSlgHSde2SVdF2UakyLYkSUZ1WbblyfdWKfdWKadFuX + clidc1iXblSRbVGQa1CLa1qUdGKid2WleWiodV+ndF6iclCaakmZaEybak6balOda1SdZ1OeaFSa + Z0iRXkCdiJaZhJKSh5KWi5aZjqOXjaKUjZmSjJeQhoyHfYOIc3CCbWqCbmiDb2l+cnODd3iId3iJ + eHmIeX6Le4COhpCSiZSXjZ6bkaKXjpuVjJmViIyOgoaLgIeQhoyNiJeRjJuZkaGblKOXlaOWlKKa + lJ+dlqKelqaelqaflaehlqijmqehl6WejZeWhpCNhIOLgoCLfoKRhIiNiZKSjpeZkJeZkJeUi5KQ + h46MgoiRh42Qh5GXjpmakZuWjZeUjpKNiIyMhISQiIiVjJaUi5WUjp+Ujp+WkJuXkZ2VkJ+RjJuN + i46MiY2Ng4mQhoyHg4mIhIuSiZabkp+WlKKWlKKZi5SZi5SbjZubjZudkqWelKablKWakqOilaej + lqialaaemaqhmqablaGZkJeXjpaXjpaVjJSRjZmMiJSSiZSUi5WZlKOXkqKZkJeOho2JfX6Ie32Q + gIaOf4SWgo2bh5KVh5KVh5KRho6XjJWdkJaajZSVg4SQfn+Vh5CZi5SWjpSQiI2OgoOOgoORhIiS + homWg4eUgISNg4eUiY2WjZeRiJKQgouLfYaMfYSOf4eWhIaWhIaWgn+RfXqJdW+IdG6Hcm+Ic3CI + d3OUgn6XiIuai42Zh4aVg4KWgH6Xgn+Zi4uajIyZjI2RhIaQfXeHdG6Jcm2MdG+LdXiXgoSbi5Wf + jpmfkJWfkJWbjZaekJmbjpWWiZCXg4aVgIOVfXSOd26Qb2SLal+NcHONcHORd3OXfXmZe4Cfgoeh + g4uafYSUdWuOcGeVdXKWd3OWd3CZeXOafX2hg4Ojh4KhhH+bgnSWfW+beWmZd2eWdVyMa1OMY1CL + Yk+OeH2dhoumiY6fg4idfWqSc2GQblyScF6Xe3Sihn6nh4Cjg32ie2KbdVydd2KhemWjgnmhf3eh + f2WaeV+acleQaE6VaVidcF+edF6dc12acFSbclWbbleecFqdc12bclyZc1qZc1qjeWWlemeoemWn + eWShcFaaalCXaEyWZ0qZaFWZaFWbZE+XYUyXZEOUYT+Wgo2Xg46WhpWdjJuakKGXjZ6akKGWjJ2U + h4iOgoOHdXd/bm+CbWqGcG6Gc3eIdXmHdXKGdHCCdHSGeHiNfoaVho2XjJqajp2bjJ6XiJqVg4SS + gIKLfX2Rg4OQhoySiI6SjJeXkZ2XkZqZkpudlJuelZ2hlKafkqWhmaihmaiimaaelaKfjJKVgoiR + e36OeXuOgH6Rg4CQiZCRi5GXi4yZjI2QhomQhomQhI2Rho6Vh5KdjpqdkZ2ZjZmajpqSh5KQhoeS + iImSjZGRjJCXi52ZjJ6VjJaWjZeSjZ2RjJuNjJSJiJCNgIKMf4CIgn+LhIKLhJCSjJeSjZ2Ujp6W + i5aViZWWi5aWi5abjqGbjqGakZuakZubkJubkJudkqOhlqeblqaalaWXlJ2WkpuWjJKRh42Oho2N + hIyOg4ySh5CfkZqekJmfkJKUhIeMgoaMgoaOgoOLfn+UfoiXgoyQhI2Rho6OhpCWjZeakJSWjJCU + goCQfn2RhIaViImWjYyVjIuMg3+JgH2JfX6Mf4CQfn+Qfn+QhI2ZjZaZjZmUiJSRho6MgImMe4aO + foiQgIiWh46Zh4iXhoeOen2MeHqJdW+Hc22IeXuSg4aZhoyah42XhoSVg4KVf4SZg4iZiY6hkZaa + jpeViZKWg3uLeHCId2KGdF+Hc3OZhISfjpmhkJqdjZCejpGdjZWdjZWfiYmahISWe3CQdWqUeXKN + c2uJbmeIbWWLbm6Qc3OQdW6SeHCVeX6dgIaaf4aaf4aVd2qQcmWRc2mVd22Xe3iXe3iafnqhhICl + iYSjiIOjhHefgHOff22aemiXemmOcmGMa1CLak+Oc3Wbf4KliIihhISjgG6Vc2GMaVSLaFOQcG2e + fnqhhH+dgHueemSXdF6bc2mle3Kjg4Cign+lf2ufemeedFyXblabcF+ec2Kid16hdV2ablCeclSf + c1efc1eec12ec12id2Oid2OleWGmemKqfmWleWGnd1yeblSXaUiWaEebaVSea1afaUyaZEeZYkGU + XT2UfoiRe4aWfoudhJGUiJGUiJGZkJ2Ui5eRhIuQg4mJen+DdHmEcniJd32Jd3qEcnWJdXiMeHqJ + d3qJd3qOe3+Wg4eWi5SZjZadjJmaiZaVhouQgIaQgIaUhImQgIaSg4iQh46SiZGajpeekpuilqKj + l6Olnayfl6efmquemaqblqablqabjpKRhIiMe3SLenOMgHqRhn+Rh4uUiY2ViIyXi46WjJKSiI6W + iZCXi5GakZuelZ+flqObkp+WjZqRiJWZjpWZjpWUi5KRiJCVh5KVh5KNhJGRiJWVi5uVi5uQiZWO + iJSSg4aOf4KJen2NfoCGfYSIf4eUhpSWiJaVi5uQhpaSh5WUiJaUiJaViZeajJWdjpeajpqdkZ2Z + kaKZkaKZkaGblKOZlqWXlaOXkZqOiJGIf4mMg42QhoySiI6XjJeZjZmXjJWSh5CQh46Qh46QgIaQ + gIaRhIuShoyOhIuQhoyOg46XjJeakJGXjY6Vg4KSgH+NgISQg4eWiYuWiYuOg3+MgH2Jen2IeXuM + fn6Mfn6Ngo2Wi5abkJuXjJeWiZCOgoiMfYKQgIaRgIubi5WekZeajZSUf4KNeXuJdW+Qe3WQgIaZ + iY6XiIuVhoiRgoeRgoeVgoubiJGbi5WhkJqhkJqdjJabh4SSfnuQe3uGcnKLdXOXgn+ijJaljpmd + iZCZhoyahImahImhhoCfhH+deW2ad2qSenSQeHKMeXKEcmqLb2qSd3KJcGWHbmONcHCSdXWVeXub + f4KWd3CSc22QdG2VeXKaeniaenibf3uhhICfi4Sfi4SihoCfg36hgH2hgH2bfXCVd2qUdV6Rc1yO + b2mZeXOhhICihoKlf26VcF+OaVONaFGQbWKdeW6jfnmifXied2Sac2GadGqfeW+mgHumgHujf3Sj + f3ShdWSfdGOfeGiheWmmemejeGSbb1Sbb1Seclaeclafcluhc1yfcl+hc2GjdWGqe2enf22iemim + dVuhcFafbVehbliid2Oid2OjcleaaU+ZYkSSXD6Of4eMfYSUfYSZgomQhomSiIyWi5aUiJSUiJSO + g46MfX+EdXiDd3qMf4OHfYCDeX2NeoCQfYOJen+QgIaOgoaViIyVjZKWjpSdjZ+djZ+bi5ebi5eR + hIuRhIuUgImRfoeNgouSh5CekqGilqWhmaqimqufmq6dl6uakqKblKObl6OXlJ+UkZWMiY2MhImN + houOgoOQg4SSiImWjI2ajZSajZSZjZaZjZaXjJebkJublqaemaidmaWXlJ+ZkaGZkaGXlaOal6aa + kZmRiJCNhouNhouQg4mRhIuQhI2Sh5CWhpCUg42OgoiOgoiIeXuHeHqGeXqHenuNgouOg4yRho6N + gouOhpKRiJWUjZmVjpqZjZmajpqhkp6ilJ+XjpuWjZqXi52ajZ+akqKdlaWblaGUjZmNhI6NhI6U + h42WiZCWi5aZjZmVjJSRiJCQh46Oho2Uh4uRhIiQiI2QiI2Ng4mNg4mRg4yXiZKfkpSXi4yZhISZ + hISOgoaMf4OOhIuRh42Qg4SQg4SNeXmMeHiQe3mQe3mNfoaWh46bkp+WjZqRhIuNgIeQfYCUgISa + hIyeiJCilZmdkJSXhoSNe3qNcm6WeneVgoibiI6ZiY6UhImRg4ONf3+RgoSZiYydjJmfjpujlJua + i5KZh4iSgIKQeX6OeH2Re4OZg4udjZWdjZWdho2Se4OVf3+WgICWgnuZhH6deniZd3SUenmVe3qR + emuQeWqRd2uSeG2Jc2eHcGSGamOJbmeUdG6ZeXOWdWqUc2iQdWqVem+eeXSdeHOae3KhgnidiYOd + iYOfh36ehn2ignuignuef3Kef3KZeXOZeXOaeniefnufg36dgHunf22bdGKUaViOZFSSamSbc22d + eHWdeHWadWKXc1+XcmibdWumfXSle3OieXCjenKhdGWjd2ileW2ofXCsgGileWGfblufbluhcFih + cFieblaeblaZa1qhc2Gjd2WnemmqfWumeWijdWGhc16jeGmqfm+og3KrhnSreWWhb1yhaUqXYUON + foONfoONen6QfYCMf4COgoOVgIyXg46Vh5CQgouQfYCNen6MfoeRg4yRhIuQg4mOhIuQhoyNgIKR + hIaQi46SjZGZjZmajpqXjZ6WjJ2bjJ6djZ+QhoyMgoiSg4iQgIaQhI2ViZKdkKOhlKehlquhlquh + lKqdkKaajJebjZmbkpqZkJeVkJSQi46RiJWQh5SOiY2Qi46UjI6XkJKel6Oel6Obkp+akZ6XkZqZ + kpuhmaiimqqblqaXkqKdlKGlm6ienqyenqyhkp6Rg46NgIeRhIuSf4OWg4eVhouVhouWh46UhIyL + f4iJfoeGenmJfn2MeX2Nen6LgISJf4ONfoORgoeNgouRho6UjZaVjpeZjZmbkJuelZ+hl6Kilp+a + jpefjpubi5eZjZmhlaGelKWakKGSiI6UiZCXi5GajZSZi5SZi5SbjJSZiZGai5KWh46WjJCVi46S + iZGQh46ShomShomUho6XiZKfkpaajZGdiY2ei46Wg4eQfYCNgIeRhIuOgoaOgoaQgn+Qgn+Vf3+X + goKUfoOZg4iekJuajJeUgIeNeoCSe4CXgIaZhomhjZGil56il56fiYmXgoKWd3CWd3CXhIuei5Ga + i5CSg4iSfX2SfX2RfX+diIubiZ2di56ijpWah42af4aXfYORe4aOeYOOgoaViIyZiY6ZiY6dg4SS + eXqVeXWVeXWMd3eSfX2ZfXmZfXmVgICahoaZgnWVfnKXeHSWd3OSdGiOcGSHaVyEZ1qObmOUc2iV + d2qWeGuVeXKVeXKbem+bem+SeW6XfnOdgn6fhIClhH6lhH6lg3qjgnmig3mig3mjg4Cjg4ChhISe + goKegn2afnmlfnSfeW+WcGWOaV6QYleVZ1yVb2iXcmqWcFyWcFyUb1yXc1+ec2Kec2KfdGWdcmOe + c2SleWqlfW+ogHOrgG2ofmqjcl6ebVqec1udclqfak+aZUqSZVGhc16meHCneXKqfWunemmjdV6e + cFqid2qne2+nfnWvhn2vg2+ofWmncFOdZ0mNfoaNfoaMf4OLfoKNeoCOe4KQe4eVgIyVgouWg4yQ + g4eQg4eQh5SRiJWVh5CWiJGQi4yOiYuQhomQhomOho2SiZGZkp6Zkp6ajpqWi5aZjZuXjJqSjJKR + i5GSg4iOf4SSiI6SiI6ViJqbjqGikKWikKWfkZ+XiZeViIyWiY2UjI6VjZCQjJKRjZSajJeajJeU + jJGUjJGbkZejmZ+dmqyal6qVkZ2RjZmVjpealJ2lmqyflaeakZ6XjpuVlJufnqahnq6fnaydjpeN + f4iOf4eRgomIfn+Ng4SQhoyRh42Zgo6Zgo6Rh42QhoyOg4KQhIONfoOQgIaSf4iOe4SGe3+Een6L + fYaRg4yRi5aWkJuVjJmakZ6Xl6WZmaaimaOhl6KllqKjlaGbkJuflJ+ZlKWXkqOWjZeXjpmajpqd + kZ2WkJmVjpebkp2dlJ6ekpuXjJWWjpSWjpSVkJSRjJCViIyRhIiQiI2WjpSblZ6fmaKhkJqbi5WV + goaOe3+Ne32Vg4SOhIaMgoORhIaViImag4idhoubhoibhoidkJaekZebh4mNeXuOeX6Xgoeah4uj + kJShlp2hlp2jiY2hh4uafn6Xe3uah42ei5GWiYuOgoOHcnSIc3WReoKag4uZi5SZi5Sah4uUgISX + foKSeX2MdX2Nd36Qfn+Rf4CWhIaaiImZhn6VgnqUeHORdXCQc3OWeXmWfYCXfoKZg4iZg4ieg3ua + f3ibeXSaeHOOd2KLc16MaFWJZVONbl6UdGSZdWmdeW2ZeXOWd3CZeGuZeGuRd2uVem+We3ebgHuf + f3mignuign6ff3uihoKjh4OniYmmiIihhoCeg36dgHuafnmhenOjfXWad2uQbWKQZ0+OZU6QZFSW + alqab1eZblaZb1ybcl6adF+Zc16ec1+ZblubcFufdF6bdWqlfnOnf3Knf3Kme2ifdWKhc16fcl2d + a0+ZaEyUZ1Wfcl+leHOmeXSofWmid2OicFafblSdcmGne2qqgHqvhn+zg3iufnOneFeic1OOg46M + gIyQgIaNfoOMeX+MeX+Me4aRgIuSg4uWh46Rh42Rh42SiZSVjJaViZeViZeSkJSQjZGRjI2OiYuQ + i4yUjpCZkpualJ2ZjZaXjJWWjZeWjZeViZWSh5KNgouNgouai5CdjZKajJWbjZabjZubjZuajZSS + hoyUh4uViIyXjZSWjJKSjpqVkZ2fkZqfkZqakJaakJahl5+mnaWhmaqZkaKWjpSSi5CVjpedlp+l + laeikqWakJSWjJCXlZmhnqKloayemqaekZWViIyQgo2Rg46LhomNiIyQh5GQh5GVh5KWiJSWi5SZ + jZaSiZGQh46WiJGXiZKQgo2LfYiIfoKGe3+LfoKNgISQh5SRiJWWjZebkp2VlaKZmaaflaaflaam + mqijl6ajlaGilJ+ZkaGXkJ+ZjqGbkaOdkKaekaebkp2ZkJqakqKelqaakqKWjp6WkJaUjZSajY6Z + jI2UhoaOgICRh42WjJKdlKGimaaelKWXjZ6ah42RfoSOen2WgoSOhoSOhoSWh4ybjJGfi5abh5Kd + iZCbiI6bkZedkpmbiYuSgIKIfoKQhomajZSekZejlpqll5umkJCijIyXgoSSfX+Zg4udh46biYuO + fX6IbmqDaWWLbniWeYOWh4yai5CZhIeRfX+WfX6WfX6ReHmReHmReHeUenmWgICeiIidiIidiIia + gIKVe32UeXWSeHSWenqdgICehIafhoehh4aehIOfg3ubf3iVe2mQd2SLalSIaFGOcGOSdGebenKd + e3ObfXOXeW+WeG6Vd22QbmuScG6Sc22XeHKZenCZenCXe3ibf3uihoijh4mmiYyni42niH6jhHqf + hHWZfm+de3Chf3Sfe2+XdGiXbVWRZ0+OZFGQZVOXbliacFubd2Wjfm2iemiheWeic2Web2KacF2b + cl6ZcGefd22jf3OlgHSnf3KlfW+meGGidF2bbleXalSWalqabl2eeG2ie3CoemOfclufblSebVOh + b1yod2Osf3qwg36uf3esfnWmdVijc1aQh5GQh5GShoyQg4mRfX+Qe36RhIiXi46ajJWajJWaiZmb + i5qWjZeVjJaUi5WWjZeXkZqXkZqVi46SiIyUiJGbkJmfkqWdkKKZjZmXjJeajJWbjZaSiZaSiZaU + iJaajp2ekZeekZebjJGai5CSjJWUjZaQiI2MhImUiY2XjZGZjZmXjJeXkKGblKWflKKekqGakJae + lJqjmqemnaqilqKZjZmUiY2Ng4eQiZKalJ2hkpudjpeWjJKZjpWel6GnoaqloaqhnaadkpmXjZSR + iJCNhIyMiI6Oi5GSiZaSiZaSjZ2WkaGhlKafkqWWkaGSjZ2Wi5aWi5aUiY2QhomOgoaMf4OJen2J + en2JfomMgIyRjJCVkJSdlqKel6OdlaWdlaWil6qlmqylmaeekqGdjZ+bjJ6ZjqOelKiflKKflKKd + lJudlJuWkaGblqadlqKalJ+bkpqakZmei46fjJCahoaUf3+XiI2fkJWhl6KimaOZlZ6RjZaViIyR + hIiOf4SRgoeVhouWh4yZiY6djZKhkZmdjZWijpediZKVjpqblaGhkpuWiJGRhIiWiY2hlJqilZui + lZmll5ujl5aekpGVf4SQen+Of4eVho2Vg4SOfX6Nc2iEal+Da2eMdG+Vhoiai42ahIeSfX+Ve32W + fX6Ve32UenuUen6SeX2Vf4KbhoieiI2fiY6bhouahImahIKVf32VfXiXf3qahIKdh4SfhoSfhoSj + iIOfhH+bgHWWe3CRcl+La1qSdGeae26igIKigIKif36aeHeWd3OWd3OSb2eUcGiUbmOXcmeUdGSU + dGSVc26beXSbf3uni4eqjI6niYyuhoKnf3uef3WdfnSjfnulf32mgnmfe3Oac2GQaVeSaVGUalOZ + cmSbdGeefXSigHiqhnmohHimfXOheG6ac2OUbV2ZbmKid2qfe3CmgnengHWngHWne2ObcFibalqb + alqXaliZa1qbcl6jeWWmdVufb1WXaEiXaEiVaFSdb1uqe3Syg3uufnCneGqlc1ifblSUho6Vh5CU + iZCSiI6VhouUhImaiZahkJ2hlKaekaOdjpeajJWZjZmViZWUi5eXjpufkZ2fkZ2ei5GbiI6bjZah + kpujkqKfjp6Wi5aUiJSUiJGViZKUi6KVjKOajKafkauekaWajaGai5CXiI2OiJSOiJSUiJSSh5KZ + i5ahkp6flJ2flJ2dlKGdlKGdlJ6XjpmZjZmekp6jl6ailqWakJaUiZCMgoaLgISNg4eWjJCZjZaa + jpeWjJKdkpmflqGqoaulnqWfmZ+XkZeXkZeUjZaVjpeVkZeVkZeVjpqWkJuZlqWdmqiim6eel6OS + kZuRkJqVjJSVjJSZjI2Xi4yRh42QhoyMfX+Jen2Gfn6MhISQi46SjZGbkp2bkp2ZkaGdlaWfl6ii + mqummqahlaGhkJ2ejZqWjZqXjpufkZ+hkqGXjpaZkJeZkJ2flqOhlZ6ekpuhlZ6dkZqbjZmbjZmb + h4mVgIOWh4yhkZahlaGekp6Vi46OhIiRf4CSgIKWgIaahImWhIaWhIaZiY6bjJGhjZSfjJKbjJGa + i5CUi5KZkJebkJuXjJeXi46ajZGjlp2jlp2llZ2nl5+jl5aekpGUfnuNeHWLeXiVg4KWgoSSfoCM + c3KHbm2GcHCLdXWVf4eXgombhImVfoOXfoKXfoKVf4KVf4KQfn+Rf4CSe4OWf4ediZChjZShjZSh + jZSljo6eiIiXfn+UenuVe3qdg4KeiYOeiYOfhH2ih3+egn6afnqdd2uWcGWWd3CefniihImjhouj + h4Kbf3qWeGuUdWmUcGWUcGWVbWOSamGRbmKVcmWScGuZd3KffXqnhIKsiYiqh4aviICngHmde3Cd + e3Cif3qmg36ohHmifnOfemmdeGeadWSbd2WadWSdeGeifXijfnmqh4Kui4aqgHqjenShd2GXbliS + aVaZb1ybbm2idHOje2uogHCnfWSXblabZEqeZ02WaVWZa1eablWdcFeib1qea1aXaEeOXz+JZE6W + cFqje26rg3WsfW2md2eialCdZUyUiJGZjZaajp2ajp2XjpaWjZWdkKKfkqWilJ+ekJuXjJWXjJWZ + jJ6ViJqZjqGelKailJ+ekJuah5CdiZKajpqajpqdkpaZjpKWjJKSiI6QhomQhomRiZmVjZ2ajaGe + kaWbkp+WjZqUiJGRho6Qh5GRiJKXiZKZi5SZkJqflqGlmaWhlaGdlKGbkp+ekpuajpefkZqhkpuh + lZ6flJ2ZjpCVi4yQg4SNgIKQg4SbjpCXjJWajpebkJmflJ2hlaGjl6Ohl5+elZ2alJ2alJ2ZkJ2b + kp+Zkp6alJ+alqKbl6Ofna+in7KfmqqalaWSjY6RjI2RjI2UjpCakpeXkJWViZWRhpGOgoOLfn+J + goKNhoaSi42WjpGalZmdl5ublaGdlqKfl6efl6emmqammqailJ2djpeWjZqXjpubkJ6ajp2ViZKS + h5CXh5GejZehlaOilqWhl5+dlJubkJmajpeXhIuUgIeRh42XjZSbjZaZi5SSg4aNfoCUfnuWgH6X + goKfiYmVh4eVh4ediY2ijpKfjJKei5GbjI6XiIuUhIyWh46WiZCZjJKUiZCVi5GfkZqilJ2mkpms + mZ+mkpmhjZSXf3mQeHKQfXeXhH6Zg4OXgoKQeX6LdHmNeH2NeH2NeIKUfoiahIyahIydh4yeiI2a + hISahISUgIeVgoiUfYKVfoObhouhi5CfkJWejpSmkJKjjZCbhoiRe36Wenebf3udh4eeiIijiISj + iIShhoKdgn6hfXSZdW2bfXOfgHeliZCmi5GjiICbgHmad2uUcGWScmWUc2eScF6Na1qQbl6ObV2Q + al+Xcmeee2ulgnKsh4SuiIashnumf3Wfe3Cfe3ClgoCqh4arh3qjf3Oie3Cmf3SlgHWlgHWffWqh + fmumf3Wmf3Wog36sh4KrgH6lenilemedc1+UcFuSb1qXa1udcF+ec2ene2+mfWKddFqaZUqZZEmZ + aFebalqabViabVibalWZaFOWZ02UZEqNYkeUaE2bdGelfW+qfWunemmjblWbZ06WkJuZkp6Zjp+Z + jp+ekqGekqGdkKOajaGXjpmWjZedjJaejZeXjJqbkJ6fl6efl6edjpqbjZmVho2ZiZGXjJWbkJmZ + lJeVkJSSi42NhoiRg4CRg4CRh42Vi5GZjp+dkqOWkJmQiZKQgouRg4yOhpCNhI6Vh5CajJWdlJui + maGmnaehl6KekJufkZ2ekJubjZmXjpaZkJeel56fmZ+dlZedlZeWiY2ViIybjpWfkpmakZmZkJee + jZehkJqjlZ6ilJ2flJ2hlZ6jmqeimaabkaKdkqOWkaGZlKOdl6einayin7Kin7KbmqWRkJqVhouW + h4yWkJaZkpmblZ6WkJmZjJ6ViJqUi5WQh5GSiI6UiZCWjJKakJabkZWhlpqekqGekqGflqGflqGe + mqOhnaailp+ekpuZkpuZkpuXjpaSiZGVho2Sg4uZhoydiZChkqGomqijmqKdlJujlJadjZCXgoyV + f4mXi46ajZGdkJGXi4yRgoSQgIOZgoedhoueiJCljpabjpKViIyjkJanlJqlkZefjJKfjJCXhIiU + foCVf4KRgoSSg4aOf4KNfoCXiJCai5KijpWolZunlJqhjZSZhIKXg4CXhIiZhomVh4eUhoaVgoiU + gIeShISRg4ONeHiNeHiVfoadho2liZCliZCiiImiiImZhomVgoaSfoCQe36UfYKag4ihiY6ljZKo + lJaolJadiIuOen2Rd3KUeXSZf4CbgoOjhoalh4emhoKhgH2ffnWbenKigHWmhHmmi5anjJemi3+f + hHmjd26bb2eZc2iWcGWQa12RbV6SamGRaV+SbWKWcGWaeW2jgnWuh3+shn6qiH2lg3ijfXWfeXKn + gn+qhIKrh36rh36ognirhHqqhn2ohHulf3CmgHKngHWmf3SmgHungn2qgoCmfn2ofW6id2ibclWR + aEyXZ1Sda1iab1yfdGGld2Kld2KfaUiZY0OWaVOabVabblqbblqaaFWaaFWXaFCVZU6VZU6UZE2Z + aluic2OmeG+oenKreVyjclWajaGbjqKZlKWalaaelqeblKWdkqOakKGWkJmWkJmfjpufjpudjpql + lqKll6qjlqihkZabjJGWiIiajIyXjpmXjpmUkZWRjpKNhoaNhoaMgH+NgoCVg4SbiYuZi5abjZmW + iY2OgoaOe4KNeoCMfYSOf4eQhoyXjZSelZ+jmqWfm6WdmaKekJubjZmXjpmWjZeXjJWdkZqemqah + naijmqWhl6KdlJ6dlJ6blaGblaGZjZaZjZadjZKfkJWhkp6ekJuflqOlm6imm6ymm6ydlp+blZ6d + laWdlaWflqOon6ysn7KnmqyXlZmOjJCWiZCajZSSkp+Skp+akZuXjpmZjp+Zjp+SkJ+UkaGZkpuZ + kpuakJaakJadkZqflJ2bkaKZjp+ekp6hlaGbl6GdmaKhlaGflJ+fkZ2ekJufkJWai5CbhIyZgomO + gH6Vh4SZjZunm6qenaebmqWfkpaajZGah42ah42bjpWdkJadjZCfkJKXiYmUhoaXiZWilJ+jlaOe + kJ6akZmVjJShlJqjlp2mkZ2lkJujjZWeiJCZh4iWhIaRf3uOfXmUenmSeXiJfn2QhIOZjJCekZWd + kJSdkJSdiIudiIuhiZadhpKXi5GViI6diZKhjZaijpWbiI6Qe3SLd2+Rf4CaiImlkZqmkpumjpSe + h4yXhoeUgoORe3mNeHWQeniVf32bh4mjjpGokpWnkZSli4yXfn+McmqLcGmRdXKWenehf4Cnhoeo + iIKlhH6ifnOdeW6denWjgHulh4ymiI2qhH+og36lgHSdeW2dd2ueeG2XdWWRb1+Oa1+Sb2OXc2SZ + dGWbenKffnWmgH6rhoOui4iqh4SohHueenKhe3elf3qogICrg4OnhHSqh3emh3qmh3qrgnirgnir + hHqlfnSiem2je26lfnejfXWlfWqmfmufd1SddFGfblufblubblqidF+ld1+ld1+jc1OhcFCXbVee + c12bb1GZbU+dZ1ObZVGWbVOZb1WebVefblihb1emdFyjdWGld2KqeF2ndVufjaGikKOelKaelKab + lKOZkaGZkp6blaGekJmekJmfjpuejZqfkZ+nmaejmaqhlqedkJSajZGZjJCajZGWjpSWjpSWkZWU + jpKRh4uMgoaIgIOIgIORfXqWgn+ShoyUh42QgIaLe4CLdXqLdXqNen6QfYCNg4eXjZGhlJqnmqGh + l5+ZkJeXjZSWjJKWi5SXjJWajpehlZ6ina6ina6lmqyil6qhmaifl6edlqKZkp6ajZSZjJKWjJCb + kZWelZ+dlJ6fkKOmlqqlnayimqqblpqVkJSdjpqhkp6blZ6mn6iroq+imaadkJaWiZCWjZWimaGa + l6eVkqKVjpeWkJmZkJ2dlKGWkaGalaWel6GblZ6alZmdl5uflKKilqWdkKKZjJ6akZ6flqOflaah + lqedlp+dlp+hkp6fkZ2hkZaZiY6hiY6dhouVhouOf4SUi5emnaqlnayjm6ufkZqbjZaWjJKVi5Gd + kZqflJ2hlp2elJqajo2ZjYyXkZeel56jmqedlKGdkZ2dkZ2jlJmmlpuqlaGmkZ2jjZeijJabjI6X + iIuZhISVgICQe3mLd3SId3ONe3iSg4iZiY6ai42djZCZhoybiI6fjJWei5Sii5Keh46RgI2djJmo + kZ6jjJmZgHqMdG6IdHKUf32fkJemlp6olJahjI6Xg4ORfX2OeXeLdXOQdHCXe3iZh4ajkZCnlZam + lJWnjYybgoCUdG6NbmiSc22Wd3CfgoSihIeihoChhH+fgHebfXOafnefg3ujh4eliIiliICihn6h + hnieg3WignuignuffW2Vc2OWamKabmWadGqeeG6denWhfnmmgH+sh4aujYmnh4Omg36ffXieem6j + f3OmgHuog36mhHinhnmoh3qnhnmohHurh36sh4KqhH+ifmOfe2GjenCieW+mfmuiemihd16fdV2h + dGOhdGOdcmGfdGOdd12adFufdFyjeF+adF+Zc16dbk6dbk6faUyhak2iclqmdV2mdF6mdF6meGGn + eWKleWOjeGKqeF+qeF+djZ+fkKKelqablKOVkJ+Ujp6ZkJ2dlKGdkpmdkpmdkpmdkpmikqWnl6qi + laedkKKblJmakpeekZebjpWZjI2Uh4iWjJKUiZCRhIuNgIeHenuHenuOe3WVgnuUgIeUgIeQfYON + eoCNd3uNd3uMenuQfn+Ngn6ViYabkZehlp2jlpqekZWVjZCSi42ZiY6ai5Cdlp+im6WjobClorKh + maqelqeimaahl6WbkJmWi5SZiY6ZiY6WjpSakpeakqKZkaGXjJeekp6imaaimaaakJGUiYuXi5Ga + jZSUkp2enaemn6udlqKWiZCViI6ZkJ2jmqealaaVkKGSjJeRi5aXkZ2alJ+dlaWakqKjlZ6jlZ6f + lqGimaOilqWflKKZjZmWi5aajpqdkZ2hlaOjl6aelKWhlqehl6WdlKGhkpuekJmfkZqZi5Sai5KQ + gIiUjZmhmqanl6qnl6qhkp6djpqXjpaZkJeel6OdlqKjmqKflp6ZkZSXkJKdlp2fmZ+hmqael6Oe + lZ+flqGmkpuqlp+mmZ+ll56jkp2ejZedjZWfkJedjZKWh4yVgIONeXuLd3SMeHWXg4abh4meiYeh + jImaiImejI2fjY6fjY6hi4uhi4uSgoyZiJKllJ6hkJqehoCWfnmQdW6UeXKajIyml5eqlZWjjo6f + hoSXfn2UeXSOdG+MbWeSc22SfX2fiYmjkJamkpmukZaihouXd26JaWGObmWXd26df4KjhoijiICi + h3+hgnWdfnKafnmdgHuiiIehh4afiHuhiX2liIOmiYSri4esjIiognedd2uZc1yadF2efXSffnWh + f3eefXShfnmlgn2sjIiqiYaqhH+ifXied2med2mhfXSng3qrh3urh3usg3mrgnimgnmohHunhH+q + h4KlgGibeF+hdWeid2ilfmmhemWheWeheWefeGqfeGqbdWGbdWGZc1yXcluhcmKmd2eleWOjeGKi + dE2db0ifaUqjbU6od2Oue2iofWSofWSuf2qsfmmrfWioemWmdFyndV2XkZ2alJ+XkZqXkZqXjpuX + jpubkp2bkp2bkpqbkpqakJaakJaakqKblKOelaKakZ6ilJ2ilJ2fkJeai5KZhomXhIiViI6WiZCR + h42LgIeOgICLfX2Qgn2XiYSXhoeVg4SQeoKNeH+Md36Md36MenuOfX6SfoCZhIedjZWhkZmikpeb + jJGQiI2RiY6ZiJWfjpufl6emnq6nn6+mnq6dlqKel6OhmqOfmaKakJaWjJKWh4yXiI2SjpeZlZ6d + lp2XkZeSjJWZkpuflKKhlaOakJSSiIyRh4iVi4yWkJmXkZqdlp+ZkpuUiY2Vi46dlqKlnqqbkJuV + iZWRh4uSiIyXjpaZkJebkp2XjpmajJWekJmbjqGilaeflqGbkp2ZjpKVi46ViZKWi5SZkJ2elaKe + lKWelKWfkqailaiilqWilqWhl6Kbkp2ekZeViI6SiZSbkp2hlaOilqWflJ+ZjZmakZ6dlKGil6qe + lKailKKekJ6Wjo6akpKdlJulm6OlmaKilp+bkp+bkp+jlaGml6OlmaKjl6GikZuejZedkJSdkJSf + kpaXi46XhIuWg4mSfniOenSVf4Kbhoifi42hjI6hi42hi42ejIudi4mhhoyhhoyZg4iZg4iikpqm + lp6ijYeXg32Nem2Sf3KZh4imlJWsl5qlkJKhiIOXf3qWenOSd2+LcmeHbmOLd3CVgHqhi5KijJSq + jJSlh46Zem6LbWGIamGRc2mbenuhf4Cni4Oihn6dgnSZfnCbf3qdgHuihIejhoiliIiliIiqiYeu + jYuwjYyvjIuviXiifWuWcFqZc1yig3elhnmnhnmhf3OigHWjgnenh4Cnh4CuiYCmgnmdemqZd2ef + eW+jfXOohHmrh3uwg36vgn2lfnSngHeog4CrhoOlgGqhfWefdFybcFifd1yjel+lemenfWmne22j + eGmec2KbcF+Zc1yVb1iicF+od2WqfWuqfWuneWSjdWGhb1ejclqnemGugGewhGusgGi2hGuygGiw + fmivfWeqeVyjc1aZkJeVjJSWjJ2WjJ2ajJqbjZuekJuilJ+flJ2dkZqZjJKajZSWjZqZkJ2bkpqd + lJujl6OhlaGejpaZiZGZhomah4uVhoiVhoiSiIyJf4ORgoeUhImZjJKajZSZiJKWhpCQgIaNfoOM + fn6LfX2NeXmNeXmQe3WXg32ZiY6ejpSdjo6ShISOg4KRhoSWhpCfjpmhl6Wlm6ilmaWekp6dkZqe + kpuflqGhl6KakJGQhoeOhIiUiY2VkJ+ZlKOdlp+XkZqUiZCXjZSajpqdkZ2ZjpKSiIyZiY6bjJGb + kZebkZebkZeZjpWVi5GXjZShl6KimaOijpWXhIuUh4uWiY2akJaakJaXiJCUhIyUh42WiZCVjJaa + kZualJ2blZ6fkpaViIyQhomRh4uSi5CXkJWblZ6dlp+dkKOjlqqll6ummayimaGelZ2bkZeVi5GQ + h46VjJSXkZqblZ6dlaWakqKflaeelKallqWhkqGei5Sah5CZjI2ajY6fkpanmp6om5+ll5uVjJSV + jJSZjZubkJ6bkJ6flKKllZ2fkJedjZKai5Cei5GbiI6XhI2UgImVgoaVgoaVhoiZiYyhi5CijJGn + kZGljo6djZCai42hho6ih5CahImeiI2fkJWmlpumkZGfi4uXg4OVgICbhoumkJWqkpeokZajiYud + g4SXfXWQdW6Rd2uLcGWIbmeSeHCah4ufjJCijJGijJGagG6Mc2GIal2Nb2KaeXqlg4Smh32dfnSZ + fnCZfnCdfnSef3WlhIKlhIKjhoiniYyojIyqjY2ujYuwkI2vjYKjgneWdGSXdWWjfnurhoOqiH2n + hnqmg3CffWqjfnmog36shn6ngHmfemebd2OZcm6feHSlf32rhoOvhn+vhn+nfWmlemehfXSmgnmh + g2+fgm6jd12fc1qeclaidVqmeWinemmofWSjeF+hc16db1uZbl2XbVylc2KndWSnfWSrgGiofWun + e2qldFymdV2nd1yvfmOwgmqvgGmwgm2wgm2uf2iuf2irgGGme1yZiY6ZiY6ViZeSh5Wai56bjJ+b + kaKdkqOdkpmZjpWZiYyZiYyVjJaakZudlKGhl6WomqallqKXjZSSiI6VhouVhouUhImVhouRho6R + ho6Ui5WUi5WXjpuelaKhkaWZiZ2OgoaMf4ONg4SOhIaUf4KNeXuNfXWUg3uShomXi46bjpCRhIaM + goOOhIaSiI6XjZSflJ+hlaGhlp2ZjpWWi5aflJ+hl6WelaKhkpKajIyUiZCZjpWblKWdlaadl5uW + kZWShoeViImZjJKajZSbjJGbjJGdjpqekJuZkJeWjZWbkZWZjpKViZWZjZmhlaOhlaOlkZediZCZ + iY6fkJWfkJWbjJGWhIaRf4CUfoaahIybjJSdjZWelZ+flqGdlZqVjZKQiIuLg4aUhImZiY6WkZWa + lZmdkZ+flKKilKKllqWjl6GekpuakJaXjZSRh42QhoySiZGXjpablKOZkaGdkqOelKWil5uelJed + iIiXg4OdiIueiYyekZWmmZ2om52mmZqejIiUgn6ZhISbh4eZjJCbjpKhjZaijpeei5GZhoyag4ue + h46XhIuUgIeah4udiY2ajpqbkJufjpmikZull5milZahlJeajZGeiJCeiJCei5GdiZCfkJWjlJmm + kpajkJSbho2ahIybho2jjZWrkJmvlJ2skJKhhIedgn6We3iSeWqMc2SHaGKQcGqReHmiiImfjY6f + jY6bgm2Qd2KOcmGRdGOdenmhfn2ffnWde3OZeGude2+eg3ieg3ilgn+nhIKliIumiYynjY6qkJGu + jYuvjoyrjH+lhnmbc2mXb2Wbd3Sog4CujYmqiYaqhHCifWmfeW6lfnOngHWngHWlfWqfeGWWcGeb + dWuienqshISrh3uohHmhfWSbeF+ZdWmdeW2hfXKdeW6hcFiiclqdb1ihc1yidWSleGelel+jeV6h + cFiba1SXblSZb1Whc1yld1+qf2esgmmrf3Cqfm+nel6leFyqeVyygGOzgG2wfmqwgHCygnKvf3Sz + g3izgmmvfmWWg4mWg4mUhpSUhpSWh5mXiJqbjqGdkKKakZmZkJeZiY6XiI2WiJGbjZadlaahmaqi + lp+dkZqQhomLgISQg4mRhIuRh4uVi46ZjpWZjpWZkpublZ6fkqWjlqihjqKZh5qViImWiYuZjJKa + jZSVgoiVgoiXhoebiYuWh4yXiI2ei46VgoaQg4mRhIuOhIiVi46hlJqhlJqXkJWSi5CUjZadlp+l + lqWilKKakJSWjJCajpedkZqlmaelmaejmZ+elJqbh4mZhIedjZCdjZCakJaelJqekaOfkqWjlp2d + kJaZjJCXi46VjJaZkJqZlKOVkJ+ajpqXjJeakJadkpmelJeZjpKUhIeUhIeUh42ZjJKXjJqekqGd + kqOhlqedlZqWjpSQgIaOf4SWg4yei5SWkZWVkJSfkJehkZmbjZmfkZ2flZudkpmbkZKVi4yRgoeQ + gIaMgoiSiI6VjJSXjpaZkJqdlJ6jl5aflJKijZCdiIueiJKfiZSfjpuol6WuoaWrnqKjkY2di4ed + i3qaiHiaiImbiYudiZKhjZadjZWai5KfiYyZg4abhImdhouei5SfjJWajpebkJmjlJullZ2om5+q + naGqmp2fkJKii5CfiI2fjpuhkJ2mlp6mlp6nlJehjZGah42ah42liZCliZCrkJuukp6ukZSni42d + h4eXgoKVgHeQe3KObmKLal6McG2fg3+hjZGdiY2agHOSeWuScmWVdGibeXShfnmhfnmhfnmefnii + gnujh4KliIOliIOliIOmiYyojI6nkZGokpKrjouojIiujoSmh32he22ZdGWadGqjfXOohoOvjImv + h3Srg3Cjf2efe2Omfm6ogHCrfm+meWqbcGKXbV6ZcnKheXmoh36nhn2lfWqbdGKbcGKdcmOfc2Ki + dWShb1Ohb1OdbVWba1SbblyidGKhdV+hdV+ebVeaaVSbbU2fcFCdc1iieF2lf2uog2+rf3CofW6n + eFamd1WjeWGsgmmyh3OwhnKzhHKwgm+wgHWzg3izg3O0hHSNg4eNg4eSgo6Xh5SXiZKZi5SejZ2e + jZ2djJmZiJWah42ah42ZiJKfjpmhlqeflaabkZWUiY2Rg4CQgn+RhIiViIyVjZCWjpGZjpKZjpKa + lJqdlp2elaKflqOfkZ2ajJeVkJGVkJGekpudkZqXi5GViI6ZiZGXiJCZjI2ajY6ajZGShomMgoiM + goiRh4uUiY2akpeZkZaUjJGVjZKUjZaalJ2dkZ+bkJ6bkp2ZkJqdlJ6dlJ6il6qhlqiel6OblaGa + i5KVho2biI6ei5GXkZeel56hlKailaellp+fkZqZiYyVhoiUi5WZkJqVjZ2UjJuXjpuVjJmbkJmf + lJ2ikpqbjJSVi5GVi5GXjZSakJadlKGelaKhl6Whl6WhlJeZjJCVgIOSfoCVho2bjJSakJaWjJKX + hIubiI6Xi46bjpKfkJKfkJKXjouRiISUf4KUf4KMeX2Oe3+Qg4eUh4uZi5SekJmilZuekZebjZab + jZaZiJWbi5ejjJuqkqKmmqajl6Ofjpmbi5WdiIiahoaahIyahIyai5CdjZKWi5SXjJWai42XiIue + iI2fiY6fjpmhkJqekZefkpmmkpaqlpqomZ6snaKqm5mjlZKjjZKfiY6hjJqlkJ6qlp+qlp+rlZen + kZSeiYybh4mdiIuijZCikpqhkZmrkZCjiYiihISfgoKbf3+WenqRd2mJb2KMbWqdfXqijI6jjZCd + gnqVenOUc2iScmeZeXOff3mefnqff3udf3+ihISni42ojI6mjJCiiIyliIimiYmnjYyrkZCyjZCu + iYyvjYSnhn2le3KddGqXcGGddWWhf3enhn2shnuuh32rgmSjel2feGWlfWqqfm+ofW6meGWfcl+a + cmmheG+qg3irhHmme2ifdWKbcl6acF2dc1ihd1ydcFWbb1SablWfc1qhc16hc16hd1ybcleXaFCa + alObaEmhbU6bcl6ieGSrf3OwhHiyhHOqfWund1Ojc0+ld2SrfWqshHSvh3ezhnSvgnCwg3KvgnC2 + hnW6iXmShoyRhIuXhIuZhoyViImZjI2ajZSdkJaZjJKXi5GWiZCWiZCZiJWfjpujkqKejZ2Zi4uS + hISNgoCOg4KQhoyZjpWbkp2dlJ6ekZefkpmblJmelpullqWnmaeflqGdlJ6elZ2dlJuhlZ6ekpuX + i46ZjJCXjpmXjpmakpKZkZGajZSUh42NhouQiI2VkJGWkZKblJmXkJWZjJKWiZCWiJaXiZeWjZWW + jZWakZuakZubkp+dlKGXkKOakqadlaWakqKWiJaUhpSXgI2XgI2UjZSdlp2flaaflaaflKKajp2X + i46Uh4uWjZeZkJqUhpGUhpGVjJmbkp+bkpqflp6jlJudjZWXjJeXjJeXjJWajpealJ2blZ6flqOh + l6WjmZqbkZKWgoKSfn6Zg4ueiJCfkJWdjZKZhIeahoiZh4ibiYudjo6djo6XjIuRhoSSfn6RfX2N + eH2OeX6NfoOQgIaVho2djZWfkpmfkpmekqGbkJ6ajJWZi5SdjJaejZefkZ2ml6OejZ2djJuah5Ca + h5CZhoydiZCdiY2ei46XjJWXjJWbjJSai5Kei5Sei5SfjpmikZulkZehjZSikpWnl5qlmp6onqKq + nZ6nmpumjpadho2ZiJKhkJqmkpuqlp+rlJmnkJWeh4ybhImag4ieh4yfiY6ijJGni4eihoKhg4Od + f3+aenidfXqWenqQdHSRcHKbenufhoejiYuhhoCaf3qRd2uOdGmVdXOZeXehfnuhfnudf4KihIen + jJKrkJankZGljo6miIijhoani4eskIywkpKukJCui4ariIOrg3Wed2mbcF+ec2Kdd22ie3KqhH+w + i4augnCmemmed2Sje2mqfXCoe2+idWSidWSec2ehdWmjfXKmf3SngGehemGfdV+fdV+hc16hc16e + cFydb1uhc2Gld2SneWSld2KidVqhdFibak6ZaEyaaU+hb1WhdGioe2+ugHmwg3uyg26oemWnd1qo + eFujd2Woe2qshnCzjHe0iHSzh3OwhHOsgG+wg3S3iXqWiZCUh42XgomXgomWh4mZiYyZjpWXjZSX + jJWXjJWajp2XjJqdi56hjqKjjpqeiZWXhoeUgoONg4eWjJCflaail6ihlKehlKehlZ6flJ2hlpqh + lpqekqGhlaOfkqajlqqfl6ejm6unlqGllJ6bjJGbjJGbkp2imaOfl5qfl5qdkZqViZKUjZSSjJKX + kZeblZualZmVkJSdh5GZg42VhouWh4ySiIyRh4uWiJGZi5Sdi56biZ2WjZqSiZaaiJuaiJuSh5KN + go2UgImSf4iSh5CViZKZjZaZjZaajJWWiJGSiIyQhomZi5SZi5SOeX6Re4CShI2XiZKbkp2dlJ6f + kZqbjZaUiJSViZWakJaakJabkJuajpqbjZailJ2om52ekZKXgIaVfoOag4uhiZGikpedjZKZhomU + gISXgoeahImeiI2hi5CfjY6XhoeQgoKNf3+QeYCOeH+Oe3+RfoKRf3ubiYajlp2jlp2flqOdlKGe + lJeXjZGajY6Uh4iXi5GdkJaeiZqfi5uViZKViZKZiY6bjJGah42ZhoyXhIuXhIudiZKdiZKfjJWi + jpejjZWijJSdh5GahI6ai5ChkZailp+lmaKqnaOrnqWqkpqfiJCWf46ag5KdiJSjjpqnl52llZqn + iY6fgoebfYSfgIiehIifhomjiIOfhH+eg36dgn2bfXOZenCOenSMeHKOcnSUd3mdg4SmjI2jiH2e + g3iZe2qOcmGOcGSUdWmdeniffXqefX6oh4iojI6ukZSqjZCojI6nhoeigIKnhIOriIewkIysjIis + i3+si3+shHemfnChemWbdWGacmiddGqifXiog36siHuohHiofWmjeGSfdWKieGShc2Gfcl+ec2Kf + dGOee2ujgHCofWuleWihem+lfnOoe3OleG+lc1+lc1+lemeofmqsfmerfWWqeFusel2lcE6ZZUSb + ZE+mblimd2uufnOygoCzg4Kyf2mue2Wod16semKod2OqeGSsgG2yhnK0hnC0hnCzhnSwg3Kwg3e0 + h3qWi5SSh5CXg5GVgI6Zg4uahIyUiJGViZKWjZWWjZWbkJuZjZmdjJaejZebi5WZiJKZhoyXhIuU + h42fkpmjma6lmq+mmaull6qhl6KflqGhlJeilZmZkpmalJqbkaOil6qfmqqjnq6rlqKnkp6fkpme + kZeflqOhl6WhlaGekp6ZjZmZjZmXkZqalJ2elaKflqOZkpuQiZKWh4yUhImRhIaQg4SNgISNgISO + hIuQhoyVho2Sg4uRhIiShomXh5SXh5SRh4iLgIKOg4KViYiRh4uOhIiXi5GXi5GZiZGWh46UiZCU + iZCWh4yWh4yRen+QeX6Lfn+WiYuZkZSblJabkZeakJaViI6ViI6ZiY6bjJGhjZSdiZCfjpmikZul + lqKhkp6aiImWhIaWg4ediY2ikZuejZeZhIeVgIOVgoidiZChiZGii5KhkZaZiY6Uh4iUh4iWf4SS + e4CQfYORfoSRfoKZhomjkp2mlZ+hmqGel56jlZ6bjZaeiYmXg4OZhomdiY2ZiZGXiJCbiJGbiJGb + iJGhjZaijpWei5Gag4uag4uXhIibiIyhiZGjjJSdjZKZiY6UgISWg4eVh5CajJWilKKml6awoq6s + nqqvmaGijJSbhoiWgIOUfoadh46nkJ2nkJ2miJCegIihe3meeXeaf3qhhoCdiIKdiIKegoKdgICb + e3WVdW+IdWiLeGqNc26SeHOif36nhIOmh32ig3mafWuVeGeRcmKQcGGZeG2de3Cbf3ijh3+ni4eq + jYmrjo6qjY2nhIKlgn+og4Kog4KnhH+ohoCvjIewjYiuiHmog3Sjfm2eeWiedWuddGqfdXOnfXqs + g3quhHuvg22ne2WhdV2leWGld2SjdWOdd1+Zc1ydeGelf26mfXOnfnSmfnqogH2ugnWqfnKneWSo + emWof3eof3evf3SwgHWuf2irfWWndWSfbl2hak2hak2jb2OueW2vgHuzhH+wgm2vgGuue2GwfmOu + e2Ood16seme0gm63h3ezg3Owg3KyhHO2hnq0hHmZjZmZjZmXiZeUhpSRgoeSg4iNhoiUjI6XkJ+Z + kaGbjZudjp2ajJWbjZaXiZKWiJGbh5Kbh5KXiZWhkp6fkqajlqqqoa6mnaqhl6KimaOelJqdkpmf + kpSfkpSakZujmqWmn6uooq6qlaaolKWflqGakZuel6GhmqOhlaOdkZ+WjpSWjpSfjp6ikaGjnaah + mqObkJuSh5KQhoeQhoeRg4OOgICHeHqHeHqLe4CLe4CUeX+UeX+MeHqSfoCVhouZiY6RhoSQhIOS + hoebjpCVi46UiY2ZiYyXiIuVhoiZiYyXi4yajY6biIyah4uUf3mSfniOgICWiIibjpKekZWdjZKa + i5CWh4yWh4yZg4uahIyZiY6bjJGfjpuikZ6ikaGikaGajZGViIyUh4ibjpCekJuekJuahoaXg4OV + goaah4uZiJKejZehkpuekJmdkJafkpmhho6ZfoeQgIiRgomOf4KUhIefi5alkJunmaKllp+ijpeb + iJGQgn+Rg4Cdg4SehIadi4yaiImfhI2ih5Chi5WmkJqmkpujkJmXgoSVf4KUgn6Zh4Obh4eeiYmf + iYeXgn+SfXqUfnuNgIeViI6hkJ2nlqOsnqysnqywnaalkZqhh4aZf36OeniWgn+eiJChi5Kdhoub + hImef3WZenCZfX2egoKliIiihoaihISfgoKee3eVc26Qc2KRdGORc2eSdGiee3elgn2jiICfhH2d + gnObgHKQc12LbliZdWqhfXKegnqdgHmhg4OrjY2zkI6wjYysiYSohoCmg4Clgn+mg36nhH+siYev + jImsi36qiHulgHSifnKje26heWuecmmleG+qgHewh32yhnSsgG+ne2OofWSof3WnfnSje2ufeGie + eGOie2eje2unf2+mgHush4KyhnSrf26rfWqoemiuf3iyg3uyhHuwg3qshnCogm2ogmimf2Wsd1Gj + bkmja16udWirf3OwhHiwhG6whG6yg26yg26zgG+semmreWGyf2eyhnSyhnSzh3qzh3qzg3OygnKV + i5uUiZqXiZeUhpSOf4KSg4aVi5GelJqflaaakKGUiJGSh5CWiJGZi5SViZKWi5Sbi5edjJmbjZaf + kZqjl6Gonaanoaqlnqemmqilmaeml6OjlaGljZKljZKikpqrm6Oon6yroq+nmaKjlZ6dkZ2bkJue + lZ2elZ2hkpudjpedkJSdkJSakZuflqGjn6uhnaimkZ2ahpGZjJCZjJCWiY2RhIiIenqHeXmLfX2I + enqIeXuIeXuIeXuSg4aai42ejpGViIyUh4uWi5SajpedlJ6ZkJqekZKajY6ekZWhlJeekZWbjpKW + iY2Uh4uQe3uSfn6Vf4edh46bjpKZjJCdjZWZiZGRh42OhIuXgIadhoudkJafkpmekaOekaOmkKWl + jqOjkJmfjJWai42djZCdkZqdkZqbjYuUhoObhImii5CakJabkZeilp+flJ2jlJullZ2ijpediZKU + h4uRhIiWgoSWgoSai5KfkJeilZuhlJqajZSWiZCZhIeZhIedh4meiIuajouajouZhIeeiYyjkJmm + kpuijJSeiJCQfn+Qfn+SfoCWgoSbh4mdiIufhH2dgnqafnqWeneOenqVgICbh5KhjJemkaKvmquq + maajkp+dg4KZf36SeHOUeXSWf4SfiI2hho6hho6ign6ZeXWbfoChg4amjJCli46jiIShhoKZgnWS + e2+VemuUeWqWdWqScmeaeXCjgnmmi4ejiISmi3+ih3uhgHCZeWmdfXqign+nhIKlgn+jgH+qh4av + i5Cvi5Cwi4irhoOjgHulgn2if3qjgHuhhoKliYami3+jiH2ng3qlgHile3Wle3WjenSfd3Cje26s + hHeyhHuyhHusgG2sgG2rfnmugHusg3qqgHiqd2iseWqmemmofWuqhHWsh3iwg3KugG+qe2mrfWqv + gHizhHuuh32viH6vi3+uiX6yhnSwhHOugGSoe1+ld1+neWKsgHSvg3euhniyiXu2iH+0h360hHSv + f2+qfWGvgmWohnWvjHu0jYK4kYa4i3uyhHWUiJSRhpGOg4yMgImSg4uVho2XiZWhkp6dkZ2Wi5aV + houWh4yVh5KbjZmekJ6hkqGbkJuXjJeZiZGdjZWflqGjmqWjmqWjmqWnmaWnmaWmlqqikqajjZWi + jJSflJ2mmqOom66rnrCmnaWelZ2ajpedkZqfkJefkJefkpmdkJaakJSakJSdkpajmZ2roq+mnaqj + lJuejpaflJ+hlaGakJaVi5GUgISQfYCLe36MfX+VgIORfX+LgISUiY2bjZadjpeXiZKUho6Sh5KZ + jZmekaWekaWZlZ6VkZqdlKGelaKdlZqWjpSQhomUiY2Uh42RhIuViI6ajZSbjZaekJmbjZmUhpGR + ho6UiJGbho2ijJSilJ2hkpuajZ+ajZ+njqGokKKhjJqhjJqijpWfjJKajpedkZqejpGZiYybho2f + iZGekZefkpmhlp2flZullJ6nlqGlkJuhjJeah42ZhoyXgoeVf4SfkJWfkJWfkJWejpSZho6Sf4iW + gIadh4yeiJKeiJKai5Cai5CXjIiajoullJ6mlZ+hi5KXgomOeniNeXeRen+XgIaahImahImfh4Ke + hoCXgoSWgIOUe3eVfXiVf4Kdh4mjkJmrl6GqlJ6okp2lg4eaeX2UeXWSeHSRen+VfoOdgoibgIed + gIOafoCZf4OfhomljZKljZKnjIihhoKeg3ubgHmXe3SVeXKVd22SdGqaenSjg32vjY6vjY6rjoen + i4OmhoKff3uigIKmhIani4eliISigHilg3qqjIysjo6wjI6qhoimhHiigHSefXKffnOee3mif32r + h3urh3uohHmmgnehfXChfXChe3ebd3KidWmoe2+vgHmwgnqvg3eugnWqg3uviICyiH6vhnuvf3Kr + e26leWiofWurg3Ovh3evg3KugnCqe2eoemWuf3evgHiuh3+viICwh4Cwh4Cwh32uhHqrfm+ugHKs + gG2rf2urf3Cvg3SugHuyhH+3iYK2iICziHSsgm6neWKrfWWvh3m2jX+2ko23lI67kYu2jIaUgIeR + foSOf4eRgomVg5aaiJuejZqejZqZiZGVho2XhI2ah5Cdh5umkKWllaejlKajlJuai5KZhombiIye + kp6flJ+elaKelaKhl6Wjmqejl6ahlaOijpeijpeekp6lmaWrnrKrnrKnnaOelJqejpSbjJGjkJmi + jpedkZqZjZaXjZGakJSflZmmm5+oobCmnq6hl5+flp6umaqvmqujmZ+bkZeah42ZhoyVh5KUhpGa + hoiXg4aUhpGbjZmekp6dkZ2dkJSWiY2Zi5SbjZaelKWjmaqfl6ielqefmaWjnaihlZ6Wi5SVhoiX + iIuViI6WiZCXjJWajpefjp6ejZ2bi5qXh5aWiZCWiZCdiJSijZmilqWhlaOijZmijZmhjJqlkJ6i + kZ6ikZ6okZ6ljZqXi5GZjJKZiY6ai5CbiJGdiZKZjZabkJmbkJuflJ+olKWqlaaikqWdjZ+ijZmX + g46XgIaVfoOai5KdjZWfiZGdh46SfYKQen+Wf4Sdhoueh46hiZGhiY6dhouaiIeZh4ahjJemkZ2e + h46UfYSLcnOQd3iVe3+Zf4ObhoabhoaeiI2eiI2dhpCag42XfXiVenWSeXiXfn2ei5GjkJanlJen + lJewiYymf4KafX2VeHiRdXqQdHmafX+df4KegIOdf4KbgImjiJGojZSmi5Glh4eniYmnh4OmhoKd + gHuafnmVeXSQdG+ZfnqfhICsjo6vkZGsjo6sjo6rjpGni42niYmmiIiokIenjoajgG6ee2mjg4Cr + i4isi4yriYusiH2ohHmmgHKhe22jd2+hdG2mfnCogHOohnWohnWlf26he2qddWied2mjd2ileGmr + fnKwg3eyhnewhHWqh3eui3qyiH6vhnuwg3evgnWofWmqfmqogHCshHSuhniuhnireGKndF6nenOs + f3ivhn2wh360i4KziYC2iXqvg3SoemWqe2eofXCjeGurfWq0hnO0h3+3iYK3i36zh3qvgGmqe2So + dV+uemSwg3q7jYS2lJW6l5m/lY67kYuNe3iNe3iNfoCUhIeZiJWdjJmekJufkZ2bjJSXiJCVhouZ + iY6ekJ6jlaOjlaOhkqGijJSahIyXgomahIybi5Wbi5WdjpehkpuhlKailaelmaemmqill56hlJqf + lKKlmaern6uqnqqmmZqhlJWfkJeejpadkpmelJqdlJudlJuekpubkJmflp6lm6Omnq6mnq6imaam + naqvoaqsnqelnZ+fl5qhlJeekZWhkp6ekJufjJCah4uUiJGViZKZlJealZmejIiZh4OXiYeekI2e + lZ+hl6KilqKjl6Omnaqmnaqhl5+Ui5KUhIeUhIeShJCUhpGai52ikqWnkp6ijZmfiZGfiZGUh4uW + iY2ZiZujlKanl5+hkZmeiYyahoiai5KdjZWhkJ+ikaGqlp2ijpWXhIuZhoyZg4ubho2ahIyZg4uX + jJeXjJeXiZWdjpqjkqKikaGlmquhlqelkZeZhoyVfoOVfoOVgouah5Cdh4mahIeRfX2Qe3uZf4Of + homhho6ih5Chh4uehIiahISfiYmhi42ijI6ahn6NeXKJcG+NdHOVeXudgIOfhoehh4ifjJKhjZSh + kJqbi5WZg4CSfXqJdW6Qe3SRhIiWiY2ijJSmkJeskIyliISehoCZgHuVd22OcGeWdXeffn+fg4ad + gIOeg4mhhoyljIeji4alhIKnh4SuiIOsh4Klg3iigHWaf3SXfXKWenedgH2ni5CukZavkJevkJeu + kJqylJ6vlZmyl5u0mpuvlZasi36de2+deHOjfnmmhoOoiIauiIOrhoCnhHSffW2ac2WWb2KZd2ei + f2+og2+og2+qfm2jeGeeb2KfcGOZc2ibdWqfd22qgHeshHSqgnKogHOrg3Wof3Wrgni0hHSwgHCu + emeqd2Omem6ugnWuh3uuh3uqeFuhb1Ohc2GneWesf3qyhH+yh4S0iYe3iX2yhHiweWSrdF+hdWSf + dGOneGiygnKzg3i3h3u2h3Kyg26wfmGsel2sc1+udGGvgn24i4a3jZG/lZnFlZTBkZCQhIONgoCM + gH+RhoSXiZKbjZaekqGbkJ6hjZadiZKWiJGXiZKZjZahlZ6fkqWbjqGdiZCZhoyWgIuZg42Zhomb + iIyZiZGbjJSfi5aolJ+lmaWonaijmZ+elJqflKKlmaemmqimmqiml6GjlZ6flZuflZudlp2blZue + kqGekqGdlqKfmaWhmaimnq6on6yqoa6onq+sorOvo6+soayooqilnqWhl5+elZ2hmZ6hmZ6llZqe + jpSUjI6RiYyWjpSakpeekJCZi4uXiYmbjY2akZ6elaKflKKlmaenna6jmaqfmZ+UjZSQhIOOg4KN + foOSg4iWhpChkJqmlp6ejpafjJKfjJKWiY2ViIyZi5SfkZqjlJafkJKfi4uZhISZhombiIyeiZWl + kJuhlJeekZWZg4CXgn+Vf4SXgoeXgoyWgIuShoyShoyah5Cei5SdjJafjpmjmqWimaOilJ2ekJmX + hoeSgIKWhIabiYudh4SahIKQeniQeniZfYKihouhi42dh4mag4iZgoeahISeiIijiYiiiIeWfnWJ + cmmIb3COdXeafYelh5Glh46ihIyei46jkJSikpehkZaiiImZf4CLd2+MeHCJen2QgIObhpCjjZem + iYyliIuiiIyZf4OReG2Mc2iVdXKaenebh4CeiYOdh4meiIuhh4ifhoelgoCnhIOwi4iuiIanhn2j + gnmefXCbem6WdHKdeninjJKwlZuzlZ2wkpqzlZ20lp6wlZGylpK3nZuwlpWwi4amgHufemuhe22h + fnmjgHumg4Kqh4anhHSffW2bd2ORbVqSbl2adWSifnOlgHWqfXCmeW2fdGOZbl2Sb2OWc2edcmWh + dWmne22rf3CofWerf2mqfmqugm60hHevf3KueF6lb1afc2Soe22qgnSshHeoemOhc1yeaVOmcFqn + eGiwgHCwh36yiH+0iXWyh3OzgmmqeWGmdV2iclqhcmSqem2yhH+2iIOzh3Czh3Cwf2evfmWvemuq + dWevgn24i4a0jIu6kZC+jo27jIuRhIuNgIeQfYOZhoyXjJWdkZqbkaKZjp+fjpuaiZaRhIuViI6e + jZehkJqbjZmWiJSUh4uRhIiVgoaVgoaXhoeUgoOWf4eeh46ejpajlJunmaernauhl6KdlJ6flKKj + l6almaemmqinmqymmaummqinm6qinaGfmp6hlaGflJ+bmaeem6qimaannquqoa6qoa6qo6+qo6+y + pauzpqyrpa6noaqfm6eemqahmqael6OjlZ6ekJmdjZCbjI6bjpWhlJqelZ2WjZWZiY6XiI2XiZWb + jZmfjpullKGqmqyomaublaGVjpqSh4OQhICQe3mUf32XhIujkJafmp6ZlJehlJqhlJqUi4mOhoSb + iIyijpKikpeejpSfi4udiIiahIeZg4abhpCljpmhkZSdjZCagH+Xfn2WgH6Vf32Uf3+Sfn6Ren+R + en+Vf4SbhoubiJGhjZajlaGomqail56akJaWfX6WfX6Vg3+aiISeiIudh4mWgnuSfniWf4ShiY6h + jI6ahoiagISXfoKahIShi4uojpKli46WgnuOenSLcG2QdXKbfoioi5Whho6fhI2fi4umkZGlkZWm + kpamkZSbh4mVenWNc26JdHKOeXeXfYOih42hi4uijIyijIyZg4OVeneNc2+Sd2+ZfXWfh4KljIei + iImjiYufhoedg4SdgH2hhICsi46zkZWojIeliIOognieeG6ScG+UcnClhpCsjZeukZGukZGylZq0 + l52zlZWzlZWwmpqwmpq0joyuiIaie2ebdWGZeG2ffnOjfnuqhIKnfnSmfXOfe2WSb1qRaFOUalWZ + cGiedW2leGuleGufdGGab1yWa1aUaVSUaVSXbVeidF+oemWoeF2oeF2reWiwfm2zg3Wvf3Kre1qe + b06hc1yqe2Sqfm2ugnCue2ilc1+jblWibVSjc1uqeWG0h36yhHuwhG60iHKwgmquf2iseWWreGSo + d2WndWSvgnq3iYK0jHmvh3SwgHCufm6sf26rfm2wg366jIe2kIu0jomziYCziYCRg4yShI2WgIiZ + g4ubi5edjJmajaGajaGhjJeahpGSgoyVhI6Zi5SajJWdh5GahI6XhIiSf4OLf36Lf36XgIaZgoed + goujiJGfkZqhkpujlaOjlaOflJ+ekp6fkZqhkpulmaemmqimnaqroq+rn66onaumm6Khlp2ekJme + kJmfl6ehmaimmaunmqyqoa6qoa6upbKqoa6vpq6vpq6rpbCooq6ml6ajlaOim6Wim6WnmqGll56h + lJqdkJaekJmhkpufmaWZkp6djZWXiJCbiI6fjJKdjZWhkZmol6esm6uml6afkZ+ZjI2WiYuZhH6Q + e3WShISbjY2blZuhmqGnlqGnlqGZjpCQhoeZiZGdjZWekZedkJaeiI2dh4ybho2Zg4uih5CnjJWo + kZmnkJedh4ydh4yXgoeWgIaafoCUeHqVfXiUe3eSfYKVf4SXgoedh4yii5emjpull56bjpWXfoKV + e3+Qgn2UhoChi5WeiJKei46ZhomXgIaii5CfiZGeiJCjhoidf4Kfg4amiYyrkJmnjJWahIyQeoKV + eXmWenqbgIehhoyii5CfiI2biYiikI6lkI2ijYuhjpCbiYubf3+UeHiRdHeOcnSQdHebf4Kli4yo + jpCmjI2fhoeWen2RdXiQdHCXe3ijiYurkZKojo2mjIumiIuihIejh4Kfg36ihoaukZG0lJGvjoys + h4KifXiWdW2ObmWfe36rh4mrkZWulJewlJmwlJmzkZWzkZWvkpe2mZ64l5WsjImng3eeem6VdGiX + d2qfe3Ojf3emfnCiem2heWeUbVuSaFCRZ0+WaVedb12idGKhc2GmeGOhc16Xa06UaEqXZ0+ebVWh + c1ymeGGnd1yoeF2meGOoemWvg3SsgHKhe1ubd1aec2KmemmsgHKsgHKugG+oe2qmdF6hb1qmdF6u + e2WyhnSzh3Wvg2+whHCugnCsgG+re3Cre3CreGureGune2qvg3K0iHmyhnezh3qvg3esg3mrgniy + iIK4joi3jou0jIiygHmwf3iShomUh4uXgoyXgoydh46eiJCekqGajp2bjZmajJeVh5CVh5CWi5SV + iZKZhJCVgIyRfoKQfYCOf4KSg4aZg4udh46biJGdiZKZi5SekJmfkZ+ekJ6ejZefjpmjkJmijpej + laGrnaiqoa6on6ynna6mm6yml6GfkZqdjZWdjZWhkaOmlqillaimlqqmmaunmqyvn7Kvn7KopbCq + prKupbKnnquolZ6lkZqjl6Gjl6Gilp+flJ2llZ2jlJujlZ6omqOlm6ielaKhkpuajJWZi5SajJWZ + jZabkJmjl6ammqionaummqiel56VjpWXfoKVe3+Vg4SbiYuflJ2mmqOrmqWmlZ+akJSRh4uXi5GX + i5Gdl5mdl5mbjJGai5CUh42ViI6ahI6jjZeikpqjlJuhkJ2fjpuhiZuii52XgoeRe4CXg4OXg4OU + f4KXg4aUgoCVg4KXiJCfkJehkZmejpabhoiWgIOUfoObhoudjJmjkp+mjpaii5KfiI2ii5CdiZCd + iZCjh4yfg4iahIyhi5KnkZuijJaZgI2Ue4idf4eegIidh4mhi42hiY6fiI2ijIyjjY2mjIunjYyh + jIyijY2dgIaXe4CUd3mUd3mNc2+SeHSni4erjouoi42jhoiaeHWXdXOVeXmZfX2mjJCwlpqvlZas + kpSriYumhIalh4eegICliIiskJCylZWukZGvi3+qhnqffW2WdGSfgHeniH6ukZSukZSylJawkpWy + jZK0kJWzkZe2lJqzlpuvkpezjYiog36heWubdGeadGmdd2ulemefdWKhdV2ab1eaaFOWZE+UY0ya + aVGhb1eicFimcFqoc1yicFabalCZaU+eblSmdGOreWild2KmeGOld1+qe2Swg3eugHSofmOlel+d + dGqheG6sgn+rgH6wgHWufnOqe2moemiqemqwgHCyhne2iXq3iXqzhneugnOrf3Cqfm+rf3Crfm2q + fWuoeWuygnSyiH+0i4K2iIO3iYS0h36wg3qyg3q8jYS4i4O6jIS0hHSsfW2Vho2ZiZGah5CXhI2a + h5Cah5CeiZWeiZWejZ2ZiJeZi5SXiZKZhJCXg46VgouVgouRfoKRfoKXgoydh5GdiJSfi5aZi5SX + iZKdhpKfiJWii5qii5qhjJeijZmmjZqmjZqllaerm66snqqqm6ennqiimaOjlZ6fkZqhjZahjZah + kpuilJ2ikqWikqWmlKenlaiumaqwm6yupa+so66rn6uqnqqnl52ikpeilKKllqWelZ+hl6Kol6Kj + kp2jlaOrnaurnrCmmaullKOfjp6hkJ2hkJ2ekJuhkp6lmaWmmqanmq6om6+qoauhl6KVhI6RgIua + hIyhi5KelZ2lm6OqnqehlZ6fkJKWh4mbjI6ejpGnmqGll56ejpSai5CXhIuZhoydiZKfjJWhkJ2i + kZ6nl6qmlqinlaijkaWbiIyWg4eXhIibiIybiYuaiImXgoKZg4OXiIudjZChjZGfjJChhoyhhoya + g4ihiY6fjpumlaKrlJ6nkJqliZCjiI6ah4uZhomei46ah4uahIyfiZGnkZmhi5KZgomWf4eag4id + houdiIieiYmeiI2hi5Cmi5GojZSnjJKmi5GijIyjjY2hhImegoeZg4ORe3uReXONdW+if36riIeq + iIylg4ebenKXd26bf3qihoCoi5KwkpqvlZmwlpqsi4yqiImliYabgH2hh4amjIuwlJawlJa0kY6s + iYelfW+bdGeZeXWff3uojIyskJCylJSylJSzkI6zkI6ykJa2lJq3mZ6ylJmujI2riYusf3OleGuf + dGGhdWKmemSjeGKecliablWeaFSXYk6UZE2XaFCeclihdFuodFWseFindVufblSbalOhb1ereGuv + e2+qem2neGqleGmnemuvgnWyhHirfWWrfWWieW+le3Kug4Csgn+yfm2uemmoemWneWSrfnKyhHi0 + jYa4kYm6kIe0i4K2iXqugnOsgGisgGiqf2uqf2uqe3Owgnm2iIO7jYi3jo24kI64i4Kzhn2ugnC4 + jHq3jYO3jYO2iHevgnCbh5Kbh5KZiJWWhpKVhI6VhI6WgJWdh5uXiJqVhpeXh5SWhpKbg5mdhJqa + hI6Zg42XhIuWg4meiZefi5mdjpqekJuajZSXi5GXhIuah42hjZadiZKhkJ+hkJ+hkJ+ikaGmlaKo + l6Wml6allqWml6ajlaOilqWdkZ+fkpmdkJaekZWekZWfkJehkZmjkp+llKGmlaKsm6isoa+vo7Ks + nqeqm6WikpWbjI6jjpqlkJubkJuekp6nkp6nkp6hlKaom66om7KqnbOqmqyllaejl6ajl6aekp6e + kp6fmaWlnqqqmqyomauuoaeom6KhkpuZi5SbjJSdjZWekp6lmaWsm6anlqGjjo6diIiaiImjkZKq + maOqmaOmkZGbh4edhouag4ibjJSejpalkJurlqKqnbCrnrKqm6qilKKfiZShi5WhjZaijpefjJWX + hI2SfXqUfnubh4efi4uhjZafjJWfiJefiJeeg4mdgoiei5GlkZeqkZ6okJ2ijI6dh4mXg4aahoia + h4uZhombh4mfi42jjpGfi42ahIeXgoShi5WnkZujkJSfjJChi5CljpSmjpmqkp2rkJaih42jiI6j + iI6liZKih5CeiI2Vf4SVgnuVgnuhg4irjZKrjo6hhISef3ObfXCihoani4ujjZKokpe0lp60lp6r + jZKoi5CjiIShhoKih4OnjIiukpu0maKzlJuvkJerg4KddXSWdXeaeXqfgoSqjI6vkZasjpSyjZCz + jpGvjY6ykJGyjZKzjpSyjImwi4isg3mmfXOieF+hd16leFyhdFibb1Sbb1SdbVCZaU2XblGZb1Of + c2Kjd2Wnel6qfWGod1ymdFqmb1umb1undGWyfm+qem2oeWumem6qfnKsg3mrgnirf2usgG2rfm+u + gHKrgnmrgnmyg3CsfmuoeF+oeF+qfm+whHWykY62lZK8lpG3kYy0i4Kwh36uf2qsfmmofWmofWmn + fWmug2+yhH24i4O3jYe4joi0h3WugG+sfW2zg3OyhH24i4O6jHq3iXiZi5aajJeXjJqSh5WSgo6U + g5CVhJSWhpWUhpGUhpGUhIyUhIyahpGeiZWZiJWWhpKZho6diZKfkZ2fkZ2bkJubkJuZiY6VhouU + hImWh4ybi5WejZehlaOflKKhkp6ekJuljpmqlJ6llJ6llJ6imaGimaGilqWekqGakZmZkJefkJWe + jpSejZehkJqjkp+jkp+nlqOrmqeqna+uobOwoquqm6WjlJabjI6hi5KjjZWbjpWekZemkJemkJeh + kqGllqWnna+nna+qm6Wml6Glm6ijmqeimaahl6Welqafl6ejlqqqnbCwoq6un6unmaejlaOekJ6e + kJ6jlaGomqawm6qrlqWnkJeii5KeiJCmkJermqqqmainlZadi4ybh4mfi42ijpWei5GjkJmsmaKr + nrCsn7KrlqKnkp6liZKmi5Sqkp+qkp+jjpqahpGWf4SUfYKeiIihi4uljZeii5Wfi5afi5ahh4uZ + f4Obh4mjjpGnkJeokZmijIyfiYmbf3+egoKehIObgoCeiI2dh4yfiYmijIyahISXgoKeh46slZ2r + lZ2jjZWmkJKokpWnkJeulp6vkZmjho2ihImihImih5Cih5CeiJKbhpCeiIuXgoShhImrjpSskpSl + i4yhhH2fg3uni5CskJWqjpWskZezlZ22l5+qjpWnjJKmiI2lh4ymiYmni4uukJezlZ2wlJmylZqs + iYSffXiad26beG+igIKujI2zlJ6ykp2wjpCujI2ujYuvjoyyjIu0jo2zjI6viIuvh4Oqgn6lf3Cj + fm+ieGKhd2Gicleicleiclqfb1efdF6jeGKnenKqfXSrfWirfWiufVuoeFamdV2ldFyjdWGqe2er + fWqsfmuoeWuqem2ofXCqfnKrfnKugHSqe2eqe2eugHKzhnewg3Ksf26od1qlc1aleGurfnKyjIe2 + kIu7ko66kY23hn+2hH62g3KvfWureWisemmnfWSqf2euhH62jIa7jYS4i4K3g3KseWimd2eoeWmq + e3OzhHu3h3e3h3eVh5KZi5aWiZ2ViJuWhpWWhpWUhpGShJCSgoyUg42UhImWh4ybi5qdjJuZiZua + i52ejJ+ejJ+bkJudkZ2dkpaZjpKWh4ySg4iVf4ebho2fjJWjkJmimqqfl6efkpmekZeejpSllZqo + lKKrlqWmmqajl6Ojl6OhlaGhl6KelZ+ekp6ekp6fkZ+hkqGjkp+llKGlm6ijmqemlqirm66snqyo + mqihkZaejpSljpamkJefkJKhkZSokZaljZKijZmlkJunnqumnaqlm6ilm6immaummauim6ehmqaf + lKKhlaOnlqaunayunrKsnbCnlainlaillqKilJ+qkp+wmaarmqenlqOljpafiZGfiZSnkZuolqqr + mayilp+ajpeejpaikpqnkZuhi5WhkJqrmqWqnqqonairlZ+nkZuljJmnjpuqlJ6okp2ikJGdi4yX + fn2Xfn2ihoajh4eljZWnkJeijZmhjJeli4mbgoCdg4enjZGmjpaokZmljpGijI6jgoOjgoOlg4Sn + hoehjIydiIiehIahh4ibg36bg36eh46rlJurl56nlJqmjpSnkJWojZaylp+wkpqoi5KihoadgICe + g4mfhIubhJGeh5Shho6eg4yhg4uniZGskJKni42ih4Kih4KrjZeukJqylJuylJu0maKzl6GskpSs + kpSniYylh4mlh4mmiIusjZevkJqzlZq0lpuvjoijg32heG6ddGqbfoCniYywkZu0lZ+wkI2ri4ir + iIaqh4Srh4mqhoiuiIerhoSuhoKrg3+ogHCnf2+oemOneWKmdFqmdFqndGGreGSqemqufm6ugHiw + g3qzhnevgnOwf2eremKrelqldFSleFyoe1+sfmmvgGuzenKvd26odWeodWeoeWmre2une2ine2io + fXCugnWvg3KsgG+ye1+mcFWhc1yjdV6wg3u6jIS+kpK+kpK+iX23g3e6hHi3gnWyemiveGWoemWo + emWuf3e3iH+4jHq0iHezf2muemSmdF6mdF6meGWoemiyg263iHOWgo2diJSZjJ+ajaGaiZaVhJGR + g4yMfoeRfYiUf4uXh5GejZefkKKejqGdkKKdkKKmkaKijZ6hiZmii5qbjpWXi5GWh4yVhouXgoeZ + g4ieiJKjjZeflKKflKKfkpadkJShjZajkJmolKKqlaOilqWlmaeimaahl6Wmlqinl6qnm6qjl6af + maWblaGllqWllqWll6qll6qnl66oma+umaWqlaGfkJeikpqnkZumkJqdkpSdkpSjkJahjZShjZGi + jpKilZmmmZ2mmqajl6Oomqiqm6qmnaqjmqehlaOekqGnlqGsm6ammayll6umlqqqmq6nl6qnl6qq + m6eun6ummqahlaGolZ6jkJmhkpunmaKmlaWol6eilJ+hkp6llqKnmaWsl6OjjpqikZ6unaqvnqiq + maOmkJeljpajkJmlkZqrlJurlJuijZCeiYyag4iag4ihiY6jjJGnlJ2mkpuikpqhkZmijImdh4Sd + iIunkpWolJ+mkZ2okZunkJqjhouihImfiI2ii5CmkJeijJSfiYyfiYybhoieiIumiJWylKGwmaGu + lp6qkJSojpKmjparlJuwlZunjJKdgHuZfXiSfX2WgICVgIOZhIebhImdhoufhIumi5GojpKli46j + jJGjjJGojJ2wlKWzlqWzlqW3m6e2mqawm56rlpmoi42lh4mohoSmg4KmjJCojpKzkJm3lJ23kpWu + iYyognqie3SfgoSlh4msjpSvkZasjImqiYeviICqg3umfn2je3qog4Cngn+rhH2uh3+whHiugnWv + fWSsemKod1yndVuleWWqfmqsgHKvg3SyiH+ziYC6jH+2iHuyg26uf2qwe1urd1asel2zgGOvgnCy + hHO0gHKreGmjc1iiclemdFyod16mc12reGKsemewfmqyf26yf26wfmindV+jdFOfcE+oenK3iH+/ + jo3FlJLBjIK7h323g3Szf3C6g2uveWKoeF+remKvgG60hnO0jHm0jHm0hnCrfWiremKnd16wfmqz + gG22hnW2hnWVgIydiJSbjJ6bjJ6bh5KXg46SfoyRfYuQf4mRgIuZi5aekJujlaOjlaOflJ+flJ+h + lZ6dkZqfjJWfjJWekZeZjJKXhIuVgoiWhIaXhoeXiJCdjZWhkJqhkJqhjZabiJGhi5WljpmilJ2j + lZ6jl6Gilp+ilqWlmaeil6qjmauooq6lnqqjl6aflKKmlKehjqKikaGllKOjlKaikqWqlp+nlJ2d + kpmhlp2llqKllqKimaGimaGmlZ+hkJqdkJSdkJSfkJWllZqflJ2hlZ6hlaGilqKmmauom66lm6ie + laKilqKlmaWrmqqrmqqvma6vma6omayrm6+un66voa+mmZ+jlp2mlZ+llJ6hlaOmmqiol6Wjkp+l + kJ6mkZ+qlaaumaqwm6emkZ2ikZ6unaqznqyumaeskZqojZaljpaljpaqlJmnkZaeiI2bhouZg42a + hI6hiZamjpumlZ+llJ6mkpulkZqii5Cdhouii5KokZmsl6aumaerlKGqkp+sjpalh46hi5Kljpar + lZ+qlJ6mkJWijJGfiYyfiYyliZWrkJuzlZ+0lqGskpanjZGnkJWslZqslpumkJWmg4KffXuUeXSQ + dXCWe3idgn6Zg4Cdh4SiiIyli46ijJGhi5CljZWljZWojJqukZ+zlqW0l6aymaawl6Wvl52ulpus + jo6jhoafg4OZfX2fg4aliIuojJGwlJmwlJarjpGqg4ajfX+bfn6lh4eujI2vjY6sjIioiISnhn2j + gnmie3KhenClf3qjfnmnfnSqgHergnirgnivfmOse2Goe2KnemGsfW2vf2+vf3K0hHe2jIO3jYS4 + jH+2iX22h3Kuf2qzfWGye1+wfmO0gme2gni7h324iHiufm6jdFOZakmda1Ghb1WqclqyeWGvfmWz + gmmwhG6yhm+zgG2vfWmveV+oc1qseW+4hHq8jYbDlIy+iX+6hnu2hnW0hHS3hG6yf2mzel+udVus + f3C2iHm0jH6yiXuwgm+uf22vfWereWOwgnmwgnm3jIm8kY6Wgo2diJSbh5WahpSXg46Wgo2Rg5GR + g5GUhpGZi5abjJ6ejqGhkqGjlaOllJ6mlZ+hlZ6ekpuajZSZjJKei5Sei5SXhIuVgoiWgIaZg4ia + h5CfjJWbjpKZjJCbiI6Zhoyah42hjZSekZehlJqjlZ6ilJ2hlZ6ilp+llaerm66qnqylmaeikqWi + kqWjlaGekJuekZefkpmfkJefkJeikpqjlJumlp6llZ2ilJ+fkZ2jlaOnmaeml6OilJ+bkZeakJae + jpafkJedjpedjpedjpejlZ6jlKaqmqylmquil6iol6eol6eml6OnmaWsm6urmqqunrKvn7OuobOu + obOnmqGilZullaemlqill6ummayllqWfkZ+hkJqhkJqulqiwmauymqqmjp6mlaKqmaaun66omqio + kZuljZelkZemkpmmlJWhjpCjiI6fhIuXhI2diZKeiZWhjJellqKnmaWvl6Kqkp2ljZeii5Wljpmo + kp2wm6eynaiym6aym6asjpmniZSikZuol6KwmaiwmaivmZ6nkZahiZGfiJCliZKrkJmylqKzl6Or + kJmmi5SqjJSsjpaolZ6lkZqniYmihISXe3iUeHSVdXKaeneZfnOfhHmliIimiYmniZGmiJCmi5Sm + i5SliZCnjJKskZqwlZ6ylqKvlJ+wlpewlpeuko2liYSfhICWe3ideniif32jh4yvkpewkpqsjpas + hIOnf36hgH6ign+nh4SujYuujI2riYuriIajgH6mfnCed2mheWuje26mem6sgHSshHeuhnirfWin + eWSreWireWiqem2ufnCygnSygnSwiHi3jn64kH+3jn67h3iyfm+zgGizgGivfWu4hnS2iIC8joe/ + kH24iXesel2fblGaaFWea1imdF6wfmisfmmsfmmsfmmvgGuvgG6wgm+vf3KoeWuvfne2hH28jYy/ + kI67jX62iHm0h3q2iHu2h3S0hnOygGiufWSyg3u4iYKziX+yiH6vhHCqf2uufm6zg3O2h4m6i428 + kpnBlp2Wh4yVhouUgImSf4iRfoSSf4aVhJSZiJeZh5qbiZ2dkZ2dkZ2bjZullqWml6OjlaGhkp6e + kJuajJWWiJGfi5meiZeah5CZho6ah4ufjJCfjY6ejI2UiY2SiIyWhIOWhIOUgoObiYubjpWekZef + kZ2ilJ+ilJ+hkp6llqKnmaWnl6qfkKKdkKKekaOekJuXiZWbi5WejZefkJWhkZankp6qlaGnl5+l + lZ2hlJqfkpmllJ6nlqGnlqOmlaKflZudkpmejpafkJedjpeekJmhkp6jlaGnl6urm6+mmauom66y + na6vmqujlaGjlaGol6eunayunay0o7OwpbCvo6+sl6afi5mjlKarm66smq6rmaynlqOikZ6ikpqh + kZmolKWvmquwmauqkqWnkp6qlaGnmaellqWolKKlkJ6nkZmokpqolZmei46fhomfhomag4udho2b + iI6ei5GhkJqol6Kvl6KslZ+njY6jiYuejI2jkZKsl6iznq+0n6u0n6uvl5+qkpqllqKqm6e0n7C2 + obK0naeokZujjJafiJKliZKrkJmulqGwmaOrkZWli46njY6njY6ijpWjkJaljpGdh4mXe3eWenWX + c26Xc26ZeXWlhICliIini4uui5SriJGmiYymiYyfhoSbgoCjhIylho2ni5CrjpSojpCskpSqlY6l + kImlg3qffnWbenKefXSif4ivjJWqjZKskJWriIOhfnmaeHWffXqmgH+rhoSmiI2oi5Crh4mmgoSi + f32ee3mZdWmWc2efeGinf2+qhHWrhnesgmuofmiqem2re26sfW2vf2+vf3KsfW+ogHOyiXu6jIS/ + kYm7iYK6iIC2g2+yf2uufnO2hnq2jYm6kY27jnq2iXWyf2SjcleXalafcl2ofWmugm6yg3Cwgm+u + fm6ufm6ugnOwhHWygnewgHWyhHu3iYC3koa6lYi+kX23i3e3h3m0hHe2h3S3iHW0iHSzh3OzhoC3 + iYSviH2viH2whG6ugmuvgnW2iHu4iYy8jZC+lJ3Cl6GZiJKXh5GZg4uVf4eSfX+UfoCZg42eiJKX + i5GXi5GbjZadjpedjp2ml6ailqKilqKekpuajpebjZaXiZKaiZSZiJKeiZWfi5afkZqhkpuhi5Kd + h46ZiJKXh5GXg4aVgIOUf4KXg4aah4uei46ejpafkJeikpqhkZmjlKaomauolq6ejKObi5qdjJui + jZmdiJSei5Sei5ShjZSlkZeolZ6olZ6mlp6ikpqbkZWelJellKGnlqOol6eol6enm6WlmaKolKKn + kqGfkZqhkpuikpejlJmhlaOonaunm6esoayunayqmaillKGjkp+llKOqmairnauzpbO3prayobCr + lKGii5elkqaql6usm6iqmaaomZ6hkZaikpqejpalkJ6qlaOumaenkqGmkJWnkZajkp+mlaKrmqen + lqOmkpunlJ2nlJqfjJKdh4ybhouZg4iZg4idiIuhjI6ijpWnlJqqlJmokpemjI2hh4idiIiijY2o + kZ6vl6Wwn6yyoa6znaWrlZ2ll56mmZ+wn6yzoq+3n6qslZ+miJCdf4edgoinjJKnjJWwlZ6qkJGj + iYuhhoCfhH+fhIuliZCijIyfiYmegn6afnqaeneZeXWZeXelhIKljZKnkJWukJKqjI6miYyni42j + h4Kbf3qffXiffXihgH6jg4CfgoKniYmqjYmmiYalgoCif36dfnSbfXOffoKoh4uskJWskJWrjH+m + h3qdeW2deW2ifXqmgH6jgoOmhIaqhIOmgH+hfn2ffXuefXSZeG+heG6qgHeviYSyjIe0iHmugnOu + f22vgG6vgGuuf2qrf2mrf2mqeXKwf3izh3q8kIO7jIS8jYa6i3Wuf2que2qzgG+0i4S7kYu4kIKz + i32whminfV+ablWdcFeoenWzhH+zhnewg3Svf3KufnCqfnKwhHi2hnq3h3uyhnmzh3qzjIC4kYbB + kIS8jIC6h3OzgG2wgHC3h3e3h3e3h3ewh362jIOuhHquhHque2WqeGKsfmuzhHK4iInBkJG/lJXB + lZaaiZSaiZSfg4ibf4SWe4Kaf4ahjJeijZmZjJKWiZCah42fjJKikaGqmaimlqijlKabkpqZkJeV + i5GVi5GWjI2bkZKhkJ+nlqaom66jlqifiZGahIyShI2Uho6ahoaZhISXg4OZhISfi42hjI6fjJKh + jZShlJqhlJqlkqamlKemkZ+hjJqfiZGfiZGijJahi5WejpabjJSjkJmolZ6ml6GjlZ6omZ6ikpej + lZ6llp+ol6KmlZ+qmqyrm66onaurn66umaqqlaanlqallKOolZuolZuXjpahl5+nm6qqnqysm6ur + mqqllKGikZ6ikKOjkaWqmqywobO0pberm66ilJ+ajJehjqKjkaWumaWumaWqmp+ikpehlJefkpaj + kJmnlJ2rlqKnkp6mkJWljpSfjpmjkp2olKWvmqunkJ+okaGfkZGekJCdjoyWiIaWi4mViYifiYem + kI2nkJerlJurlZqokpejjY2eiIifiYyijI6mjpmrlJ6vmqa0n6uym6aslqGolZumkpmsm6ayoau6 + oa6slKGsi4ybenuWfYCehIiihIysjpamjIuiiIejgnmjgnmjg4ClhIKlh4mlh4mihoafg4Oeg3+d + gn6df4Klh4mvlJ2wlZ6ukpmrkJaniZGoi5KsiH+lgHifeW6feW6ZdWqbeG2ie3SrhH2uiIOog36l + goChfn2efXCaeW2XdXOhfnuriYuujI2ujYemhn+ie3Cdd2uXdXCZd3KfeW+mf3Wrfneoe3Soenum + eHmmeXKhdG2hdG+ugHu0jIy4kJC2joeviIC0gG+zf26uf2iuf2irfWiuf2qofmqme2iqgnSyiXuz + joa3kom/joO2hnqwfWmwfWm2iIO8jom+loy4kYe3jHiug2+meGOjdWGnfniwh4C4hHWyfm+uemes + eWWufnOygnewgnm2h360iHmyhne0h3q/kYTFkIbBjIK4hnS0gnC2gni4hHq6hnu7h322iXW4jHi2 + i3evhHCrel+nd1yreGSzf2u2hIDDkY2+lI28koybjZmXiZWahI6Zg42dhpCdhpCdjJuejZ2Uh42O + goiRhIiXi46ikKOmlKenkaqjjaabkZeZjpWXi5GajZSVkJGblpeilq+mmrOrmqemlaKfhIufhIub + iJGbiJGbhouahImXiYmWiIiei5GjkJajkJahjZSbkJudkZ2lkKGlkKGjjJmdhpKZiY6ejpSnkp6o + lJ+ikZ6hkJ2ml6Oomqammqinm6qunrCunrComqiml6aimaOhl6KomauunrCsnbCrm6+lmaWjl6Os + nqqrnaillJ6hkJqah5CfjJWilKKqm6qrnairnainlqGfjpmejZqfjpuikKOvnbCwoq6snqqmkpue + i5Sii5KmjpajlJunl5+jlJmhkZafkJWikpejkJamkpmnlJ2olZ6njJKliZCeiZWijZmnkJ2vl6Wo + maGjlJunkpWmkZShjZGbiIydjZKai5Cfi4ulkJCnkJWqkpeqkperlJmii5ChiY6ehIifhomhhoyl + iZCulaK2naqwl6WulaKqjZKrjpSokpq0nqa2n6qul6Kni4OZfXWUeXKVenOdf3+miIiihoaihoaf + hH+dgn2jgoOlg4SmhIamhIaeiIieiIihh4ahh4ang4uuiZGzl6Ozl6O0lqGwkp2qi5Kmh46rhoOn + gn+hf3SaeW6acmiddGqbeG2hfXKrhoCrhoCqgoCje3qdenmbeXiXd26aeXCnf36vh4aoiIKignuh + enCZc2mUcGWWc2iac2OddWWjeGmmemuleHOjd3KmdW+jc22bc22ieXOsh4S2kI26kIm0i4SshHeu + hnivg3Svg3SogG6ogG6ugnCne2qoe2+vgnWwi4a3kYy8jom6jIe2hnWwgHCzhoC7jYi/lY64joi6 + jH23iXqugnOrf3Cwgnm3iH+2h2+yg2uue2WvfWevgG6wgm+vf3Kzg3WuhnWshHSwg3u8joe/kYS8 + joK6iXu4iHq2hnqwgHW2gnW6hnmyg260hnC3i3KwhGuvfWKsel+reGSwfWmzg3jCkYbBkYm+joed + jJmaiZaXh5aWhpWXg46bh5KZi5aXiZWVgouQfYaVf4edh46ijZ6nkqOllqKjlaGbkZWZjpKai5KX + iJCbkJmjl6Gnn7Onn7OrmqehkJ2ahImbhouWjJKbkZejjZehi5WhiZGhiZGdjJadjJadjpqajJee + kJ6ekJ6fkZ+fkZ+iiZafh5SZiJWikZ6ol6enlqallaeikqWjl6anm6qunrCsna+zobawnrOmmaui + laejl6Ommqaqm6qsnqyvoa+rnauqnaOsn6awn6qyoaurlKGeh5SRgoeVhoudiJankqGfmaWhmqau + laKiiZahi5KfiZGhjJevmqaznqywm6qljpadh46dh4yijJGhkZmmlp6jlpqekZWijpWmkpmokpen + kZaulp6qkpqliZKliZKjh5WmiZeokZ6okZ6rl56olZuqlJuokpqhjZGdiY2bjI6bjI6njJKmi5Gl + jZKljZKqlJaslpmrkJajiI6dh4mdh4mXgoSeiIuqjJmzlaKykqKujp6vjoysjImrjZe3maO3n6qw + maOwjI6mgoSafneWenOZfnmjiIOlh4emiIiiiIejiYiniYmqjIyni4eliISihoiliIuli4yiiImn + iYyoi42zlZ+4mqW6mqWykp2zjJSwiZGniYylh4mhhH2dgHmhenCeeG6Wc2qeenKqgn6qgn6shn6o + gnqheXWed3OZdWqWc2ibeXSffXilgHijf3eieXOXb2mXb2WVbWOWa1iZbluecmGhdGOjd2+meXKl + d3KbbmmWcGmadG2ogH+3jo22lIuwjoauhHqsg3mzhHu0hn2zhn6zhn6yjH2lf3CmeWqqfW6uh3+y + i4O6jIe6jIe6hne0gHK2h3+/kIi8kZG6jo64i362iHuwiHqvh3mvh3mvh3m0iXOziHKzhG+zhG+w + hHOyhnSwhG6ugmuofWene2WsfW+zg3W7jIO+joa8jn+7jX62hnW0hHS0gm62g2+0gG27h3O3i3m3 + i3myhm2rf2eyhne0iHmyi4O3kIi7jIu3iIediZKfjJWaiZSWhpCUho6XiZKZiZGUhIyReoeQeYaU + foOZg4ibjZafkZqjkp+llKGbkZWXjZGai5CXiI2jkp+rmqeqn7Cnna6ol6KdjJaahImdh4yekZei + lZuolZ6lkZqjjJSljZWdjZWbjJSbjpWbjpWejJ+hjqKhjqKfjaGfi5mhjJqbkJujl6Ovmquumaqn + lqOikZ6nmaernaurnrCsn7Kyo7KworCmmaufkqWolJ+rlqKsl6Ovmqasoaqjl6Gilp+nm6Wsnqys + nqyikpqVho2SfX+UfoCdg4eojpKekp6hlaGnkp6eiZWai42Vhoibho2mkJeunrKrm6+nlJqdiZCe + iJChi5KhkJqmlZ+ll5ubjpKhkZamlpunlJqqlp2slqGnkZuiiZahiJWliZWliZWmkJqqlJ6vlqOs + lKGslaKqkp+nkZGijIydh4yijJGskZqqjpeljpGmkJKulpuulpuukZGliIibhoiXgoSUfYKZgoei + hoiukZSvkZmrjZWrjY2miIioi5eylKGzl6OwlaGzkJunhJCUfoCRe36bf3umiYaqjouliYali4yq + kJGylZqylZqnjY6li4ymi5GnjJKmjJCjiY2oi5KniZGylJ64mqW0maWwlaGyi42viIumi4ejiISi + hn6hhH2je3iheXWbeXeee3mjfnmngn2rg3Org3OhfWebeGKWcmGUb16Wc2iZdWqfeXKeeHCfeGqX + cGOdal6ZZ1uSZVSUZ1Wfbl2mdGOldWineGqoeWuhcmSXcGOac2Wleni2i4i+lo63kIiwhHisgHSy + hH2zhn6wh364joa6lISviXqqeGSmdGGoenKwgnm4iYS4iYS4iH23h3u0h367jYS+kIu7jYi7h320 + gHeyhnmzh3qzh3qzh3q0iHu0iHu7i327i326jH26jH2zhG2vgGmofmWnfWSremKufWS3g3m7h327 + jX68jn+4iHivf2+zgGqvfWeve2W4hG64iYC7jIO2iXqzh3i4lIu4lIu2kpG3lJK7kI24jYuXiJCW + h46XiI2XiI2XiJCai5KZiZGVho2OeYCNeH+SfX+bhoidjJmdjJmdi56ejJ+ajo2ViYiXhIibiIyl + kJ6qlaOlmaWflJ+ljpGeiIuWg4eah4uhkZallZqilZuilZuijJaahI6Wg4mVgoiViI6WiZCbi5Wd + jJaeiZqdiJmhiZmljZ2ikZ6ol6Wsl6ilkKGjjZWhi5KqkqWulqiom66uobOwoquml6GikpqfkJel + kZeqlp2umqOsmaKrm6OomaGmlaKnlqOonaulmaediY2UgISQeniRe3mZe36ihIeikpqikpqekpuZ + jZaUiY2Ng4eWgo2fi5aml6aqm6qll5uajZGdiZChjZSmlZ+ol6KikpeejpSfjJWjkJmqmaOol6Kv + lqOokJ2ii5WjjJaijJSijJSmi5SskZqolKWsl6iwl6WvlqOmkZSijZCfiZGljpaukpmukpmqlJal + jpGslZ+wmaOukZSliIuehIaehIaagIKZf4CehoCokIuukZSqjZCojIyihoamiJWoi5eskZqskZqu + kZaojJGbgIybgIyfg4ani42ujpmvkJqoi5erjZq0maWylqKqjpWukpmrkJmqjpelh4mhg4aliI2l + iI2sjJu2laW2mqOylp+vjY6nhoehhISfg4Onhn2lg3qmgHuhe3eff3uign6mgHuog36qhn2ng3qn + fWmdc1+WalqQZFSQZVWWa1uZbl2ab16XdF6XdF6abViXalaVaFaWaVebbWKhcmeldWimd2mleWWh + dWKab2GdcmOhdWSugnC6koi2joSuhHqqgHeuhHqyiH6rh3qyjYC3kX2zjXmvfmOmdVufdGGmemeu + fXW0g3u4iH23h3uzh3q4jH+7jIO6i4K0hHewgHOugmuwhG6yiXmwiHi0h3q6jH++joe/kIi8joa7 + jYS3iHWsfmusfmeqe2Sue2WsemSzf3O4hHi2hni6iXu7iHe4hnS2gHKyfW6weWeze2m4h4O7iYa3 + jou7ko64lJa4lJa8l5q+mZu/lpK4kIwADQEAAAMAAAABAQAAAAEBAAMAAAABAQAAAAECAAMAAAAD + AAMAqgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAACAAMAsAESAAMAAAABAAEAAAEVAAMA + AAABAAMAAAEWAAMAAAABAKoAAAEXAAQAAAACAAMAuAEcAAMAAAABAAEAAAFTAAMAAAADAAMAwIdz + AAcAABDoAAMAxgAAAAAACAAIAAgAAAAIAAH+CAAB/gAAAQIAAAEAAQABAAAQ6GFwcGwCAAAAbW50 + clJHQiBYWVogB9YABAAeABAAAgAkYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbW + AAEAAAAA0y1hcHBs8Km3nXI3UvdB2LuwZ9wBHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA + AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAYSbmRp + bgAAB+wAAAY+ZGVzYwAADiwAAABkZHNjbQAADpAAAAH+bW1vZAAAEJAAAAAoY3BydAAAELgAAAAt + WFlaIAAAAAAAAF1MAAA01QAAB9tYWVogAAAAAAAAdAUAALP7AAAiflhZWiAAAAAAAAAlhQAAF0sA + AKjMWFlaIAAAAAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov// + /aMAAAPcAADAbGN1cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0A + AHZjZ3QAAAAAAAAAAAADAQAAAgAAAgQC9wQFBQUGCgcFCAsJCAoNCwgMCg0QDg0PDxAOERASEBMS + FBIVFBYXFxgYFhkaGhsbGhwdHR0eHyAeISIiIiMjJCUlJCYmJycpJyopKyosLC0tLi8vLzAxMjEz + NDQ0NTQ2Njc3OTo6Ojs7PD09PT49Pz9BQkJCQ0NEQ0VFRkZISElJSklLTExMTk1PT1BQUVJSU1RU + VVVWV1dXWFhaWltbXFxdXl5eYGBhYWJiY2RkZGVlZ2doaGlpamlra2xtbW1vcHBwcXJycnNydHR1 + dHZ2eHh5eHp6e3t8fH19fn5/f4CAgYGCg4SDhYSGhoeHiIiJiYqKi4uMjI2Njo6Pj5CQkZGSkpOT + lJSVlZaWl5eYmJmZmpqbm5ycnZ2enp+foKChoaKio6OkpKWlpiWmpqenqKipqaqqq6usrK2trq6v + r7CwsbGysrOztLS1NLW1tra3t7i4ubm6uru7vLy9vb6+v7/AP8DAwcHCwsPDxMTFxcbGx8fIyMlI + ycnKysvLzMzNzc5Nzs7Pz9DQ0dHSUdLS09PU1NXV1lXW1tfX2NjZ2dpZ2trb29zc3d3eXd7e39/g + 4OHh4uLjYuPj5OTl5ebm5+foZ+jo6enq6uvr7Ozt7e5t7u7v7/Dw8fHy8vNy8/P09PX19vb39/j4 + +fn6efr6+/v8/P39/v7/fv//AAACBAL3A3AEBAUJBgQHCggHCQwKBwsJDA8NDA4ODw0QDxEPEhET + ERQTFRYWFxcVGBkZGhoZGxwcHB0eHh0fICAgISEiIyMiJSUmJicmKCcpKCoqKyssLS0tLzAwLzEy + MjIzMjQ0NTU3ODg4OTk6Ozs7PDs9PT9AQEBBQUJBQ0NEREVFR0ZIR0lKSkpLSkxMTk5PUFBRUVFS + UlRVVVVWVldXWFhZWVpbXFtdXV5eX19gYWFhY2NkZGVlZmZnZmhoaWpqamxtbW1ub29vcG9xcXJx + c3N0dHV0dnZ3d3l5enp7e3x8fX1+fn9/gICBgIKCg4OEhIWFhoaHh4iIiYmKiouLjIyNjY6Oj4+Q + kJGRkpKTk5SUlZWWlpeXmJiZmZqam5ucnJ2dnp6fn6CgoaGioqOjpKSlpaamp6eoqKmpqqqrKqur + rKytra6ur6+wsLGxsrKzs7S0tbW2tre3uDe4uLm5urq7u7y8vb2+vr+/wMDBwcLCw8PExMXFxkXG + xsfHyMjJycrKy8vMzM1Mzc3Ozs/P0NDR0dLS01LT09TU1dXW1tfX2NjZ2dpZ2trb29zc3d3e3t/f + 4F/g4OHh4uLj4+Tk5eXm5udm5+fo6Onp6urr6+zs7e3u7u9u7+/w8PHx8vLz8/T09fX29vd29/f4 + +Pn5+vr7+/z8/f3+/v9+//8AAAGCAmUDQAQcBPEFuwaJB1wIMQkHCdUKoQtyDEUNFA3jDrUPhBBR + ER4R7hK5E4cUWBUnFfMWvReHGFEZGhngGqobdRw/HQUdyh6PH1UgHSDjIaoibyMwI/ckuSV6Jjwm + /ifDKIQpRSoMKswrjSxNLQgtyS6IL0UwBDDFMYUyQzMVM+00wjWWNmw3QDgROOM5tTqHO1k8Lj0I + Pdw+sj+JQF5BMEIAQtJDqER9RUlGHUbvR8RImUlrSjpLEEveTK1Nf05MTxlP6lC4UYNST1MbU+dU + sVV5VkZXC1fRWJdZYFoqWvJbtlx4XTxeAl7FX4hgUGERYc5ii2NNZA1k02WoZpZnjWiLaXtqdWts + bHBtYG5bb0VwOHEsciJzE3QFdPh153bTd7x4pXmUeoN7b3xOfTd+JH8Mf++A1IG8gp+DfoRohUiG + KocPh/KI04m0ipaLeYxcjTuOHY79j9yQvpGhkoeTb5RPlS+WEpb4l96YvpmdmoCbZ5xRnTqeHp8D + n/Sg9KH6ovuj9qT0pfCm76foqOCp46rdq9SszK3Err6vuLCzsa+yrLOqtKm1qbart664xrnMutO7 + 2rznvgG/FcAwwUnCbMOVxMHF78cfyFDJiMrSzCPNds7M0CnRmtMS1JHWJtfD2WjbJ90C3ujg7uMZ + 5Wbn1uqP7Y/xDvVt+x7//wAAbmRpbgAAAAAAAAY2AACXOAAAVsIAAFQSAACKMAAAJ6sAABaoAABQ + DQAAVDkAAiFHAAIR6wABRR4AAwEAAAIAAAABAAMACwAWACUANwBNAGUAgQCfAMEA5QELATUBYQGQ + AcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVGBXAFxAYbBnQGzwctB4wH7ggfCFIIuAkgCYoJ + 9gpkCtULRwuBC7wMMgyrDSYNog4hDmEOoQ8kD6kQLxC4EUMRzxIWEl0S7hOAFBUUqxVDFZAV3RZ5 + FxcXthhYGKoY/BmhGkga8RucG/McSRz4HageWx8PH2ofxSB9ITch8iKwIw8jbyQwJPMltyZ+J0Yn + qygQKNwpqSp5K0osHCzxLVwtxy6gL3kwVTEzMhIy8zPVNEc0uTWgNoc3cThcOUk6ODsoPBo9Dj4D + Pn8++z/0QO5B6kLoQ+hE6UXsRvFH90j/SglLFEwhTTBOQE9SUGZRe1KSU6tUxVXhVv9YHlk/WmFb + hVyrXdJe+2AlYVJif2TgZhJnR2h8abRq7WwnbWRuom/hcSJyZXOpdO92NnjJehV7Y3yyfgN/VYCp + gf+DVoSvhgmIwoohi4GM445Hj6yREpJ7k+SWvJgrmZubDJx/n2qg4aJao9Wmz6hOqc6rUa5ar+Cx + abLytgu3mbkpurq94b93wQ7Cp8RBx3vJGcq6zFvN/9FK0vHUm9ZF1/HZn9z/3rHgZOIZ49DnQej8 + 6rnsdu427/fxufVC9wj40Pqa/GX//wAAAAEAAwALACUANwBNAGUAgQCfAMEA5QELATUBYQGQAcEB + 9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVwBcQGGwZ0Bs8HLQdcB4wH7ghSCLgJIAmKCfYKZArV + Cw4LRwu8DDIMqw0mDaIOIQ5hDqEPJA+pEC8QuBFDEc8SFhJdEu4TgBQVFKsVQxXdFisWeRcXF7YY + WBj8GaEZ9BpIGvEbnBxJHPgdUB2oHlsfDx/FIH0hNyHyIlEisCNvJDAk8yW3Jn4m4idGKBAo3Cmp + KnkrSiwcLPEtXC3HLqAveTBVMTMyEjLzM9U0uTWgNoc3cTfmOFw5STo4Oyg8Gj0OPgM++z/0QO5B + 6kLoQ+hE6UXsRvFH90j/SglLFEwhTTBOQE9SUGZRe1KSU6tUxVXhVv9YHlk/WmFbhVyrXdJe+2Al + YVJif2OvZOBmEmdHaHxptGrtbCdtZG/hcSJyZXOpdO92Nnd/eMl6FXtjfLJ+A39Vgf+DVoSvhgmH + ZYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qolqj1aVRps+oTqnOrNSuWq/gsWmy8rR+ + tgu5Kbq6vE294b93wQ7EQcXdx3vJGcq6zFvN/9FK0vHUm9ZF1/HZn9tO3P/gZOIZ49DliOdB6Pzq + uex27/fxufN89UL3CPjQ+pr8Zf//AAAAAAAGABIAIwA5AFUAdQCZAMEA7gEgAVQBjgHLAgsCUQKb + AucDOQOMA+QEQAShBQYFbwXdBkwGvwc4B7UINgi5CUAJygpdCu4LiAwlDMQNZQ4PDrUPZRAXENMR + ixJNEw8T0hSeFVkWDxbPF40YURkaGeUasxuEHFUdIh37HtAfqyCMIXIiVyM5JCwlGCYKJvgn7ijr + KeIq6SvpLPMuAC8JMB8xNjJPM2o0kTWyNuE4ETlBOnA7qDzrPi0/bkC7Qf9DUkSzRglHZ0i0SdVK + 7Uv6TRxONE9RUGFRilKoU91VBlYxV1tYkVnCWvhcNl15XsNgA2FGYo9j7WU7ZoZn42lEaptr/21r + bsdwOHGkcw10gnX4d25443pce959Wn7hgGWB54NmhOSGdYgDiYyLEoynjkCP1JFjku6Uf5Yfl7CZ + JJqOm/qdep7xoHOh66NwpP+mdqf+qY6rH6ywrkGv07Fksva0h7YZt6q5O7rLvFu9zL9ZwOjCd8QE + xXfG+8hyye/LaszVzj/PqNEP0nbT3NVB1p7X59kv2nbbvN0B3kXfeeCl4c/i+eQc5THmROdX6Gjp + cepw62PsU+1A7i3vDO/r8LzxjvJW8xvz2/SV9U719vaf90L32/h0+QX5h/oK+o36+vtl+8/8OvyV + /OT9NP2D/dP+I/6J/vT/X//J//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAABtbHVjAAAAAAAAAA8AAAAMaXRJVAAAABQAAADEZnJGUgAAAEIAAADYbmJOTwAAABIA + AAEaZXNFUwAAABIAAAEsZmlGSQAAABAAAAE+cHRQVAAAABgAAAFOemhUVwAAAA4AAAFmamFKUAAA + AA4AAAF0bmxOTAAAABYAAAGCZGVERQAAABAAAAGYa29LUgAAAAwAAAGoZW5VUwAAABIAAAG0c3ZT + RQAAABAAAAHGZGFESwAAABwAAAHWemhDTgAAAAwAAAHyAEwAQwBEACAAYwBvAGwAbwByAGkAyQBj + AHIAYQBuACAA4AAgAGMAcgBpAHMAdABhAHUAeAAgAGwAaQBxAHUAaQBkAGUAcwAgAGMAbwB1AGwA + ZQB1AHIARgBhAHIAZwBlAC0ATABDAEQATABDAEQAIABjAG8AbABvAHIAVgDkAHIAaQAtAEwAQwBE + AEwAQwBEACAAYwBvAGwAbwByAGkAZABvX2mCcm2yZnaYb3k6VmgwqzDpMPwAIABMAEMARABLAGwA + ZQB1AHIAZQBuAC0ATABDAEQARgBhAHIAYgAtAEwAQwBEzuy37AAgAEwAQwBEAEMAbwBsAG8AcgAg + AEwAQwBEAEYA5AByAGcALQBMAEMARABMAEMARAAtAGYAYQByAHYAZQBzAGsA5gByAG1faYJyACAA + TABDAEQAAG1tb2QAAAAAAAAGEAAAnFYAAAAAv/h7gAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENv + cHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA= +item7.X-ABRELATEDNAMES:assistant +item7.X-ABLabel:_$!!$_ +item8.X-ABRELATEDNAMES;type=pref:spouse +item8.X-ABLabel:_$!!$_ +item9.X-ABRELATEDNAMES:father +item9.X-ABLabel:_$!!$_ +item10.X-ABRELATEDNAMES:Custom relation +item10.X-ABLabel:CustomRelLabel +X-ABUID:3D833EB4-BFFC-41F0-9193-96695487C45E\:ABPerson +END:VCARD diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/testdata/AAB4/SingleNonAscii.vcf Binary file qtcontactsmobility/tests/auto/qversit/testdata/AAB4/SingleNonAscii.vcf has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/testdata/AAB4/SingleNonAsciiWithPhoto.vcf Binary file qtcontactsmobility/tests/auto/qversit/testdata/AAB4/SingleNonAsciiWithPhoto.vcf has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/testdata/AAB5/SingleNonAscii.vcf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversit/testdata/AAB5/SingleNonAscii.vcf Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,10 @@ +BEGIN:VCARD +VERSION:3.0 +N:name;ã²ã‚‰ãŒãª;;; +FN:ã²ã‚‰ãŒãª name +ORG:ABC; +EMAIL;type=INTERNET;type=WORK;type=pref:a@b.com +TEL;type=WORK;type=pref:1234 +TEL;type=CELL:5678 +X-ABUID:71192A64-301C-420B-AF88-DA4E0CF1B8A4\:ABPerson +END:VCARD diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/testdata/Entourage11/basic.vcf Binary file qtcontactsmobility/tests/auto/qversit/testdata/Entourage11/basic.vcf has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/testdata/Entourage11/image.vcf Binary file qtcontactsmobility/tests/auto/qversit/testdata/Entourage11/image.vcf has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/testdata/Entourage11/nonascii.vcf Binary file qtcontactsmobility/tests/auto/qversit/testdata/Entourage11/nonascii.vcf has changed diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/testdata/Entourage12/basic.vcf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversit/testdata/Entourage12/basic.vcf Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,8 @@ +begin:vcard +version:3.0 +prodid:Microsoft-Entourage/12.23.0.091001 +UID:F3236599-2900-42D3-9969-8F9714C5EE36 +fn;charset=utf-8:first last +n;charset=utf-8:last;first;;; +org;charset=utf-8:Nokia;Qt DF +end:vcard diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/testdata/Entourage12/kevin.vcf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversit/testdata/Entourage12/kevin.vcf Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,7 @@ +begin:vcard +version:3.0 +prodid:Microsoft-Entourage/12.23.0.091001 +UID:01430B95-6B2D-4A6E-87F1-D165D4F8FA7A +fn;charset=utf-8:Kevin Wu Won +n;charset=utf-8:Wu Won;Kevin;;; +end:vcard diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/testdata/Entourage12/nonascii.vcf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversit/testdata/Entourage12/nonascii.vcf Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,8 @@ +begin:vcard +version:3.0 +prodid:Microsoft-Entourage/12.23.0.091001 +UID:C92628BF-C7B4-42F5-9A7F-EF9D9EF6CDC3 +fn;charset=utf-8:ã²ã‚‰ãŒãª name +n;charset=utf-8:name;ã²ã‚‰ãŒãª;;Mr.; +org;charset=utf-8:ABC; +end:vcard diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/testdata/gmail.vcf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversit/testdata/gmail.vcf Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,24 @@ +BEGIN:VCARD +VERSION:3.0 +FN:Test Contact +N:Contact;Test;;; +EMAIL;TYPE=INTERNET;TYPE=HOME:a@b.com +TEL;TYPE=CELL:1234 +ADR;TYPE=HOME:;address;;;;; +ORG:company +TITLE:title +BDAY:1900-01-01 +URL;TYPE=HOME:website +END:VCARD +BEGIN:VCARD +VERSION:3.0 +FN:Test Contact 2 +N:2;Test;Contact;; +EMAIL;TYPE=INTERNET;TYPE=HOME:a@b.com +TEL;TYPE=CELL:1234 +ADR;TYPE=HOME:;address;;;;; +ORG:ノキア +TITLE:title +BDAY:1900-01-01 +URL;TYPE=HOME:website +END:VCARD diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/ut_qversit.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversit/ut_qversit.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,214 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qversitdefs_p.h" +#include "ut_qversit.h" +#include "qversitreader.h" +#include "qversitreader_p.h" +#include "qversitcontactimporter.h" +#include "qcontact.h" +#include "qcontactmanager.h" + +#include +#include +#include +#include + +QTM_BEGIN_NAMESPACE +class MyQVersitResourceHandler : public QVersitResourceHandler +{ +public: + MyQVersitResourceHandler() : mIndex(0) + { + } + + bool saveResource(const QByteArray& contents, const QVersitProperty& property, + QString* location) + { + Q_UNUSED(property) + *location = QString::number(mIndex++); + mObjects.insert(*location, contents); + return true; + } + + bool loadResource(const QString &location, QByteArray *contents, QString *mimeType) + { + Q_UNUSED(location) + Q_UNUSED(contents) + Q_UNUSED(mimeType) + return false; + } + + int mIndex; + QMap mObjects; +}; +QTM_END_NAMESPACE + +QTM_USE_NAMESPACE + +#ifndef TESTDATA_DIR +#define TESTDATA_DIR "./" +#endif + +Q_DECLARE_METATYPE(QList) + +void UT_QVersit::testImportFiles() +{ + QFETCH(QString, filename); + QFETCH(QByteArray, charset); + QFETCH(QList, expectedContacts); + + QVersitReader reader; + QFile file(filename); + QVERIFY2(file.open(QIODevice::ReadOnly), filename.toAscii()); + reader.setDevice(&file); + if (charset != "") { + reader.setDefaultCodec(QTextCodec::codecForName(charset)); + } + QVERIFY(reader.startReading()); + QVERIFY(reader.waitForFinished()); + QList documents = reader.results(); + QCOMPARE(reader.error(), QVersitReader::NoError); + QVersitContactImporter importer; + MyQVersitResourceHandler resourceHandler; + importer.setResourceHandler(&resourceHandler); + QList contacts = importer.importContacts(documents); + + if (expectedContacts.size() > 0) { + QCOMPARE(contacts.size(), expectedContacts.size()); + QListIterator i(expectedContacts); + foreach (QContact parsed, contacts) { + QContact expected = i.next(); + QList expectedDetails = expected.details(); + foreach(QContactDetail expectedDetail, expectedDetails) { + QString name = expectedDetail.definitionName(); + QContactDetail parsedDetail = parsed.detail(name); + if (parsedDetail != expectedDetail) { + qDebug() << "Detail: " << name.toAscii(); + qDebug() << "Actual:" << parsedDetail.variantValues(); + qDebug() << "Expected:" << expectedDetail.variantValues(); + QCOMPARE(parsedDetail, expectedDetail); + } + } + } + } +} + +#define QTEST_NEW_ROW(filename,charset,contact) \ + QTest::newRow(filename) \ + << QString::fromAscii(TESTDATA_DIR "testdata/") + QString::fromAscii(filename) \ + << QByteArray(charset) \ + << (contact) + +void UT_QVersit::testImportFiles_data() +{ + QTest::addColumn("filename"); + QTest::addColumn("charset"); + QTest::addColumn >("expectedContacts"); + + QTEST_NEW_ROW("AAB4/MultipleAll.vcf", "UTF-16BE", QList()); + QTEST_NEW_ROW("AAB4/MultipleAscii.vcf", "", QList()); + QTEST_NEW_ROW("AAB4/SingleCompany.vcf", "", QList()); + QTEST_NEW_ROW("AAB4/SingleExtensive.vcf", "", QList()); + QTEST_NEW_ROW("AAB4/SingleNonAscii.vcf", "UTF-16BE", QList()); + QTEST_NEW_ROW("AAB4/SingleNonAsciiWithPhoto.vcf", "UTF-16BE", QList()); + QTEST_NEW_ROW("AAB5/SingleNonAscii.vcf", "UTF-8", QList()); + + { + QList list; + QContact contact; + QContactName name; + name.setCustomLabel(QLatin1String("Firstname Lastname")); + name.setFirstName(QLatin1String("Firstname")); + name.setLastName(QLatin1String("Lastname")); + name.setMiddleName(QString()); + name.setPrefix(QLatin1String("Title")); + name.setSuffix(QLatin1String("Suffix")); + contact.saveDetail(&name); + QContactOrganization org; + org.setName(QLatin1String("Company Name")); + org.setDepartment(QStringList(QLatin1String("Department Name"))); + org.setTitle(QLatin1String("Job title")); + contact.saveDetail(&org); + list.append(contact); + QContactNote note; + note.setNote(QLatin1String("This is a note field. Pretty boring.")); + contact.saveDetail(¬e); + QContactUrl homeUrl; + homeUrl.setUrl(QLatin1String("http://mywebpage.com")); + homeUrl.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&homeUrl); + QContactUrl workUrl; + workUrl.setUrl(QLatin1String("http://workwebpage")); + workUrl.setContexts(QContactDetail::ContextWork); + contact.saveDetail(&workUrl); + QTEST_NEW_ROW("Entourage11/basic.vcf", "UTF-16BE", list); + } + + QTEST_NEW_ROW("Entourage11/image.vcf", "UTF-16BE", QList()); + + QTEST_NEW_ROW("Entourage11/nonascii.vcf", "UTF-16BE", QList()); + + { + QList list; + QContact contact; + QContactName name; + name.setCustomLabel(QLatin1String("first last")); + name.setFirstName(QLatin1String("first")); + name.setLastName(QLatin1String("last")); + name.setMiddleName(QString()); + name.setPrefix(QString()); + name.setSuffix(QString()); + contact.saveDetail(&name); + QContactOrganization org; + org.setName(QLatin1String("Nokia")); + org.setDepartment(QStringList(QLatin1String("Qt DF"))); + contact.saveDetail(&org); + list.append(contact); + QTEST_NEW_ROW("Entourage12/basic.vcf", "", list); + } + + QTEST_NEW_ROW("Entourage12/kevin.vcf", "UTF-8", QList()); + QTEST_NEW_ROW("Entourage12/nonascii.vcf", "UTF-8", QList()); + QTEST_NEW_ROW("gmail.vcf", "UTF-8", QList()); +} + +QTEST_MAIN(UT_QVersit) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversit/ut_qversit.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversit/ut_qversit.h Fri Apr 16 14:53:18 2010 +0300 @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef UT_QVERSIT_H +#define UT_QVERSIT_H + +#include +#include +#include + +QTM_BEGIN_NAMESPACE + +class QVersitContactImporter; +class QVersitContactImporterPrivate; +class QVersitReader; + +QTM_END_NAMESPACE +QTM_USE_NAMESPACE + +class UT_QVersit : public QObject +{ + Q_OBJECT + +private slots: // Tests + void testImportFiles(); + void testImportFiles_data(); + +private: +}; + +#endif // UT_QVERSIT_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitcontactexporter/qversitcontactexporter.pro --- a/qtcontactsmobility/tests/auto/qversitcontactexporter/qversitcontactexporter.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitcontactexporter/qversitcontactexporter.pro Fri Apr 16 14:53:18 2010 +0300 @@ -4,7 +4,7 @@ CONFIG+=testcase include(../../../common.pri) -DEFINES += BUILD_QTVERSIT QT_ASCII_CAST_WARNINGS +DEFINES += QT_ASCII_CAST_WARNINGS DEPENDPATH += . INCLUDEPATH += \ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitcontactexporter/ut_qversitcontactexporter.cpp --- a/qtcontactsmobility/tests/auto/qversitcontactexporter/ut_qversitcontactexporter.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitcontactexporter/ut_qversitcontactexporter.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -43,9 +43,12 @@ #include "qversitcontactexporter.h" #include "qversitcontactexporter_p.h" #include "qversitproperty.h" -#include "qversitdefs.h" +#include "qversitdefs_p.h" #include +#include #include +#include +#include #include #include #include @@ -68,114 +71,135 @@ #include QTM_BEGIN_NAMESPACE -class MyQVersitContactExporterPrivate : public QVersitContactExporterPrivate { + +class MyQVersitContactExporterDetailHandler : public QVersitContactExporterDetailHandler +{ public: - void encodeName(QVersitProperty& property, const QContactDetail& detail); - void encodePhoneNumber(QVersitProperty& property, const QContactDetail& detail); - void encodeEmail(QVersitProperty& property, const QContactDetail& detail); - void encodeAddress(QVersitProperty& property, const QContactDetail& detail); - void encodeUrl(QVersitProperty& property, const QContactDetail& detail); - void encodeUid(QVersitProperty& property, const QContactDetail& detail); - bool encodeRev(QVersitProperty& property, const QContactDetail& detail); - void encodeBirthDay(QVersitProperty& property, const QContactDetail& detail); - void encodeNote(QVersitProperty& property, const QContactDetail& detail); - void encodeGeoLocation(QVersitProperty& property, const QContactDetail& detail); - void encodeOrganization(QVersitDocument& document, const QContactDetail& detail); - void encodeGender(QVersitProperty& property, const QContactDetail& detail); - void encodeNickname(QVersitDocument& document, const QContactDetail& detail); - void encodeAnniversary(QVersitProperty& property, const QContactDetail& detail); - bool encodeOnlineAccount(QVersitProperty& property, const QContactDetail& detail); - bool encodeFamily(QVersitDocument& document, const QContactDetail& detail); - bool encodeAvatar(QVersitProperty& property, - const QContactDetail& detail); - bool encodeDisplayLabel(QVersitProperty& property, - const QContactDetail& detail, - const QContact& contact) {return QVersitContactExporterPrivate::encodeDisplayLabel(property, detail, contact);} - bool isValidRemoteUrl(const QString& resourceIdentifier) {return QVersitContactExporterPrivate::isValidRemoteUrl(resourceIdentifier);} - void encodeParameters(QVersitProperty& property, - const QStringList& contexts, - const QStringList& subTypes=QStringList()) {return QVersitContactExporterPrivate::encodeParameters(property, contexts, subTypes);} - bool encodeEmbeddedContent(const QString& resourcePath, - QVersitProperty& property, - bool performScaling) {return QVersitContactExporterPrivate::encodeEmbeddedContent(resourcePath, property, performScaling);} - void setEscapedValue(QVersitProperty& property,const QString& value) {QVersitContactExporterPrivate::setEscapedValue(property, value);} - QByteArray escape(const QByteArray& value) {return QVersitContactExporterPrivate::escape(value);} + MyQVersitContactExporterDetailHandler() : mPreProcess(false) + { + } + + bool preProcessDetail(const QContact& contact, + const QContactDetail& detail, + QVersitDocument* document) + { + Q_UNUSED(contact) + Q_UNUSED(document) + mPreProcessedDetails.append(detail); + return mPreProcess; + } + + bool postProcessDetail(const QContact& contact, + const QContactDetail& detail, + bool alreadyProcessed, + QVersitDocument* document) + { + Q_UNUSED(contact) + Q_UNUSED(document) + if (!alreadyProcessed) + mUnknownDetails.append(detail); + else + mPostProcessedDetails.append(detail); + return false; + } + + void clear() + { + mPreProcess = false; + mDefinitionNamesToProcess.clear(); + mUnknownDetails.clear(); + mPreProcessedDetails.clear(); + mPostProcessedDetails.clear(); + } + + // a hook to control what preProcess returns: + bool mPreProcess; + QStringList mDefinitionNamesToProcess; + QList mUnknownDetails; + QList mPreProcessedDetails; + QList mPostProcessedDetails; +}; +class MyQVersitResourceHandler : public QVersitResourceHandler +{ +public: + MyQVersitResourceHandler() + : mLoadResourceCalled(false), + mLoadSuccess(true) + { + } - // private data - QHash& PropertyMappings() {return mPropertyMappings;} - QHash& ParameterMappings() {return mParameterMappings;} + bool loadResource(const QString& location, QByteArray* contents, QString* mimeType) + { + mLocation = location; + *contents = mSimulatedData; + *mimeType = mSimulatedMimeType; + mLoadResourceCalled = true; + return mLoadSuccess; + } + + bool saveResource(const QByteArray &contents, const QVersitProperty &property, QString *location) + { + Q_UNUSED(contents) + Q_UNUSED(property) + Q_UNUSED(location) + return false; + } + void clear() + { + mSimulatedData.clear(); + mSimulatedMimeType.clear(); + mLocation.clear(); + mLoadResourceCalled = false; + mLoadSuccess = true; + } + + QByteArray mSimulatedData; + QString mSimulatedMimeType; + QString mLocation; + bool mLoadResourceCalled; + bool mLoadSuccess; // A hook to control what loadResource returns. }; + +const static QByteArray SAMPLE_GIF(QByteArray::fromBase64( + "R0lGODlhEgASAIAAAAAAAP///yH5BAEAAAEALAAAAAASABIAAAIdjI+py+0G" + "wEtxUmlPzRDnzYGfN3KBaKGT6rDmGxQAOw==")); + QTM_END_NAMESPACE QTM_USE_NAMESPACE -void UT_QVersitContactExporter::scale( - const QString& imageFileName, - QByteArray& imageData) -{ - QCOMPARE(imageFileName, mTestPhotoFile); - imageData = mSimulatedImageData; - mScaleSignalEmitted = true; -} +const QString TEST_PHOTO_FILE(QLatin1String("versitTest001.jpg")); +const QString TEST_AUDIO_FILE(QLatin1String("versitTest001.wav")); void UT_QVersitContactExporter::init() { mExporter = new QVersitContactExporter(); - QObject::connect( - mExporter, SIGNAL(scale(const QString&,QByteArray&)), - this, SLOT(scale(const QString&,QByteArray&))); - mExporterPrivate = new MyQVersitContactExporterPrivate(); - QVERIFY(!mExporterPrivate->ParameterMappings().empty()); - QVERIFY(!mExporterPrivate->PropertyMappings().empty()); - mScaleSignalEmitted = false; + mDetailHandler = new MyQVersitContactExporterDetailHandler; + mExporter->setDetailHandler(mDetailHandler); + mResourceHandler = new MyQVersitResourceHandler; + mExporter->setResourceHandler(mResourceHandler); } void UT_QVersitContactExporter::cleanup() { - mSimulatedImageData = QByteArray(); - mScaleSignalEmitted = false; - delete mExporterPrivate; + QVERIFY(mExporter->detailHandler() == mDetailHandler); + mExporter->setDetailHandler(0); + delete mDetailHandler; + QVERIFY(mExporter->resourceHandler() == mResourceHandler); + mExporter->setResourceHandler(0); + delete mResourceHandler; delete mExporter; } -void UT_QVersitContactExporter::initTestCase() -{ - // Create a dummy file - QDir dir = QDir::current(); - mTestPhotoFile = dir.filePath(QString::fromAscii("versitTest001.jpg")); - mTestAudioFile = dir.filePath(QString::fromAscii("versitTest001.wav")); - QFile testPhotoFile(dir.filePath(mTestPhotoFile)); - QFile testAudioFile(dir.filePath(mTestAudioFile)); - - if ( testPhotoFile.open( QIODevice::ReadWrite ) ) { - QTextStream stream( &testPhotoFile ); - stream << "HHH KKK UUU NNN OOO PPP GGG NNN KKK OOO UUU PPP III" << endl; - } - testPhotoFile.close(); - - if ( testAudioFile.open( QIODevice::ReadWrite ) ) { - QTextStream stream( &testPhotoFile ); - stream << "HHH KKK UUU NNN OOO PPP GGG NNN KKK OOO UUU PPP III" << endl; - } - testAudioFile.close(); -} - -void UT_QVersitContactExporter::cleanupTestCase() -{ - QDir dir = QDir::current(); - dir.remove(mTestPhotoFile); - dir.remove(mTestAudioFile); -} - void UT_QVersitContactExporter::testConvertContact() { QContact contact; // Adding name to the contact QContactName name; - name.setFirst(QString::fromAscii("Moido")); + name.setFirstName(QString::fromAscii("Moido")); contact.saveDetail(&name); // Adding phone number to the Contact. @@ -184,28 +208,33 @@ contact.saveDetail(&phoneNumber); // Convert contact into versit properties - QVersitDocument document = mExporter->exportContact(contact); + QList list; + list.append(contact); + QList documents = mExporter->exportContacts(list); // Each Contact has display label detail by default. Display label is enocded // if some value exisit for the Label or if value for Name exisit. - QCOMPARE(document.properties().count(), 3); + QCOMPARE(documents.size(), 1); + QCOMPARE(documents.first().properties().count(), 3); } -void UT_QVersitContactExporter::testUnknownContactDetails() +void UT_QVersitContactExporter::testContactDetailHandler() { // Test1: Un-supported Avatar Test QContact contact; - QVersitDocument versitDocument; + QVersitDocument document; QContactAvatar contactAvatar; - const QString url = QString::fromAscii("http://www.myhome.com/test.jpg"); contactAvatar.setSubType(QContactAvatar::SubTypeTexturedMesh); contact.saveDetail(&contactAvatar); - versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().count(), 0); - QList unknowndDetails = mExporter->unknownContactDetails(); - QString defintionName = contactAvatar.definitionName(); - QContactDetail detail = searchDetail(unknowndDetails,defintionName); - QCOMPARE(defintionName, detail.definitionName()); + QList contacts; + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 0); + QList unknownDetails = mDetailHandler->mUnknownDetails; + QVERIFY(unknownDetails.size() > 0); + QString definitionName = contactAvatar.definitionName(); + QContactDetail detail = searchDetail(unknownDetails,definitionName); + QCOMPARE(definitionName, detail.definitionName()); // Test2: Un-supported Online Account QContactOnlineAccount onlineAccount; @@ -213,13 +242,33 @@ onlineAccount.setAccountUri(testUri); onlineAccount.setSubTypes(QString::fromAscii("unsupported")); contact.saveDetail(&onlineAccount); - versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().count(), 0); - unknowndDetails = mExporter->unknownContactDetails(); - defintionName = onlineAccount.definitionName(); - detail = QContactDetail(); - detail = searchDetail(unknowndDetails,defintionName); - QCOMPARE(defintionName, detail.definitionName()); + contacts.clear(); + contacts.append(contact); + mDetailHandler->clear(); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 0); + unknownDetails = mDetailHandler->mUnknownDetails; + QVERIFY(unknownDetails.size() > 0); + definitionName = onlineAccount.definitionName(); + detail = searchDetail(unknownDetails, definitionName); + QCOMPARE(definitionName, detail.definitionName()); + + // Test that preProcessDetail return true stops the exporter from doing anything. + contact.clearDetails(); + QContactName contactName; + contactName.setFirstName(QLatin1String("John")); + contact.saveDetail(&contactName); + mDetailHandler->clear(); + mDetailHandler->mPreProcess = true; + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 0); + QVERIFY(mDetailHandler->mPreProcessedDetails.count() > 0); + QCOMPARE(mDetailHandler->mPostProcessedDetails.count(), 0); + QCOMPARE(mDetailHandler->mUnknownDetails.count(), 0); + + QVERIFY(mExporter->detailHandler() == mDetailHandler); } void UT_QVersitContactExporter::testEncodeName() @@ -228,13 +277,15 @@ QContactName name; // vCard 2.1 - name.setFirst(QString::fromAscii("Heido")); - name.setLast(QString::fromAscii("HH")); - name.setMiddle(QString::fromAscii("A")); + name.setFirstName(QString::fromAscii("Heido")); + name.setLastName(QString::fromAscii("HH")); + name.setMiddleName(QString::fromAscii("A")); name.setPrefix(QString::fromAscii("Mr.")); name.setContexts(QContactDetail::ContextHome); contact.saveDetail(&name); - QVersitDocument document = mExporter->exportContact(contact); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); // Each Contact has display label detail by default. Display label is enocded // if some value exisit for the Label or if value for Name exisit. @@ -244,7 +295,7 @@ // Check name QCOMPARE(displayProperty.name(), QString::fromAscii("FN")); // Check value - QCOMPARE(QString::fromAscii(displayProperty.value()), QString::fromAscii("Heido HH")); + QCOMPARE(displayProperty.value(), QString::fromAscii("Heido HH")); QVersitProperty nameProperty = document.properties().at(1); // Check parameters, contexts not allowed for N property @@ -252,21 +303,23 @@ // Check name QCOMPARE(nameProperty.name(), QString::fromAscii("N")); // Check value - QCOMPARE(QString::fromAscii(nameProperty.value()), QString::fromAscii("HH;Heido;A;Mr.;")); + QCOMPARE(nameProperty.value(), QString::fromAscii("HH;Heido;A;Mr.;")); // vCard 3.0, special characters in the name parts are backslash escaped contact.removeDetail(&name); - name.setFirst(QString::fromAscii("Hom,er")); - name.setLast(QString::fromAscii("Simp;son")); - name.setMiddle(QString::fromAscii("J;")); + name.setFirstName(QString::fromAscii("Hom,er")); + name.setLastName(QString::fromAscii("Simp;son")); + name.setMiddleName(QString::fromAscii("J;")); name.setPrefix(QString::fromAscii(";Mr.")); name.setSuffix(QString::fromAscii("Sir,")); contact.saveDetail(&name); - document = mExporter->exportContact(contact,QVersitDocument::VCard30); - QCOMPARE(document.versitType(),QVersitDocument::VCard30); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts, QVersitDocument::VCard30Type).first(); + QCOMPARE(document.type(),QVersitDocument::VCard30Type); // Each Contact has display label detail by default. Display label is enocded - // if some value exisit for the Label or if value for Name exisit. + // if some value exists for the Label or if value for Name exisit. QCOMPARE(document.properties().count(), 2); displayProperty = document.properties().at(0); nameProperty = document.properties().at(1); @@ -278,10 +331,9 @@ QCOMPARE(nameProperty.name(), QString::fromAscii("N")); // Check value - QCOMPARE(QString::fromAscii(displayProperty.value()), - QString::fromAscii("Hom\\,er Simp\\;son")); + QCOMPARE(displayProperty.value(), QString::fromAscii("Hom\\,er Simp\\;son")); - QCOMPARE(QString::fromAscii(nameProperty.value()), + QCOMPARE(nameProperty.value(), QString::fromAscii("Simp\\;son;Hom\\,er;J\\;;\\;Mr.;Sir\\,")); } @@ -293,7 +345,9 @@ phoneNumber.setContexts(QContactDetail::ContextHome); phoneNumber.setSubTypes(QContactPhoneNumber::SubTypeMobile); contact.saveDetail(&phoneNumber); - QVersitDocument document = mExporter->exportContact(contact); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); QVersitProperty property = document.properties().at(0); // Check parameters @@ -305,7 +359,7 @@ // Check name QCOMPARE(property.name(), QString::fromAscii("TEL")); // Check value - QCOMPARE(QString::fromAscii(property.value()), phoneNumber.number()); + QCOMPARE(property.value(), phoneNumber.number()); } void UT_QVersitContactExporter::testEncodeEmailAddress() @@ -315,7 +369,9 @@ email.setEmailAddress(QString::fromAscii("test@test")); email.setContexts(QContactDetail::ContextHome); contact.saveDetail(&email); - QVersitDocument document = mExporter->exportContact(contact); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); QVersitProperty property = document.properties().at(0); // Check parameters @@ -325,7 +381,7 @@ // Check name QCOMPARE(property.name(), QString::fromAscii("EMAIL")); // Check value - QCOMPARE(QString::fromAscii(property.value()), email.emailAddress()); + QCOMPARE(property.value(), email.emailAddress()); } void UT_QVersitContactExporter::testEncodeStreetAddress() @@ -341,7 +397,9 @@ address.setContexts(QContactDetail::ContextHome); address.setSubTypes(QContactAddress::SubTypePostal); contact.saveDetail(&address); - QVersitDocument document = mExporter->exportContact(contact); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); QVersitProperty property = document.properties().at(0); // Check parameters @@ -353,8 +411,7 @@ // Check name QCOMPARE(property.name(), QString::fromAscii("ADR")); // Check value - QCOMPARE(QString::fromAscii(property.value()), - QString::fromAscii(";;HKKI 1X 90;Helsinki;;00440;Finland")); + QCOMPARE(property.value(), QString::fromAscii(";;HKKI 1X 90;Helsinki;;00440;Finland")); // vCard 3.0, special characters in the address parts are backslash escaped contact.removeDetail(&address); @@ -365,14 +422,16 @@ address.setPostcode(QString::fromAscii("12345;")); address.setCountry(QString::fromAscii("My;Country")); contact.saveDetail(&address); - document = mExporter->exportContact(contact,QVersitDocument::VCard30); - QCOMPARE(document.versitType(),QVersitDocument::VCard30); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts, QVersitDocument::VCard30Type).first(); + QCOMPARE(document.type(),QVersitDocument::VCard30Type); QCOMPARE(document.properties().count(), 1); property = document.properties().at(0); // Check name QCOMPARE(property.name(), QString::fromAscii("ADR")); // Check value - QCOMPARE(QString::fromAscii(property.value()), + QCOMPARE(property.value(), QString::fromAscii("PO\\;Box;;My\\;Street;My\\;Town;My\\;State;12345\\;;My\\;Country")); } @@ -384,7 +443,9 @@ url.setContexts(QContactDetail::ContextHome); url.setSubType(QContactUrl::SubTypeHomePage); contact.saveDetail(&url); - QVersitDocument document = mExporter->exportContact(contact); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); QVersitProperty property = document.properties().at(0); // Check parameters @@ -394,7 +455,7 @@ // Check name QCOMPARE(property.name(), QString::fromAscii("URL")); // Check value - QCOMPARE(QString::fromAscii(property.value()), url.url()); + QCOMPARE(property.value(), url.url()); } void UT_QVersitContactExporter::testEncodeUid() @@ -406,7 +467,9 @@ guid.setContexts(QContactDetail::ContextHome); guid.setGuid(QString::fromAscii("0101222")); contact.saveDetail(&guid); - QVersitDocument document = mExporter->exportContact(contact); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); QVersitProperty property = document.properties().at(0); // Check parameters @@ -415,21 +478,22 @@ // Check name QCOMPARE(property.name(), QString::fromAscii("UID")); // Check value - QCOMPARE(QString::fromAscii(property.value()), guid.guid()); + QCOMPARE(property.value(), guid.guid()); // vCard 3.0, special characters in the value are backslash escaped contact.removeDetail(&guid); guid.setGuid(QString::fromAscii("1;2,3\r\n4\\5")); contact.saveDetail(&guid); - document = mExporter->exportContact(contact,QVersitDocument::VCard30); - QCOMPARE(document.versitType(),QVersitDocument::VCard30); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts, QVersitDocument::VCard30Type).first(); + QCOMPARE(document.type(),QVersitDocument::VCard30Type); QCOMPARE(document.properties().count(), 1); property = document.properties().at(0); // Check name QCOMPARE(property.name(), QString::fromAscii("UID")); // Check value - QCOMPARE(QString::fromAscii(property.value()), - QString::fromAscii("1\\;2\\,3\\n4\\\\5")); + QCOMPARE(property.value(), QString::fromAscii("1\\;2\\,3\\n4\\\\5")); } void UT_QVersitContactExporter::testEncodeRev() @@ -447,23 +511,27 @@ // Contexts not allowed in REV property, check that they are not added timeStamp.setContexts(QContactDetail::ContextHome); contact.saveDetail(&timeStamp); - QVersitDocument document = mExporter->exportContact(contact); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); QVersitProperty property = document.properties().at(0); QCOMPARE(property.parameters().count(), 0); QCOMPARE(property.name(), QString::fromAscii("REV")); QString expectedValueUTCEncoded = QString::fromAscii("2009-01-01T06:01:02Z"); - QCOMPARE(QString::fromAscii(property.value()), expectedValueUTCEncoded); + QCOMPARE(property.value(), expectedValueUTCEncoded); // Last modified time not found, use the creation time QDateTime emptyTime; timeStamp.setLastModified(emptyTime); timeStamp.setCreated(revisionTime); contact.saveDetail(&timeStamp); - document = mExporter->exportContact(contact); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); property = document.properties().at(0); - QCOMPARE(QString::fromAscii(property.value()), expectedValueUTCEncoded); + QCOMPARE(property.value(), expectedValueUTCEncoded); // Last modified time found, Local Time spec not UTC QDateTime localTime; @@ -471,17 +539,21 @@ timeStamp.setCreated(localTime); revisionTime.setTimeSpec(Qt::LocalTime); contact.saveDetail(&timeStamp); - document = mExporter->exportContact(contact); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); property = document.properties().at(0); QString expectedValueEncoded = QString::fromAscii("2009-01-01T06:01:02"); - QCOMPARE(QString::fromAscii(property.value()), expectedValueUTCEncoded); + QCOMPARE(property.value(), expectedValueUTCEncoded); // Last modified time not found, creation time not found timeStamp.setLastModified(emptyTime); timeStamp.setCreated(emptyTime); contact.saveDetail(&timeStamp); - document = mExporter->exportContact(contact); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 0); } @@ -494,12 +566,14 @@ // Contexts not allowed in BDAY property, check that they are not added birthDay.setContexts(QContactDetail::ContextHome); contact.saveDetail(&birthDay); - QVersitDocument document = mExporter->exportContact(contact); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); QVersitProperty property = document.properties().at(0); QCOMPARE(property.parameters().count(), 0); QCOMPARE(property.name(), QString::fromAscii("BDAY")); - QCOMPARE(QString::fromAscii(property.value()), QString::fromAscii("2009-01-01")); + QCOMPARE(property.value(), QString::fromAscii("2009-01-01")); } void UT_QVersitContactExporter::testEncodeNote() @@ -510,18 +584,20 @@ // Contexts not allowed in NOTE property, check that they are not added note.setContexts(QContactDetail::ContextHome); contact.saveDetail(¬e); - QVersitDocument document = mExporter->exportContact(contact); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); QVersitProperty property = document.properties().at(0); QCOMPARE(property.parameters().count(), 0); QCOMPARE(property.name(), QString::fromAscii("NOTE")); - QCOMPARE(QString::fromAscii(property.value()), note.note()); + QCOMPARE(property.value(), note.note()); } void UT_QVersitContactExporter::testEncodeGeoLocation() { QContact contact; - QContactGeolocation geoLocation; + QContactGeoLocation geoLocation; QString longitude = QString::fromAscii("99.9"); geoLocation.setLongitude(longitude.toDouble()); QString latitude = QString::fromAscii("98.9"); @@ -529,20 +605,23 @@ // Contexts not allowed in GEO property, check that they are not added geoLocation.setContexts(QContactDetail::ContextHome); contact.saveDetail(&geoLocation); - QVersitDocument document = mExporter->exportContact(contact); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); QVersitProperty property = document.properties().at(0); QCOMPARE(property.parameters().count(), 0); QCOMPARE(property.name(), QString::fromAscii("GEO")); QString expectedValue = longitude + QString::fromAscii(",") + latitude; - QCOMPARE(QString::fromAscii(property.value()), expectedValue); + QCOMPARE(property.value(), expectedValue); } void UT_QVersitContactExporter::testEncodeOrganization() { + QList contacts; QContact contact; QContactOrganization organization; - QVersitDocument versitDocument; + QVersitDocument document; QVersitProperty property; QString title(QString::fromAscii("Developer")); QString organizationName(QString::fromAscii("Nokia")); @@ -551,21 +630,25 @@ // TITLE organization.setTitle(title); contact.saveDetail(&organization); - versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().count(), 1); - property = versitDocument.properties().at(0); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 1); + property = document.properties().at(0); QCOMPARE(property.name(), QString::fromAscii("TITLE")); - QCOMPARE(QString::fromAscii(property.value()), title); + QCOMPARE(property.value(), title); // ORG with name organization.setTitle(QString()); organization.setName(QString::fromAscii("Nokia")); contact.saveDetail(&organization); - versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().count(), 1); - property = versitDocument.properties().at(0); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 1); + property = document.properties().at(0); QCOMPARE(property.name(), QString::fromAscii("ORG")); - QCOMPARE(QString::fromAscii(property.value()), QString::fromAscii("Nokia;")); + QCOMPARE(property.value(), QString::fromAscii("Nokia;")); // ORG with department/unit organization.setName(QString()); @@ -573,102 +656,115 @@ departments.append(QString::fromAscii("Qt")); organization.setDepartment(departments); contact.saveDetail(&organization); - versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().count(), 1); - property = versitDocument.properties().at(0); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 1); + property = document.properties().at(0); QCOMPARE(property.name(), QString::fromAscii("ORG")); - QCOMPARE(QString::fromAscii(property.value()), QString::fromAscii(";R&D;Qt")); + QCOMPARE(property.value(), QString::fromAscii(";R&D;Qt")); // ORG with name and department/unit organization.setName(QString::fromAscii("Nokia")); contact.saveDetail(&organization); - versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().count(), 1); - property = versitDocument.properties().at(0); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 1); + property = document.properties().at(0); QCOMPARE(property.name(), QString::fromAscii("ORG")); - QCOMPARE(QString::fromAscii(property.value()), QString::fromAscii("Nokia;R&D;Qt")); + QCOMPARE(property.value(), QString::fromAscii("Nokia;R&D;Qt")); // TITLE and ORG organization.setTitle(QString::fromAscii("Developer")); contact.saveDetail(&organization); - versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().count(), 2); - property = versitDocument.properties().at(0); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 2); + property = document.properties().at(0); QCOMPARE(property.name(), QString::fromAscii("TITLE")); - QCOMPARE(QString::fromAscii(property.value()), title); - property = versitDocument.properties().at(1); + QCOMPARE(property.value(), title); + property = document.properties().at(1); QCOMPARE(property.name(), QString::fromAscii("ORG")); - QCOMPARE(QString::fromAscii(property.value()), QString::fromAscii("Nokia;R&D;Qt")); + QCOMPARE(property.value(), QString::fromAscii("Nokia;R&D;Qt")); // ORG LOGO Test1: LOGO as remote Resouce - mScaleSignalEmitted = false; - - const QString url = QString::fromAscii("http://www.myhome.com/test.jpg"); + const QString url = QString::fromAscii("http://myhome.com/test.jpg"); contact = QContact(); organization = QContactOrganization(); organization.setLogo(url); contact.saveDetail(&organization); - versitDocument = mExporter->exportContact(contact); - QVERIFY(!mScaleSignalEmitted); + contacts.clear(); + contacts.append(contact); + mResourceHandler->mSimulatedMimeType = QLatin1String("image/jpeg"); + mExporter->setResourceHandler(mResourceHandler); + document = mExporter->exportContacts(contacts).first(); + QVERIFY(!mResourceHandler->mLoadResourceCalled); - //Media type, and source type are encoded. - QCOMPARE(versitDocument.properties().at(0).parameters().count(), 2); + // Source type is encoded, but media type is not for a URL. + QCOMPARE(document.properties().at(0).parameters().count(), 1); - QVERIFY(versitDocument.properties().at(0).parameters().contains( - QString::fromAscii("TYPE"), QString::fromAscii("JPEG"))); - QVERIFY(versitDocument.properties().at(0).parameters().contains( + QVERIFY(document.properties().at(0).parameters().contains( QString::fromAscii("VALUE"), QString::fromAscii("URL"))); //Check property Name - QString propertyName = versitDocument.properties().at(0).name(); + QString propertyName = document.properties().at(0).name(); QCOMPARE(propertyName, QString::fromAscii("LOGO")); //Check property value - QString value = QString::fromAscii(versitDocument.properties().at(0).value().data() ); + QString value = document.properties().at(0).value(); QCOMPARE(value, url); // ORG LOGO Test2: LOGO File. + mResourceHandler->mSimulatedData = "simulated data"; contact = QContact(); organization = QContactOrganization(); - organization.setLogo(mTestPhotoFile); + organization.setLogo(TEST_PHOTO_FILE); contact.saveDetail(&organization); - versitDocument = mExporter->exportContact(contact); - QVERIFY(mScaleSignalEmitted); - - //Media type, source encoding is encoded i.e. base64 - QCOMPARE(versitDocument.properties().at(0).parameters().count(), 2); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QVERIFY(mResourceHandler->mLoadResourceCalled); + QCOMPARE(mResourceHandler->mLocation, TEST_PHOTO_FILE); - QVERIFY(versitDocument.properties().at(0).parameters().contains( + // It should be stored in the property as a QVariant of QByteArray + property = document.properties().at(0); + QMultiHash parameters = property.parameters(); + // Media type is encoded + QCOMPARE(parameters.count(), 1); + QVERIFY(parameters.contains( QString::fromAscii("TYPE"), QString::fromAscii("JPEG"))); - - QVERIFY(versitDocument.properties().at(0).parameters().contains( - QString::fromAscii("ENCODING"), QString::fromAscii("BASE64"))); - - //Ensure value1 is not URL - QString value1 = QString::fromAscii(versitDocument.properties().at(0).value().data()); - QEXPECT_FAIL(value1.toAscii(), url.toAscii(), Continue); + // Verify value. + QVariant variantValue = property.variantValue(); + QVERIFY(variantValue.type() == QVariant::ByteArray); + QCOMPARE(variantValue.value(), mResourceHandler->mSimulatedData); // Assistant Name Test. contact = QContact(); organization = QContactOrganization(); organization.setAssistantName(QString::fromAscii("myAssistant")); contact.saveDetail(&organization); - versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().count(), 1); - property = versitDocument.properties().at(0); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 1); + property = document.properties().at(0); QCOMPARE(property.name(), QString::fromAscii("X-ASSISTANT")); - QCOMPARE(QString::fromAscii(property.value()), QString::fromAscii("myAssistant")); + QCOMPARE(property.value(), QString::fromAscii("myAssistant")); // Test: Role contact = QContact(); organization = QContactOrganization(); organization.setRole(QString::fromAscii("Executive")); contact.saveDetail(&organization); - versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().count(), 1); - property = versitDocument.properties().at(0); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 1); + property = document.properties().at(0); QCOMPARE(property.name(), QString::fromAscii("ROLE")); - QCOMPARE(QString::fromAscii(property.value()), QString::fromAscii("Executive")); + QCOMPARE(property.value(), QString::fromAscii("Executive")); } @@ -676,38 +772,78 @@ { QContact contact; QContactAvatar contactAvatar; - - mScaleSignalEmitted = false; + QPixmap pixmap; + pixmap.loadFromData(SAMPLE_GIF); + mResourceHandler->mSimulatedData = "simulated data"; + mResourceHandler->mSimulatedMimeType = QLatin1String("image/jpeg"); // Test1: Web URL const QString url = QString::fromAscii("http://www.myhome.com/test.jpg"); contactAvatar.setAvatar(url); contactAvatar.setSubType(QContactAvatar::SubTypeImage); contact.saveDetail(&contactAvatar); - QVersitDocument versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().at(0).parameters().count(), 2); - QVERIFY(!mScaleSignalEmitted); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); + QVERIFY(document.properties().length() > 0); + QVersitProperty property = document.properties().at(0); + QCOMPARE(property.parameters().count(), 1); + QVERIFY(!mResourceHandler->mLoadResourceCalled); // Test 2: Local Media PHOTO - contactAvatar.setAvatar(mTestPhotoFile); + contactAvatar.setAvatar(TEST_PHOTO_FILE); + contactAvatar.setPixmap(pixmap); // Should be ignored if the file can be loaded. contactAvatar.setSubType(QContactAvatar::SubTypeImage); contact.saveDetail(&contactAvatar); - versitDocument = mExporter->exportContact(contact); - QVERIFY(mScaleSignalEmitted); - - //Media type, source encoding is encoded i.e. base64 - QCOMPARE(versitDocument.properties().at(0).parameters().count(), 2); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QVERIFY(mResourceHandler->mLoadResourceCalled); + QCOMPARE(mResourceHandler->mLocation, TEST_PHOTO_FILE); + // verify the value + QVERIFY(document.properties().length() > 0); + property = document.properties().at(0); + QVariant variantValue = property.variantValue(); + QVERIFY(variantValue.type() == QVariant::ByteArray); + QCOMPARE(variantValue.value(), mResourceHandler->mSimulatedData); + QVERIFY(property.parameters().contains(QString::fromAscii("TYPE"), + QString::fromAscii("JPEG"))); // Test3: UnSupported Media Type, properties and parameters are not encoded - mScaleSignalEmitted = false; + mResourceHandler->clear(); const QString testUrl2 = QString::fromAscii("http://www.myhome.com/test.jpg"); contactAvatar.setAvatar(testUrl2); // un-supported media type is encoded contactAvatar.setSubType(QContactAvatar::SubTypeTexturedMesh); contact.saveDetail(&contactAvatar); - versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().count(), 0); - QVERIFY(!mScaleSignalEmitted); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 0); + QVERIFY(!mResourceHandler->mLoadResourceCalled); + + // Test 4: Load resource fails but there is a pixmap. The pixmap should be saved. + // This feature is only supported if we can write PNGs. + if (QImageWriter::supportedImageFormats().contains("png")) { + mResourceHandler->clear(); + mResourceHandler->mLoadSuccess = false; + contactAvatar.setAvatar(QLatin1String("")); + contactAvatar.setSubType(QContactAvatar::SubTypeImage); + contactAvatar.setPixmap(pixmap); + contact.saveDetail(&contactAvatar); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + // verify the value + QVERIFY(document.properties().length() > 0); + property = document.properties().at(0); + variantValue = property.variantValue(); + QVERIFY(variantValue.type() == QVariant::ByteArray); + QByteArray retrievedData = variantValue.value(); + QPixmap retrievedPixmap; + retrievedPixmap.loadFromData(retrievedData); + QCOMPARE(retrievedPixmap, pixmap); + } } @@ -715,96 +851,89 @@ { QContact contact; QContactAvatar contactAvatar; + QVariant variantValue; // Test 1: URL const QString url = QString::fromAscii("http://www.myhome.com/test.jpg"); contactAvatar.setAvatar(url); contactAvatar.setSubType(QContactAvatar::SubTypeImage); contact.saveDetail(&contactAvatar); - QVersitDocument versitDocument = mExporter->exportContact(contact); - QVERIFY(!mScaleSignalEmitted); - QVersitProperty photoProperty = versitDocument.properties().at(0); - QCOMPARE(photoProperty.parameters().count(), 2); - QVERIFY(photoProperty.parameters().contains( - QString::fromAscii("TYPE"),QString::fromAscii("JPEG"))); + QList contacts; + contacts.append(contact); + mResourceHandler->mSimulatedMimeType = QLatin1String("image/jpeg"); + QVersitDocument document = mExporter->exportContacts(contacts).first(); + QVERIFY(!mResourceHandler->mLoadResourceCalled); + QVersitProperty photoProperty = document.properties().at(0); + QCOMPARE(photoProperty.parameters().count(), 1); QVERIFY(photoProperty.parameters().contains( QString::fromAscii("VALUE"),QString::fromAscii("URL"))); QCOMPARE(photoProperty.name(), QString::fromAscii("PHOTO")); - QCOMPARE(QString::fromAscii(photoProperty.value()), url); + QCOMPARE(photoProperty.value(), url); - // Test 2: Local PHOTO, image not scaled - contactAvatar.setAvatar(mTestPhotoFile); + // Test 2: Local PHOTO, image loaded by the loader + contactAvatar.setAvatar(TEST_PHOTO_FILE); contactAvatar.setSubType(QContactAvatar::SubTypeImage); contact.saveDetail(&contactAvatar); - versitDocument = mExporter->exportContact(contact); - QVERIFY(mScaleSignalEmitted); - photoProperty = versitDocument.properties().at(0); - QCOMPARE(photoProperty.parameters().count(), 2); - QVERIFY(photoProperty.parameters().contains( - QString::fromAscii("TYPE"), - QString::fromAscii("JPEG"))); - QVERIFY(photoProperty.parameters().contains( - QString::fromAscii("ENCODING"), - QString::fromAscii("BASE64"))); - QFile photoFile(mTestPhotoFile); - photoFile.open(QIODevice::ReadOnly); - QByteArray photoFileContent = photoFile.readAll(); - QCOMPARE(photoProperty.value(), photoFileContent.toBase64()); + contacts.clear(); + contacts.append(contact); + mResourceHandler->clear(); + mResourceHandler->mSimulatedMimeType = QLatin1String("image/jpeg"); + mResourceHandler->mSimulatedData = "simulated image data"; + document = mExporter->exportContacts(contacts).first(); + QVERIFY(mResourceHandler->mLoadResourceCalled); + photoProperty = document.properties().at(0); + QCOMPARE(photoProperty.parameters().count(), 1); + QVERIFY(photoProperty.parameters().contains(QString::fromAscii("TYPE"), + QString::fromAscii("JPEG"))); + variantValue = photoProperty.variantValue(); + QVERIFY(variantValue.type() == QVariant::ByteArray); + QCOMPARE(variantValue.value(), mResourceHandler->mSimulatedData); - // Test 3: Local PHOTO, image scaled by the "client" - mScaleSignalEmitted = false; - mSimulatedImageData = "simulated image data"; - versitDocument = mExporter->exportContact(contact); - QVERIFY(mScaleSignalEmitted); - photoProperty = versitDocument.properties().at(0); - QCOMPARE(photoProperty.parameters().count(), 2); - QVERIFY(photoProperty.parameters().contains( - QString::fromAscii("TYPE"), - QString::fromAscii("JPEG"))); - QVERIFY(photoProperty.parameters().contains( - QString::fromAscii("ENCODING"), - QString::fromAscii("BASE64"))); - QCOMPARE(photoProperty.value(), mSimulatedImageData.toBase64()); - - // Test 5: Local SOUND - mScaleSignalEmitted = false; - contactAvatar.setAvatar(mTestAudioFile); + // Test 3: Local SOUND + mResourceHandler->clear(); + mResourceHandler->mSimulatedMimeType = QLatin1String("audio/wav"); + mResourceHandler->mSimulatedData = "simulated audio data"; + contactAvatar.setAvatar(TEST_AUDIO_FILE); contactAvatar.setSubType(QContactAvatar::SubTypeAudioRingtone); contact.saveDetail(&contactAvatar); - versitDocument = mExporter->exportContact(contact); - QVERIFY(!mScaleSignalEmitted); - QVersitProperty soundProperty = versitDocument.properties().at(0); - QCOMPARE(soundProperty.parameters().count(), 2); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QVERIFY(mResourceHandler->mLoadResourceCalled); + QVersitProperty soundProperty = document.properties().at(0); + QCOMPARE(soundProperty.parameters().count(), 1); QVERIFY(soundProperty.parameters().contains( QString::fromAscii("TYPE"), - QString::fromAscii("WAVE"))); - QVERIFY(soundProperty.parameters().contains( - QString::fromAscii("ENCODING"), - QString::fromAscii("BASE64"))); - QCOMPARE(soundProperty.value(), QByteArray()); + QString::fromAscii("WAV"))); + variantValue = soundProperty.variantValue(); + QVERIFY(variantValue.type() == QVariant::ByteArray); + QCOMPARE(variantValue.value(), mResourceHandler->mSimulatedData); - // Test 6: New media format will be encoded also - const QString testUrl = QString::fromAscii("http://www.myhome.com/test.ggg"); - contactAvatar.setAvatar(testUrl); - contactAvatar.setSubType(QContactAvatar::SubTypeImage); - contact.saveDetail(&contactAvatar); - versitDocument = mExporter->exportContact(contact); - QVERIFY(!mScaleSignalEmitted); - QCOMPARE(versitDocument.properties().count(), 1); - QCOMPARE(versitDocument.properties().at(0).parameters().count(), 2); - QVERIFY(versitDocument.properties().at(0).parameters().contains( - QString::fromAscii("TYPE"), QString::fromAscii("GGG"))); - QVERIFY(versitDocument.properties().at(0).parameters().contains( - QString::fromAscii("VALUE"),QString::fromAscii("URL"))); - - // Test 7: Unsupported media type, properties and parameters are not encoded + // Test 4: Unsupported media type, properties and parameters are not encoded + mResourceHandler->clear(); + mResourceHandler->mSimulatedMimeType = QLatin1String("text/jpeg"); const QString testUrl2 = QString::fromAscii("http://www.myhome.com/test.jpg"); contactAvatar.setAvatar(testUrl2); // un-supported media type is encoded contactAvatar.setSubType(QContactAvatar::SubTypeTexturedMesh); contact.saveDetail(&contactAvatar); - versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().count(), 0); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 0); + QVERIFY(!mResourceHandler->mLoadResourceCalled); + + // Without a resource handler + mExporter->setResourceHandler(0); + contactAvatar.setAvatar(TEST_PHOTO_FILE); + contactAvatar.setSubType(QContactAvatar::SubTypeImage); + contact.saveDetail(&contactAvatar); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 0); + + mExporter->setResourceHandler(mResourceHandler); } void UT_QVersitContactExporter::testEncodeParameters() @@ -819,7 +948,9 @@ subtypes.append(QContactPhoneNumber::SubTypeDtmfMenu); phoneNumber.setSubTypes(subtypes); contact.saveDetail(&phoneNumber); - QVersitDocument document = mExporter->exportContact(contact); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); QVersitProperty property = document.properties().at(0); QCOMPARE(property.parameters().count(), 2); @@ -833,47 +964,57 @@ { QContact contact; QContactAvatar contactAvatar; - QVersitDocument versitDocument; + mResourceHandler->mLoadSuccess = false; // Test1: http URL QString url = QString::fromAscii("http://www.nonoh.com/test.jpg"); contactAvatar.setAvatar(url); contactAvatar.setSubType(QContactAvatar::SubTypeImage); contact.saveDetail(&contactAvatar); - versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().count(), 1); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 1); // Test2: FTP URL url = QString::fromAscii("ftp://nonoh.com/test.jpg"); contactAvatar.setAvatar(url); contactAvatar.setSubType(QContactAvatar::SubTypeImage); contact.saveDetail(&contactAvatar); - versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().count(), 1); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 1); // Test3: NEW Protocol URL url = QString::fromAscii("myProtocol://nonoh.com/test.jpg"); contactAvatar.setAvatar(url); contactAvatar.setSubType(QContactAvatar::SubTypeImage); contact.saveDetail(&contactAvatar); - versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().count(), 1); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 1); // Test4: URL without scheme url = QString::fromAscii("www.nonoh.com/test.jpg"); contactAvatar.setAvatar(url); contactAvatar.setSubType(QContactAvatar::SubTypeImage); contact.saveDetail(&contactAvatar); - versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().count(), 1); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 1); // Test5: File Name but File does not Exisit url = QString::fromAscii("c:/filedoesnotexisit.jok"); contactAvatar.setAvatar(url); contactAvatar.setSubType(QContactAvatar::SubTypeImage); contact.saveDetail(&contactAvatar); - versitDocument = mExporter->exportContact(contact); - QCOMPARE(versitDocument.properties().count(), 0); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 0); } void UT_QVersitContactExporter::testEncodeGender() @@ -883,42 +1024,51 @@ gender.setGender(QContactGender::GenderMale); gender.setContexts(QContactGender::ContextHome); // Should not be encoded contact.saveDetail(&gender); - QVersitDocument document = mExporter->exportContact(contact); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); QVersitProperty property = document.properties().at(0); QCOMPARE(property.parameters().count(), 0); QCOMPARE(property.name(), QString::fromAscii("X-GENDER")); - QCOMPARE(QString::fromAscii(property.value()), gender.gender()); + QCOMPARE(property.value(), gender.gender()); } void UT_QVersitContactExporter::testEncodeNickName() { QContact contact; - QVersitDocument document; + + // Add an extra detail + QContactGender gender; + gender.setGender(QContactGender::GenderMale); + contact.saveDetail(&gender); - // Nickname not yet in the document - QContactNickname nicknameDetail; - QString firstNickname(QString::fromAscii("Homie")); - nicknameDetail.setNickname(firstNickname); + // One nickname given + QContactNickname firstNickname; + firstNickname.setNickname(QLatin1String("Homie")); + contact.saveDetail(&firstNickname); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 2); + QVersitProperty property = document.properties().at(1); + QCOMPARE(property.name(), QLatin1String("X-NICKNAME")); + QCOMPARE(property.value(), QLatin1String("Homie")); - contact.saveDetail(&nicknameDetail); - mExporterPrivate->exportContact(document,contact); - - QCOMPARE(document.properties().count(), 1); - QVersitProperty property = document.properties().at(0); + // Two nicknames given, should be collated into a single property + contact.clearDetails(); + contact.saveDetail(&gender); + contact.saveDetail(&firstNickname); + QContactNickname secondNickname; + secondNickname.setNickname(QLatin1String("Jay")); + contact.saveDetail(&secondNickname); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); + QCOMPARE(document.properties().count(), 2); + property = document.properties().at(1); QCOMPARE(property.name(), QString::fromAscii("X-NICKNAME")); - QCOMPARE(QString::fromAscii(property.value()), firstNickname); - - // Nickname already in the document, append to the existing property - QString secondNickname(QString::fromAscii("Jay")); - nicknameDetail.setNickname(secondNickname); - - contact.saveDetail(&nicknameDetail); - mExporterPrivate->exportContact(document,contact); - QCOMPARE(document.properties().count(), 1); - property = document.properties().at(0); - QCOMPARE(property.name(), QString::fromAscii("X-NICKNAME")); - QCOMPARE(QString::fromAscii(property.value()), QString::fromAscii("Homie,Jay")); + QCOMPARE(property.value(), QString::fromAscii("Homie,Jay")); } void UT_QVersitContactExporter::testEncodeAnniversary() @@ -930,7 +1080,9 @@ anniversary.setContexts(QContactDetail::ContextHome); anniversary.setSubType(QContactAnniversary::SubTypeWedding); contact.saveDetail(&anniversary); - QVersitDocument document = mExporter->exportContact(contact); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); QVersitProperty property = document.properties().at(0); // The contexts and subtypes are not defined for X-ANNIVERSARY property @@ -938,7 +1090,7 @@ // Check name QCOMPARE(property.name(), QString::fromAscii("X-ANNIVERSARY")); // Check value - QCOMPARE(QString::fromAscii(property.value()), date.toString(Qt::ISODate)); + QCOMPARE(property.value(), date.toString(Qt::ISODate)); } @@ -953,7 +1105,9 @@ onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeVideoShare); onlineAccount.setContexts(QContactDetail::ContextHome); contact.saveDetail(&onlineAccount); - QVersitDocument document = mExporter->exportContact(contact); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); QVersitProperty property = document.properties().at(0); // Check parameters @@ -965,13 +1119,15 @@ // Check name QCOMPARE(property.name(), QString::fromAscii("X-SIP")); // Check value - QCOMPARE(QString::fromAscii(property.value()), accountUri); + QCOMPARE(property.value(), accountUri); // VoIP onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeSipVoip); onlineAccount.setContexts(QContactDetail::ContextWork); contact.saveDetail(&onlineAccount); - document = mExporter->exportContact(contact); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); property = document.properties().at(0); // Check parameters @@ -983,13 +1139,15 @@ // Check name QCOMPARE(property.name(), QString::fromAscii("X-SIP")); // Check value - QCOMPARE(QString::fromAscii(property.value()), accountUri); + QCOMPARE(property.value(), accountUri); // Plain SIP onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeSip); onlineAccount.setContexts(QContactDetail::ContextWork); contact.saveDetail(&onlineAccount); - document = mExporter->exportContact(contact); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); property = document.properties().at(0); // Check parameters, SIP not added as a TYPE parameter @@ -999,13 +1157,15 @@ // Check name QCOMPARE(property.name(), QString::fromAscii("X-SIP")); // Check value - QCOMPARE(QString::fromAscii(property.value()), accountUri); + QCOMPARE(property.value(), accountUri); // IMPP / X-IMPP onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeImpp); onlineAccount.setContexts(QContactDetail::ContextHome); contact.saveDetail(&onlineAccount); - document = mExporter->exportContact(contact); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); property = document.properties().at(0); // Check parameters, SIP not added as a TYPE parameter @@ -1015,12 +1175,14 @@ // Check name QCOMPARE(property.name(), QString::fromAscii("X-IMPP")); // Check value - QCOMPARE(QString::fromAscii(property.value()), accountUri); + QCOMPARE(property.value(), accountUri); // Other subtypes not converted onlineAccount.setSubTypes(QString::fromAscii("INVALIDSUBTYPE")); contact.saveDetail(&onlineAccount); - document = mExporter->exportContact(contact); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 0); } @@ -1032,19 +1194,23 @@ // No spouse, no family family.setContexts(QContactDetail::ContextHome); contact.saveDetail(&family); - QVersitDocument document = mExporter->exportContact(contact); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 0); // Only spouse present QString spouce = QString::fromAscii("ABC"); family.setSpouse(spouce); contact.saveDetail(&family); - document = mExporter->exportContact(contact); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 1); QVersitProperty spouseProperty = document.properties().at(0); QCOMPARE(spouseProperty.parameters().count(), 0); QCOMPARE(spouseProperty.name(), QString::fromAscii("X-SPOUSE")); - QCOMPARE(QString::fromAscii(spouseProperty.value()), spouce); + QCOMPARE(spouseProperty.value(), spouce); // Spouse and children QStringList children; @@ -1052,55 +1218,75 @@ family.setChildren(children); family.setSpouse(spouce); contact.saveDetail(&family); - document = mExporter->exportContact(contact); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 2); spouseProperty = document.properties().at(0); QCOMPARE(spouseProperty.parameters().count(), 0); QCOMPARE(spouseProperty.name(), QString::fromAscii("X-SPOUSE")); - QCOMPARE(QString::fromAscii(spouseProperty.value()), spouce); + QCOMPARE(spouseProperty.value(), spouce); QVersitProperty childrenProperty = document.properties().at(1); QCOMPARE(childrenProperty.parameters().count(), 0); QCOMPARE(childrenProperty.name(), QString::fromAscii("X-CHILDREN")); - QCOMPARE(QString::fromAscii(childrenProperty.value()), QString::fromAscii("A,B")); + QCOMPARE(childrenProperty.value(), QString::fromAscii("A\\,B")); } void UT_QVersitContactExporter::testEncodeDisplayLabel() { QContact contact; - QContactDisplayLabel displayLaebl; QContactName contactName; // No display label and no QContactName - QVersitDocument document = mExporter->exportContact(contact); + QList contacts; + contacts.append(contact); + QVersitDocument document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 0); // No display label, but QContactName found - contactName.setFirst(QString::fromAscii("First")); - contactName.setLast(QString::fromAscii("Last")); - contactName.setMiddle(QString::fromAscii("Middle")); + contactName.setFirstName(QString::fromAscii("First")); + contactName.setLastName(QString::fromAscii("Last")); + contactName.setMiddleName(QString::fromAscii("Middle")); contact.saveDetail(&contactName); - document = mExporter->exportContact(contact); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts).first(); QCOMPARE(document.properties().count(), 2); QVersitProperty displayProperty = document.properties().at(0); QCOMPARE(displayProperty.name(), QString::fromAscii("FN")); - QCOMPARE(QString::fromAscii(displayProperty.value()), QString::fromAscii("First Last")); + QCOMPARE(displayProperty.value(), QString::fromAscii("First Last")); QVersitProperty nameProperty = document.properties().at(1); QCOMPARE(nameProperty.name(), QString::fromAscii("N")); - QCOMPARE(QString::fromAscii(nameProperty.value()), + QCOMPARE(nameProperty.value(), QString::fromAscii("Last;First;Middle;;")); // Custom label in QContactName, use vCard 3.0 to test the backslash escaping contact = QContact(); contactName.setCustomLabel(QString::fromAscii("Custom,Label")); contact.saveDetail(&contactName); - document = mExporter->exportContact(contact, QVersitDocument::VCard30); + contacts.clear(); + contacts.append(contact); + document = mExporter->exportContacts(contacts, QVersitDocument::VCard30Type).first(); displayProperty = document.properties().at(0); QCOMPARE(displayProperty.name(), QString::fromAscii("FN")); - QCOMPARE(QString::fromAscii(displayProperty.value()), + QCOMPARE(displayProperty.value(), QString::fromAscii("Custom\\,Label")); } +void UT_QVersitContactExporter::testDefaultResourceHandler() +{ + QVersitDefaultResourceHandler handler; + QByteArray contents; + QString mimeType; + handler.loadResource(QLatin1String("test.jpg"), &contents, &mimeType); + QCOMPARE(mimeType, QLatin1String("image/jpeg")); + + QVersitProperty property; + QString location; + QVERIFY(!handler.saveResource("test contents", property, &location)); +} + // Test utility functions QContactDetail UT_QVersitContactExporter::searchDetail( QList details, diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitcontactexporter/ut_qversitcontactexporter.h --- a/qtcontactsmobility/tests/auto/qversitcontactexporter/ut_qversitcontactexporter.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitcontactexporter/ut_qversitcontactexporter.h Fri Apr 16 14:53:18 2010 +0300 @@ -49,7 +49,9 @@ QTM_BEGIN_NAMESPACE class QVersitContactExporter; -class MyQVersitContactExporterPrivate; +class QVersitContactExporterPrivate; +class MyQVersitResourceHandler; +class MyQVersitContactExporterDetailHandler; QTM_END_NAMESPACE QTM_USE_NAMESPACE @@ -58,17 +60,12 @@ { Q_OBJECT -public slots: - void scale(const QString& imageFileName, QByteArray& imageData); - private slots: void init(); void cleanup(); - void initTestCase(); - void cleanupTestCase(); void testConvertContact(); - void testUnknownContactDetails(); + void testContactDetailHandler(); void testEncodeName(); void testEncodePhoneNumber(); void testEncodeEmailAddress(); @@ -90,17 +87,15 @@ void testEncodeFamily(); void testEncodeAvatar(); void testEncodeDisplayLabel(); + void testDefaultResourceHandler(); // Test Utility Function QContactDetail searchDetail(QList details, QString search); private: // Data QVersitContactExporter* mExporter; - MyQVersitContactExporterPrivate* mExporterPrivate; - QString mTestPhotoFile; - QString mTestAudioFile; - bool mScaleSignalEmitted; - QByteArray mSimulatedImageData; + MyQVersitResourceHandler* mResourceHandler; + MyQVersitContactExporterDetailHandler* mDetailHandler; }; #endif // UT_QVERSITCONTACTEXPORTER_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitcontactimporter/ut_qversitcontactimporter.cpp --- a/qtcontactsmobility/tests/auto/qversitcontactimporter/ut_qversitcontactimporter.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitcontactimporter/ut_qversitcontactimporter.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -39,7 +39,7 @@ ** ****************************************************************************/ -#include "qversitdefs.h" +#include "qversitdefs_p.h" #include "ut_qversitcontactimporter.h" #include "qversitcontactimporter.h" #include "qversitcontactimporter_p.h" @@ -67,47 +67,122 @@ #include #include +QTM_BEGIN_NAMESPACE +class MyQVersitContactImporterPropertyHandler : public QVersitContactImporterPropertyHandler +{ +public: + MyQVersitContactImporterPropertyHandler() + : mPreProcess(false) + { + } + + bool preProcessProperty(const QVersitDocument& document, + const QVersitProperty& property, + int contactIndex, + QContact* contact) + { + Q_UNUSED(document) + Q_UNUSED(contact) + Q_UNUSED(contactIndex); + mPreProcessedProperties.append(property); + return mPreProcess; + } + + bool postProcessProperty(const QVersitDocument& document, + const QVersitProperty& property, + bool alreadyProcessed, + int contactIndex, + QContact* contact) + { + Q_UNUSED(document) + Q_UNUSED(contact) + Q_UNUSED(contactIndex) + if (!alreadyProcessed) + mUnknownProperties.append(property); + else + mPostProcessedProperties.append(property); + return false; + } + + void clear() + { + mPreProcess = false; + mPropertyNamesToProcess.clear(); + mUnknownProperties.clear(); + mPreProcessedProperties.clear(); + mPostProcessedProperties.clear(); + } + + // a hook to control what preProcess returns: + bool mPreProcess; + QStringList mPropertyNamesToProcess; + QList mUnknownProperties; + QList mPreProcessedProperties; + QList mPostProcessedProperties; +}; + +class MyQVersitResourceHandler : public QVersitResourceHandler +{ +public: + MyQVersitResourceHandler() : mIndex(0) + { + } + + bool saveResource(const QByteArray& contents, const QVersitProperty& property, + QString* location) + { + Q_UNUSED(property); + *location = QString::number(mIndex++); + mObjects.insert(*location, contents); + return true; + } + + bool loadResource(const QString &location, QByteArray *contents, QString *mimeType) + { + Q_UNUSED(location) + Q_UNUSED(contents) + Q_UNUSED(mimeType) + return false; + } + + void clear() + { + mIndex = 0; + mObjects.clear(); + } + + int mIndex; + QMap mObjects; +}; + +const static QByteArray SAMPLE_GIF(QByteArray::fromBase64( + "R0lGODlhEgASAIAAAAAAAP///yH5BAEAAAEALAAAAAASABIAAAIdjI+py+0G" + "wEtxUmlPzRDnzYGfN3KBaKGT6rDmGxQAOw==")); + +QTM_END_NAMESPACE QTM_USE_NAMESPACE - -QString imageAndAudioClipPath(QString::fromAscii("random98354_dir76583_ut_versit_photo")); - -void UT_QVersitContactImporter::initTestCase() -{ - // Create the directory to store the image - QDir dir; - if (!dir.exists(imageAndAudioClipPath)) { - dir.mkdir(imageAndAudioClipPath); - } -} - -void UT_QVersitContactImporter::cleanupTestCase() +void UT_QVersitContactImporter::init() { - QDir dir; - - if (dir.exists(imageAndAudioClipPath)) { - dir.cd(imageAndAudioClipPath); - // remove all the files first - QStringList allFiles; - allFiles << QString::fromAscii("*"); - QStringList fileList = dir.entryList(allFiles, QDir::Files); - foreach (QString file, fileList) { - dir.remove(file); - } - dir.cdUp(); - dir.rmdir(imageAndAudioClipPath); - } -} - -void UT_QVersitContactImporter::init() -{ mImporter = new QVersitContactImporter(); + mImporterPrivate = new QVersitContactImporterPrivate(); + mResourceHandler = new MyQVersitResourceHandler(); + mImporter->setResourceHandler(mResourceHandler); + mPropertyHandler = new MyQVersitContactImporterPropertyHandler(); + mImporter->setPropertyHandler(mPropertyHandler); } void UT_QVersitContactImporter::cleanup() { + QVERIFY(mImporter->propertyHandler() == mPropertyHandler); + mImporter->setPropertyHandler(0); + delete mPropertyHandler; + QVERIFY(mImporter->resourceHandler() == mResourceHandler); + mImporter->setResourceHandler(0); + delete mResourceHandler; delete mImporter; + delete mImporterPrivate; } void UT_QVersitContactImporter::testName() @@ -121,13 +196,15 @@ value.append(QString::fromAscii("Dr"));//PreFix value.append(QString::fromAscii("MSc"));//Suffix nameProperty.setName(QString::fromAscii("N")); - nameProperty.setValue(value.join(QString::fromAscii(";")).toAscii()); - document.addProperty(nameProperty); - QContact contact = mImporter->importContact(document); + nameProperty.setValue(value.join(QString::fromAscii(";"))); + document.addProperty(nameProperty); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactName name = (QContactName)contact.detail(QContactName::DefinitionName); - QCOMPARE(name.last(),value[0]); - QCOMPARE(name.first(),value[1]); - QCOMPARE(name.middle(),value[2]); + QCOMPARE(name.lastName(),value[0]); + QCOMPARE(name.firstName(),value[1]); + QCOMPARE(name.middleName(),value[2]); QCOMPARE(name.prefix(),value[3]); QCOMPARE(name.suffix(),value[4]); @@ -140,30 +217,57 @@ anotherValue.append(QString::fromAscii("FakeDr"));//PreFix anotherValue.append(QString::fromAscii("FakeMSc"));//Suffix nameProperty.setName(QString::fromAscii("N")); - nameProperty.setValue(anotherValue.join(QString::fromAscii(";")).toAscii()); + nameProperty.setValue(anotherValue.join(QString::fromAscii(";"))); document.addProperty(nameProperty); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); QList names = contact.details(QContactName::DefinitionName); QCOMPARE(names.count(),1); // anotherValue should be discarded, so check for value name = (QContactName)names[0]; - QCOMPARE(name.last(),value[0]); - QCOMPARE(name.first(),value[1]); - QCOMPARE(name.middle(),value[2]); + QCOMPARE(name.lastName(),value[0]); + QCOMPARE(name.firstName(),value[1]); + QCOMPARE(name.middleName(),value[2]); QCOMPARE(name.prefix(),value[3]); QCOMPARE(name.suffix(),value[4]); } +// check that it doesn't crash if the FN property comes before the N property. +void UT_QVersitContactImporter::testNameWithFormatted() +{ + QVersitDocument document; + QVersitProperty fnProperty; + fnProperty.setName(QString::fromAscii("FN")); + fnProperty.setValue(QString::fromAscii("First Last")); + document.addProperty(fnProperty); + QVersitProperty nProperty; + nProperty.setName(QString::fromAscii("N")); + nProperty.setValue(QString::fromAscii("Last;First;Middle;Prefix;Suffix")); + document.addProperty(nProperty); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); + QContactName name = static_cast(contact.detail(QContactName::DefinitionName)); + QCOMPARE(name.firstName(), QString::fromAscii("First")); + QCOMPARE(name.lastName(), QString::fromAscii("Last")); + QCOMPARE(name.middleName(), QString::fromAscii("Middle")); + QCOMPARE(name.prefix(), QString::fromAscii("Prefix")); + QCOMPARE(name.suffix(), QString::fromAscii("Suffix")); + QCOMPARE(name.customLabel(), QString::fromAscii("First Last")); +} + void UT_QVersitContactImporter::testAddress() { - QContact contact; QVersitDocument document; QVersitProperty property; property.setName(QString::fromAscii("ADR")); // Empty value for the address document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactAddress address = static_cast(contact.detail(QContactAddress::DefinitionName)); QCOMPARE(address.postOfficeBox(),QString()); @@ -174,9 +278,11 @@ QCOMPARE(address.country(),QString()); // Address with just seprators - property.setValue(QByteArray(";;;;;;")); + property.setValue(QString::fromAscii(";;;;;;")); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); address = static_cast(contact.detail(QContactAddress::DefinitionName)); QCOMPARE(address.postOfficeBox(),QString()); QCOMPARE(address.street(),QString()); @@ -186,9 +292,11 @@ QCOMPARE(address.country(),QString()); // Address with some fields missing - property.setValue(QByteArray(";;My Street;My Town;;12345;")); + property.setValue(QString::fromAscii(";;My Street;My Town;;12345;")); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); address = static_cast(contact.detail(QContactAddress::DefinitionName)); QCOMPARE(address.postOfficeBox(),QString()); QCOMPARE(address.street(),QString::fromAscii("My Street")); @@ -198,9 +306,11 @@ QCOMPARE(address.country(),QString()); // Address with all the fields filled - property.setValue(QByteArray("PO Box;E;My Street;My Town;My State;12345;My Country")); + property.setValue(QString::fromAscii("PO Box;E;My Street;My Town;My State;12345;My Country")); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); address = static_cast(contact.detail(QContactAddress::DefinitionName)); QCOMPARE(address.postOfficeBox(),QString::fromAscii("PO Box")); QCOMPARE(address.street(),QString::fromAscii("My Street")); @@ -210,15 +320,17 @@ QCOMPARE(address.country(),QString::fromAscii("My Country")); // Address with TYPE parameters converted to contexts and subtypes - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("HOME")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("WORK")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("DOM")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("INTL")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("POSTAL")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("PARCEL")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("X-EXTENSION")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("HOME")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("WORK")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("DOM")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("INTL")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("POSTAL")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("PARCEL")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("X-EXTENSION")); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); address = static_cast(contact.detail(QContactAddress::DefinitionName)); QStringList contexts = address.contexts(); QVERIFY(contexts.contains(QContactDetail::ContextHome)); @@ -232,14 +344,15 @@ void UT_QVersitContactImporter::testOrganizationName() { - QContact contact; QVersitDocument document; QVersitProperty property; // Empty value for the organization property.setName(QString::fromAscii("ORG")); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactOrganization organization = static_cast( contact.detail(QContactOrganization::DefinitionName)); @@ -247,9 +360,11 @@ QCOMPARE(organization.department().count(),0); // Organization without separators - property.setValue(QByteArray("Nokia")); + property.setValue(QString::fromAscii("Nokia")); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); organization = static_cast( contact.detail(QContactOrganization::DefinitionName)); @@ -257,9 +372,11 @@ QCOMPARE(organization.department().count(),0); // Organization with one separator - property.setValue(QByteArray(";")); + property.setValue(QString::fromAscii(";")); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); organization = static_cast( contact.detail(QContactOrganization::DefinitionName)); @@ -267,9 +384,11 @@ QCOMPARE(organization.department().count(),0); // Organization with just separators - property.setValue(QByteArray(";;;")); + property.setValue(QString::fromAscii(";;;")); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); organization = static_cast( contact.detail(QContactOrganization::DefinitionName)); @@ -277,9 +396,11 @@ QCOMPARE(organization.department().count(),0); // Organization with one Organizational Unit - property.setValue(QByteArray("Nokia;R&D")); + property.setValue(QString::fromAscii("Nokia;R&D")); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); organization = static_cast( contact.detail(QContactOrganization::DefinitionName)); @@ -288,9 +409,11 @@ QCOMPARE(organization.department().at(0),QString::fromAscii("R&D")); // Organization with organization name and semicolon - property.setValue(QByteArray("Nokia;")); + property.setValue(QString::fromAscii("Nokia;")); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); organization = static_cast( contact.detail(QContactOrganization::DefinitionName)); @@ -298,9 +421,11 @@ QCOMPARE(organization.department().count(),0); // Organization with semicolon and department - property.setValue(QByteArray(";R&D")); + property.setValue(QString::fromAscii(";R&D")); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); organization = static_cast( contact.detail(QContactOrganization::DefinitionName)); @@ -309,9 +434,11 @@ QCOMPARE(organization.department().at(0),QString::fromAscii("R&D")); // Organization with more Organizational Units - property.setValue(QByteArray("Nokia;R&D;Devices;Qt")); + property.setValue(QString::fromAscii("Nokia;R&D;Devices;Qt")); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); organization = static_cast( contact.detail(QContactOrganization::DefinitionName)); @@ -324,110 +451,113 @@ void UT_QVersitContactImporter::testOrganizationTitle() { - QContact contact; QVersitDocument document; QVersitProperty property; // One title property.setName(QString::fromAscii("TITLE")); - QByteArray titleValue("Developer"); + QString titleValue(QString::fromAscii("Developer")); property.setValue(titleValue); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QList organizationDetails = contact.details(QContactOrganization::DefinitionName); QCOMPARE(organizationDetails.count(), 1); QContactOrganization organization = static_cast(organizationDetails[0]); - QCOMPARE(organization.title(),QString::fromAscii(titleValue)); + QCOMPARE(organization.title(),titleValue); // Two titles -> two QContactOrganizations created property.setName(QString::fromAscii("TITLE")); - QByteArray secondTitleValue("Hacker"); + QString secondTitleValue(QString::fromAscii("Hacker")); property.setValue(secondTitleValue); document.addProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); organizationDetails = contact.details(QContactOrganization::DefinitionName); QCOMPARE(organizationDetails.count(), 2); QContactOrganization firstOrganization = static_cast(organizationDetails[0]); - QCOMPARE(firstOrganization.title(),QString::fromAscii(titleValue)); + QCOMPARE(firstOrganization.title(),titleValue); QContactOrganization secondOrganization = static_cast(organizationDetails[1]); - QCOMPARE(secondOrganization.title(),QString::fromAscii(secondTitleValue)); + QCOMPARE(secondOrganization.title(),secondTitleValue); // Two titles and one organization name -> two QContactOrganizations created property.setName(QString::fromAscii("ORG")); - QByteArray organizationName("Nokia"); + QString organizationName(QString::fromAscii("Nokia")); property.setValue(organizationName); document.addProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); organizationDetails = contact.details(QContactOrganization::DefinitionName); QCOMPARE(organizationDetails.count(), 2); firstOrganization = static_cast(organizationDetails[0]); - QCOMPARE(firstOrganization.title(),QString::fromAscii(titleValue)); - QCOMPARE(firstOrganization.name(),QString::fromAscii(organizationName)); + QCOMPARE(firstOrganization.title(),titleValue); + QCOMPARE(firstOrganization.name(),organizationName); secondOrganization = static_cast(organizationDetails[1]); - QCOMPARE(secondOrganization.title(),QString::fromAscii(secondTitleValue)); + QCOMPARE(secondOrganization.title(),secondTitleValue); QCOMPARE(secondOrganization.name(),QString()); } +void UT_QVersitContactImporter::testOrganizationAssistant() +{ + QContact contact; + QVersitDocument document; + QVersitProperty property; + property.setName(QString::fromAscii("X-ASSISTANT")); + QString assistantValue(QString::fromAscii("Jenny")); + property.setValue(assistantValue); + document = createDocumentWithProperty(property); + QList documentList; + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); + QContactOrganization organization = + static_cast( + contact.detail(QContactOrganization::DefinitionName)); + QCOMPARE(organization.assistantName(), assistantValue); +} + void UT_QVersitContactImporter::testOrganizationLogo() { QContact contact; QVersitDocument document; QVersitProperty property; - property.setName(QString::fromAscii("X-ASSISTANT")); - QByteArray assistantValue("Jenny"); - property.setValue(assistantValue); - document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); - QContactOrganization organization = - static_cast( - contact.detail(QContactOrganization::DefinitionName)); - QCOMPARE(organization.assistantName(), QString::fromAscii(assistantValue)); -} - -void UT_QVersitContactImporter::testOrganizationAssistant() -{ - QContact contact; - QVersitDocument document; - QVersitProperty property; + QList documentList; // Embedded LOGO property.setName(QString::fromAscii("LOGO")); - QByteArray logo = "R0lGODlhEgASAIAAAAAAAP///yH5BAEAAAEALAAAAAASABIAAAIdjI+py+0G"; - property.setValue(logo.toBase64()); - property.addParameter(QString::fromAscii("TYPE"), + QByteArray logo(QByteArray::fromBase64( + "R0lGODlhEgASAIAAAAAAAP///yH5BAEAAAEALAAAAAASABIAAAIdjI+py+0G")); + property.setValue(logo); + property.insertParameter(QString::fromAscii("TYPE"), QString::fromAscii("GIF")); - property.addParameter(QString::fromAscii("ENCODING"), - QString::fromAscii("BASE64")); document = createDocumentWithProperty(property); - mImporter->setImagePath(imageAndAudioClipPath); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); QContactOrganization organization = - static_cast( - contact.detail(QContactOrganization::DefinitionName)); - QString logoFileName = organization.logo(); - QVERIFY(logoFileName.endsWith(QString::fromAscii(".gif"))); - QVERIFY(logoFileName.contains(imageAndAudioClipPath + QString::fromAscii("/"))); - QFile logoFile(logoFileName); - QVERIFY(logoFile.open(QIODevice::ReadOnly)); - QByteArray content = logoFile.readAll(); - QCOMPARE(content,logo); - logoFile.close(); + static_cast(contact.detail(QContactOrganization::DefinitionName)); + QByteArray content = mResourceHandler->mObjects.value(organization.logo()); + QCOMPARE(content, logo); // LOGO as a URL property.setName(QString::fromAscii("LOGO")); - QByteArray logoUrl = "http://www.organization.org/logo.gif"; + QString logoUrl(QString::fromAscii("http://www.organization.org/logo.gif")); property.setValue(logoUrl); - property.addParameter(QString::fromAscii("VALUE"),QString::fromAscii("URL")); + property.insertParameter(QString::fromAscii("VALUE"),QString::fromAscii("URL")); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); organization = static_cast( contact.detail(QContactOrganization::DefinitionName)); - QCOMPARE(organization.logo(),QString::fromAscii(logoUrl)); + QCOMPARE(organization.logo(),logoUrl); } void UT_QVersitContactImporter::testOrganizationRole() @@ -438,14 +568,16 @@ // Setting the role is not yet supported by QContactOrganization property.setName(QString::fromAscii("ROLE")); - QByteArray roleValue("Very important manager and proud of it"); + QString roleValue(QString::fromAscii("Very important manager and proud of it")); property.setValue(roleValue); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + QList documentList; + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); QContactOrganization organization = static_cast( contact.detail(QContactOrganization::DefinitionName)); - QCOMPARE(organization.role(), QString::fromAscii(roleValue)); + QCOMPARE(organization.role(), roleValue); } void UT_QVersitContactImporter::testTel() @@ -453,26 +585,28 @@ QVersitDocument document; QVersitProperty property; property.setName(QString::fromAscii("TEL")); - QByteArray value("+35850987654321"); + QString value(QString::fromAscii("+35850987654321")); property.setValue(value); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("VOICE")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("CELL")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("MODEM")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("CAR")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("VIDEO")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("FAX")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("BBS")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("PAGER")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("HOME")); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("WORK")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("VOICE")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("CELL")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("MODEM")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("CAR")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("VIDEO")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("FAX")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("BBS")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("PAGER")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("HOME")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("WORK")); document.addProperty(property); - QContact contact = mImporter->importContact(document); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); const QContactPhoneNumber& phone = static_cast( contact.detail(QContactPhoneNumber::DefinitionName)); - QCOMPARE(phone.number(),QString(QString::fromAscii(value))); + QCOMPARE(phone.number(),QString(value)); const QStringList subTypes = phone.subTypes(); QCOMPARE(subTypes.count(),8); @@ -495,15 +629,17 @@ { QVersitProperty property; property.setName(QString::fromAscii("EMAIL")); - QByteArray value("john.citizen@example.com"); + QString value(QString::fromAscii("john.citizen@example.com")); property.setValue(value); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("WORK")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("WORK")); QVersitDocument document = createDocumentWithProperty(property); - QContact contact = mImporter->importContact(document); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactEmailAddress email = static_cast( contact.detail(QContactEmailAddress::DefinitionName)); - QCOMPARE(email.emailAddress(),QString::fromAscii(value)); + QCOMPARE(email.emailAddress(),value); const QStringList contexts = email.contexts(); QCOMPARE(contexts.count(),1); QVERIFY(contexts.contains(QContactDetail::ContextWork)); @@ -513,15 +649,17 @@ { QVersitProperty property; property.setName(QString::fromAscii("URL")); - QByteArray value("http://example.com"); + QString value(QString::fromAscii("http://example.com")); property.setValue(value); - property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("WORK")); - QVersitDocument document = createDocumentWithProperty(property); - QContact contact = mImporter->importContact(document); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("WORK")); + QVersitDocument document = createDocumentWithProperty(property); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactUrl url = static_cast( contact.detail(QContactUrl::DefinitionName)); - QCOMPARE(url.url(),QString::fromAscii(value)); + QCOMPARE(url.url(),value); const QStringList contexts = url.contexts(); QCOMPARE(contexts.count(),1); QVERIFY(contexts.contains(QContactDetail::ContextWork)); @@ -531,14 +669,16 @@ { QVersitProperty property; property.setName(QString::fromAscii("UID")); - QByteArray value("unique identifier"); + QString value(QString::fromAscii("unique identifier")); property.setValue(value); QVersitDocument document = createDocumentWithProperty(property); - QContact contact = mImporter->importContact(document); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactGuid uid = static_cast( contact.detail(QContactGuid::DefinitionName)); - QCOMPARE(uid.guid(),QString::fromAscii(value)); + QCOMPARE(uid.guid(),value); } void UT_QVersitContactImporter::testTimeStamp() @@ -546,60 +686,70 @@ // Simple date : ISO 8601 extended format QVersitProperty property; property.setName(QString::fromAscii("REV")); - QByteArray dateValue("1981-05-20"); + QString dateValue(QString::fromAscii("1981-05-20")); property.setValue(dateValue); QVersitDocument document = createDocumentWithProperty(property); - QContact contact = mImporter->importContact(document); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactTimestamp timeStamp = static_cast( contact.detail(QContactTimestamp::DefinitionName)); - QCOMPARE(timeStamp.lastModified().date().toString(Qt::ISODate),QString::fromAscii(dateValue)); + QCOMPARE(timeStamp.lastModified().date().toString(Qt::ISODate),dateValue); // Date and Time : ISO 8601 extended format without utc offset - QByteArray dateAndTimeValue("1981-05-20T23:55:55"); + QString dateAndTimeValue(QString::fromAscii("1981-05-20T23:55:55")); property.setValue(dateAndTimeValue); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); timeStamp = static_cast( contact.detail(QContactTimestamp::DefinitionName)); - QCOMPARE(timeStamp.lastModified().toString(Qt::ISODate),QString::fromAscii(dateAndTimeValue)); + QCOMPARE(timeStamp.lastModified().toString(Qt::ISODate),dateAndTimeValue); // Date and Time : ISO 8601 extented format with utc offset - QByteArray utcOffset = "Z"; - QByteArray dateAndTimeWithUtcValue = dateAndTimeValue+utcOffset; + QString utcOffset(QString::fromAscii("Z")); + QString dateAndTimeWithUtcValue = dateAndTimeValue+utcOffset; property.setValue(dateAndTimeWithUtcValue); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); timeStamp = static_cast( contact.detail(QContactTimestamp::DefinitionName)); - QCOMPARE(timeStamp.lastModified().toString(Qt::ISODate),QString::fromAscii(dateAndTimeValue)); + QCOMPARE(timeStamp.lastModified().toString(Qt::ISODate),dateAndTimeValue); QCOMPARE(timeStamp.lastModified().timeSpec(),Qt::UTC); // Date and Time : ISO 8601 in basic format without utc offset - dateAndTimeValue = "19810520T235555"; + dateAndTimeValue = QString::fromAscii("19810520T235555"); property.setValue(dateAndTimeValue); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); timeStamp = static_cast( contact.detail(QContactTimestamp::DefinitionName)); QCOMPARE(timeStamp.lastModified().toString(QString::fromAscii("yyyyMMddThhmmss")), - QString::fromAscii(dateAndTimeValue)); + dateAndTimeValue); // Date and Time : ISO 8601 in basic format with utc offset - dateAndTimeValue = "19810520T235555"; + dateAndTimeValue = QString::fromAscii("19810520T235555"); dateAndTimeWithUtcValue = dateAndTimeValue+utcOffset; property.setValue(dateAndTimeWithUtcValue); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); timeStamp = static_cast( contact.detail(QContactTimestamp::DefinitionName)); QCOMPARE(timeStamp.lastModified().toString(QString::fromAscii("yyyyMMddThhmmss")), - QString::fromAscii(dateAndTimeValue)); + dateAndTimeValue); QCOMPARE(timeStamp.lastModified().timeSpec(),Qt::UTC); } @@ -608,25 +758,29 @@ // Date : ISO 8601 extended format QVersitProperty property; property.setName(QString::fromAscii("X-ANNIVERSARY")); - QByteArray dateValue("1981-05-20"); + QString dateValue(QString::fromAscii("1981-05-20")); property.setValue(dateValue); QVersitDocument document = createDocumentWithProperty(property); - QContact contact = mImporter->importContact(document); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactAnniversary anniversary = static_cast( contact.detail(QContactAnniversary::DefinitionName)); - QCOMPARE(anniversary.originalDate().toString(Qt::ISODate),QString::fromAscii(dateValue)); + QCOMPARE(anniversary.originalDate().toString(Qt::ISODate),dateValue); // Date : ISO 8601 in basic format - dateValue = "19810520"; + dateValue = QString::fromAscii("19810520"); property.setValue(dateValue); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); anniversary = static_cast( contact.detail(QContactAnniversary::DefinitionName)); QCOMPARE(anniversary.originalDate().toString(QString::fromAscii("yyyyMMdd")), - QString::fromAscii(dateValue)); + dateValue); } @@ -635,26 +789,30 @@ // Date : ISO 8601 extended format QVersitProperty property; property.setName(QString::fromAscii("BDAY")); - QByteArray dateValue("1981-05-20"); + QString dateValue(QString::fromAscii("1981-05-20")); property.setValue(dateValue); QVersitDocument document = createDocumentWithProperty(property); - QContact contact = mImporter->importContact(document); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactBirthday bday = static_cast( contact.detail(QContactBirthday::DefinitionName)); QCOMPARE(bday.date().toString(Qt::ISODate), - QString::fromAscii(dateValue)); + dateValue); // Date : ISO 8601 in basic format - dateValue = "19810520"; + dateValue = QString::fromAscii("19810520"); property.setValue(dateValue); document = createDocumentWithProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); bday = static_cast( contact.detail(QContactBirthday::DefinitionName)); QCOMPARE(bday.date().toString(QString::fromAscii("yyyyMMdd")), - QString::fromAscii(dateValue)); + dateValue); } @@ -663,14 +821,16 @@ // Date : ISO 8601 extended format QVersitProperty property; property.setName(QString::fromAscii("X-GENDER")); - QByteArray val("Male"); + QString val(QString::fromAscii("Male")); property.setValue(val); QVersitDocument document = createDocumentWithProperty(property); - QContact contact = mImporter->importContact(document); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactGender gender = static_cast( contact.detail(QContactGender ::DefinitionName)); - QCOMPARE(gender.gender(),QString::fromAscii(val)); + QCOMPARE(gender.gender(),val); } void UT_QVersitContactImporter::testNickname() @@ -680,9 +840,11 @@ QVersitProperty nameProperty; QString singleVal(QString::fromAscii("Homie")); nameProperty.setName(QString::fromAscii("NICKNAME")); - nameProperty.setValue(singleVal.toAscii()); + nameProperty.setValue(singleVal); document.addProperty(nameProperty); - QContact contact = mImporter->importContact(document); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactNickname nickName = (QContactNickname)contact.detail(QContactNickname::DefinitionName); QCOMPARE(nickName.nickname(),singleVal); @@ -694,9 +856,11 @@ multiVal.append(QString::fromAscii("SuperHero")); multiVal.append(QString::fromAscii("NukeSpecialist")); nameProperty.setName(QString::fromAscii("NICKNAME")); - nameProperty.setValue(multiVal.join(QString::fromAscii(",")).toAscii()); + nameProperty.setValue(multiVal.join(QString::fromAscii(","))); document.addProperty(nameProperty); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); QList nickNames = contact.details(QContactNickname::DefinitionName); QCOMPARE(nickNames.count(),3); nickName = static_cast(nickNames[0]); @@ -710,569 +874,122 @@ document = QVersitDocument(); nameProperty = QVersitProperty(); nameProperty.setName(QString::fromAscii("X-NICKNAME")); - nameProperty.setValue(singleVal.toAscii()); + nameProperty.setValue(singleVal); document.addProperty(nameProperty); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); nickName = static_cast( contact.detail(QContactNickname::DefinitionName)); QCOMPARE(nickName.nickname(),singleVal); } -void UT_QVersitContactImporter::testAvatarJpegStored() +void UT_QVersitContactImporter::testAvatarStored() { - // JPEG image. Name property present. The image directory exist. - // Test that the avatar detail is created and the image - // is stored on the disk. - -QByteArray img = -"/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf\ -/bAIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQ\ -EBAQEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4r\ -NTUwMDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgBhAGGAwEiAAIRAQMRAf/EAT8AAAEFAQEBAQEBAAA" - -"AAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQ\ -cGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKyg\ -yZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3\ -h5ent8fX5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGL" - -"hcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1e\ -X1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A9ASSSSUpJJJJSkkkklKSSSSUp\ -JJJJSkkkklKSSSSUpJJJJSkySdJSkkkklKSTEgCToFXfmN4qG8/vfmpk8kMY4pyER4pESdg2Uyo\ -uvudy6PIaIck8mVSn8TxDSMZT/BkGE9S6UhJZwPgpCx7fouITY/FIdcch5G0+z2LoJKozKePpCR" - -"+KsMtZYPadfBW8PNYcukZa/unQscoSjuzSSSU61ZOmSSUpOkkkpSSSSSlJJJJKUkkkkpSSSSSlJ\ -JJJKUmTpJKUkkkkpSSSSSlJJJJKUmMwY5TpJKW+KdJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJ\ -JJJSlC21lTC95gD7yfAJrbWUsL3nTsO5PgFQc99r/Ut0I+gzs0f3qvzPMxwRs6yPyxXwgZHwZWW\ -WXGX6N7Vj+PiopJLCy5Z5JcUzZ/ls2QABQVKSSUqNSkkpS7pBSk4JBkaFMkiNCpt05AdDX6HsUd" - -"ZoVqi/hjz8CtXk+esjHlP92Z/IsOTH1j9jYSSSWmwrpJJJKWSTpJKUkkkkpSSSSSlJJJJKUkkkk\ -pSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSZJS6SZJJS6hZYyphe8w0\ -JWWMqYXvMNCoPe+54ss0A+gzw8z5qDmeZhghZ1kflj3XwgZHwU577X+pZpH0G/uj+9MU6ZYGTJL\ -JIzkbJbIAGgUkm+CSYldMU6ZJS6SSRRUpKUkkEKCfwTJyips0XzDHn4FWFncFWaL59j+exWpyXO" - -"7Ysp8IyP5FhyY+obKSZOtRhUkmSSUo6J0ySSl0kkklKSSSSUpJJJJSkkydJSkkkklKSSSSUpJJJ\ -JSkkkklKSSTJKXSSSSUpJJJJSkydJJSkkkklKULLGVsL3mGjkpWWMrYXvMNHJVCx77n77NAPoM/\ -d8z5qDmOYhhjZ1kflj3XwgZHwXe917979Gt+g3w8z5pikmKwcuWWWZnM2T/ACpsAAaBSSZP5qNc\ -rskmSRUukkmSUukmTpKUmSS7pKXSSSSUpOEyQ4SQ2qL5hj+exVhZoKtUXz7H89itTkudusWU+EZ" - -"H8iw5MfUNhOmSB7HQrUYV0kkklKSSSSUpJJJJSkkkySlJ0ydJSkkkklLJJ0klKSSSSUpJJJJSkk\ -kklKSSSSUpJJJJSkkkySl1GyxlbC95ho5KT3traXvMNbqSs+yx17979GD+bZ4fyj5/kUHMcxDDD\ -ilqT8se66EDI+CrLHXvD3jaxv0GeHmfNMkUv4rBy5Z5ZmczZP5dg2gABQUkkkmKWTpcpu6CVJ0y\ -UIqUEikkgFKSSS7JKUU0aynKSRUpJL4JIqUlKSRQUpOCmTpKbWPfPsf8irAEd5WaPFWqL59jjr2" - -"K1eR526xZT4RkfyLBkx9R9WykmTrUYVJJJJKUkkkkpSSSZJS6ZOkkpSSSSSlJJJJKUkkkkpSSSS\ -SlJJJJKUkkkkpZJJJJS6i97a2l7zDRyUnOaxpc4w0aklZ9trshwcdK26sYf+qKh5jmIYYcUtSfl\ -j3K6EDI+C9ljr3bne1g1Yz/AL87zTJJlgZcs8sjOZsn8PANkAAUFSkl3STErJJ0kkqTJJ0lKCZO\ -kkpZOmSQCl0ySXgipSdMnCClk6ZLxSUumT9vgmRKl0xTpIKXTeaSSSG3RfPsfz2KOs2YKt0X7va" - -"7nsVrclzt1iynXaMj+RYcmOtQ2EkydabCpMnSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJ\ -JJJSkkkklKUXOaxpc4w0akpOc1jS5xho1JKoW2uyHAnSoataeSf3j/AAUOfPDDDilv+jHuV0ImR\ -Vba7IcCdKhq1nj/ACnJkkywM2aeWZnM/wBg7BsgACgpJJJMSpIJJJJW4ST8pJKUmSSSUpLskkgp\ -QTpJkVKSTpklKSSS0QUpKUkklL/BMnSRUpJJJBSkkkklKTzCZJG0Nyi/d7Xc9j4oyzgSCrdF272" - -"u+l281rclznFWLIfVtGR6+BYMmOtQnSSSWkxKSTJ0lKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkk\ -lKTOc1rS5xho1JKTnNa0ucYaNSSqF1xyD3FQ+i0/neZUWfPDDDil9B1JXRiZFa612Q7XSkfRafz\ -v5R/gmSSWBmyyyzM5nyHQDs2QABQUmSCXkokq7JJFJJSktUkkUqS7JJgSgpdN3SSSUukkmSUpLs\ -nSRUpMl2SKClJAzPlol4pAaz3KSlJJdkkqUukAkkipSZJP3QUpJKUgkhSSSSKVJwSDKZJBDcou3" - -"ja76X5UdZoMGQrlN28bT9Lt5rY5LneMDFkPq2jI9fA+LBkx1qEySYGU60WJSZOkkpSSSSSlJJJJ\ -KUkkmSUukkkkpSYkAEkwByUiQ0FzjAGpJWfdecg6aUjgd3eZ8lFnzwww4pHyHUldGBkdFXXHIOm\ -lI+iP3z4ny8EySSwc2aeWZnI+Q6AdmzEACgskUkioUqSSSCKlJJJJKUklwmSSukkmQtSkk6YJKU\ -n/IkkipZOkkkFKKSRS+CClJk6ZFSkzdRMR5HlOnSUpJJMkpdJIJJIUl2SSQClFLukkipXZJIcJI" - -"JUnBI45S7JkdtkN2m4PG0/S/KjLNBIII0KuU3B4g/SC2OS5zjrHkPr/Rl+9/awZMdajZMmTpLQY\ -lk6SSSlJJJJKUmTpJKUmc5rWlzjDRqSUnODWlzjAGpJWfdc7II7Ujhvd3mf7lDnzwww4pfSPUld\ -CBkf2quuOSY4pHA/f8AM+XkmTJLAzZp5p8cz5DoB2DZAAFBdMl8UyjXLykmSSCl+ySSSSFJJd0y\ -Sl5STJJFK6ZL4pd0ipScpJuySl0gkmRUueUu6ZJJS4STJIKXSTJtS4eABn5wipcGZjtoUu6SSVK" - -"XCXdMn7JKUklOqSClJJd0vFJCuUkgkUkqSSS7/BJCkuySSKlJ2kgyOUx/FJCyCpvU3CwQfpIqzW\ -uIII0IV2m4WCDo7wWzyXOe4BjyH1jY/vf2tfJjrUbJUkkloMakkkklKTOc1rS5xho1JKdZ+Tab7\ -XVj+aq0P8p/n5N/Kos+aOLGZy6bDuV0Y8Rpa652QeCKR9Fp5d5lR7J0lz+bNPLMzmfLsPJsgACg\ -skkko0rJJFOklYpdk6ZLqpdJJJJCkkkoSSsknTJKUnSTJKXSSKSSlkinSRUpMkn7pKW7pcJJaoK" - -"UkknSClkkuyXZFSk6ZOgpZJJJKlKTpJSipSSSSClJJeCSKlJJd0klKKSSbugpdSaSDIKikjqDaG\ -9TcLBB0cirOa4tIIOqvVP9Rgd37ra5HmzlHtz+eI0P7w/i18kK1GzNJJJXmNha/wBOp7/3Wl33C\ -VmY4IpZOpIlx8zqfxK0cljn41rG/Scxwb8SIWdQ4OqY7xaD+CzPihPDjHS5fsZsP6X0SJk6SyWZ\ -bukkkkpSXCSRSSpJJJJSkkvgnSQsklKSVqUl3SS5KSVJJJIoUlokkkVKShJJJSku6SSCVQkkkih" - -"bVOkkUkqTd06SRUrskkkgpSZOkUVKShJJJCkuyUpd0lKS8UkklK0SSSSUpKEkgEFK7JJBOkpQCs\ -YrjuLfESq6Pij3k+SscoSOYx1+8syfKW2kkkuhaylmPq9C11fDHEur+B1I+RWmh21MuZtePMHuD\ -4hQczgGbGYbEaxPivhPhPh1aISU30W1nUbm/vD+IUPyrCyYcmM1OJH5fa2AQdQbUmTpKIhKuySS\ -SNFSkycpIKWhOkmSUrRIhJJJSkkkiipSSSSSlBIpJJKUEkku6SlJJJeSSlu6dJJJKkkkkkKSSS7" - -"pFSkkkikpXdJMOU8oJUlKSSSFJJJIqUnTBOgpSSSUI0eylJJJFKipQ4S1nyS7Jwx7tAJlIRkdAC\ -T4KtZXMevayTyVGrGiHP8AuR1q8jycoH3cgo/ox6+ZYMkwdAukkktNiUkkkkpSaAeQnSSUx2t8B\ -9yW1vgFJJCh2Va21vgE21vgPuUkkqHZVsHV1uEFoKoZFZxrWQZqsMNnkO5j5rSVPqYnHaf3baz9\ -7w3+Kg5rBDJilcRxRiTE9bC/HIiQF6HRCmTplzzZUknTd0lKS7wkl3SSpJJOihbukkkgpSSSXdF" - -"SkgkkEkq7BJJJJCk0J0u6RUpJJNqkpdIpJFBSgkkEiklSXdLskkhSXdOm7JFS7ROg7q7XQxo1Eu\ -VWnWxvxV5afw3DCXFkkBIxNC2HLIigFbW+ASgeCdJa1BhWgeCW1vgE6SVBTHa3wH3J4jhOklQUp\ -JJJJSkkkklKSSSSUpJJJJSydJJJSkkkklKVLq0/YXkdn1H7rGK6qnU9cJ48XMH/AE2psxcJDvEp\ -juPNARqU2qdILmG2oJk5TBJSkkkkVK7p0ydJSySSSCVSkkkUUKTBOkklR4KYmEh/vS8+UlLlIpJ" - -"kFLpJJBFCkjykkkpZOkkgLSpJIpJIUNEkoTpKZ0/zjfiryo0fzrfir62Phf8ANT/v/sYM3zDyUk\ -kktFiUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlKl1b+gP/r1f+fGK6qfVRODYP\ -Nn/AFbUzJ/Nz/ulMfmHmEPdMnTLmW2umSShFSkkkigpSdN2SKKlBJLhJJKkiYH8EgmPdDopfukm\ -SRUqE4SSSUpJMkgpQTpJh+VFS6RSSSQpJJJJSkkkklKSSThBTOj+dar6oUfzjfir62Phf83P+/8" - -"AsYM3zDyUkkktFiUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlKp1T+hP+LP8Aq2\ -q2qfVhOBaPNn/VtTcnyS/ulMdx5oO6SR5SXMNtSSRSRUqNZSKSXdJSkkkklKSCSSXVSkoS7peKS\ -Vk6bukgpdJLtCXwSUt8Ekk6Slkk5CZJS/ZJJI90UK7pJJIFKkgkkkhXZOm8kuCBHxKKklP8434q\ -+qFP842PFX1r/C/5uf8AeH5MGbceSkkklosSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkkl" - -"KSSSSUpU+qmMGz4sH3vaFcVLq8/YXR+/V93qsTcmkJH+qV0fmHmEXdMl/FLuuYbSkkkkVKTJykA\ -gpXKSSSKleSSSSCVJJJJKUUydJJSkkkklLFIJ4lMkpdJIJIqUkkkUkLJ0ydBK6ZJI+aKFDxTlLs\ -mSUkp/nW/FX1Qp/nW/FX1r/AAv+bn/f/YwZtx5KSSSWixKSSSSUsnSSSUpJJJJSkkkklKSSSSUp\ -JJJJSkkkklKSSSSUpU+qQcJ08bq5/wA9quKn1Uxgv/rV/wDnxqZkNY5n+qfyTH5h5hCkmSXMttS" - -"SXkkipR4SS5EJIJUkkkihXdJJIIJUkl2SRUpJJJBSpSSSSUpLzTJ0lKhMnTJKXSSKSKlk6ZOAgp\ -SRSSKKF0yRPZJAqSU/zrfir6z6f5xvxWgtf4X/ADc/7/7GDNuPJSSSS0mJSSSSSlJJJJKUkkkkp\ -SSSSSlJJJJKUkmTpKUkkkkpSSSSSlKn1QTg2DzZ/wBW1XFT6q7bhPP8qv8AGxqbk+SX90pj8w80\ -J8UkjymXMNtSSSSKlJFJJBSkkkkVKSSlJJKkkkklKSSSSUryShN3ToKV2TJJ4SUpNynTcJKX7Jk" - -"6SKllIJgnSCCtKZOkglSSZOOUrUzp/nW/FaCz6f51vxWgtf4X/Nz/ALwa+bceSkkklpMSkkkklK\ -SSSSUsnSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKVLqwnAs+LD9z2lXVU6n/QrPiz/AKtqZk+SX\ -90pj8w8wgOpKZOkuZbaySSSKlJJJJKV8EkkklKSSSSStwl/BOkkpSQSKSSld0ikkUuilJk4S7oK\ -UEycpklLpk6ZEqXCSQSSQpJJJBKx4SCSceKSmVX863wkLRWfT/ON+IWgtf4X8mT+8Gvm3HkpJJJ" - -"aTEpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKVPqv9Bf/AFq//PjVcVTqn9Dd/W\ -Z/1bUzJ/Nz/un8l0fmHmEB0lJLul4LmW0pMUkkVK7Jk6SSVcpJJJBCu6SSSCVBJJLsihSSSRSUp\ -JJJJS6ZJJJSkku6UIKUkkkipSRSSKSlJBJJLqpSQSSGiCWdP8434rQVCn+cb8VfWv8AC/kyf3g1\ -8248lJJJLSYlJJJJKUkkkkpSSSSSlJJJJKUkkmSUukmTpKUkkkkpSSSSSlKp1QxhPPg6ufh6jZV" - -"tCyavXx7Kv32kD49k2YuMh3BCYmiD2LSSUa3b2Bx0PDh4HupQuZIINHcNtZJOl2QUpMnASRUsEk\ -kkgpRS7pJ0lLJJ4TJKV2SSSQKlFJJLskpSSXknRUskkE6Sld1FOlCSlJJd0/dJSySRlJJSil2S7\ -p+2iCmdOtrfir6p4rSX7uzVcW18MiRilL96Wn0a+U+ryCkkklfY1JJJJKUkkkkpZOkkkpSSSSSl\ -JJJJKUkkkkpSSSSSlJJJJKUkkkkppZOM5rjbUJDtXsHj+8EEEH5crSUXVVv+k0E+Ko8zyEcsjOB" - -"4JHfsWWOWhR1aCSufZqvA/el9mq8/vVT/AEZm7w+0/wAF/ux8Wmkrn2arwP3pfZqvA/el/ozN+9\ -D7T/BXux8Wmkrn2arwP3pfZavA/eh/ozN+9D7T/BXux8WmkrYxax4p/stXn96X+jM/eH2n+Cvdj\ -4tNLurn2Wrz+9L7LV5/el/o3P3h9p/gr3Y+LTShXPstXn96b7LV5/el/ozP3h9v9ivdj4tSEoVv\ -7JV5/el9lr8/vS/0bn7w+3+xXux8Wokrf2WrzS+y1+aX+jc/eH2/2K92Pi1Elc+y1+aX2Wvz+9L" - -"/AEbn7w+3+xXux8Wmkrf2Wrz+9P8AZa/P70v9G5+8Pt/sV7sfFppamfBXPstXn96b7LVM6/el/o\ -3P3h9pV7sfFqJK39lr8Sl9lq8/vS/0bn7w+3+xXux8WopMY5xAaJVsY1Q7T8UQNDRAEBSY/hk7/\ -WSiB/V1KDmHQMa6xW2B8yppJLUhGMIiMRQiKDATepUkkknKUkkkkpSSSSSlJJJJKUkkkkpSSSSS\ -lJJJJKUkkkkpSSSSSlk6SSSlk6SSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkp" - -"SSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKf/Z"; - + QByteArray gif(SAMPLE_GIF); QStringList nameValues(QString::fromAscii("John")); // First name nameValues.append(QString::fromAscii("Citizen")); // Last name - QByteArray name = nameValues.join(QString::fromAscii(";")).toAscii(); - QVersitDocument document = - createDocumentWithNameAndPhoto( - name,img,QString::fromAscii("JPEG"), - QString::fromAscii("BASE64")); - mImporter->setImagePath(imageAndAudioClipPath); - QContact contact = mImporter->importContact(document); - QContactAvatar avatar = - static_cast(contact.detail(QContactAvatar::DefinitionName)); - QVERIFY(avatar.subType() == QContactAvatar::SubTypeImage); - QString fileName = avatar.avatar(); - QVERIFY(fileName.contains(nameValues.at(0) + nameValues.at(1))); - QVERIFY(fileName.endsWith(QString::fromAscii(".jpg"))); - QFile file(fileName); - QVERIFY(file.open(QIODevice::ReadOnly)); - QByteArray content = file.readAll(); - file.close(); - QCOMPARE(content,img); -} - -void UT_QVersitContactImporter::testAvatarGifStored() -{ - QByteArray img = -"R0lGODlhEgASAIAAAAAAAP///yH5BAEAAAEALAAAAAASABIAAAIdjI+py+0G" -"wEtxUmlPzRDnzYGfN3KBaKGT6rDmGxQAOw=="; - QStringList nameValues(QString::fromAscii("John")); // First name - nameValues.append(QString::fromAscii("Citizen")); // Last name - QByteArray name = nameValues.join(QString::fromAscii(";")).toAscii(); - QVersitDocument document = - createDocumentWithNameAndPhoto( - name,img,QString::fromAscii("GIF"), - QString::fromAscii("B")); - mImporter->setImagePath(imageAndAudioClipPath); - QContact contact = mImporter->importContact(document); + QString name = nameValues.join(QString::fromAscii(";")); + QVersitDocument document = createDocumentWithNameAndPhoto(name, gif, QLatin1String("GIF")); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactDetail detail = contact.detail(QContactAvatar::DefinitionName); QVERIFY(!detail.isEmpty()); - // Take out the random part from the original file name QContactAvatar avatar = static_cast(detail); - QString fileName = avatar.avatar(); QVERIFY(avatar.subType() == QContactAvatar::SubTypeImage); - QDir dir; - QVERIFY(dir.exists(avatar.avatar())); - QVERIFY(fileName.contains(nameValues.at(0) + nameValues.at(1))); - QVERIFY(fileName.endsWith(QString::fromAscii(".gif"))); - QFile file(fileName); - QVERIFY(file.open(QIODevice::ReadOnly)); - QByteArray content = file.readAll(); - QCOMPARE(content,img); -} - -void UT_QVersitContactImporter::testAvatarJpegTwoContactsWithSameName() -{ - // Create 2 contacts with the same name. - // Test that the generated photo files have different names - QByteArray img = -"/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf\ -/bAIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQ\ -EBAQEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4r\ -NTUwMDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgBhAGGAwEiAAIRAQMRAf/EAT8AAAEFAQEBAQEBAAA" - -"AAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQ\ -cGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKyg\ -yZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3\ -h5ent8fX5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGL" - -"hcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1e\ -X1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A9ASSSSUpJJJJSkkkklKSSSSUp\ -JJJJSkkkklKSSSSUpJJJJSkySdJSkkkklKSTEgCToFXfmN4qG8/vfmpk8kMY4pyER4pESdg2Uyo\ -uvudy6PIaIck8mVSn8TxDSMZT/BkGE9S6UhJZwPgpCx7fouITY/FIdcch5G0+z2LoJKozKePpCR" - -"+KsMtZYPadfBW8PNYcukZa/unQscoSjuzSSSU61ZOmSSUpOkkkpSSSSSlJJJJKUkkkkpSSSSSlJ\ -JJJKUmTpJKUkkkkpSSSSSlJJJJKUmMwY5TpJKW+KdJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJ\ -JJJSlC21lTC95gD7yfAJrbWUsL3nTsO5PgFQc99r/Ut0I+gzs0f3qvzPMxwRs6yPyxXwgZHwZWW\ -WXGX6N7Vj+PiopJLCy5Z5JcUzZ/ls2QABQVKSSUqNSkkpS7pBSk4JBkaFMkiNCpt05AdDX6HsUd" - -"ZoVqi/hjz8CtXk+esjHlP92Z/IsOTH1j9jYSSSWmwrpJJJKWSTpJKUkkkkpSSSSSlJJJJKUkkkk\ -pSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSZJS6SZJJS6hZYyphe8w0\ -JWWMqYXvMNCoPe+54ss0A+gzw8z5qDmeZhghZ1kflj3XwgZHwU577X+pZpH0G/uj+9MU6ZYGTJL\ -JIzkbJbIAGgUkm+CSYldMU6ZJS6SSRRUpKUkkEKCfwTJyips0XzDHn4FWFncFWaL59j+exWpyXO" - -"7Ysp8IyP5FhyY+obKSZOtRhUkmSSUo6J0ySSl0kkklKSSSSUpJJJJSkkydJSkkkklKSSSSUpJJJ\ -JSkkkklKSSTJKXSSSSUpJJJJSkydJJSkkkklKULLGVsL3mGjkpWWMrYXvMNHJVCx77n77NAPoM/\ -d8z5qDmOYhhjZ1kflj3XwgZHwXe917979Gt+g3w8z5pikmKwcuWWWZnM2T/ACpsAAaBSSZP5qNc\ -rskmSRUukkmSUukmTpKUmSS7pKXSSSSUpOEyQ4SQ2qL5hj+exVhZoKtUXz7H89itTkudusWU+EZ" - -"H8iw5MfUNhOmSB7HQrUYV0kkklKSSSSUpJJJJSkkkySlJ0ydJSkkkklLJJ0klKSSSSUpJJJJSkk\ -kklKSSSSUpJJJJSkkkySl1GyxlbC95ho5KT3traXvMNbqSs+yx17979GD+bZ4fyj5/kUHMcxDDD\ -ilqT8se66EDI+CrLHXvD3jaxv0GeHmfNMkUv4rBy5Z5ZmczZP5dg2gABQUkkkmKWTpcpu6CVJ0y\ -UIqUEikkgFKSSS7JKUU0aynKSRUpJL4JIqUlKSRQUpOCmTpKbWPfPsf8irAEd5WaPFWqL59jjr2" - -"K1eR526xZT4RkfyLBkx9R9WykmTrUYVJJJJKUkkkkpSSSZJS6ZOkkpSSSSSlJJJJKUkkkkpSSSS\ -SlJJJJKUkkkkpZJJJJS6i97a2l7zDRyUnOaxpc4w0aklZ9trshwcdK26sYf+qKh5jmIYYcUtSfl\ -j3K6EDI+C9ljr3bne1g1Yz/AL87zTJJlgZcs8sjOZsn8PANkAAUFSkl3STErJJ0kkqTJJ0lKCZO\ -kkpZOmSQCl0ySXgipSdMnCClk6ZLxSUumT9vgmRKl0xTpIKXTeaSSSG3RfPsfz2KOs2YKt0X7va" - -"7nsVrclzt1iynXaMj+RYcmOtQ2EkydabCpMnSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJ\ -JJJSkkkklKUXOaxpc4w0akpOc1jS5xho1JKoW2uyHAnSoataeSf3j/AAUOfPDDDilv+jHuV0ImR\ -Vba7IcCdKhq1nj/ACnJkkywM2aeWZnM/wBg7BsgACgpJJJMSpIJJJJW4ST8pJKUmSSSUpLskkgp\ -QTpJkVKSTpklKSSS0QUpKUkklL/BMnSRUpJJJBSkkkklKTzCZJG0Nyi/d7Xc9j4oyzgSCrdF272" - -"u+l281rclznFWLIfVtGR6+BYMmOtQnSSSWkxKSTJ0lKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkk\ -lKTOc1rS5xho1JKTnNa0ucYaNSSqF1xyD3FQ+i0/neZUWfPDDDil9B1JXRiZFa612Q7XSkfRafz\ -v5R/gmSSWBmyyyzM5nyHQDs2QABQUmSCXkokq7JJFJJSktUkkUqS7JJgSgpdN3SSSUukkmSUpLs\ -nSRUpMl2SKClJAzPlol4pAaz3KSlJJdkkqUukAkkipSZJP3QUpJKUgkhSSSSKVJwSDKZJBDcou3" - -"ja76X5UdZoMGQrlN28bT9Lt5rY5LneMDFkPq2jI9fA+LBkx1qEySYGU60WJSZOkkpSSSSSlJJJJ\ -KUkkmSUukkkkpSYkAEkwByUiQ0FzjAGpJWfdecg6aUjgd3eZ8lFnzwww4pHyHUldGBkdFXXHIOm\ -lI+iP3z4ny8EySSwc2aeWZnI+Q6AdmzEACgskUkioUqSSSCKlJJJJKUklwmSSukkmQtSkk6YJKU\ -n/IkkipZOkkkFKKSRS+CClJk6ZFSkzdRMR5HlOnSUpJJMkpdJIJJIUl2SSQClFLukkipXZJIcJI" - -"JUnBI45S7JkdtkN2m4PG0/S/KjLNBIII0KuU3B4g/SC2OS5zjrHkPr/Rl+9/awZMdajZMmTpLQY\ -lk6SSSlJJJJKUmTpJKUmc5rWlzjDRqSUnODWlzjAGpJWfdc7II7Ujhvd3mf7lDnzwww4pfSPUld\ -CBkf2quuOSY4pHA/f8AM+XkmTJLAzZp5p8cz5DoB2DZAAFBdMl8UyjXLykmSSCl+ySSSSFJJd0y\ -Sl5STJJFK6ZL4pd0ipScpJuySl0gkmRUueUu6ZJJS4STJIKXSTJtS4eABn5wipcGZjtoUu6SSVK" - -"XCXdMn7JKUklOqSClJJd0vFJCuUkgkUkqSSS7/BJCkuySSKlJ2kgyOUx/FJCyCpvU3CwQfpIqzW\ -uIII0IV2m4WCDo7wWzyXOe4BjyH1jY/vf2tfJjrUbJUkkloMakkkklKTOc1rS5xho1JKdZ+Tab7\ -XVj+aq0P8p/n5N/Kos+aOLGZy6bDuV0Y8Rpa652QeCKR9Fp5d5lR7J0lz+bNPLMzmfLsPJsgACg\ -skkko0rJJFOklYpdk6ZLqpdJJJJCkkkoSSsknTJKUnSTJKXSSKSSlkinSRUpMkn7pKW7pcJJaoK" - -"UkknSClkkuyXZFSk6ZOgpZJJJKlKTpJSipSSSSClJJeCSKlJJd0klKKSSbugpdSaSDIKikjqDaG\ -9TcLBB0cirOa4tIIOqvVP9Rgd37ra5HmzlHtz+eI0P7w/i18kK1GzNJJJXmNha/wBOp7/3Wl33C\ -VmY4IpZOpIlx8zqfxK0cljn41rG/Scxwb8SIWdQ4OqY7xaD+CzPihPDjHS5fsZsP6X0SJk6SyWZ\ -bukkkkpSXCSRSSpJJJJSkkvgnSQsklKSVqUl3SS5KSVJJJIoUlokkkVKShJJJSku6SSCVQkkkih" - -"bVOkkUkqTd06SRUrskkkgpSZOkUVKShJJJCkuyUpd0lKS8UkklK0SSSSUpKEkgEFK7JJBOkpQCs\ -YrjuLfESq6Pij3k+SscoSOYx1+8syfKW2kkkuhaylmPq9C11fDHEur+B1I+RWmh21MuZtePMHuD\ -4hQczgGbGYbEaxPivhPhPh1aISU30W1nUbm/vD+IUPyrCyYcmM1OJH5fa2AQdQbUmTpKIhKuySS\ -SNFSkycpIKWhOkmSUrRIhJJJSkkkiipSSSSSlBIpJJKUEkku6SlJJJeSSlu6dJJJKkkkkkKSSS7" - -"pFSkkkikpXdJMOU8oJUlKSSSFJJJIqUnTBOgpSSSUI0eylJJJFKipQ4S1nyS7Jwx7tAJlIRkdAC\ -T4KtZXMevayTyVGrGiHP8AuR1q8jycoH3cgo/ox6+ZYMkwdAukkktNiUkkkkpSaAeQnSSUx2t8B\ -9yW1vgFJJCh2Va21vgE21vgPuUkkqHZVsHV1uEFoKoZFZxrWQZqsMNnkO5j5rSVPqYnHaf3baz9\ -7w3+Kg5rBDJilcRxRiTE9bC/HIiQF6HRCmTplzzZUknTd0lKS7wkl3SSpJJOihbukkkgpSSSXdF" - -"SkgkkEkq7BJJJJCk0J0u6RUpJJNqkpdIpJFBSgkkEiklSXdLskkhSXdOm7JFS7ROg7q7XQxo1Eu\ -VWnWxvxV5afw3DCXFkkBIxNC2HLIigFbW+ASgeCdJa1BhWgeCW1vgE6SVBTHa3wH3J4jhOklQUp\ -JJJJSkkkklKSSSSUpJJJJSydJJJSkkkklKVLq0/YXkdn1H7rGK6qnU9cJ48XMH/AE2psxcJDvEp\ -juPNARqU2qdILmG2oJk5TBJSkkkkVK7p0ydJSySSSCVSkkkUUKTBOkklR4KYmEh/vS8+UlLlIpJ" - -"kFLpJJBFCkjykkkpZOkkgLSpJIpJIUNEkoTpKZ0/zjfiryo0fzrfir62Phf8ANT/v/sYM3zDyUk\ -kktFiUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlKl1b+gP/r1f+fGK6qfVRODYP\ -Nn/AFbUzJ/Nz/ulMfmHmEPdMnTLmW2umSShFSkkkigpSdN2SKKlBJLhJJKkiYH8EgmPdDopfukm\ -SRUqE4SSSUpJMkgpQTpJh+VFS6RSSSQpJJJJSkkkklKSSThBTOj+dar6oUfzjfir62Phf83P+/8" - -"AsYM3zDyUkkktFiUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlKp1T+hP+LP8Aq2\ -q2qfVhOBaPNn/VtTcnyS/ulMdx5oO6SR5SXMNtSSRSRUqNZSKSXdJSkkkklKSCSSXVSkoS7peKS\ -Vk6bukgpdJLtCXwSUt8Ekk6Slkk5CZJS/ZJJI90UK7pJJIFKkgkkkhXZOm8kuCBHxKKklP8434q\ -+qFP842PFX1r/C/5uf8AeH5MGbceSkkklosSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkkl" - -"KSSSSUpU+qmMGz4sH3vaFcVLq8/YXR+/V93qsTcmkJH+qV0fmHmEXdMl/FLuuYbSkkkkVKTJykA\ -gpXKSSSKleSSSSCVJJJJKUUydJJSkkkklLFIJ4lMkpdJIJIqUkkkUkLJ0ydBK6ZJI+aKFDxTlLs\ -mSUkp/nW/FX1Qp/nW/FX1r/AAv+bn/f/YwZtx5KSSSWixKSSSSUsnSSSUpJJJJSkkkklKSSSSUp\ -JJJJSkkkklKSSSSUpU+qQcJ08bq5/wA9quKn1Uxgv/rV/wDnxqZkNY5n+qfyTH5h5hCkmSXMttS" - -"SXkkipR4SS5EJIJUkkkihXdJJIIJUkl2SRUpJJJBSpSSSSUpLzTJ0lKhMnTJKXSSKSKlk6ZOAgp\ -SRSSKKF0yRPZJAqSU/zrfir6z6f5xvxWgtf4X/ADc/7/7GDNuPJSSSS0mJSSSSSlJJJJKUkkkkp\ -SSSSSlJJJJKUkmTpKUkkkkpSSSSSlKn1QTg2DzZ/wBW1XFT6q7bhPP8qv8AGxqbk+SX90pj8w80\ -J8UkjymXMNtSSSSKlJFJJBSkkkkVKSSlJJKkkkklKSSSSUryShN3ToKV2TJJ4SUpNynTcJKX7Jk" - -"6SKllIJgnSCCtKZOkglSSZOOUrUzp/nW/FaCz6f51vxWgtf4X/Nz/ALwa+bceSkkklpMSkkkklK\ -SSSSUsnSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKVLqwnAs+LD9z2lXVU6n/QrPiz/AKtqZk+SX\ -90pj8w8wgOpKZOkuZbaySSSKlJJJJKV8EkkklKSSSSStwl/BOkkpSQSKSSld0ikkUuilJk4S7oK\ -UEycpklLpk6ZEqXCSQSSQpJJJBKx4SCSceKSmVX863wkLRWfT/ON+IWgtf4X8mT+8Gvm3HkpJJJ" - -"aTEpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKVPqv9Bf/AFq//PjVcVTqn9Dd/W\ -Z/1bUzJ/Nz/un8l0fmHmEB0lJLul4LmW0pMUkkVK7Jk6SSVcpJJJBCu6SSSCVBJJLsihSSSRSUp\ -JJJJS6ZJJJSkku6UIKUkkkipSRSSKSlJBJJLqpSQSSGiCWdP8434rQVCn+cb8VfWv8AC/kyf3g1\ -8248lJJJLSYlJJJJKUkkkkpSSSSSlJJJJKUkkmSUukmTpKUkkkkpSSSSSlKp1QxhPPg6ufh6jZV" - -"tCyavXx7Kv32kD49k2YuMh3BCYmiD2LSSUa3b2Bx0PDh4HupQuZIINHcNtZJOl2QUpMnASRUsEk\ -kkgpRS7pJ0lLJJ4TJKV2SSSQKlFJJLskpSSXknRUskkE6Sld1FOlCSlJJd0/dJSySRlJJSil2S7\ -p+2iCmdOtrfir6p4rSX7uzVcW18MiRilL96Wn0a+U+ryCkkklfY1JJJJKUkkkkpZOkkkpSSSSSl\ -JJJJKUkkkkpSSSSSlJJJJKUkkkkppZOM5rjbUJDtXsHj+8EEEH5crSUXVVv+k0E+Ko8zyEcsjOB" - -"4JHfsWWOWhR1aCSufZqvA/el9mq8/vVT/AEZm7w+0/wAF/ux8Wmkrn2arwP3pfZqvA/el/ozN+9\ -D7T/BXux8Wmkrn2arwP3pfZavA/eh/ozN+9D7T/BXux8WmkrYxax4p/stXn96X+jM/eH2n+Cvdj\ -4tNLurn2Wrz+9L7LV5/el/o3P3h9p/gr3Y+LTShXPstXn96b7LV5/el/ozP3h9v9ivdj4tSEoVv\ -7JV5/el9lr8/vS/0bn7w+3+xXux8Wokrf2WrzS+y1+aX+jc/eH2/2K92Pi1Elc+y1+aX2Wvz+9L" - -"/AEbn7w+3+xXux8Wmkrf2Wrz+9P8AZa/P70v9G5+8Pt/sV7sfFppamfBXPstXn96b7LVM6/el/o\ -3P3h9pV7sfFqJK39lr8Sl9lq8/vS/0bn7w+3+xXux8WopMY5xAaJVsY1Q7T8UQNDRAEBSY/hk7/\ -WSiB/V1KDmHQMa6xW2B8yppJLUhGMIiMRQiKDATepUkkknKUkkkkpSSSSSlJJJJKUkkkkpSSSSS\ -lJJJJKUkkkkpSSSSSlk6SSSlk6SSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkp" - -"SSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKf/Z"; - - -QStringList nameValues(QString::fromAscii("John")); // First name - nameValues.append(QString::fromAscii("Citizen")); // Last name - QByteArray name = nameValues.join(QString::fromAscii(";")).toAscii(); - QVersitDocument document1 = - createDocumentWithNameAndPhoto( - name,img,QString::fromAscii("JPEG"), - QString::fromAscii("BASE64")); - QVersitDocument document2 = - createDocumentWithNameAndPhoto( - name,img,QString::fromAscii("JPEG"), - QString::fromAscii("B")); + QByteArray content = mResourceHandler->mObjects.value(avatar.avatar()); + QCOMPARE(content, gif); + QPixmap pixmap(avatar.pixmap()); + QPixmap expectedPixmap; + expectedPixmap.loadFromData(gif); + QCOMPARE(pixmap, expectedPixmap); - mImporter->setImagePath(imageAndAudioClipPath); - QContact contact1 = mImporter->importContact(document1); - QContact contact2 = mImporter->importContact(document2); - QContactAvatar avatar1 = - static_cast(contact1.detail(QContactAvatar::DefinitionName)); - QContactAvatar avatar2 = - static_cast(contact2.detail(QContactAvatar::DefinitionName)); - QVERIFY(avatar1.subType() == QContactAvatar::SubTypeImage); - QVERIFY(avatar2.subType() == QContactAvatar::SubTypeImage); - QVERIFY(avatar1.avatar() != avatar2.avatar()); -} - -void UT_QVersitContactImporter::testAvatarJpegNonexistentPath() -{ - // JPEG image. Name property present. The image path doesn't exist. - // Test that the avatar detail is not created and there is no image - // stored on the disk. - QByteArray img = -"/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf\ -/bAIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQ\ -EBAQEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4r\ -NTUwMDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgBhAGGAwEiAAIRAQMRAf/EAT8AAAEFAQEBAQEBAAA" - -"AAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQ\ -cGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKyg\ -yZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3\ -h5ent8fX5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGL" - -"hcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1e\ -X1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A9ASSSSUpJJJJSkkkklKSSSSUp\ -JJJJSkkkklKSSSSUpJJJJSkySdJSkkkklKSTEgCToFXfmN4qG8/vfmpk8kMY4pyER4pESdg2Uyo\ -uvudy6PIaIck8mVSn8TxDSMZT/BkGE9S6UhJZwPgpCx7fouITY/FIdcch5G0+z2LoJKozKePpCR" - -"+KsMtZYPadfBW8PNYcukZa/unQscoSjuzSSSU61ZOmSSUpOkkkpSSSSSlJJJJKUkkkkpSSSSSlJ\ -JJJKUmTpJKUkkkkpSSSSSlJJJJKUmMwY5TpJKW+KdJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJ\ -JJJSlC21lTC95gD7yfAJrbWUsL3nTsO5PgFQc99r/Ut0I+gzs0f3qvzPMxwRs6yPyxXwgZHwZWW\ -WXGX6N7Vj+PiopJLCy5Z5JcUzZ/ls2QABQVKSSUqNSkkpS7pBSk4JBkaFMkiNCpt05AdDX6HsUd" - -"ZoVqi/hjz8CtXk+esjHlP92Z/IsOTH1j9jYSSSWmwrpJJJKWSTpJKUkkkkpSSSSSlJJJJKUkkkk\ -pSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSZJS6SZJJS6hZYyphe8w0\ -JWWMqYXvMNCoPe+54ss0A+gzw8z5qDmeZhghZ1kflj3XwgZHwU577X+pZpH0G/uj+9MU6ZYGTJL\ -JIzkbJbIAGgUkm+CSYldMU6ZJS6SSRRUpKUkkEKCfwTJyips0XzDHn4FWFncFWaL59j+exWpyXO" - -"7Ysp8IyP5FhyY+obKSZOtRhUkmSSUo6J0ySSl0kkklKSSSSUpJJJJSkkydJSkkkklKSSSSUpJJJ\ -JSkkkklKSSTJKXSSSSUpJJJJSkydJJSkkkklKULLGVsL3mGjkpWWMrYXvMNHJVCx77n77NAPoM/\ -d8z5qDmOYhhjZ1kflj3XwgZHwXe917979Gt+g3w8z5pikmKwcuWWWZnM2T/ACpsAAaBSSZP5qNc\ -rskmSRUukkmSUukmTpKUmSS7pKXSSSSUpOEyQ4SQ2qL5hj+exVhZoKtUXz7H89itTkudusWU+EZ" - -"H8iw5MfUNhOmSB7HQrUYV0kkklKSSSSUpJJJJSkkkySlJ0ydJSkkkklLJJ0klKSSSSUpJJJJSkk\ -kklKSSSSUpJJJJSkkkySl1GyxlbC95ho5KT3traXvMNbqSs+yx17979GD+bZ4fyj5/kUHMcxDDD\ -ilqT8se66EDI+CrLHXvD3jaxv0GeHmfNMkUv4rBy5Z5ZmczZP5dg2gABQUkkkmKWTpcpu6CVJ0y\ -UIqUEikkgFKSSS7JKUU0aynKSRUpJL4JIqUlKSRQUpOCmTpKbWPfPsf8irAEd5WaPFWqL59jjr2" - -"K1eR526xZT4RkfyLBkx9R9WykmTrUYVJJJJKUkkkkpSSSZJS6ZOkkpSSSSSlJJJJKUkkkkpSSSS\ -SlJJJJKUkkkkpZJJJJS6i97a2l7zDRyUnOaxpc4w0aklZ9trshwcdK26sYf+qKh5jmIYYcUtSfl\ -j3K6EDI+C9ljr3bne1g1Yz/AL87zTJJlgZcs8sjOZsn8PANkAAUFSkl3STErJJ0kkqTJJ0lKCZO\ -kkpZOmSQCl0ySXgipSdMnCClk6ZLxSUumT9vgmRKl0xTpIKXTeaSSSG3RfPsfz2KOs2YKt0X7va" - -"7nsVrclzt1iynXaMj+RYcmOtQ2EkydabCpMnSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJ\ -JJJSkkkklKUXOaxpc4w0akpOc1jS5xho1JKoW2uyHAnSoataeSf3j/AAUOfPDDDilv+jHuV0ImR\ -Vba7IcCdKhq1nj/ACnJkkywM2aeWZnM/wBg7BsgACgpJJJMSpIJJJJW4ST8pJKUmSSSUpLskkgp\ -QTpJkVKSTpklKSSS0QUpKUkklL/BMnSRUpJJJBSkkkklKTzCZJG0Nyi/d7Xc9j4oyzgSCrdF272" - -"u+l281rclznFWLIfVtGR6+BYMmOtQnSSSWkxKSTJ0lKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkk\ -lKTOc1rS5xho1JKTnNa0ucYaNSSqF1xyD3FQ+i0/neZUWfPDDDil9B1JXRiZFa612Q7XSkfRafz\ -v5R/gmSSWBmyyyzM5nyHQDs2QABQUmSCXkokq7JJFJJSktUkkUqS7JJgSgpdN3SSSUukkmSUpLs\ -nSRUpMl2SKClJAzPlol4pAaz3KSlJJdkkqUukAkkipSZJP3QUpJKUgkhSSSSKVJwSDKZJBDcou3" - -"ja76X5UdZoMGQrlN28bT9Lt5rY5LneMDFkPq2jI9fA+LBkx1qEySYGU60WJSZOkkpSSSSSlJJJJ\ -KUkkmSUukkkkpSYkAEkwByUiQ0FzjAGpJWfdecg6aUjgd3eZ8lFnzwww4pHyHUldGBkdFXXHIOm\ -lI+iP3z4ny8EySSwc2aeWZnI+Q6AdmzEACgskUkioUqSSSCKlJJJJKUklwmSSukkmQtSkk6YJKU\ -n/IkkipZOkkkFKKSRS+CClJk6ZFSkzdRMR5HlOnSUpJJMkpdJIJJIUl2SSQClFLukkipXZJIcJI" - -"JUnBI45S7JkdtkN2m4PG0/S/KjLNBIII0KuU3B4g/SC2OS5zjrHkPr/Rl+9/awZMdajZMmTpLQY\ -lk6SSSlJJJJKUmTpJKUmc5rWlzjDRqSUnODWlzjAGpJWfdc7II7Ujhvd3mf7lDnzwww4pfSPUld\ -CBkf2quuOSY4pHA/f8AM+XkmTJLAzZp5p8cz5DoB2DZAAFBdMl8UyjXLykmSSCl+ySSSSFJJd0y\ -Sl5STJJFK6ZL4pd0ipScpJuySl0gkmRUueUu6ZJJS4STJIKXSTJtS4eABn5wipcGZjtoUu6SSVK" - -"XCXdMn7JKUklOqSClJJd0vFJCuUkgkUkqSSS7/BJCkuySSKlJ2kgyOUx/FJCyCpvU3CwQfpIqzW\ -uIII0IV2m4WCDo7wWzyXOe4BjyH1jY/vf2tfJjrUbJUkkloMakkkklKTOc1rS5xho1JKdZ+Tab7\ -XVj+aq0P8p/n5N/Kos+aOLGZy6bDuV0Y8Rpa652QeCKR9Fp5d5lR7J0lz+bNPLMzmfLsPJsgACg\ -skkko0rJJFOklYpdk6ZLqpdJJJJCkkkoSSsknTJKUnSTJKXSSKSSlkinSRUpMkn7pKW7pcJJaoK" + // Without the resource handler, the pixmap should still be set. + mImporter->setResourceHandler(0); + contact = mImporter->importContacts(documentList).first(); + avatar = contact.detail(); + QVERIFY(avatar.subType() == QContactAvatar::SubTypeImage); + QVERIFY(avatar.avatar().isEmpty()); + pixmap = avatar.pixmap(); + QCOMPARE(pixmap, expectedPixmap); -"UkknSClkkuyXZFSk6ZOgpZJJJKlKTpJSipSSSSClJJeCSKlJJd0klKKSSbugpdSaSDIKikjqDaG\ -9TcLBB0cirOa4tIIOqvVP9Rgd37ra5HmzlHtz+eI0P7w/i18kK1GzNJJJXmNha/wBOp7/3Wl33C\ -VmY4IpZOpIlx8zqfxK0cljn41rG/Scxwb8SIWdQ4OqY7xaD+CzPihPDjHS5fsZsP6X0SJk6SyWZ\ -bukkkkpSXCSRSSpJJJJSkkvgnSQsklKSVqUl3SS5KSVJJJIoUlokkkVKShJJJSku6SSCVQkkkih" - -"bVOkkUkqTd06SRUrskkkgpSZOkUVKShJJJCkuyUpd0lKS8UkklK0SSSSUpKEkgEFK7JJBOkpQCs\ -YrjuLfESq6Pij3k+SscoSOYx1+8syfKW2kkkuhaylmPq9C11fDHEur+B1I+RWmh21MuZtePMHuD\ -4hQczgGbGYbEaxPivhPhPh1aISU30W1nUbm/vD+IUPyrCyYcmM1OJH5fa2AQdQbUmTpKIhKuySS\ -SNFSkycpIKWhOkmSUrRIhJJJSkkkiipSSSSSlBIpJJKUEkku6SlJJJeSSlu6dJJJKkkkkkKSSS7" - -"pFSkkkikpXdJMOU8oJUlKSSSFJJJIqUnTBOgpSSSUI0eylJJJFKipQ4S1nyS7Jwx7tAJlIRkdAC\ -T4KtZXMevayTyVGrGiHP8AuR1q8jycoH3cgo/ox6+ZYMkwdAukkktNiUkkkkpSaAeQnSSUx2t8B\ -9yW1vgFJJCh2Va21vgE21vgPuUkkqHZVsHV1uEFoKoZFZxrWQZqsMNnkO5j5rSVPqYnHaf3baz9\ -7w3+Kg5rBDJilcRxRiTE9bC/HIiQF6HRCmTplzzZUknTd0lKS7wkl3SSpJJOihbukkkgpSSSXdF" - -"SkgkkEkq7BJJJJCk0J0u6RUpJJNqkpdIpJFBSgkkEiklSXdLskkhSXdOm7JFS7ROg7q7XQxo1Eu\ -VWnWxvxV5afw3DCXFkkBIxNC2HLIigFbW+ASgeCdJa1BhWgeCW1vgE6SVBTHa3wH3J4jhOklQUp\ -JJJJSkkkklKSSSSUpJJJJSydJJJSkkkklKVLq0/YXkdn1H7rGK6qnU9cJ48XMH/AE2psxcJDvEp\ -juPNARqU2qdILmG2oJk5TBJSkkkkVK7p0ydJSySSSCVSkkkUUKTBOkklR4KYmEh/vS8+UlLlIpJ" - -"kFLpJJBFCkjykkkpZOkkgLSpJIpJIUNEkoTpKZ0/zjfiryo0fzrfir62Phf8ANT/v/sYM3zDyUk\ -kktFiUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlKl1b+gP/r1f+fGK6qfVRODYP\ -Nn/AFbUzJ/Nz/ulMfmHmEPdMnTLmW2umSShFSkkkigpSdN2SKKlBJLhJJKkiYH8EgmPdDopfukm\ -SRUqE4SSSUpJMkgpQTpJh+VFS6RSSSQpJJJJSkkkklKSSThBTOj+dar6oUfzjfir62Phf83P+/8" - -"AsYM3zDyUkkktFiUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlKp1T+hP+LP8Aq2\ -q2qfVhOBaPNn/VtTcnyS/ulMdx5oO6SR5SXMNtSSRSRUqNZSKSXdJSkkkklKSCSSXVSkoS7peKS\ -Vk6bukgpdJLtCXwSUt8Ekk6Slkk5CZJS/ZJJI90UK7pJJIFKkgkkkhXZOm8kuCBHxKKklP8434q\ -+qFP842PFX1r/C/5uf8AeH5MGbceSkkklosSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkkl" - -"KSSSSUpU+qmMGz4sH3vaFcVLq8/YXR+/V93qsTcmkJH+qV0fmHmEXdMl/FLuuYbSkkkkVKTJykA\ -gpXKSSSKleSSSSCVJJJJKUUydJJSkkkklLFIJ4lMkpdJIJIqUkkkUkLJ0ydBK6ZJI+aKFDxTlLs\ -mSUkp/nW/FX1Qp/nW/FX1r/AAv+bn/f/YwZtx5KSSSWixKSSSSUsnSSSUpJJJJSkkkklKSSSSUp\ -JJJJSkkkklKSSSSUpU+qQcJ08bq5/wA9quKn1Uxgv/rV/wDnxqZkNY5n+qfyTH5h5hCkmSXMttS" - -"SXkkipR4SS5EJIJUkkkihXdJJIIJUkl2SRUpJJJBSpSSSSUpLzTJ0lKhMnTJKXSSKSKlk6ZOAgp\ -SRSSKKF0yRPZJAqSU/zrfir6z6f5xvxWgtf4X/ADc/7/7GDNuPJSSSS0mJSSSSSlJJJJKUkkkkp\ -SSSSSlJJJJKUkmTpKUkkkkpSSSSSlKn1QTg2DzZ/wBW1XFT6q7bhPP8qv8AGxqbk+SX90pj8w80\ -J8UkjymXMNtSSSSKlJFJJBSkkkkVKSSlJJKkkkklKSSSSUryShN3ToKV2TJJ4SUpNynTcJKX7Jk" + // Empty photo. The avatar should not be added to the QContact. + QVersitProperty property; + property.setName(QLatin1String("PHOTO")); + property.setValue(QByteArray()); + document.clear(); + document.addProperty(property); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); + QCOMPARE(contact.details(QContactAvatar::DefinitionName).size(), 0); -"6SKllIJgnSCCtKZOkglSSZOOUrUzp/nW/FaCz6f51vxWgtf4X/Nz/ALwa+bceSkkklpMSkkkklK\ -SSSSUsnSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKVLqwnAs+LD9z2lXVU6n/QrPiz/AKtqZk+SX\ -90pj8w8wgOpKZOkuZbaySSSKlJJJJKV8EkkklKSSSSStwl/BOkkpSQSKSSld0ikkUuilJk4S7oK\ -UEycpklLpk6ZEqXCSQSSQpJJJBKx4SCSceKSmVX863wkLRWfT/ON+IWgtf4X8mT+8Gvm3HkpJJJ" - -"aTEpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKVPqv9Bf/AFq//PjVcVTqn9Dd/W\ -Z/1bUzJ/Nz/un8l0fmHmEB0lJLul4LmW0pMUkkVK7Jk6SSVcpJJJBCu6SSSCVBJJLsihSSSRSUp\ -JJJJS6ZJJJSkku6UIKUkkkipSRSSKSlJBJJLqpSQSSGiCWdP8434rQVCn+cb8VfWv8AC/kyf3g1\ -8248lJJJLSYlJJJJKUkkkkpSSSSSlJJJJKUkkmSUukmTpKUkkkkpSSSSSlKp1QxhPPg6ufh6jZV" - -"tCyavXx7Kv32kD49k2YuMh3BCYmiD2LSSUa3b2Bx0PDh4HupQuZIINHcNtZJOl2QUpMnASRUsEk\ -kkgpRS7pJ0lLJJ4TJKV2SSSQKlFJJLskpSSXknRUskkE6Sld1FOlCSlJJd0/dJSySRlJJSil2S7\ -p+2iCmdOtrfir6p4rSX7uzVcW18MiRilL96Wn0a+U+ryCkkklfY1JJJJKUkkkkpZOkkkpSSSSSl\ -JJJJKUkkkkpSSSSSlJJJJKUkkkkppZOM5rjbUJDtXsHj+8EEEH5crSUXVVv+k0E+Ko8zyEcsjOB" - -"4JHfsWWOWhR1aCSufZqvA/el9mq8/vVT/AEZm7w+0/wAF/ux8Wmkrn2arwP3pfZqvA/el/ozN+9\ -D7T/BXux8Wmkrn2arwP3pfZavA/eh/ozN+9D7T/BXux8WmkrYxax4p/stXn96X+jM/eH2n+Cvdj\ -4tNLurn2Wrz+9L7LV5/el/o3P3h9p/gr3Y+LTShXPstXn96b7LV5/el/ozP3h9v9ivdj4tSEoVv\ -7JV5/el9lr8/vS/0bn7w+3+xXux8Wokrf2WrzS+y1+aX+jc/eH2/2K92Pi1Elc+y1+aX2Wvz+9L" - -"/AEbn7w+3+xXux8Wmkrf2Wrz+9P8AZa/P70v9G5+8Pt/sV7sfFppamfBXPstXn96b7LVM6/el/o\ -3P3h9pV7sfFqJK39lr8Sl9lq8/vS/0bn7w+3+xXux8WopMY5xAaJVsY1Q7T8UQNDRAEBSY/hk7/\ -WSiB/V1KDmHQMa6xW2B8yppJLUhGMIiMRQiKDATepUkkknKUkkkkpSSSSSlJJJJKUkkkkpSSSSS\ -lJJJJKUkkkkpSSSSSlk6SSSlk6SSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkp" - -"SSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKf/Z"; - - QStringList nameValues(QString::fromAscii("John")); // First name - nameValues.append(QString::fromAscii("Citizen")); // Last name - QByteArray name = nameValues.join(QString::fromAscii(";")).toAscii(); - QVersitDocument document = - createDocumentWithNameAndPhoto( - name,img,QString::fromAscii("JPEG"), - QString::fromAscii("BASE64")); - - mImporter->setImagePath(QString::fromAscii("some_nonexistent/path/anywhere543")); - QContact contact = mImporter->importContact(document); - - QContactDetail detail = contact.detail(QContactAvatar::DefinitionName); - QVERIFY(detail.isEmpty()); - - QDir dir(mImporter->imagePath()); - QVERIFY(!dir.exists()); + mImporter->setResourceHandler(mResourceHandler); } void UT_QVersitContactImporter::testAvatarUrl() { QVersitProperty property; - property.setName(QString::fromAscii("PHOTO")); - QByteArray value("file:///jgpublic."); + property.setName(QLatin1String("PHOTO")); + QString value(QLatin1String("http://example.com/example.jpg")); property.setValue(value); - property.addParameter( - QString::fromAscii("VALUE"),QString::fromAscii("URL")); + property.insertParameter(QLatin1String("VALUE"), QLatin1String("URL")); QVersitDocument document; document.addProperty(property); + QList documentList; + documentList.append(document); - QContact contact = mImporter->importContact(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactAvatar avatar = static_cast(contact.detail(QContactAvatar::DefinitionName)); - QCOMPARE(avatar.avatar(), QString::fromAscii("file:///jgpublic.")); + QCOMPARE(avatar.avatar(), QLatin1String("http://example.com/example.jpg")); + QVERIFY(avatar.subType() == QContactAvatar::SubTypeImage); + + + // A URL disguised inside a QByteArray. + document.clear(); + property.clear(); + property.setName(QLatin1String("PHOTO")); + property.setValue(QByteArray("http://example.com/example.jpg")); + property.insertParameter(QLatin1String("VALUE"), QLatin1String("URL")); + property.insertParameter(QLatin1String("CHARSET"), QLatin1String("UTF-8")); + document.addProperty(property); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); + avatar = + static_cast(contact.detail(QContactAvatar::DefinitionName)); + QCOMPARE(avatar.avatar(), QLatin1String("http://example.com/example.jpg")); QVERIFY(avatar.subType() == QContactAvatar::SubTypeImage); } -void UT_QVersitContactImporter::testAvatarEncoding() +void UT_QVersitContactImporter::testAvatarInvalid() { - // Tests only quoted-printable encoding. - // Assumes that this is the only other encoding supported in PHOTO. - // In versit property the image is already decoded by the reader. - QByteArray img = -"R0lGODlhEgASAIAAAAA" -"AAP///yH5BAEAAAEALAAAAAASABIAAAIdjI+py+0G" -"wEtxUmlPzRDnzYGfN3KBaKGT6rDmGxQAOw=="; - QStringList nameValues(QString::fromAscii("John")); // First name - nameValues.append(QString::fromAscii("Citizen")); // Last name - QByteArray name = nameValues.join(QString::fromAscii(";")).toAscii(); - QVersitDocument document = - createDocumentWithNameAndPhoto( - name,img,QString::fromAscii("GIF"), - QString::fromAscii("8BIT")); + // An avatar that's a QVersitDocument? It shouldn't work. + QVersitDocument document; + QVersitProperty property; + property.setName(QLatin1String("PHOTO")); + QVersitDocument nestedDocument; + property.setValue(QVariant::fromValue(nestedDocument)); + property.insertParameter(QLatin1String("VALUE"), QLatin1String("URL")); + document.addProperty(property); + QList list; + list.append(document); + QContact contact = mImporter->importContacts(list).first(); + QCOMPARE(contact.details(QContactAvatar::DefinitionName).size(), 0); - mImporter->setImagePath(imageAndAudioClipPath); - QContact contact = mImporter->importContact(document); - - QContactDetail detail = contact.detail(QContactAvatar::DefinitionName); - QVERIFY(!detail.isEmpty()); - QContactAvatar avatar = static_cast(detail); - QVERIFY(avatar.subType() == QContactAvatar::SubTypeImage); - QDir dir; - QVERIFY(dir.exists(avatar.avatar())); + document.clear(); + property.clear(); + list.clear(); + property.setName(QLatin1String("PHOTO")); + property.setValue(QVariant::fromValue(nestedDocument)); + document.addProperty(property); + list.append(document); + contact = mImporter->importContacts(list).first(); + QCOMPARE(contact.details(QContactAvatar::DefinitionName).size(), 0); } void UT_QVersitContactImporter::testGeo() @@ -1284,10 +1001,12 @@ val.append(QString::fromAscii("18.53"));// Longtitude val.append(QString::fromAscii("45.32")); // Latitude nameProperty.setName(QString::fromAscii("GEO")); - nameProperty.setValue(val.join(QString::fromAscii(",")).toAscii()); + nameProperty.setValue(val.join(QString::fromAscii(","))); document.addProperty(nameProperty); - QContact contact = mImporter->importContact(document); - QContactGeolocation geo = (QContactGeolocation)contact.detail(QContactGeolocation::DefinitionName); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); + QContactGeoLocation geo = (QContactGeoLocation)contact.detail(QContactGeoLocation::DefinitionName); QString str; str.setNum(geo.longitude(),'.',2); QCOMPARE(str,val[0]); @@ -1300,9 +1019,11 @@ val.append(QString::fromAscii("18.53"));// Longtitude val.append(QString::fromAscii("-45.32")); // Latitude nameProperty.setName(QString::fromAscii("GEO")); - nameProperty.setValue(val.join(QString::fromAscii(",")).toAscii()); + nameProperty.setValue(val.join(QString::fromAscii(","))); document.addProperty(nameProperty); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); geo = (QContactGeolocation)contact.detail(QContactGeolocation::DefinitionName); str.setNum(geo.longitude(),'.',2); QCOMPARE(str,val[0]); @@ -1315,46 +1036,52 @@ // single line value QVersitDocument document; QVersitProperty nameProperty; - QByteArray val("I will not sleep at my work -John"); + QString val(QString::fromAscii("I will not sleep at my work -John")); nameProperty.setName(QString::fromAscii("NOTE")); nameProperty.setValue(val); document.addProperty(nameProperty); - QContact contact = mImporter->importContact(document); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactNote note = (QContactNote)contact.detail(QContactNote::DefinitionName); - QCOMPARE(note.note(),QString::fromAscii(val)); + QCOMPARE(note.note(),val); // Multiline value and quoted printable encoding document = QVersitDocument(); nameProperty = QVersitProperty(); - val = QByteArray("My Dad acts like he belongs,=0D=0AHe belongs in the zoo.=0D=0A"); + val = QString::fromAscii("My Dad acts like he belongs,=0D=0AHe belongs in the zoo.=0D=0A"); nameProperty.setName(QString::fromAscii("NOTE")); nameProperty.setValue(val); QMultiHash params; - params.insert(QString::fromAscii("QUOTED-PRINTABLE"),QString::fromAscii(val)); + params.insert(QString::fromAscii("QUOTED-PRINTABLE"),val); nameProperty.setParameters(params); document.addProperty(nameProperty); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); note = (QContactNote)contact.detail(QContactNote::DefinitionName); - QCOMPARE(note.note(),QString::fromAscii(val)); + QCOMPARE(note.note(),val); } void UT_QVersitContactImporter::testLabel() { QVersitDocument document; QVersitProperty nameProperty; - QByteArray val("John Citizen"); + QString val(QString::fromAscii("John Citizen")); nameProperty.setName(QString::fromAscii("FN")); nameProperty.setValue(val); document.addProperty(nameProperty); - QContact contact = mImporter->importContact(document); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactName name = (QContactName)contact.detail(QContactName::DefinitionName); - QCOMPARE(name.customLabel(),QString::fromAscii(val)); + QCOMPARE(name.customLabel(),val); } void UT_QVersitContactImporter::testOnlineAccount() { - QByteArray accountUri("sip:john.citizen@example.com"); + QString accountUri(QString::fromAscii("sip:john.citizen@example.com")); // Plain X-SIP, no TYPE -> QVersitDocument document; @@ -1362,11 +1089,13 @@ property.setName(QString::fromAscii("X-SIP")); property.setValue(accountUri); document.addProperty(property); - QContact contact = mImporter->importContact(document); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactOnlineAccount onlineAccount = static_cast( contact.detail(QContactOnlineAccount::DefinitionName)); - QCOMPARE(onlineAccount.accountUri(),QString::fromAscii(accountUri)); + QCOMPARE(onlineAccount.accountUri(),accountUri); QStringList subTypes = onlineAccount.subTypes(); QCOMPARE(subTypes.count(),1); QVERIFY(subTypes.first() == QContactOnlineAccount::SubTypeSip); @@ -1380,11 +1109,13 @@ params.insert(QString::fromAscii("TYPE"),QString::fromAscii("SWIS")); property.setParameters(params); document.addProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); onlineAccount = static_cast( contact.detail(QContactOnlineAccount::DefinitionName)); - QCOMPARE(onlineAccount.accountUri(),QString::fromAscii(accountUri)); + QCOMPARE(onlineAccount.accountUri(),accountUri); subTypes = onlineAccount.subTypes(); QCOMPARE(subTypes.count(),1); QVERIFY(subTypes.first() == QContactOnlineAccount::SubTypeVideoShare); @@ -1398,11 +1129,13 @@ params.insert(QString::fromAscii("TYPE"),QString::fromAscii("VOIP")); property.setParameters(params); document.addProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); onlineAccount = static_cast( contact.detail(QContactOnlineAccount::DefinitionName)); - QCOMPARE(onlineAccount.accountUri(),QString::fromAscii(accountUri)); + QCOMPARE(onlineAccount.accountUri(),accountUri); subTypes = onlineAccount.subTypes(); QCOMPARE(subTypes.count(),1); QVERIFY(subTypes.first() == QContactOnlineAccount::SubTypeSipVoip); @@ -1413,11 +1146,13 @@ property.setName(QString::fromAscii("X-IMPP")); property.setValue(accountUri); document.addProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); onlineAccount = static_cast( contact.detail(QContactOnlineAccount::DefinitionName)); - QCOMPARE(onlineAccount.accountUri(),QString::fromAscii(accountUri)); + QCOMPARE(onlineAccount.accountUri(),accountUri); subTypes = onlineAccount.subTypes(); QCOMPARE(subTypes.count(),1); QVERIFY(subTypes.first() == QContactOnlineAccount::SubTypeImpp); @@ -1428,11 +1163,13 @@ property.setName(QString::fromAscii("IMPP")); property.setValue(accountUri); document.addProperty(property); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); onlineAccount = static_cast( contact.detail(QContactOnlineAccount::DefinitionName)); - QCOMPARE(onlineAccount.accountUri(),QString::fromAscii(accountUri)); + QCOMPARE(onlineAccount.accountUri(),accountUri); subTypes = onlineAccount.subTypes(); QCOMPARE(subTypes.count(),1); QVERIFY(subTypes.first() == QContactOnlineAccount::SubTypeImpp); @@ -1443,29 +1180,33 @@ // Interesting : kid but no wife :) QVersitDocument document; QVersitProperty nameProperty; - QByteArray val("Jane"); // one is enough + QString val(QString::fromAscii("Jane")); // one is enough nameProperty.setName(QString::fromAscii("X-CHILDREN")); nameProperty.setValue(val); document.addProperty(nameProperty); - QContact contact = mImporter->importContact(document); + QList documentList; + documentList.append(document); + QContact contact = mImporter->importContacts(documentList).first(); QContactFamily family = (QContactFamily)contact.detail(QContactFamily::DefinitionName); QStringList children = family.children(); QCOMPARE(children.count(),1); // ensure no other kids in list QCOMPARE(family.spouse(),QString()); // make sure no wife - QCOMPARE(children[0],QString::fromAscii(val)); // ensure it is your kid + QCOMPARE(children[0],val); // ensure it is your kid // Critical : wife but no kids , happy hours document = QVersitDocument(); nameProperty = QVersitProperty(); nameProperty.setName(QString::fromAscii("X-SPOUSE")); - val = "Jenny"; + val = QString::fromAscii("Jenny"); nameProperty.setValue(val); document.addProperty(nameProperty); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); family = (QContactFamily)contact.detail(QContactFamily::DefinitionName); children = family.children(); QCOMPARE(children.count(),0); // list should be empty as you know - QCOMPARE(family.spouse(),QString::fromAscii(val)); // make sure thats your wife:( + QCOMPARE(family.spouse(),val); // make sure thats your wife:( // Hopeless : couple of kids and wife document = QVersitDocument(); @@ -1476,105 +1217,119 @@ kidsVal.append(QString::fromAscii("James")); kidsVal.append(QString::fromAscii("Jake")); kidsVal.append(QString::fromAscii("Jane")); - nameProperty.setValue(kidsVal.join(QString::fromAscii(",")).toAscii()); + nameProperty.setValue(kidsVal.join(QString::fromAscii(","))); document.addProperty(nameProperty); // Add wife next - val = "Jenny"; + val = QString::fromAscii("Jenny"); nameProperty = QVersitProperty(); nameProperty.setName(QString::fromAscii("X-SPOUSE")); nameProperty.setValue(val); document.addProperty(nameProperty); - contact = mImporter->importContact(document); + documentList.clear(); + documentList.append(document); + contact = mImporter->importContacts(documentList).first(); family = (QContactFamily)contact.detail(QContactFamily::DefinitionName); children = family.children(); QCOMPARE(children.count(),3); // too late , count them now. // painfull but ensure they are your kids QCOMPARE(children.join(QString::fromAscii(",")),kidsVal.join(QString::fromAscii(","))); - QCOMPARE(family.spouse(),QString::fromAscii(val)); // make sure thats your wife:( + QCOMPARE(family.spouse(),val); // make sure thats your wife:( } void UT_QVersitContactImporter::testSound() { - QString path(imageAndAudioClipPath); - mImporter->setAudioClipPath(path); QVersitDocument document; QVersitProperty nameProperty; nameProperty.setName(QString::fromAscii("N")); - nameProperty.setValue("Citizen;John;;;"); + nameProperty.setValue(QString::fromAscii("Citizen;John;;;")); document.addProperty(nameProperty); nameProperty = QVersitProperty(); + QVersitProperty soundProperty; QMultiHash param; param.insert(QString::fromAscii("TYPE"),QString::fromAscii("WAVE")); - param.insert(QString::fromAscii("ENCODING"),QString::fromAscii("BASE64")); - nameProperty.setName(QString::fromAscii("SOUND")); + soundProperty.setName(QString::fromAscii("SOUND")); QByteArray val("111110000011111"); - nameProperty.setValue(val.toBase64()); - nameProperty.setParameters(param); - document.addProperty(nameProperty); - QContact contact = mImporter->importContact(document); + soundProperty.setValue(val); + soundProperty.setParameters(param); + document.addProperty(soundProperty); + QList documents; + documents.append(document); + QContact contact = mImporter->importContacts(documents).first(); QContactAvatar avatar = (QContactAvatar)contact.detail(QContactAvatar::DefinitionName); QCOMPARE(avatar.value(QContactAvatar::FieldSubType),QContactAvatar::SubTypeAudioRingtone.operator QString()); - QDir dir(path); - QStringList type(QString::fromAscii("*.wav")); - QStringList files = dir.entryList(type); - QCOMPARE(files.count(),1); - QString fileName = avatar.avatar(); - QVERIFY(fileName.endsWith(QString::fromAscii(".wav"))); - QFile file(fileName); - QVERIFY(file.open( QIODevice::ReadOnly)); - QByteArray content = file.readAll(); - QCOMPARE(content,val); + QVERIFY(!avatar.hasValue(QContactAvatar::FieldAvatarPixmap)); + QByteArray content = mResourceHandler->mObjects.value(avatar.avatar()); + QCOMPARE(content, val); } -void UT_QVersitContactImporter::testUnknownVersitProperties() +void UT_QVersitContactImporter::testPropertyHandler() { QVersitDocument document; QVersitProperty property; - QCOMPARE(mImporter->unknownVersitProperties().count(), 0); // No unconverted properties, no converted properties either - mImporter->importContact(document); - QCOMPARE(mImporter->unknownVersitProperties().count(), 0); + QList documents; + documents.append(document); + mImporter->importContacts(documents); + QCOMPARE(mPropertyHandler->mUnknownProperties.size(), 0); + QCOMPARE(mPropertyHandler->mPreProcessedProperties.size(), 0); + QCOMPARE(mPropertyHandler->mPostProcessedProperties.size(), 0); // No unconverted properties, one converted property + mPropertyHandler->clear(); property.setName(QString::fromAscii("N")); - property.setValue("Citizen;John;Q;;"); + property.setValue(QString::fromAscii("Citizen;John;Q;;")); document.addProperty(property); - mImporter->importContact(document); - QCOMPARE(mImporter->unknownVersitProperties().count(), 0); + documents.clear(); + documents.append(document); + QContact contact = mImporter->importContacts(documents).first(); + QCOMPARE(mPropertyHandler->mUnknownProperties.size(), 0); + QCOMPARE(mPropertyHandler->mPreProcessedProperties.size(), 1); + QCOMPARE(mPropertyHandler->mPostProcessedProperties.size(), 1); + + // Set the handler to override handling of the property + mPropertyHandler->clear(); + mPropertyHandler->mPreProcess = true; + document = QVersitDocument(); + property.setName(QString::fromAscii("N")); + property.setValue(QString::fromAscii("Citizen;John;Q;;")); + document.addProperty(property); + documents.clear(); + documents.append(document); + contact = mImporter->importContacts(documents).first(); + QCOMPARE(mPropertyHandler->mUnknownProperties.size(), 0); + QCOMPARE(mPropertyHandler->mPreProcessedProperties.size(), 1); + QCOMPARE(mPropertyHandler->mPostProcessedProperties.size(), 0); + QContactDetail nameDetail = contact.detail(QContactName::DefinitionName); + QVERIFY(nameDetail.isEmpty()); // One unknown property + mPropertyHandler->clear(); property.setName(QString::fromAscii("X-EXTENSION-1")); - property.setValue("extension value 1"); + property.setValue(QString::fromAscii("extension value 1")); document.addProperty(property); - mImporter->importContact(document); - QList unknownProperties = - mImporter->unknownVersitProperties(); + documents.clear(); + documents.append(document); + mImporter->importContacts(documents); + QList unknownProperties = mPropertyHandler->mUnknownProperties; QCOMPARE(unknownProperties.count(), 1); QCOMPARE(unknownProperties[0].name(), QString::fromAscii("X-EXTENSION-1")); - QCOMPARE(QString::fromAscii(unknownProperties[0].value()), - QString::fromAscii("extension value 1")); + QCOMPARE(unknownProperties[0].value(), QString::fromAscii("extension value 1")); // Two unknown properties + mPropertyHandler->clear(); property.setName(QString::fromAscii("X-EXTENSION-2")); - property.setValue("extension value 2"); + property.setValue(QString::fromAscii("extension value 2")); document.addProperty(property); - mImporter->importContact(document); - unknownProperties = mImporter->unknownVersitProperties(); + documents.clear(); + documents.append(document); + mImporter->importContacts(documents); + unknownProperties = mPropertyHandler->mUnknownProperties; QCOMPARE(unknownProperties.count(), 2); QCOMPARE(unknownProperties[0].name(), QString::fromAscii("X-EXTENSION-1")); - QCOMPARE(QString::fromAscii(unknownProperties[0].value()), - QString::fromAscii("extension value 1")); + QCOMPARE(unknownProperties[0].value(), QString::fromAscii("extension value 1")); QCOMPARE(unknownProperties[1].name(), QString::fromAscii("X-EXTENSION-2")); - QCOMPARE(QString::fromAscii(unknownProperties[1].value()), - QString::fromAscii("extension value 2")); - - // Test that the previous unknown properties are cleaned - // when importContact is called again - document = QVersitDocument(); - mImporter->importContact(document); - unknownProperties = mImporter->unknownVersitProperties(); - QCOMPARE(unknownProperties.count(), 0); + QCOMPARE(unknownProperties[1].value(), QString::fromAscii("extension value 2")); } QVersitDocument UT_QVersitContactImporter::createDocumentWithProperty( @@ -1586,10 +1341,9 @@ } QVersitDocument UT_QVersitContactImporter::createDocumentWithNameAndPhoto( - const QByteArray& name, + const QString& name, QByteArray image, - const QString& imageType, - const QString& encoding) + const QString& imageType) { QVersitDocument document; @@ -1600,17 +1354,9 @@ QVersitProperty property; property.setName(QString::fromAscii("PHOTO")); - if (encoding == QString::fromAscii("BASE64") || - encoding == QString::fromAscii("B")){ - property.setValue(image.toBase64()); - } else { - property.setValue(image); - } + property.setValue(image); if (imageType != QString()) { - property.addParameter(QString::fromAscii("TYPE"), imageType); - } - if (encoding != QString()) { - property.addParameter(QString::fromAscii("ENCODING"), encoding); + property.insertParameter(QString::fromAscii("TYPE"), imageType); } document.addProperty(property); diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitcontactimporter/ut_qversitcontactimporter.h --- a/qtcontactsmobility/tests/auto/qversitcontactimporter/ut_qversitcontactimporter.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitcontactimporter/ut_qversitcontactimporter.h Fri Apr 16 14:53:18 2010 +0300 @@ -43,6 +43,7 @@ #define UT_QVERSITCONTACTIMPORTER_H #include +#include #include #include @@ -50,6 +51,8 @@ class QVersitContactImporter; class QVersitContactImporterPrivate; +class MyQVersitContactImporterPropertyHandler; +class MyQVersitResourceHandler; QTM_END_NAMESPACE QTM_USE_NAMESPACE @@ -59,13 +62,11 @@ Q_OBJECT private slots: // Tests - - void initTestCase(); - void cleanupTestCase(); void init(); void cleanup(); void testName(); + void testNameWithFormatted(); void testAddress(); void testTel(); void testEmail(); @@ -81,33 +82,31 @@ void testBirthday(); void testGender(); void testNickname(); - void testAvatarJpegStored(); - void testAvatarGifStored(); - void testAvatarJpegTwoContactsWithSameName(); - void testAvatarJpegNonexistentPath(); + void testAvatarStored(); void testAvatarUrl(); - void testAvatarEncoding(); + void testAvatarInvalid(); void testGeo(); void testNote(); void testOnlineAccount(); void testFamily(); void testSound(); void testLabel(); - void testUnknownVersitProperties(); + void testPropertyHandler(); private: // Utilities QVersitDocument createDocumentWithProperty(const QVersitProperty& property); QVersitDocument createDocumentWithNameAndPhoto( - const QByteArray& name, + const QString& name, QByteArray image, - const QString& photoType, - const QString& encoding); + const QString& photoType); private: QVersitContactImporter* mImporter; QVersitContactImporterPrivate* mImporterPrivate; + MyQVersitContactImporterPropertyHandler* mPropertyHandler; + MyQVersitResourceHandler* mResourceHandler; }; #endif // UT_QVERSITCONTACTIMPORTER_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitdocument/qversitdocument.pro --- a/qtcontactsmobility/tests/auto/qversitdocument/qversitdocument.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitdocument/qversitdocument.pro Fri Apr 16 14:53:18 2010 +0300 @@ -4,7 +4,7 @@ CONFIG+=testcase include(../../../common.pri) -DEFINES += BUILD_QTVERSIT QT_ASCII_CAST_WARNINGS +DEFINES += QT_ASCII_CAST_WARNINGS DEPENDPATH += . INCLUDEPATH += \ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitdocument/ut_qversitdocument.cpp --- a/qtcontactsmobility/tests/auto/qversitdocument/ut_qversitdocument.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitdocument/ut_qversitdocument.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -61,15 +61,16 @@ void UT_QVersitDocument::testConstructor() { - QCOMPARE(QVersitDocument::VCard21, mVersitDocument->versitType()); + QCOMPARE(QVersitDocument::InvalidType, mVersitDocument->type()); } -void UT_QVersitDocument::testVersitType() +void UT_QVersitDocument::testType() { - QCOMPARE(QVersitDocument::VCard21, mVersitDocument->versitType()); + mVersitDocument->setType(QVersitDocument::VCard21Type); + QCOMPARE(QVersitDocument::VCard21Type, mVersitDocument->type()); - mVersitDocument->setVersitType(QVersitDocument::VCard30); - QCOMPARE(QVersitDocument::VCard30, mVersitDocument->versitType()); + mVersitDocument->setType(QVersitDocument::VCard30Type); + QCOMPARE(QVersitDocument::VCard30Type, mVersitDocument->type()); } void UT_QVersitDocument::testAddProperty() @@ -80,7 +81,38 @@ QCOMPARE(1, mVersitDocument->properties().count()); } -void UT_QVersitDocument::testRemoveProperties() +void UT_QVersitDocument::testRemoveProperty() +{ + // Remove an empty property. + QCOMPARE(mVersitDocument->properties().count(), 0); + QVersitProperty property; + mVersitDocument->addProperty(property); + mVersitDocument->removeProperty(property); + QCOMPARE(mVersitDocument->properties().count(), 0); + + // A full property. + property.setName(QLatin1String("TEL")); + property.setGroups(QStringList(QLatin1String("HOME"))); + QMultiHash params; + params.insert(QLatin1String("TYPE"), QLatin1String("HOME")); + property.setParameters(params); + property.setValue(QLatin1String("123")); + mVersitDocument->addProperty(property); + QCOMPARE(mVersitDocument->properties().count(), 1); + QVersitProperty property2; + property2.setName(QLatin1String("TEL")); + // Remove with a partial property fails. + mVersitDocument->removeProperty(property2); + QCOMPARE(mVersitDocument->properties().count(), 1); + property2.setGroups(QStringList(QLatin1String("HOME"))); + property2.setParameters(params); + property2.setValue(QLatin1String("123")); + // Remove with a fully specified property succeeds. + mVersitDocument->removeProperty(property2); + QCOMPARE(mVersitDocument->properties().count(), 0); +} + +void UT_QVersitDocument::testRemoveAllProperties() { QString name(QString::fromAscii("FN")); @@ -118,5 +150,37 @@ QCOMPARE(1, mVersitDocument->properties().count()); } +void UT_QVersitDocument::testEquality() +{ + QVersitDocument document1; + QVersitDocument document2; + QVERIFY(document1.isEmpty()); + QVERIFY(document1 == document2); + QVERIFY(!(document1 != document2)); + QVersitProperty property; + property.setName(QLatin1String("FN")); + property.setValue(QLatin1String("John Citizen")); + document2.addProperty(property); + QVERIFY(!(document1 == document2)); + QVERIFY(document1 != document2); + QVERIFY(!document2.isEmpty()); + + document1.addProperty(property); + QVERIFY(document1 == document2); + QVERIFY(!(document1 != document2)); + + document2.clear(); + QVERIFY(document2.isEmpty()); + + document1.clear(); + QVERIFY(document1 == document2); + QVERIFY(!(document1 != document2)); + + document2.setType(QVersitDocument::VCard21Type); + QVERIFY(!(document1 == document2)); + QVERIFY(document1 != document2); + QVERIFY(!document2.isEmpty()); +} + QTEST_MAIN(UT_QVersitDocument) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitdocument/ut_qversitdocument.h --- a/qtcontactsmobility/tests/auto/qversitdocument/ut_qversitdocument.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitdocument/ut_qversitdocument.h Fri Apr 16 14:53:18 2010 +0300 @@ -61,10 +61,12 @@ void cleanup(); void testConstructor(); - void testVersitType(); + void testType(); void testAddProperty(); - void testRemoveProperties(); - + void testRemoveProperty(); + void testRemoveAllProperties(); + void testEquality(); + private: // data QVersitDocument* mVersitDocument; }; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitproperty/qversitproperty.pro --- a/qtcontactsmobility/tests/auto/qversitproperty/qversitproperty.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitproperty/qversitproperty.pro Fri Apr 16 14:53:18 2010 +0300 @@ -4,7 +4,7 @@ CONFIG+=testcase include(../../../common.pri) -DEFINES += BUILD_QTVERSIT QT_ASCII_CAST_WARNINGS +DEFINES += QT_ASCII_CAST_WARNINGS DEPENDPATH += . INCLUDEPATH += \ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitproperty/ut_qversitproperty.cpp --- a/qtcontactsmobility/tests/auto/qversitproperty/ut_qversitproperty.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitproperty/ut_qversitproperty.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -92,13 +92,13 @@ QString name(QString::fromAscii("type")); QString value1(QString::fromAscii("home")); - mVersitProperty->addParameter(name,value1); + mVersitProperty->insertParameter(name,value1); QMultiHash parameters = mVersitProperty->parameters(); QCOMPARE(parameters.count(), 1); QVERIFY(parameters.contains(typeParameterName,QString::fromAscii("HOME"))); QString value2(QString::fromAscii("voice")); - mVersitProperty->addParameter(name,value2); + mVersitProperty->insertParameter(name,value2); parameters = mVersitProperty->parameters(); QCOMPARE(parameters.count(), 2); QVERIFY(parameters.contains(typeParameterName,QString::fromAscii("HOME"))); @@ -109,12 +109,18 @@ QVERIFY(parameters.contains(typeParameterName,QString::fromAscii("HOME"))); mVersitProperty->removeParameter(name,value2); - QCOMPARE(mVersitProperty->parameters().count(), 0); + QCOMPARE(mVersitProperty->parameters().count(), 0); + + mVersitProperty->insertParameter(name, value1); + mVersitProperty->insertParameter(name, value2); + QCOMPARE(mVersitProperty->parameters().count(), 2); + mVersitProperty->removeParameters(name); + QCOMPARE(mVersitProperty->parameters().count(), 0); } void UT_QVersitProperty::testValue() { - QByteArray value("050484747"); + QString value(QString::fromAscii("050484747")); mVersitProperty->setValue(value); QCOMPARE(mVersitProperty->value(), value); } @@ -125,12 +131,38 @@ QVersitProperty property; property.setName(QString::fromAscii("X-tension")); document.addProperty(property); - mVersitProperty->setEmbeddedDocument(document); + mVersitProperty->setValue(QVariant::fromValue(document)); QList embeddedDocumentProperties = - mVersitProperty->embeddedDocument().properties(); + mVersitProperty->value().properties(); QCOMPARE(embeddedDocumentProperties.count(),1); QCOMPARE(embeddedDocumentProperties[0].name(),QString::fromAscii("X-TENSION")); } +void UT_QVersitProperty::testEquality() +{ + QVersitProperty property1; + QVersitProperty property2; + QVERIFY(property1.isEmpty()); + QVERIFY(property1 == property2); + QVERIFY(!(property1 != property2)); + property2.setName(QLatin1String("FN")); + property2.setValue(QLatin1String("John Citizen")); + QVERIFY(!(property1 == property2)); + QVERIFY(property1 != property2); + QVERIFY(!property2.isEmpty()); + + property1.setName(QLatin1String("FN")); + property1.setValue(QLatin1String("John Citizen")); + QVERIFY(property1 == property2); + QVERIFY(!(property1 != property2)); + + property2.clear(); + QVERIFY(property2.isEmpty()); + + property1.clear(); + QVERIFY(property1 == property2); + QVERIFY(!(property1 != property2)); +} + QTEST_MAIN(UT_QVersitProperty) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitproperty/ut_qversitproperty.h --- a/qtcontactsmobility/tests/auto/qversitproperty/ut_qversitproperty.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitproperty/ut_qversitproperty.h Fri Apr 16 14:53:18 2010 +0300 @@ -68,6 +68,7 @@ void testParameters(); void testValue(); void testEmbeddedDocument(); + void testEquality(); private: QVersitProperty* mVersitProperty; diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitreader/qversitreader.pro --- a/qtcontactsmobility/tests/auto/qversitreader/qversitreader.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitreader/qversitreader.pro Fri Apr 16 14:53:18 2010 +0300 @@ -4,7 +4,7 @@ CONFIG+=testcase include(../../../common.pri) -DEFINES += BUILD_QTVERSIT QT_ASCII_CAST_WARNINGS +DEFINES += QT_ASCII_CAST_WARNINGS DEPENDPATH += . INCLUDEPATH += \ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitreader/ut_qversitreader.cpp --- a/qtcontactsmobility/tests/auto/qversitreader/ut_qversitreader.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitreader/ut_qversitreader.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -42,19 +42,45 @@ #include "ut_qversitreader.h" #include "qversitreader.h" #include "qversitreader_p.h" +#include "versitutils_p.h" #include +#include + +// Copied from tst_qcontactmanager.cpp +// Waits until __expr is true and fails if it doesn't happen within 5s. +#ifndef QTRY_VERIFY +#define QTRY_VERIFY(__expr) \ + do { \ + const int __step = 50; \ + const int __timeout = 5000; \ + if (!(__expr)) { \ + QTest::qWait(0); \ + } \ + for (int __i = 0; __i < __timeout && !(__expr); __i+=__step) { \ + QTest::qWait(__step); \ + } \ + QVERIFY(__expr); \ + } while(0) +#endif + +// This says "NOKIA" in Katakana encoded with UTF-8 +const QByteArray KATAKANA_NOKIA("\xe3\x83\x8e\xe3\x82\xad\xe3\x82\xa2"); QTM_USE_NAMESPACE void UT_QVersitReader::init() { - mReadingDoneCalled = false; - mExpectedDocumentCount = 0; mInputDevice = new QBuffer; mInputDevice->open(QBuffer::ReadWrite); mReader = new QVersitReader; - connect(mReader,SIGNAL(readingDone()),this,SLOT(readingDone()),Qt::DirectConnection); mReaderPrivate = new QVersitReaderPrivate; + mSignalCatcher = new SignalCatcher; + qRegisterMetaType("QVersitReader::State"); + connect(mReader, SIGNAL(stateChanged(QVersitReader::State)), + mSignalCatcher, SLOT(stateChanged(QVersitReader::State))); + connect(mReader, SIGNAL(resultsAvailable()), + mSignalCatcher, SLOT(resultsAvailable())); + mAsciiCodec = QTextCodec::codecForName("ISO 8859-1"); } void UT_QVersitReader::cleanup() @@ -62,12 +88,7 @@ delete mReaderPrivate; delete mReader; delete mInputDevice; -} - -void UT_QVersitReader::readingDone() -{ - QCOMPARE(mReader->result().count(),mExpectedDocumentCount); - mReadingDoneCalled = true; + delete mSignalCatcher; } void UT_QVersitReader::testDevice() @@ -78,38 +99,99 @@ // Device has been set mReader->setDevice(mInputDevice); QVERIFY(mReader->device() == mInputDevice); + + delete mInputDevice; + QVERIFY(mReader->device() == NULL); + + mInputDevice = new QBuffer; + mInputDevice->open(QBuffer::ReadWrite); + + QVERIFY(mReader->device() == NULL); + mReader->setDevice(mInputDevice); + QVERIFY(mReader->device() == mInputDevice); +} + +void UT_QVersitReader::testDefaultCodec() +{ + QVERIFY(mReader->defaultCodec() == QTextCodec::codecForName("UTF-8")); + mReader->setDefaultCodec(QTextCodec::codecForName("UTF-16BE")); + QVERIFY(mReader->defaultCodec() == QTextCodec::codecForName("UTF-16BE")); } void UT_QVersitReader::testReading() { // No I/O device set - QVERIFY(!mReader->readAll()); + QVERIFY(!mReader->startReading()); + QCOMPARE(mReader->error(), QVersitReader::IOError); // Device set, no data mReader->setDevice(mInputDevice); - mInputDevice->open(QBuffer::ReadWrite); - QVERIFY(!mReader->readAll()); - QCOMPARE(mReader->result().count(),0); + mInputDevice->open(QBuffer::ReadOnly); + QVERIFY(mReader->startReading()); + QVERIFY(mReader->waitForFinished()); + QList results(mReader->results()); + QCOMPARE(mReader->state(), QVersitReader::FinishedState); + QCOMPARE(mReader->error(), QVersitReader::NoError); + QCOMPARE(results.count(),0); // Device set, one document const QByteArray& oneDocument = "BEGIN:VCARD\r\nVERSION:2.1\r\nFN:John\r\nEND:VCARD\r\n"; - mInputDevice->write(oneDocument); + mInputDevice->close(); + mInputDevice->setData(oneDocument); + mInputDevice->open(QBuffer::ReadOnly); mInputDevice->seek(0); - QVERIFY(mReader->readAll()); - QCOMPARE(mReader->result().count(),1); + QVERIFY(mReader->startReading()); + QVERIFY(mReader->waitForFinished()); + results = mReader->results(); + QCOMPARE(mReader->state(), QVersitReader::FinishedState); + QCOMPARE(mReader->error(), QVersitReader::NoError); + QCOMPARE(results.count(),1); + + // Wide charset with no byte-order mark + QTextCodec* codec = QTextCodec::codecForName("UTF-16BE"); + const QByteArray& wideDocument = + VersitUtils::encode("BEGIN:VCARD\r\nVERSION:2.1\r\nFN:John\r\nEND:VCARD\r\n", codec); + mInputDevice->close(); + mInputDevice->setData(wideDocument); + mInputDevice->open(QBuffer::ReadOnly); + mInputDevice->seek(0); + mReader->setDefaultCodec(codec); + QVERIFY(mReader->startReading()); + QVERIFY(mReader->waitForFinished()); + results = mReader->results(); + QCOMPARE(mReader->state(), QVersitReader::FinishedState); + QCOMPARE(mReader->error(), QVersitReader::NoError); + QCOMPARE(mReader->results().count(),1); + mReader->setDefaultCodec(NULL); // Two documents const QByteArray& twoDocuments = - "BEGIN:VCARD\r\nFN:Jenny\r\nEND:VCARD\r\nBEGIN:VCARD\r\nFN:Jake\r\nEND:VCARD\r\n"; - delete mInputDevice; - mInputDevice = 0; - mInputDevice = new QBuffer; - mInputDevice->open(QBuffer::ReadWrite); - mInputDevice->write(twoDocuments); + " \r\n BEGIN:VCARD\r\nFN:Jenny\r\nEND:VCARD\r\nBEGIN:VCARD\r\nFN:Jake\r\nEND:VCARD\r\n"; + mInputDevice->close(); + mInputDevice->setData(twoDocuments); + mInputDevice->open(QBuffer::ReadOnly); mInputDevice->seek(0); - QVERIFY(mReader->readAll()); - QCOMPARE(mReader->result().count(),2); + QVERIFY(mReader->startReading()); + QVERIFY(mReader->waitForFinished()); + results = mReader->results(); + QCOMPARE(mReader->state(), QVersitReader::FinishedState); + QCOMPARE(mReader->error(), QVersitReader::NoError); + QCOMPARE(results.count(),2); + + // Erroneous document (missing property name) + mInputDevice->close(); + mInputDevice->setData(QByteArray( + "BEGIN:VCARD\r\nFN:Jenny\r\n;Jenny;;;\r\nEND:VCARD\r\n" + "BEGIN:VCARD\r\nFN:Jake\r\nEND:VCARD\r\n")); + mInputDevice->open(QBuffer::ReadOnly); + mInputDevice->seek(0); + QVERIFY(mReader->startReading()); + QVERIFY(mReader->waitForFinished()); + results = mReader->results(); + QCOMPARE(mReader->state(), QVersitReader::FinishedState); + QCOMPARE(mReader->error(), QVersitReader::ParseError); + QCOMPARE(results.count(), 1); // Valid documents and a grouped document between them const QByteArray& validDocumentsAndGroupedDocument = @@ -122,33 +204,77 @@ BEGIN:VCARD\r\nFN:Jake\r\nEND:VCARD\r\n\ BEGIN:VCARD\r\nFN:James\r\nEND:VCARD\r\n\ BEGIN:VCARD\r\nFN:Jane\r\nEND:VCARD\r\n"; - delete mInputDevice; - mInputDevice = 0; - mInputDevice = new QBuffer; + mInputDevice->close(); + mInputDevice->setData(validDocumentsAndGroupedDocument); mInputDevice->open(QBuffer::ReadWrite); - mInputDevice->write(validDocumentsAndGroupedDocument); mInputDevice->seek(0); - QVERIFY(mReader->readAll()); - QCOMPARE(mReader->result().count(),4); + QVERIFY(mReader->startReading()); + QVERIFY(mReader->waitForFinished()); + results = mReader->results(); + QCOMPARE(mReader->state(), QVersitReader::FinishedState); + // An error is logged because one failed, but the rest are readable. + QCOMPARE(mReader->error(), QVersitReader::ParseError); + QCOMPARE(results.count(),4); + + // Valid documents and a grouped document between them + const QByteArray& validDocumentsAndGroupedDocument2 = +"BEGIN:VCARD\r\nFN:Jenny\r\nEND:VCARD\r\n\ +BEGIN:VCARD\r\n\ +X-GROUPING:pub gang\r\n\ +BEGIN:VCARD\r\nFN:Jeremy\r\nEND:VCARD\r\n\ +BEGIN:VCARD\r\nFN:Jeffery\r\nEND:VCARD\r\n\ +END:VCARD\r\n\ +BEGIN:VCARD\r\nFN:Jake\r\nEND:VCARD\r\n\ +BEGIN:VCARD\r\nFN:James\r\nEND:VCARD\r\n\ +BEGIN:VCARD\r\nFN:Jane\r\nEND:VCARD"; + mInputDevice->close(); + mInputDevice->setData(validDocumentsAndGroupedDocument2); + mInputDevice->open(QBuffer::ReadWrite); + mInputDevice->seek(0); + QVERIFY(mReader->startReading()); + QVERIFY(mReader->waitForFinished()); + results = mReader->results(); + QCOMPARE(mReader->state(), QVersitReader::FinishedState); + // An error is logged because one failed, but the rest are readable. + QCOMPARE(mReader->error(), QVersitReader::ParseError); + QCOMPARE(mReader->results().count(),4); // Asynchronous reading - QVERIFY(!mReadingDoneCalled); - delete mInputDevice; - mInputDevice = 0; - mInputDevice = new QBuffer; + mInputDevice->close(); + mInputDevice->setData(twoDocuments); mInputDevice->open(QBuffer::ReadWrite); - mInputDevice->write(oneDocument); mInputDevice->seek(0); - mExpectedDocumentCount = 1; + mSignalCatcher->mStateChanges.clear(); + mSignalCatcher->mResultsCount = 0; QVERIFY(mReader->startReading()); - delete mReader; // waits for the thread to finish - mReader = 0; - QVERIFY(mReadingDoneCalled); + QTRY_VERIFY(mSignalCatcher->mStateChanges.count() >= 2); + QCOMPARE(mSignalCatcher->mStateChanges.at(0), QVersitReader::ActiveState); + QCOMPARE(mSignalCatcher->mStateChanges.at(1), QVersitReader::FinishedState); + QVERIFY(mSignalCatcher->mResultsCount >= 2); + QCOMPARE(mReader->results().size(), 2); + QCOMPARE(mReader->error(), QVersitReader::NoError); + + // Cancelling + mInputDevice->close(); + mInputDevice->setData(twoDocuments); + mInputDevice->open(QBuffer::ReadOnly); + mInputDevice->seek(0); + mSignalCatcher->mStateChanges.clear(); + mSignalCatcher->mResultsCount = 0; + QVERIFY(mReader->startReading()); + mReader->cancel(); + mReader->waitForFinished(); + QTRY_VERIFY(mSignalCatcher->mStateChanges.count() >= 2); + QCOMPARE(mSignalCatcher->mStateChanges.at(0), QVersitReader::ActiveState); + QVersitReader::State state(mSignalCatcher->mStateChanges.at(1)); + // It's possible that it finishes before it cancels. + QVERIFY(state == QVersitReader::CanceledState + || state == QVersitReader::FinishedState); } void UT_QVersitReader::testResult() { - QCOMPARE(mReader->result().count(),0); + QCOMPARE(mReader->results().count(),0); } void UT_QVersitReader::testSetVersionFromProperty() @@ -162,245 +288,964 @@ // VERSION property with 2.1 property.setName(QString::fromAscii("VERSION")); - property.setValue(QByteArray("2.1")); + property.setValue(QString::fromAscii("2.1")); QVERIFY(mReaderPrivate->setVersionFromProperty(document,property)); - QVERIFY(document.versitType() == QVersitDocument::VCard21); + QVERIFY(document.type() == QVersitDocument::VCard21Type); // VERSION property with 3.0 - property.setValue(QByteArray("3.0")); + property.setValue(QString::fromAscii("3.0")); QVERIFY(mReaderPrivate->setVersionFromProperty(document,property)); - QVERIFY(document.versitType() == QVersitDocument::VCard30); + QVERIFY(document.type() == QVersitDocument::VCard30Type); // VERSION property with a not supported value - property.setValue(QByteArray("4.0")); + property.setValue(QString::fromAscii("4.0")); QVERIFY(!mReaderPrivate->setVersionFromProperty(document,property)); // VERSION property with BASE64 encoded supported value - property.setValue(QByteArray("2.1").toBase64()); - property.addParameter(QString::fromAscii("ENCODING"),QString::fromAscii("BASE64")); + property.setValue(QString::fromAscii(QByteArray("2.1").toBase64())); + property.insertParameter(QString::fromAscii("ENCODING"),QString::fromAscii("BASE64")); QVERIFY(mReaderPrivate->setVersionFromProperty(document,property)); - QVERIFY(document.versitType() == QVersitDocument::VCard21); + QVERIFY(document.type() == QVersitDocument::VCard21Type); // VERSION property with BASE64 encoded not supported value - property.setValue(QByteArray("4.0").toBase64()); + property.setValue(QString::fromAscii(QByteArray("4.0").toBase64())); QVERIFY(!mReaderPrivate->setVersionFromProperty(document,property)); } void UT_QVersitReader::testParseNextVersitPropertyVCard21() { - QVersitDocument::VersitType type = QVersitDocument::VCard21; + QVersitDocument::VersitType type = QVersitDocument::VCard21Type; // Test a valid vCard 2.1 with properties having separate handling: - // AGENT property, some property with parameter ENCODING=QUOTED-PRINTABLE - // and some other property without this parameter + // AGENT property, ENCODING parameters (BASE64 and QUOTED-PRINTABLE) and CHARSET parameter + QTextCodec* codec = QTextCodec::codecForName("UTF-16BE"); QByteArray vCard("Begin:vcard\r\n"); vCard.append("VERSION:2.1\r\n"); vCard.append("FN:John\r\n"); + vCard.append("ORG;CHARSET=UTF-8:"); + vCard.append(KATAKANA_NOKIA); + vCard.append("\r\n"); + // "NOKIA" in Katakana, UTF-8 encoded, then base-64 encoded: + vCard.append("NOTE;ENCODING=BASE64;CHARSET=UTF-8:"); + vCard.append(KATAKANA_NOKIA.toBase64()); + vCard.append("\r\n"); + // The value here is "UXQgaXMgZ3JlYXQh", which is the base64 encoding of "Qt is great!". vCard.append("PHOTO;ENCODING=BASE64: U\t XQgaX MgZ\t3Jl YXQh\r\n\r\n"); + // Again, but without the explicity "ENCODING" parameter + vCard.append("PHOTO;BASE64: U\t XQgaX MgZ\t3Jl YXQh\r\n\r\n"); vCard.append("HOME.Springfield.EMAIL;Encoding=Quoted-Printable:john.citizen=40exam=\r\nple.com\r\n"); + vCard.append("EMAIL;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-16BE:"); + vCard.append(codec->fromUnicode(QLatin1String("john.citizen=40exam=\r\nple.com"))); + vCard.append("\r\n"); vCard.append("AGENT:\r\nBEGIN:VCARD\r\nFN:Jenny\r\nEND:VCARD\r\n\r\n"); vCard.append("End:VCARD\r\n"); + QBuffer buffer(&vCard); + buffer.open(QIODevice::ReadOnly); + LineReader lineReader(&buffer, mAsciiCodec); - QVersitProperty property = mReaderPrivate->parseNextVersitProperty(type,vCard); + QVersitProperty property = mReaderPrivate->parseNextVersitProperty(type, lineReader); QCOMPARE(property.name(),QString::fromAscii("BEGIN")); - QCOMPARE(property.value(),QByteArray("vcard")); - - property = mReaderPrivate->parseNextVersitProperty(type,vCard); - QCOMPARE(property.name(),QString::fromAscii("VERSION")); - QCOMPARE(property.value(),QByteArray("2.1")); + QCOMPARE(property.value(),QString::fromAscii("vcard")); - property = mReaderPrivate->parseNextVersitProperty(type,vCard); + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("VERSION")); + QCOMPARE(property.value(),QString::fromAscii("2.1")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); QCOMPARE(property.name(),QString::fromAscii("FN")); - QCOMPARE(property.value(),QByteArray("John")); + QCOMPARE(property.value(),QString::fromAscii("John")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("ORG")); + QCOMPARE(property.value(),QString::fromUtf8(KATAKANA_NOKIA)); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("NOTE")); + QCOMPARE(property.value(),QString::fromUtf8(KATAKANA_NOKIA)); - property = mReaderPrivate->parseNextVersitProperty(type,vCard); + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); QCOMPARE(property.name(),QString::fromAscii("PHOTO")); - QCOMPARE(1,property.parameters().count()); - // Linear whitespaces (SPACEs and TABs) removed from the value: - QCOMPARE(property.value(),QByteArray("UXQgaXMgZ3JlYXQh")); + // Linear whitespaces (SPACEs and TABs) removed from the value and base64 decoded: + QCOMPARE(property.variantValue().type(), QVariant::ByteArray); + QCOMPARE(property.value(), QByteArray("Qt is great!")); + // Ensure that base-64 encoded strings can be retrieved as strings. + QCOMPARE(property.value(), QLatin1String("Qt is great!")); - property = mReaderPrivate->parseNextVersitProperty(type,vCard); + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("PHOTO")); + QCOMPARE(property.variantValue().type(), QVariant::ByteArray); + QCOMPARE(property.value(), QByteArray("Qt is great!")); + QCOMPARE(property.value(), QLatin1String("Qt is great!")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); QStringList propertyGroup(QString::fromAscii("HOME")); propertyGroup.append(QString::fromAscii("Springfield")); QCOMPARE(property.groups(),propertyGroup); QCOMPARE(property.name(),QString::fromAscii("EMAIL")); QCOMPARE(0,property.parameters().count()); - QCOMPARE(property.value(),QByteArray("john.citizen@example.com")); - - property = mReaderPrivate->parseNextVersitProperty(type,vCard); + QCOMPARE(property.value(),QString::fromAscii("john.citizen@example.com")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("EMAIL")); + // The base64 parameter should be stripped by the reader. + QCOMPARE(property.parameters().count(), 0); + QCOMPARE(property.value(),QString::fromAscii("john.citizen@example.com")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); QCOMPARE(property.name(),QString::fromAscii("AGENT")); - QCOMPARE(property.value(),QByteArray()); - QCOMPARE(property.embeddedDocument().properties().count(),1); + QCOMPARE(property.value(),QString()); + QVERIFY(property.variantValue().userType() == qMetaTypeId()); + QCOMPARE(property.value().properties().count(), 1); - property = mReaderPrivate->parseNextVersitProperty(type,vCard); + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); QCOMPARE(property.name(),QString::fromAscii("END")); - QCOMPARE(property.value(),QByteArray("VCARD")); + QCOMPARE(property.value(),QString::fromAscii("VCARD")); - property = mReaderPrivate->parseNextVersitProperty(type,vCard); + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); QCOMPARE(property.name(),QString()); - QCOMPARE(property.value(),QByteArray()); + QCOMPARE(property.value(),QString()); // Simulate a situation where the document nesting level is exceeded // In practice this would mean a big number of nested AGENT properties mReaderPrivate->mDocumentNestingLevel = 20; QByteArray agentProperty("AGENT:BEGIN:VCARD\r\nN:Jenny\r\nEND:VCARD\r\n\r\n"); - property = mReaderPrivate->parseNextVersitProperty(type,agentProperty); - QCOMPARE(property.name(),QString()); - QCOMPARE(property.embeddedDocument().properties().count(),0); - QCOMPARE(property.value(),QByteArray()); + buffer.close(); + buffer.setData(agentProperty); + buffer.open(QIODevice::ReadOnly); + LineReader agentLineReader(&buffer, mAsciiCodec); + + property = mReaderPrivate->parseNextVersitProperty(type, agentLineReader); + QVERIFY(property.isEmpty()); } void UT_QVersitReader::testParseNextVersitPropertyVCard30() { - QVersitDocument::VersitType type = QVersitDocument::VCard30; + QVersitDocument::VersitType type = QVersitDocument::VCard30Type; // Test a valid vCard 3.0 with properties having separate handling: // AGENT property and some other property QByteArray vCard("Begin:vcard\r\n"); vCard.append("VERSION:3.0\r\n"); vCard.append("FN:John\r\n"); + vCard.append("ORG;CHARSET=UTF-8:"); + vCard.append(KATAKANA_NOKIA); + vCard.append("\r\n"); + // "NOKIA" in Katakana, UTF-8 encoded, then base-64 encoded: + vCard.append("NOTE;ENCODING=B;CHARSET=UTF-8:"); + vCard.append(KATAKANA_NOKIA.toBase64()); + vCard.append("\r\n"); vCard.append("TEL;TYPE=PREF;HOME:123\r\n"); + // The value here is "UXQgaXMgZ3JlYXQh", which is the base64 encoding of "Qt is great!". vCard.append("PHOTO;ENCODING=B:UXQgaXMgZ3JlYXQh\r\n"); + // Again, but without the explicity "ENCODING" parameter + vCard.append("PHOTO;B:UXQgaXMgZ3JlYXQh\r\n"); vCard.append("EMAIL:john.citizen@example.com\r\n"); vCard.append("AGENT:BEGIN:VCARD\\nFN:Jenny\\nEND:VCARD\\n\r\n"); vCard.append("End:VCARD\r\n"); + QBuffer buffer(&vCard); + buffer.open(QIODevice::ReadOnly); + LineReader lineReader(&buffer, mAsciiCodec); - QVersitProperty property = mReaderPrivate->parseNextVersitProperty(type,vCard); + QVersitProperty property = mReaderPrivate->parseNextVersitProperty(type, lineReader); QCOMPARE(property.name(),QString::fromAscii("BEGIN")); - QCOMPARE(property.value(),QByteArray("vcard")); + QCOMPARE(property.value(),QString::fromAscii("vcard")); - property = mReaderPrivate->parseNextVersitProperty(type,vCard); + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); QCOMPARE(property.name(),QString::fromAscii("VERSION")); - QCOMPARE(property.value(),QByteArray("3.0")); + QCOMPARE(property.value(),QString::fromAscii("3.0")); - property = mReaderPrivate->parseNextVersitProperty(type,vCard); + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); QCOMPARE(property.name(),QString::fromAscii("FN")); - QCOMPARE(property.value(),QByteArray("John")); + QCOMPARE(property.value(),QString::fromAscii("John")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("ORG")); + QCOMPARE(property.value(),QString::fromUtf8(KATAKANA_NOKIA)); - property = mReaderPrivate->parseNextVersitProperty(type,vCard); + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("NOTE")); + QCOMPARE(property.value(),QString::fromUtf8(KATAKANA_NOKIA)); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); QCOMPARE(property.name(),QString::fromAscii("TEL")); - QCOMPARE(property.value(),QByteArray("123")); + QCOMPARE(property.value(),QString::fromAscii("123")); QCOMPARE(property.parameters().count(), 2); - property = mReaderPrivate->parseNextVersitProperty(type,vCard); + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); QCOMPARE(property.name(),QString::fromAscii("PHOTO")); - QCOMPARE(1,property.parameters().count()); - QCOMPARE(property.value(),QByteArray("UXQgaXMgZ3JlYXQh")); + QCOMPARE(property.variantValue().type(), QVariant::ByteArray); + QCOMPARE(property.value(), QByteArray("Qt is great!")); + // Ensure that base-64 encoded strings can be retrieved as strings. + QCOMPARE(property.value(), QLatin1String("Qt is great!")); - property = mReaderPrivate->parseNextVersitProperty(type,vCard); + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("PHOTO")); + QCOMPARE(property.variantValue().type(), QVariant::ByteArray); + QCOMPARE(property.value(), QByteArray("Qt is great!")); + QCOMPARE(property.value(), QLatin1String("Qt is great!")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); QCOMPARE(property.name(),QString::fromAscii("EMAIL")); QCOMPARE(0,property.parameters().count()); - QCOMPARE(property.value(),QByteArray("john.citizen@example.com")); + QCOMPARE(property.value(),QString::fromAscii("john.citizen@example.com")); - property = mReaderPrivate->parseNextVersitProperty(type,vCard); + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); QCOMPARE(property.name(),QString::fromAscii("AGENT")); - QCOMPARE(property.value(),QByteArray()); - QCOMPARE(property.embeddedDocument().properties().count(),1); + QVERIFY(property.variantValue().userType() == qMetaTypeId()); + QCOMPARE(property.value().properties().count(), 1); - property = mReaderPrivate->parseNextVersitProperty(type,vCard); + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); QCOMPARE(property.name(),QString::fromAscii("END")); - QCOMPARE(property.value(),QByteArray("VCARD")); + QCOMPARE(property.value(),QString::fromAscii("VCARD")); - property = mReaderPrivate->parseNextVersitProperty(type,vCard); + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); QCOMPARE(property.name(),QString()); - QCOMPARE(property.value(),QByteArray()); + QCOMPARE(property.value(),QString()); // Simulate a situation where the document nesting level is exceeded // In practice this would mean a big number of nested AGENT properties mReaderPrivate->mDocumentNestingLevel = 20; QByteArray agentProperty("AGENT:BEGIN\\:VCARD\\nFN\\:Jenny\\nEND\\:VCARD\\n\r\n"); - property = mReaderPrivate->parseNextVersitProperty(type,agentProperty); - QCOMPARE(property.name(),QString()); - QCOMPARE(property.embeddedDocument().properties().count(),0); - QCOMPARE(property.value(),QByteArray()); + buffer.close(); + buffer.setData(agentProperty); + buffer.open(QIODevice::ReadOnly); + LineReader agentLineReader(&buffer, mAsciiCodec); + + property = mReaderPrivate->parseNextVersitProperty(type, agentLineReader); + QVERIFY(property.isEmpty()); } void UT_QVersitReader::testParseVersitDocument() { - // Valid vCard 2.1 - const char validCard21[] = -"BEGIN:VCARD\r\n\ -VERSION:2.1\r\n\ -FN:John\r\n\ -AGENT:BEGIN:VCARD\r\nN:Jenny\r\nEND:VCARD\r\n\r\n\ -EMAIL;ENCODING=QUOTED-PRINTABLE:john.citizen=40exam=\r\nple.com\r\n\ -END:VCARD\r\n"; - QByteArray vCard(validCard21); + QFETCH(QByteArray, vCard); + QFETCH(bool, expectedSuccess); + QFETCH(int, expectedProperties); + + QBuffer buffer(&vCard); + buffer.open(QIODevice::ReadOnly); + LineReader lineReader(&buffer, QTextCodec::codecForName("UTF-8")); + QVersitDocument document; - QVERIFY(mReaderPrivate->parseVersitDocument(vCard,document)); - QCOMPARE(document.properties().count(),3); - QCOMPARE(mReaderPrivate->mDocumentNestingLevel,0); + QCOMPARE(mReaderPrivate->parseVersitDocument(lineReader, document), expectedSuccess); + QCOMPARE(document.properties().count(), expectedProperties); + QCOMPARE(mReaderPrivate->mDocumentNestingLevel, 0); +} + +void UT_QVersitReader::testParseVersitDocument_data() +{ + QTest::addColumn("vCard"); + QTest::addColumn("expectedSuccess"); + QTest::addColumn("expectedProperties"); + + QTest::newRow("Basic vCard 2.1") + << QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:2.1\r\n" + "FN:John\r\n" + "END:VCARD\r\n") + << true + << 1; - // Valid vCard 3.0 - const char validCard30[] = -"BEGIN:VCARD\r\n\ -VERSION:3.0\r\n\ -FN:John\r\n\ -AGENT:BEGIN\\:VCARD\\nN\\:Jenny\\nEND\\:VCARD\\n\r\n\ -EMAIL:john.citizen@example.com\r\n\ -END:VCARD\r\n"; - vCard = validCard30; - document = QVersitDocument(); - QVERIFY(mReaderPrivate->parseVersitDocument(vCard,document)); - QCOMPARE(document.properties().count(),3); - QCOMPARE(mReaderPrivate->mDocumentNestingLevel,0); + QTest::newRow("vCard 2.1 with Agent") + << QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:2.1\r\n" + "FN:John\r\n" + "AGENT:BEGIN:VCARD\r\nN:Jenny\r\nEND:VCARD\r\n\r\n" + "EMAIL;ENCODING=QUOTED-PRINTABLE:john.citizen=40exam=\r\nple.com\r\n" + "END:VCARD\r\n") + << true + << 3; + + QTest::newRow("vCard 3.0 with Agent") + << QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "FN:John\r\n" + "AGENT:BEGIN\\:VCARD\\nN\\:Jenny\\nEND\\:VCARD\\n\r\n" + "EMAIL:john.citizen@example.com\r\n" + "END:VCARD\r\n") + << true + << 3; - // No BEGIN found - const char beginMissing[] = -"VCARD\r\n\ -VERSION:2.1\r\n\ -FN:Nobody\r\n\ -END:VCARD\r\n"; - vCard = beginMissing; - document = QVersitDocument(); - QVERIFY(mReaderPrivate->parseVersitDocument(vCard,document)); - QCOMPARE(document.properties().count(),0); - QCOMPARE(mReaderPrivate->mDocumentNestingLevel,0); + QTest::newRow("No BEGIN found") + << QByteArray( + "VCARD\r\n" + "VERSION:2.1\r\n" + "FN:Nobody\r\n" + "END:VCARD\r\n") + << false + << 0; + + QTest::newRow("Wrong card type") + << QByteArray( + "BEGIN:VCAL\r\n" + "END:VCAL\r\n") + << false + << 0; - // Wrong card type - const char wrongType[] = -"BEGIN:VCAL\r\n\ -END:VCAL\r\n"; - vCard = wrongType; - document = QVersitDocument(); - QVERIFY(mReaderPrivate->parseVersitDocument(vCard,document)); - QCOMPARE(document.properties().count(),0); - QCOMPARE(mReaderPrivate->mDocumentNestingLevel,0); - - // Wrong version - const char wrongVersion[] = -"BEGIN:VCARD\r\n\ -VERSION:4.0\r\n\ -FN:Nobody\r\n\ -END:VCARD\r\n"; - vCard = wrongVersion; - document = QVersitDocument(); - QVERIFY(!mReaderPrivate->parseVersitDocument(vCard,document)); - QCOMPARE(document.properties().count(),0); - QCOMPARE(mReaderPrivate->mDocumentNestingLevel,0); + QTest::newRow("Wrong version") + << QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "FN:Nobody\r\n" + "END:VCARD\r\n") + << false + << 0; + + QTest::newRow("No trailing crlf") + << QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:2.1\r\n" + "FN:Nobody\r\n" + "END:VCARD") + << true + << 1; + + QTest::newRow("No end") + << QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:2.1\r\n" + "FN:Nobody\r\n") + << false + << 0; + + QTest::newRow("Grouped vCards are not supported. The whole vCard will be discarded.") + << QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:2.1\r\n" + "X-EXAMPLES:Family vCard\r\n" + "BEGIN:VCARD\r\n" + "VERSION:2.1\r\n" + "N:Citizen;John\r\n" + "TEL;CELL:1111\r\n" + "EMAIL;ENCODING=QUOTED-PRINTABLE:john.citizen=40example.com\r\n" + "END:VCARD\r\n" + "BEGIN:VCARD\r\n" + "VERSION:2.1\r\n" + "N:Citizen;Jenny\r\n" + "TEL;CELL:7777\r\n" + "END:VCARD\r\n" + "END:VCARD") + << false + << 0; +} + +void UT_QVersitReader::testDecodeQuotedPrintable() +{ + // Soft line breaks + QString encoded(QLatin1String("This=\r\n is =\r\none line.")); + QString decoded(QLatin1String("This is one line.")); + mReaderPrivate->decodeQuotedPrintable(encoded); + QCOMPARE(encoded, decoded); + + // Characters recommended to be encoded according to RFC 1521: + encoded = QLatin1String("To be decoded: =0A=0D=21=22=23=24=3D=40=5B=5C=5D=5E=60=7B=7C=7D=7E"); + decoded = QLatin1String("To be decoded: \n\r!\"#$=@[\\]^`{|}~"); + mReaderPrivate->decodeQuotedPrintable(encoded); + QCOMPARE(encoded, decoded); + + // Other random characters encoded. + // Some implementation may encode these too, as it is allowed. + encoded = QLatin1String("=45=6E=63=6F=64=65=64 =64=61=74=61"); + decoded = QLatin1String("Encoded data"); + mReaderPrivate->decodeQuotedPrintable(encoded); + QCOMPARE(encoded, decoded); +} +void UT_QVersitReader::testParamName() +{ + // Empty value + QByteArray param; + QCOMPARE(mReaderPrivate->paramName(param, mAsciiCodec),QString()); + + // Only value present + param = "WORK"; + QCOMPARE(mReaderPrivate->paramName(param, mAsciiCodec), + QString::fromAscii("TYPE")); + + // The below tests intentionally use the misspelling TIPE to avoid the default behaviour of + // returning TYPE when the name can't be parsed. + // Both name and value, spaces after the name + param = "TIPE \t =WORK"; + QCOMPARE(mReaderPrivate->paramName(param, mAsciiCodec), + QString::fromAscii("TIPE")); + + // Both name and value, no spaces after the name + param = "TIPE=WORK"; + QCOMPARE(mReaderPrivate->paramName(param, mAsciiCodec), + QString::fromAscii("TIPE")); + + // Test wide character support. + QTextCodec* codec = QTextCodec::codecForName("UTF-16BE"); + param = codec->fromUnicode(QString::fromAscii("TIPE=WORK")); + QCOMPARE(mReaderPrivate->paramName(param, codec), + QString::fromAscii("TIPE")); + +} + +void UT_QVersitReader::testParamValue() +{ + // Empty value + QByteArray param; + QCOMPARE(mReaderPrivate->paramValue(param, mAsciiCodec),QString()); + + // Only value present + param = "WORK"; + QCOMPARE(mReaderPrivate->paramValue(param, mAsciiCodec), + QString::fromAscii("WORK")); + + // Name and equals sign, but no value + param = "TYPE="; + QCOMPARE(mReaderPrivate->paramValue(param, mAsciiCodec),QString()); + + // Name and equals sign, but value has only spaces + param = "TYPE= \t "; + QCOMPARE(mReaderPrivate->paramValue(param, mAsciiCodec),QString()); + + // Both name and value, spaces before the value + param = "TYPE= \t WORK"; + QCOMPARE(mReaderPrivate->paramValue(param, mAsciiCodec), + QString::fromAscii("WORK")); + + // Both name and value, no spaces before the value + param = "ENCODING=QUOTED-PRINTABLE"; + QCOMPARE(mReaderPrivate->paramValue(param, mAsciiCodec), + QString::fromAscii("QUOTED-PRINTABLE")); + + // Test wide character support. + QTextCodec* codec = QTextCodec::codecForName("UTF-16BE"); + param = codec->fromUnicode(QString::fromAscii("TYPE=WORK")); + QCOMPARE(mReaderPrivate->paramValue(param, codec), + QString::fromAscii("WORK")); +} + +void UT_QVersitReader::testExtractPart() +{ + QByteArray originalStr; + + // Negative starting position + QCOMPARE(mReaderPrivate->extractPart(originalStr,-1,1), QByteArray()); + + // Empty original string + QCOMPARE(mReaderPrivate->extractPart(originalStr,0,1), QByteArray()); + + // Trimmed substring empty + originalStr = " \t \t"; + QCOMPARE(mReaderPrivate->extractPart(originalStr,0,4), QByteArray()); + + // The given substring length is greater than the original string length + originalStr = "ENCODING=7BIT"; + QCOMPARE(mReaderPrivate->extractPart(originalStr,0,100), originalStr); + + // Non-empty substring, from the beginning + originalStr = " TYPE=WORK ; X-PARAM=X-VALUE; ENCODING=8BIT"; + QCOMPARE(mReaderPrivate->extractPart(originalStr,0,11), + QByteArray("TYPE=WORK")); + + // Non-empty substring, from the middle + QCOMPARE(mReaderPrivate->extractPart(originalStr,12,16), + QByteArray("X-PARAM=X-VALUE")); + + // Non-empty substring, from the middle to the end + QCOMPARE(mReaderPrivate->extractPart(originalStr,29), + QByteArray("ENCODING=8BIT")); +} + +void UT_QVersitReader::testExtractParts() +{ + QList parts; + + // Empty value + QByteArray text; + parts = mReaderPrivate->extractParts(text,";", mAsciiCodec); + QVERIFY(parts.isEmpty()); + + // Only separator + text = ";"; + parts = mReaderPrivate->extractParts(text,";", mAsciiCodec); + QVERIFY(parts.isEmpty()); + + // One part + text = "part"; + parts = mReaderPrivate->extractParts(text,";", mAsciiCodec); + QCOMPARE(parts.count(),1); + QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("part")); + + // Separator in the beginning, one part + text = ";part"; + parts = mReaderPrivate->extractParts(text,";", mAsciiCodec); + QCOMPARE(parts.count(),1); + QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("part")); + + // Separator in the end, one part + text = "part;"; + parts = mReaderPrivate->extractParts(text,";", mAsciiCodec); + QCOMPARE(parts.count(),1); + QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("part")); + + // One part that contains escaped separator + text = "part\\;"; + parts = mReaderPrivate->extractParts(text,";", mAsciiCodec); + QCOMPARE(parts.count(),1); + QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("part\\;")); + + // Two parts + text = "part1;part2"; + parts = mReaderPrivate->extractParts(text,";", mAsciiCodec); + QCOMPARE(parts.count(),2); + QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("part1")); + QCOMPARE(QString::fromAscii(parts[1]),QString::fromAscii("part2")); + + // Two parts that contain escaped separators + text = "pa\\;rt1;par\\;t2"; + parts = mReaderPrivate->extractParts(text,";", mAsciiCodec); + QCOMPARE(parts.count(),2); + QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("pa\\;rt1")); + QCOMPARE(QString::fromAscii(parts[1]),QString::fromAscii("par\\;t2")); + + // Test wide character support + QTextCodec* codec = QTextCodec::codecForName("UTF-16BE"); + text = codec->fromUnicode(QString::fromAscii("part1;part2")); + parts = mReaderPrivate->extractParts(text,";", codec); + QCOMPARE(parts.count(),2); + QCOMPARE(codec->toUnicode(parts[0]),QString::fromAscii("part1")); + QCOMPARE(codec->toUnicode(parts[1]),QString::fromAscii("part2")); +} + +void UT_QVersitReader::testExtractPropertyGroupsAndName() +{ + QPair groupsAndName; + + // Empty string + VersitCursor cursor(QByteArray(" ")); + groupsAndName = mReaderPrivate->extractPropertyGroupsAndName(cursor, mAsciiCodec); + QCOMPARE(groupsAndName.first.count(),0); + QCOMPARE(groupsAndName.second,QString()); + + // No value -> returns empty string and no groups + QByteArray property("TEL"); + cursor.setData(property); + cursor.selection = property.size(); + groupsAndName = mReaderPrivate->extractPropertyGroupsAndName(cursor, mAsciiCodec); + QCOMPARE(groupsAndName.first.count(),0); + QCOMPARE(groupsAndName.second,QString()); + + // Simple name and value + property = "TEL:123"; + cursor.setData(property); + cursor.selection = property.size(); + groupsAndName = mReaderPrivate->extractPropertyGroupsAndName(cursor, mAsciiCodec); + QCOMPARE(groupsAndName.first.count(),0); + QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); + + // One whitespace before colon + property = "TEL :123"; + cursor.setData(property); + cursor.selection = property.size(); + groupsAndName = mReaderPrivate->extractPropertyGroupsAndName(cursor, mAsciiCodec); + QCOMPARE(groupsAndName.first.count(),0); + QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); + + // Several whitespaces before colon + property = "TEL \t :123"; + cursor.setData(property); + cursor.selection = property.size(); + groupsAndName = mReaderPrivate->extractPropertyGroupsAndName(cursor, mAsciiCodec); + QCOMPARE(groupsAndName.first.count(),0); + QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); + + // Name contains a group + property = "group1.TEL:1234"; + cursor.setData(property); + cursor.selection = property.size(); + groupsAndName = mReaderPrivate->extractPropertyGroupsAndName(cursor, mAsciiCodec); + QCOMPARE(groupsAndName.first.count(),1); + QCOMPARE(groupsAndName.first.takeFirst(),QString::fromAscii("group1")); + QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); + + // Name contains more than one group + property = "group1.group2.TEL:12345"; + cursor.setData(property); + cursor.selection = property.size(); + groupsAndName = mReaderPrivate->extractPropertyGroupsAndName(cursor, mAsciiCodec); + QCOMPARE(groupsAndName.first.count(),2); + QCOMPARE(groupsAndName.first.takeFirst(),QString::fromAscii("group1")); + QCOMPARE(groupsAndName.first.takeFirst(),QString::fromAscii("group2")); + QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); + QCOMPARE(cursor.position, 17); + + // Property contains one parameter + property = "TEL;WORK:123"; + cursor.setData(property); + cursor.selection = property.size(); + groupsAndName = mReaderPrivate->extractPropertyGroupsAndName(cursor, mAsciiCodec); + QCOMPARE(groupsAndName.first.count(),0); + QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); + + // Property contains several parameters + property = "EMAIL;INTERNET;ENCODING=QUOTED-PRINTABLE:user=40ovi.com"; + cursor.setData(property); + cursor.selection = property.size(); + groupsAndName = mReaderPrivate->extractPropertyGroupsAndName(cursor, mAsciiCodec); + QCOMPARE(groupsAndName.first.count(),0); + QCOMPARE(groupsAndName.second,QString::fromAscii("EMAIL")); + + // Name contains an escaped semicolon + property = "X-proper\\;ty:value"; + cursor.setData(property); + cursor.selection = property.size(); + groupsAndName = mReaderPrivate->extractPropertyGroupsAndName(cursor, mAsciiCodec); + QCOMPARE(groupsAndName.first.count(),0); + QCOMPARE(groupsAndName.second,QString::fromAscii("X-proper\\;ty")); + + // Test wide character support + QTextCodec* codec = QTextCodec::codecForName("UTF-16BE"); + property = codec->fromUnicode(QString::fromAscii("group1.group2.TEL;WORK:123")); + cursor.setData(property); + cursor.selection = property.size(); + groupsAndName = mReaderPrivate->extractPropertyGroupsAndName(cursor, codec); + QCOMPARE(groupsAndName.first.count(),2); + QCOMPARE(groupsAndName.first.takeFirst(),QString::fromAscii("group1")); + QCOMPARE(groupsAndName.first.takeFirst(),QString::fromAscii("group2")); + QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); + QCOMPARE(cursor.position, 36); // 2 bytes * 17 characters + 2 byte BOM. + +} - // Grouped vCards are not supported. The whole vCard will be discarded. - const char groupedCard[] = -"BEGIN:VCARD\r\n\ -VERSION:2.1\r\n\ -X-EXAMPLES:Family vCard\r\n\ -BEGIN:VCARD\r\n\ -VERSION:2.1\r\n\ -N:Citizen;John\r\n\ -TEL;CELL:1111\r\n\ -EMAIL;ENCODING=QUOTED-PRINTABLE:john.citizen=40example.com\r\n\ -END:VCARD\r\n\ -BEGIN:VCARD\r\n\ -VERSION:2.1\r\n\ -N:Citizen;Jenny\r\n\ -TEL;CELL:7777\r\n\ -END:VCARD\r\n\ -END:VCARD"; - vCard = groupedCard; - document = QVersitDocument(); - QVERIFY(!mReaderPrivate->parseVersitDocument(vCard,document)); - QCOMPARE(mReaderPrivate->mDocumentNestingLevel, 0); - QCOMPARE(mReaderPrivate->mVersitDocuments.count(), 0); +void UT_QVersitReader::testExtractVCard21PropertyParams() +{ + // No parameters + VersitCursor cursor(QByteArray(":123")); + cursor.setSelection(cursor.data.size()); + QCOMPARE(mReaderPrivate->extractVCard21PropertyParams(cursor, mAsciiCodec).count(), 0); + + // "Empty" parameter + cursor.setData(QByteArray(";:123")); + cursor.setSelection(cursor.data.size()); + QCOMPARE(mReaderPrivate->extractVCard21PropertyParams(cursor, mAsciiCodec).count(), 0); + + // Semicolon found, but no value for the property + cursor.setData(QByteArray(";TYPE=X-TYPE")); + cursor.setSelection(cursor.data.size()); + QCOMPARE(mReaderPrivate->extractVCard21PropertyParams(cursor, mAsciiCodec).count(), 0); + + // The property name contains an escaped semicolon, no parameters + cursor.setData(QByteArray(":value")); + cursor.setSelection(cursor.data.size()); + QCOMPARE(mReaderPrivate->extractVCard21PropertyParams(cursor, mAsciiCodec).count(), 0); + + // The property value contains a semicolon, no parameters + cursor.setData(QByteArray(":va;lue")); + cursor.setSelection(cursor.data.size()); + QCOMPARE(mReaderPrivate->extractVCard21PropertyParams(cursor, mAsciiCodec).count(), 0); + + // One parameter + cursor.setData(QByteArray(";HOME:123")); + cursor.setSelection(cursor.data.size()); + QMultiHash params = mReaderPrivate->extractVCard21PropertyParams(cursor, + mAsciiCodec); + QCOMPARE(1, params.count()); + QCOMPARE(1, params.values(QString::fromAscii("TYPE")).count()); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[0],QString::fromAscii("HOME")); + + // Two parameters of the same type + cursor.setData(QByteArray(";HOME;VOICE:123")); + cursor.setSelection(cursor.data.size()); + params = mReaderPrivate->extractVCard21PropertyParams(cursor, mAsciiCodec); + QCOMPARE(2, params.count()); + QCOMPARE(2, params.values(QString::fromAscii("TYPE")).count()); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[0],QString::fromAscii("HOME")); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[1],QString::fromAscii("VOICE")); + + // Two parameters, several empty parameters (extra semicolons) + cursor.setData(QByteArray(";;;;HOME;;;;;VOICE;;;:123")); + cursor.setSelection(cursor.data.size()); + params = mReaderPrivate->extractVCard21PropertyParams(cursor, mAsciiCodec); + QCOMPARE(2, params.count()); + QCOMPARE(2, params.values(QString::fromAscii("TYPE")).count()); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[0],QString::fromAscii("HOME")); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[1],QString::fromAscii("VOICE")); + + // Two parameters with different types + cursor.setData(QByteArray(";INTERNET;ENCODING=QUOTED-PRINTABLE:user=40ovi.com")); + cursor.setSelection(cursor.data.size()); + params.clear(); + params = mReaderPrivate->extractVCard21PropertyParams(cursor, mAsciiCodec); + QCOMPARE(2, params.count()); + QList typeParams = params.values(QString::fromAscii("TYPE")); + QCOMPARE(1, typeParams.count()); + QCOMPARE(typeParams[0],QString::fromAscii("INTERNET")); + QList encodingParams = params.values(QString::fromAscii("ENCODING")); + QCOMPARE(1, encodingParams.count()); + QCOMPARE(encodingParams[0],QString::fromAscii("QUOTED-PRINTABLE")); + + // Test wide character support. + QTextCodec* codec = QTextCodec::codecForName("UTF-16BE"); + QByteArray data = VersitUtils::encode(";HOME;CHARSET=UTF-16:123", codec); + cursor.setData(data); + cursor.setSelection(cursor.data.size()); + params = mReaderPrivate->extractVCard21PropertyParams(cursor, codec); + QCOMPARE(2, params.count()); + typeParams = params.values(QString::fromAscii("TYPE")); + QCOMPARE(1, typeParams.count()); + QCOMPARE(typeParams[0],QString::fromAscii("HOME")); + encodingParams = params.values(QString::fromAscii("CHARSET")); + QCOMPARE(1, encodingParams.count()); + QCOMPARE(encodingParams[0],QString::fromAscii("UTF-16")); +} + +void UT_QVersitReader::testExtractVCard30PropertyParams() +{ + // No parameters + VersitCursor cursor(QByteArray(":123")); + cursor.setSelection(cursor.data.size()); + QCOMPARE(mReaderPrivate->extractVCard30PropertyParams(cursor, mAsciiCodec).count(), 0); + + // One parameter + cursor.setData(QByteArray(";TYPE=HOME:123")); + cursor.setSelection(cursor.data.size()); + QMultiHash params = mReaderPrivate->extractVCard30PropertyParams(cursor, + mAsciiCodec); + QCOMPARE(params.count(), 1); + QCOMPARE(params.values(QString::fromAscii("TYPE")).count(), 1); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[0], QString::fromAscii("HOME")); + + // One parameter with an escaped semicolon + cursor.setData(QByteArray(";para\\;meter:value")); + cursor.setSelection(cursor.data.size()); + params = mReaderPrivate->extractVCard30PropertyParams(cursor, mAsciiCodec); + QCOMPARE(params.count(), 1); + QCOMPARE(params.values(QString::fromAscii("TYPE")).count(), 1); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[0], QString::fromAscii("para;meter")); + + // One parameter with and escaped comma in the name and the value + cursor.setData(QByteArray(";X-PA\\,RAM=VAL\\,UE:123")); + cursor.setSelection(cursor.data.size()); + params = mReaderPrivate->extractVCard30PropertyParams(cursor, mAsciiCodec); + QCOMPARE(params.count(), 1); + QCOMPARE(params.values(QString::fromAscii("X-PA,RAM")).count(), 1); + QCOMPARE(params.values(QString::fromAscii("X-PA,RAM"))[0], QString::fromAscii("VAL,UE")); + + // Two parameters of the same type + cursor.setData(QByteArray(";TYPE=HOME,VOICE:123")); + cursor.setSelection(cursor.data.size()); + params = mReaderPrivate->extractVCard30PropertyParams(cursor, mAsciiCodec); + QCOMPARE(params.count(), 2); + QCOMPARE(params.values(QString::fromAscii("TYPE")).count(), 2); + QVERIFY(params.values(QString::fromAscii("TYPE")).contains(QString::fromAscii("HOME"))); + QVERIFY(params.values(QString::fromAscii("TYPE")).contains(QString::fromAscii("VOICE"))); + + // Two parameters of the same type in separate name-values + cursor.setData(QByteArray(";TYPE=HOME;TYPE=VOICE:123")); + cursor.setSelection(cursor.data.size()); + params = mReaderPrivate->extractVCard30PropertyParams(cursor, mAsciiCodec); + QCOMPARE(params.count(), 2); + QCOMPARE(params.values(QString::fromAscii("TYPE")).count(), 2); + QVERIFY(params.values(QString::fromAscii("TYPE")).contains(QString::fromAscii("HOME"))); + QVERIFY(params.values(QString::fromAscii("TYPE")).contains(QString::fromAscii("VOICE"))); + + // Three parameters of the same type + cursor.setData(QByteArray(";TYPE=PREF,HOME,VOICE:123")); + cursor.setSelection(cursor.data.size()); + params = mReaderPrivate->extractVCard30PropertyParams(cursor, mAsciiCodec); + QCOMPARE(params.count(), 3); + QCOMPARE(params.values(QString::fromAscii("TYPE")).count(), 3); + QVERIFY(params.values(QString::fromAscii("TYPE")).contains(QString::fromAscii("PREF"))); + QVERIFY(params.values(QString::fromAscii("TYPE")).contains(QString::fromAscii("HOME"))); + QVERIFY(params.values(QString::fromAscii("TYPE")).contains(QString::fromAscii("VOICE"))); + + // Two parameters with different types + cursor.setData(QByteArray(";TYPE=HOME;X-PARAM=X-VALUE:Home Street 1")); + cursor.setSelection(cursor.data.size()); + params.clear(); + params = mReaderPrivate->extractVCard30PropertyParams(cursor, mAsciiCodec); + QCOMPARE(params.count(), 2); + QList typeParams = params.values(QString::fromAscii("TYPE")); + QCOMPARE(typeParams.count(), 1); + QCOMPARE(typeParams[0],QString::fromAscii("HOME")); + QList encodingParams = params.values(QString::fromAscii("X-PARAM")); + QCOMPARE(encodingParams.count(), 1); + QCOMPARE(encodingParams[0],QString::fromAscii("X-VALUE")); + + // Test wide character support. + QTextCodec* codec = QTextCodec::codecForName("UTF-16BE"); + QByteArray data = VersitUtils::encode(";TIPE=HOME,VOICE;CHARSET=UTF-16:123", codec); + cursor.setData(data); + cursor.setSelection(cursor.data.size()); + params = mReaderPrivate->extractVCard30PropertyParams(cursor, codec); + QCOMPARE(params.count(), 3); + typeParams = params.values(QString::fromAscii("TIPE")); + QCOMPARE(params.values(QString::fromAscii("TIPE")).count(), 2); + QVERIFY(params.values(QString::fromAscii("TIPE")).contains(QString::fromAscii("HOME"))); + QVERIFY(params.values(QString::fromAscii("TIPE")).contains(QString::fromAscii("VOICE"))); + encodingParams = params.values(QString::fromAscii("CHARSET")); + QCOMPARE(1, encodingParams.count()); + QCOMPARE(encodingParams[0],QString::fromAscii("UTF-16")); +} + +void UT_QVersitReader::testExtractParams() +{ + VersitCursor cursor; + QByteArray data = ":123"; + cursor.setData(data); + cursor.setPosition(0); + cursor.setSelection(cursor.data.size()); + QList params = mReaderPrivate->extractParams(cursor, mAsciiCodec); + QCOMPARE(params.size(), 0); + QCOMPARE(cursor.position, 1); + + data = "a;b:123"; + cursor.setData(data); + cursor.setPosition(0); + cursor.setSelection(cursor.data.size()); + params = mReaderPrivate->extractParams(cursor, mAsciiCodec); + QCOMPARE(params.size(), 2); + QCOMPARE(cursor.position, 4); + QCOMPARE(params.at(0), QByteArray("a")); + QCOMPARE(params.at(1), QByteArray("b")); + + QTextCodec* codec = QTextCodec::codecForName("UTF-16BE"); + data = VersitUtils::encode(":123", codec); + cursor.setData(data); + cursor.setPosition(0); + cursor.setSelection(cursor.data.size()); + params = mReaderPrivate->extractParams(cursor, codec); + QCOMPARE(params.size(), 0); + QCOMPARE(cursor.position, 2); + + data = VersitUtils::encode("a;b:123", codec); + cursor.setData(data); + cursor.setPosition(0); + cursor.setSelection(cursor.data.size()); + params = mReaderPrivate->extractParams(cursor, codec); + QCOMPARE(params.size(), 2); + QCOMPARE(cursor.position, 8); + +} + +Q_DECLARE_METATYPE(QList) + +void UT_QVersitReader::testReadLine() +{ + QFETCH(QByteArray, codecName); + QFETCH(QString, data); + QFETCH(QList, expectedLines); + + QTextCodec* codec = QTextCodec::codecForName(codecName); + QTextEncoder* encoder = codec->makeEncoder(); + encoder->fromUnicode(QString()); + + QByteArray bytes(encoder->fromUnicode(data)); + + mInputDevice->close(); + mInputDevice->setData(bytes); + mInputDevice->open(QIODevice::ReadWrite); + + LineReader lineReader(mInputDevice, codec, 10); + + // Check that all expected lines are read. + foreach (QString expectedLine, expectedLines) { + QByteArray expectedBytes(encoder->fromUnicode(expectedLine)); + QVERIFY(!lineReader.atEnd()); + VersitCursor line = lineReader.readLine(); + QVERIFY(line.data.indexOf(expectedBytes) == line.position); + QCOMPARE(line.selection - line.position, expectedBytes.length()); + } + // And that there are no more lines + VersitCursor line = lineReader.readLine(); + QCOMPARE(line.selection, line.position); + QVERIFY(lineReader.atEnd()); + + delete encoder; +} + +void UT_QVersitReader::testReadLine_data() +{ + // Note: for this test, we set mLineReader to read 10 bytes at a time. Lines of multiples of + // 10 bytes are hence border cases. + QTest::addColumn("codecName"); + QTest::addColumn("data"); + QTest::addColumn >("expectedLines"); + + QList codecNames; + codecNames << "UTF-8" << "UTF-16"; + + foreach (QByteArray codecName, codecNames) { + QTest::newRow("empty " + codecName) + << codecName + << "" + << QList(); + + QTest::newRow("one line " + codecName) + << codecName + << "line" + << (QList() << QLatin1String("line")); + + QTest::newRow("one ten-byte line " + codecName) + << codecName + << "tenletters" + << (QList() << QLatin1String("tenletters")); + + QTest::newRow("one long line " + codecName) + << codecName + << "one line longer than ten characters" + << (QList() << QLatin1String("one line longer than ten characters")); + + QTest::newRow("one terminated line " + codecName) + << codecName + << "one line longer than ten characters\r\n" + << (QList() << QLatin1String("one line longer than ten characters")); + + QTest::newRow("two lines " + codecName) + << codecName + << "two\r\nlines" + << (QList() << QLatin1String("two") << QLatin1String("lines")); + + QTest::newRow("two terminated lines " + codecName) + << codecName + << "two\r\nlines\r\n" + << (QList() << QLatin1String("two") << QLatin1String("lines")); + + QTest::newRow("two long lines " + codecName) + << codecName + << "one line longer than ten characters\r\nanother line\r\n" + << (QList() << QLatin1String("one line longer than ten characters") << QLatin1String("another line")); + + QTest::newRow("two full lines " + codecName) + << codecName + << "tenletters\r\n8letters\r\n" + << (QList() << QLatin1String("tenletters") << QLatin1String("8letters")); + + QTest::newRow("a nine-byte line " + codecName) + << codecName + << "9 letters\r\nanother line\r\n" + << (QList() << QLatin1String("9 letters") << QLatin1String("another line")); + + QTest::newRow("a blank line " + codecName) + << codecName + << "one\r\n\r\ntwo\r\n" + << (QList() << QLatin1String("one") << QLatin1String("two")); + + QTest::newRow("folded lines " + codecName) + << codecName + << "folded\r\n line\r\nsecond line\r\n" + << (QList() << QLatin1String("folded line") << QLatin1String("second line")); + + QTest::newRow("multiply folded lines " + codecName) + << codecName + << "fo\r\n lded\r\n line\r\nseco\r\n\tnd l\r\n ine\r\n" + << (QList() << QLatin1String("folded line") << QLatin1String("second line")); + + QTest::newRow("fold hidden after a chunk " + codecName) + << codecName + << "8letters\r\n on one line\r\n" + << (QList() << QLatin1String("8letters on one line")); + + QTest::newRow("three mac lines " + codecName) + << codecName + << "one\rtwo\rthree\r" + << (QList() << QLatin1String("one") << QLatin1String("two") << QLatin1String("three")); + } } QTEST_MAIN(UT_QVersitReader) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitreader/ut_qversitreader.h --- a/qtcontactsmobility/tests/auto/qversitreader/ut_qversitreader.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitreader/ut_qversitreader.h Fri Apr 16 14:53:18 2010 +0300 @@ -45,42 +45,71 @@ #include #include #include +#include "qversitreader.h" QTM_BEGIN_NAMESPACE -class QVersitReader; class QVersitReaderPrivate; +class LineReader; QTM_END_NAMESPACE QTM_USE_NAMESPACE +// Poor man's QSignalSpy because I couldn't get QSignalSpy to work with the user type QVR::State. +class SignalCatcher : public QObject +{ +Q_OBJECT +public: + SignalCatcher() : mResultsCount(0) {} +public slots: + void stateChanged(QVersitReader::State state) { + mStateChanges.append(state); + } + void resultsAvailable() { + mResultsCount += 1; + } + +public: + QList mStateChanges; + int mResultsCount; +}; + class UT_QVersitReader : public QObject { Q_OBJECT -public slots: - void readingDone(); - private slots: // Tests void init(); void cleanup(); - + void testDevice(); + void testDefaultCodec(); void testReading(); void testResult(); void testSetVersionFromProperty(); void testParseNextVersitPropertyVCard21(); void testParseNextVersitPropertyVCard30(); - void testParseVersitDocument(); + void testParseVersitDocument(); + void testParseVersitDocument_data(); + void testDecodeQuotedPrintable(); + void testParamName(); + void testParamValue(); + void testExtractPart(); + void testExtractParts(); + void testExtractPropertyGroupsAndName(); + void testExtractVCard21PropertyParams(); + void testExtractVCard30PropertyParams(); + void testExtractParams(); + void testReadLine(); + void testReadLine_data(); private: // Data - QVersitReader* mReader; QVersitReaderPrivate* mReaderPrivate; QBuffer* mInputDevice; - int mExpectedDocumentCount; - bool mReadingDoneCalled; + QTextCodec* mAsciiCodec; + SignalCatcher* mSignalCatcher; }; #endif // UT_VERSITREADER_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitutils/qversitutils.pro --- a/qtcontactsmobility/tests/auto/qversitutils/qversitutils.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitutils/qversitutils.pro Fri Apr 16 14:53:18 2010 +0300 @@ -4,7 +4,7 @@ CONFIG+=testcase include(../../../common.pri) -DEFINES += BUILD_QTVERSIT QT_ASCII_CAST_WARNINGS +DEFINES += QT_ASCII_CAST_WARNINGS DEPENDPATH += . INCLUDEPATH += \ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitutils/ut_versitutils.cpp --- a/qtcontactsmobility/tests/auto/qversitutils/ut_versitutils.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitutils/ut_versitutils.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -42,703 +42,92 @@ #include "ut_versitutils.h" #include #include +#include #include "versitutils_p.h" QTM_USE_NAMESPACE -void UT_VersitUtils::testCountLeadingWhiteSpaces() -{ - // Empty string - QByteArray text; - QCOMPARE(VersitUtils::countLeadingWhiteSpaces(text), 0); - - // Only whitespaces - text = " \r \n\t \t"; - QCOMPARE(VersitUtils::countLeadingWhiteSpaces(text), 7); - - // One whitespace with other characters - text = " text"; - QCOMPARE(VersitUtils::countLeadingWhiteSpaces(text), 1); - - // Several whitespaces with other characters - text = "\t\r\n\r\n text"; - QCOMPARE(VersitUtils::countLeadingWhiteSpaces(text), 6); - - // No whitespaces - text = "text"; - QCOMPARE(VersitUtils::countLeadingWhiteSpaces(text), 0); - - // Start counting whitespaces in the middle of the string - text = "something \r\n\r\n"; - QCOMPARE(VersitUtils::countLeadingWhiteSpaces(text,9), 5); -} - -void UT_VersitUtils::testFindHardLineBreakInQuotedPrintable() -{ - // Empty string - QCOMPARE(-1, VersitUtils::findHardLineBreakInQuotedPrintable(QByteArray())); - - // No line breaks - QCOMPARE(-1, VersitUtils::findHardLineBreakInQuotedPrintable(QByteArray("just text"))); - - // No soft line breaks - QCOMPARE(4, VersitUtils::findHardLineBreakInQuotedPrintable(QByteArray("text\r\n"))); - - // One soft line break - QCOMPARE(7, VersitUtils::findHardLineBreakInQuotedPrintable(QByteArray("te=\r\nxt\r\n"))); - - // Two soft line breaks - QCOMPARE(10, VersitUtils::findHardLineBreakInQuotedPrintable(QByteArray("t=\r\ne=\r\nxt\r\n"))); -} - -void UT_VersitUtils::testParamName() -{ - // Empty value - QByteArray param; - QCOMPARE(VersitUtils::paramName(param),QByteArray()); - - // Only value present - param = "WORK"; - QCOMPARE(QString::fromAscii(VersitUtils::paramName(param)), - QString::fromAscii("TYPE")); - - // Both name and value, spaces after the name - param = "TYPE \t =WORK"; - QCOMPARE(QString::fromAscii(VersitUtils::paramName(param)), - QString::fromAscii("TYPE")); - - // Both name and value, no spaces after the name - param = "TYPE=WORK"; - QCOMPARE(QString::fromAscii(VersitUtils::paramName(param)), - QString::fromAscii("TYPE")); -} - -void UT_VersitUtils::testParamValue() -{ - // Empty value - QByteArray param; - QCOMPARE(VersitUtils::paramValue(param),QByteArray()); - - // Only value present - param = "WORK"; - QCOMPARE(QString::fromAscii(VersitUtils::paramValue(param)), - QString::fromAscii("WORK")); - - // Name and equals sign, but no value - param = "TYPE="; - QCOMPARE(VersitUtils::paramValue(param),QByteArray()); - - // Name and equals sign, but value has only spaces - param = "TYPE= \t "; - QCOMPARE(VersitUtils::paramValue(param),QByteArray()); - - // Both name and value, spaces before the value - param = "TYPE= \t WORK"; - QCOMPARE(QString::fromAscii(VersitUtils::paramValue(param)), - QString::fromAscii("WORK")); - - // Both name and value, no spaces before the value - param = "ENCODING=QUOTED-PRINTABLE"; - QCOMPARE(QString::fromAscii(VersitUtils::paramValue(param)), - QString::fromAscii("QUOTED-PRINTABLE")); -} - -void UT_VersitUtils::testExtractPart() -{ - QByteArray originalStr; - - // Negative starting position - QCOMPARE(VersitUtils::extractPart(originalStr,-1,1), QByteArray()); - - // Empty original string - QCOMPARE(VersitUtils::extractPart(originalStr,0,1), QByteArray()); - - // Trimmed substring empty - originalStr = " \t \t"; - QCOMPARE(VersitUtils::extractPart(originalStr,0,4), QByteArray()); - - // The given substring length is greater than the original string length - originalStr = "ENCODING=7BIT"; - QCOMPARE(VersitUtils::extractPart(originalStr,0,100), originalStr); - - // Non-empty substring, from the beginning - originalStr = " TYPE=WORK ; X-PARAM=X-VALUE; ENCODING=8BIT"; - QCOMPARE(VersitUtils::extractPart(originalStr,0,11), - QByteArray("TYPE=WORK")); - - // Non-empty substring, from the middle - QCOMPARE(VersitUtils::extractPart(originalStr,12,16), - QByteArray("X-PARAM=X-VALUE")); - - // Non-empty substring, from the middle to the end - QCOMPARE(VersitUtils::extractPart(originalStr,29), - QByteArray("ENCODING=8BIT")); -} - -void UT_VersitUtils::testExtractParts() -{ - QList parts; - - // Empty value - QByteArray text; - parts = VersitUtils::extractParts(text,';'); - QVERIFY(parts.isEmpty()); - - // Only separator - text = ";"; - parts = VersitUtils::extractParts(text,';'); - QVERIFY(parts.isEmpty()); - - // One part - text = "part"; - parts = VersitUtils::extractParts(text,';'); - QCOMPARE(parts.count(),1); - QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("part")); - - // Separator in the beginning, one part - text = ";part"; - parts = VersitUtils::extractParts(text,';'); - QCOMPARE(parts.count(),1); - QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("part")); - - // Separator in the end, one part - text = "part;"; - parts = VersitUtils::extractParts(text,';'); - QCOMPARE(parts.count(),1); - QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("part")); - - // One part that contains escaped separator - text = "part\\;"; - parts = VersitUtils::extractParts(text,';'); - QCOMPARE(parts.count(),1); - QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("part\\;")); - - // Two parts - text = "part1;part2"; - parts = VersitUtils::extractParts(text,';'); - QCOMPARE(parts.count(),2); - QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("part1")); - QCOMPARE(QString::fromAscii(parts[1]),QString::fromAscii("part2")); - - // Two parts that contain escaped separators - text = "pa\\;rt1;par\\;t2"; - parts = VersitUtils::extractParts(text,';'); - QCOMPARE(parts.count(),2); - QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("pa\\;rt1")); - QCOMPARE(QString::fromAscii(parts[1]),QString::fromAscii("par\\;t2")); -} - -void UT_VersitUtils::testFold() -{ - int maxCharsForLine = 3; - - // Empty string - QByteArray unfolded; - QByteArray folded; - QCOMPARE( - QString::fromAscii(VersitUtils::fold(unfolded,maxCharsForLine)), - QString::fromAscii(folded)); - - // String that needs one folding - unfolded = "12345"; - folded = "123\r\n 45"; - QCOMPARE( - QString::fromAscii(VersitUtils::fold(unfolded,maxCharsForLine)), - QString::fromAscii(folded)); - - // String that needs multiple foldings - unfolded = "1234567"; - folded = "123\r\n 45\r\n 67"; - QCOMPARE( - QString::fromAscii(VersitUtils::fold(unfolded,maxCharsForLine)), - QString::fromAscii(folded)); - - // String that has line breaks and needs foldings - unfolded = "12\r\n3456789"; - folded = "12\r\n345\r\n 67\r\n 89"; - QCOMPARE( - QString::fromAscii(VersitUtils::fold(unfolded,maxCharsForLine)), - QString::fromAscii(folded)); - - // Line break in the beginning of the string - unfolded = "\r\n12345"; - folded = "\r\n123\r\n 45"; - QCOMPARE( - QString::fromAscii(VersitUtils::fold(unfolded,maxCharsForLine)), - QString::fromAscii(folded)); - - // Input contains the amount of characters after which a folding - // would normally be added -> Folding not added - unfolded = "123"; - folded = "123"; - QCOMPARE( - QString::fromAscii(VersitUtils::fold(unfolded,maxCharsForLine)), - QString::fromAscii(folded)); - - // CR in the end of the string -> Folding not added - unfolded = "123\r"; - folded = "123\r"; - QCOMPARE( - QString::fromAscii(VersitUtils::fold(unfolded,maxCharsForLine)), - QString::fromAscii(folded)); - - // CRLF in the end of the string -> Folding not added - unfolded = "123\r\n"; - folded = "123\r\n"; - QCOMPARE( - QString::fromAscii(VersitUtils::fold(unfolded,maxCharsForLine)), - QString::fromAscii(folded)); -} - -void UT_VersitUtils::testUnfold() -{ - // No folding - QCOMPARE(QByteArray("no folding\r\n"), QByteArray("no folding\r\n")); - - // Single space - QByteArray folded("unfol\r\n ded\r\n"); - QByteArray unfolded("unfolded\r\n"); - QCOMPARE(unfolded, VersitUtils::unfold(folded)); - - // Multiple spaces - folded = "unfol\r\n ded\r\n"; - unfolded = "unfol ded\r\n"; - QCOMPARE(unfolded, VersitUtils::unfold(folded)); - - // Single tab - folded = "unfol\r\n\tded\r\n"; - unfolded = "unfolded\r\n"; - QCOMPARE(unfolded, VersitUtils::unfold(folded)); - - // Multiple tabs - folded = "unfol\r\n\t\tded\r\n"; - unfolded = "unfol\tded\r\n"; - QCOMPARE(unfolded, VersitUtils::unfold(folded)); - - // One space and one tab - folded = "unfol\r\n \tded\r\n"; - QCOMPARE(unfolded, VersitUtils::unfold(folded)); - - // One tab and one space - folded = "unfol\r\n\t ded\r\n"; - unfolded = "unfol ded\r\n"; - QCOMPARE(unfolded, VersitUtils::unfold(folded)); - - // Multiple spaces and tabs - folded = "unfol\r\n\t \t \t\t ded\r\n"; - unfolded = "unfol \t \t\t ded\r\n"; - QCOMPARE(unfolded, VersitUtils::unfold(folded)); - - // Two foldings - folded = "un\r\n\tfol\r\n ded\r\n"; - unfolded = "unfolded\r\n"; - QCOMPARE(unfolded, VersitUtils::unfold(folded)); - - // Three foldings - folded = "un\r\n fol\r\n\tde\r\n d\r\n"; - unfolded = "unfolded\r\n"; - QCOMPARE(unfolded, VersitUtils::unfold(folded)); - - // Two actual lines containing foldings - folded = "li\r\n\tne1\r\nl\r\n ine2\r\n"; - unfolded = "line1\r\nline2\r\n"; - QCOMPARE(unfolded, VersitUtils::unfold(folded)); -} - -void UT_VersitUtils::testQuotedPrintableEncode() -{ - QByteArray encodedBytes; - - // Nothing to encode - QByteArray nothingToEncode("nothing to encode"); - QVERIFY(!VersitUtils::quotedPrintableEncode(nothingToEncode)); - - // Special characters - QByteArray inputOutput("\n"); - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=0A")); - inputOutput = "\r"; - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=0D")); - inputOutput = "!"; - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=21")); - inputOutput = "\""; - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=22")); - inputOutput = "#"; - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=23")); - inputOutput = "$"; - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=24")); - inputOutput = "="; - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=3D")); - inputOutput = "@"; - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=40")); - inputOutput = "["; - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=5B")); - inputOutput = "\\"; - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=5C")); - inputOutput = "]"; - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=5D")); - inputOutput = "^"; - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=5E")); - inputOutput = "`"; - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=60")); - inputOutput = "{"; - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=7B")); - inputOutput = "|"; - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=7C")); - inputOutput = "}"; - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=7D")); - inputOutput = "~"; - QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); - QCOMPARE(inputOutput, QByteArray("=7E")); -} - -void UT_VersitUtils::testDecodeQuotedPrintable() -{ - // Soft line breaks - QByteArray encoded("This=\r\n is =\r\none line."); - QByteArray decoded("This is one line."); - VersitUtils::decodeQuotedPrintable(encoded); - QCOMPARE(encoded, decoded); - - // Characters recommended to be encoded according to RFC 1521: - encoded = "To be decoded: =0A=0D=21=22=23=24=3D=40=5B=5C=5D=5E=60=7B=7C=7D=7E"; - decoded = "To be decoded: \n\r!\"#$=@[\\]^`{|}~"; - VersitUtils::decodeQuotedPrintable(encoded); - QCOMPARE(encoded, decoded); - - // Other random characters encoded. - // Some implementation may encode these too, as it is allowed. - encoded = "=45=6E=63=6F=64=65=64 =64=61=74=61"; - decoded = "Encoded data"; - VersitUtils::decodeQuotedPrintable(encoded); - QCOMPARE(encoded, decoded); -} - void UT_VersitUtils::testBackSlashEscape() { // Empty string - QByteArray input; - QVERIFY(!VersitUtils::backSlashEscape(input)); - QCOMPARE(input,QByteArray()); + QString input; + VersitUtils::backSlashEscape(input); + QCOMPARE(input,QString()); // Nothing to escape in the string - input = "Nothing to escape"; - QVERIFY(!VersitUtils::backSlashEscape(input)); - QCOMPARE(QString::fromAscii(input),QString::fromAscii("Nothing to escape")); + input = QString::fromAscii("Nothing to escape"); + VersitUtils::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("Nothing to escape")); // Line break in the beginning - input = "\r\n input"; - QVERIFY(VersitUtils::backSlashEscape(input)); - QCOMPARE(QString::fromAscii(input),QString::fromAscii("\\n input")); + input = QString::fromAscii("\r\n input"); + VersitUtils::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("\\n input")); // Line break in the end - input = "input\r\n"; - QVERIFY(VersitUtils::backSlashEscape(input)); - QCOMPARE(QString::fromAscii(input),QString::fromAscii("input\\n")); + input = QString::fromAscii("input\r\n"); + VersitUtils::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("input\\n")); // Semicolon in the beginning - input = ";input"; - QVERIFY(VersitUtils::backSlashEscape(input)); - QCOMPARE(QString::fromAscii(input),QString::fromAscii("\\;input")); + input = QString::fromAscii(";input"); + VersitUtils::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("\\;input")); // Semicolon in the end - input = "input;"; - QVERIFY(VersitUtils::backSlashEscape(input)); - QCOMPARE(QString::fromAscii(input),QString::fromAscii("input\\;")); + input = QString::fromAscii("input;"); + VersitUtils::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("input\\;")); // Comma in the beginning - input = ",input"; - QVERIFY(VersitUtils::backSlashEscape(input)); - QCOMPARE(QString::fromAscii(input),QString::fromAscii("\\,input")); + input = QString::fromAscii(",input"); + VersitUtils::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("\\,input")); // Comma in the end - input = "input,"; - QVERIFY(VersitUtils::backSlashEscape(input)); - QCOMPARE(QString::fromAscii(input),QString::fromAscii("input\\,")); + input = QString::fromAscii("input,"); + VersitUtils::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("input\\,")); // Backslash in the beginning - input = "\\input"; - QVERIFY(VersitUtils::backSlashEscape(input)); - QCOMPARE(QString::fromAscii(input),QString::fromAscii("\\\\input")); + input = QString::fromAscii("\\input"); + VersitUtils::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("\\\\input")); // Backslash in the end - input = "input\\"; - QVERIFY(VersitUtils::backSlashEscape(input)); - QCOMPARE(QString::fromAscii(input),QString::fromAscii("input\\\\")); + input = QString::fromAscii("input\\"); + VersitUtils::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("input\\\\")); // Line break, semicolon, backslash and comma in the middle of the string - input = "Escape these \r\n ; , \\ "; - QVERIFY(VersitUtils::backSlashEscape(input)); - QCOMPARE(QString::fromAscii(input), - QString::fromAscii("Escape these \\n \\; \\, \\\\ ")); - - // Escaping not done for an already escaped string - QVERIFY(!VersitUtils::backSlashEscape(input)); - QCOMPARE(QString::fromAscii(input), - QString::fromAscii("Escape these \\n \\; \\, \\\\ ")); - - // Don't escape special characters within quotes - input = "Quoted \"\r\n ; , \\ \""; - QVERIFY(!VersitUtils::backSlashEscape(input)); - QCOMPARE(QString::fromAscii(input), - QString::fromAscii("Quoted \"\r\n ; , \\ \"")); + input = QString::fromAscii("Escape these \r\n ; , \\ "); + VersitUtils::backSlashEscape(input); + QCOMPARE(input, QString::fromAscii("Escape these \\n \\; \\, \\\\ ")); } void UT_VersitUtils::testRemoveBackSlashEscaping() { // Empty string - QByteArray input; + QString input; VersitUtils::removeBackSlashEscaping(input); - QCOMPARE(input,QByteArray()); + QCOMPARE(input,QString()); // Nothing to escape in the string - input = "Nothing to escape"; + input = QString::fromAscii("Nothing to escape"); VersitUtils::removeBackSlashEscaping(input); - QCOMPARE(QString::fromAscii(input),QString::fromAscii("Nothing to escape")); + QCOMPARE(input,QString::fromAscii("Nothing to escape")); // Line break, semicolon, backslash and comma in the string - input = "These should be unescaped \\n \\N \\; \\, \\\\"; + input = QString::fromAscii("These should be unescaped \\n \\N \\; \\, \\\\"); VersitUtils::removeBackSlashEscaping(input); - QCOMPARE(QString::fromAscii(input), - QString::fromAscii("These should be unescaped \r\n \r\n ; , \\")); + QCOMPARE(input, QString::fromAscii("These should be unescaped \r\n \r\n ; , \\")); // Don't remove escaping within quotes - input = "Quoted \"\\n \\N \\; \\,\""; - QVERIFY(!VersitUtils::backSlashEscape(input)); - QCOMPARE(QString::fromAscii(input), - QString::fromAscii("Quoted \"\\n \\N \\; \\,\"")); -} - -void UT_VersitUtils::testExtractPropertyGroupsAndName() -{ - QPair groupsAndName; - - // Empty string - groupsAndName = VersitUtils::extractPropertyGroupsAndName(QByteArray()); - QCOMPARE(groupsAndName.first.count(),0); - QCOMPARE(groupsAndName.second,QString()); - - // No value -> returns empty string and no groups - QByteArray property("TEL"); - groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); - QCOMPARE(groupsAndName.first.count(),0); - QCOMPARE(groupsAndName.second,QString()); - - // Simple name and value - property = "TEL:123"; - groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); - QCOMPARE(groupsAndName.first.count(),0); - QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); - - // One whitespace before colon - property = "TEL :123"; - groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); - QCOMPARE(groupsAndName.first.count(),0); - QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); - - // Several whitespaces before colon - property = "TEL \t :123"; - groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); - QCOMPARE(groupsAndName.first.count(),0); - QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); - - // Name contains a group - property = "group1.TEL:1234"; - groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); - QCOMPARE(groupsAndName.first.count(),1); - QCOMPARE(groupsAndName.first.takeFirst(),QString::fromAscii("group1")); - QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); - - // Name contains more than one group - property = "group1.group2.TEL:12345"; - groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); - QCOMPARE(groupsAndName.first.count(),2); - QCOMPARE(groupsAndName.first.takeFirst(),QString::fromAscii("group1")); - QCOMPARE(groupsAndName.first.takeFirst(),QString::fromAscii("group2")); - QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); - - // Property contains one parameter - property = "TEL;WORK:123"; - groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); - QCOMPARE(groupsAndName.first.count(),0); - QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); - - // Property contains several parameters - property = "EMAIL;INTERNET;ENCODING=QUOTED-PRINTABLE:user=40ovi.com"; - groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); - QCOMPARE(groupsAndName.first.count(),0); - QCOMPARE(groupsAndName.second,QString::fromAscii("EMAIL")); - - // Name contains an escaped semicolon - property = "X-proper\\;ty:value"; - groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); - QCOMPARE(groupsAndName.first.count(),0); - QCOMPARE(groupsAndName.second,QString::fromAscii("X-proper\\;ty")); -} - -void UT_VersitUtils::testExtractPropertyValue() -{ - // Empty string - QCOMPARE(VersitUtils::extractPropertyValue(QByteArray()), QByteArray()); - - // No colon found - QCOMPARE(VersitUtils::extractPropertyValue(QByteArray("TEL")), QByteArray()); - - // Colon in the end - QCOMPARE(VersitUtils::extractPropertyValue(QByteArray("TEL:")), QByteArray()); - - // Simple name and value - QByteArray property("TEL:123"); - QCOMPARE(VersitUtils::extractPropertyValue(property), QByteArray("123")); - - // Simple name and the value contains colons - property = "X-property:12:3"; - QCOMPARE(VersitUtils::extractPropertyValue(property), QByteArray("12:3")); -} - -void UT_VersitUtils::testExtractVCard21PropertyParams() -{ - // No parameters - QByteArray property("TEL:123"); - QCOMPARE(VersitUtils::extractVCard21PropertyParams(property).count(), 0); - - // "Empty" parameter - property ="TEL;:123"; - QCOMPARE(VersitUtils::extractVCard21PropertyParams(property).count(), 0); - - // Semicolon found, but no value for the property - property = "X-property;TYPE=X-TYPE"; - QCOMPARE(VersitUtils::extractVCard21PropertyParams(property).count(), 0); - - // The property name contains an escaped semicolon, no parameters - property = "X-proper\\;ty:value"; - QCOMPARE(VersitUtils::extractVCard21PropertyParams(property).count(), 0); - - // The property value contains a semicolon, no parameters - property = "X-property:va;lue"; - QCOMPARE(VersitUtils::extractVCard21PropertyParams(property).count(), 0); - - // One parameter - property = "TEL;HOME:123"; - QMultiHash params = - VersitUtils::extractVCard21PropertyParams(property); - QCOMPARE(1, params.count()); - QCOMPARE(1, params.values(QString::fromAscii("TYPE")).count()); - QCOMPARE(params.values(QString::fromAscii("TYPE"))[0],QString::fromAscii("HOME")); - - // Two parameters of the same type - property = "TEL;HOME;VOICE:123"; - params = VersitUtils::extractVCard21PropertyParams(property); - QCOMPARE(2, params.count()); - QCOMPARE(2, params.values(QString::fromAscii("TYPE")).count()); - QCOMPARE(params.values(QString::fromAscii("TYPE"))[0],QString::fromAscii("HOME")); - QCOMPARE(params.values(QString::fromAscii("TYPE"))[1],QString::fromAscii("VOICE")); - - // Two parameters, several empty parameters (extra semicolons) - property = "TEL;;;;HOME;;;;;VOICE;;;:123"; - params = VersitUtils::extractVCard21PropertyParams(property); - QCOMPARE(2, params.count()); - QCOMPARE(2, params.values(QString::fromAscii("TYPE")).count()); - QCOMPARE(params.values(QString::fromAscii("TYPE"))[0],QString::fromAscii("HOME")); - QCOMPARE(params.values(QString::fromAscii("TYPE"))[1],QString::fromAscii("VOICE")); - - // Two parameters with different types - property = "EMAIL;INTERNET;ENCODING=QUOTED-PRINTABLE:user=40ovi.com"; - params.clear(); - params = VersitUtils::extractVCard21PropertyParams(property); - QCOMPARE(2, params.count()); - QList typeParams = params.values(QString::fromAscii("TYPE")); - QCOMPARE(1, typeParams.count()); - QCOMPARE(typeParams[0],QString::fromAscii("INTERNET")); - QList encodingParams = params.values(QString::fromAscii("ENCODING")); - QCOMPARE(1, encodingParams.count()); - QCOMPARE(encodingParams[0],QString::fromAscii("QUOTED-PRINTABLE")); -} - -void UT_VersitUtils::testExtractVCard30PropertyParams() -{ - // No parameters - QByteArray property("TEL:123"); - QCOMPARE(VersitUtils::extractVCard30PropertyParams(property).count(), 0); - - // One parameter - property = "TEL;TYPE=HOME:123"; - QMultiHash params = - VersitUtils::extractVCard30PropertyParams(property); - QCOMPARE(params.count(), 1); - QCOMPARE(params.values(QString::fromAscii("TYPE")).count(), 1); - QCOMPARE(params.values(QString::fromAscii("TYPE"))[0], - QString::fromAscii("HOME")); - - // One parameter with an escaped semicolon - property = "X-property;para\\;meter:value"; - params = VersitUtils::extractVCard30PropertyParams(property); - QCOMPARE(params.count(), 1); - QCOMPARE(params.values(QString::fromAscii("TYPE")).count(), 1); - QCOMPARE(params.values(QString::fromAscii("TYPE"))[0], - QString::fromAscii("para;meter")); - - // One parameter with and escaped comma in the name and the value - property = "TEL;X-PA\\,RAM=VAL\\,UE:123"; - params = VersitUtils::extractVCard30PropertyParams(property); - QCOMPARE(params.count(), 1); - QCOMPARE(params.values(QString::fromAscii("X-PA,RAM")).count(), 1); - QCOMPARE(params.values(QString::fromAscii("X-PA,RAM"))[0], - QString::fromAscii("VAL,UE")); - - // Two parameters of the same type - property = "TEL;TYPE=HOME,VOICE:123"; - params = VersitUtils::extractVCard30PropertyParams(property); - QCOMPARE(params.count(), 2); - QCOMPARE(params.values(QString::fromAscii("TYPE")).count(), 2); - QCOMPARE(params.values(QString::fromAscii("TYPE"))[0],QString::fromAscii("HOME")); - QCOMPARE(params.values(QString::fromAscii("TYPE"))[1],QString::fromAscii("VOICE")); - - // Two parameters of the same type in separate name-values - property = "TEL;TYPE=HOME;TYPE=VOICE:123"; - params = VersitUtils::extractVCard30PropertyParams(property); - QCOMPARE(params.count(), 2); - QCOMPARE(params.values(QString::fromAscii("TYPE")).count(), 2); - QCOMPARE(params.values(QString::fromAscii("TYPE"))[0],QString::fromAscii("HOME")); - QCOMPARE(params.values(QString::fromAscii("TYPE"))[1],QString::fromAscii("VOICE")); - - // Three parameters of the same type - property = "TEL;TYPE=PREF,HOME,VOICE:123"; - params = VersitUtils::extractVCard30PropertyParams(property); - QCOMPARE(params.count(), 3); - QCOMPARE(params.values(QString::fromAscii("TYPE")).count(), 3); - QCOMPARE(params.values(QString::fromAscii("TYPE"))[0],QString::fromAscii("PREF")); - QCOMPARE(params.values(QString::fromAscii("TYPE"))[1],QString::fromAscii("HOME")); - QCOMPARE(params.values(QString::fromAscii("TYPE"))[2],QString::fromAscii("VOICE")); - - // Two parameters with different types - property = "ADR;TYPE=HOME;X-PARAM=X-VALUE:Home Street 1"; - params.clear(); - params = VersitUtils::extractVCard30PropertyParams(property); - QCOMPARE(params.count(), 2); - QList typeParams = params.values(QString::fromAscii("TYPE")); - QCOMPARE(typeParams.count(), 1); - QCOMPARE(typeParams[0],QString::fromAscii("HOME")); - QList encodingParams = params.values(QString::fromAscii("X-PARAM")); - QCOMPARE(encodingParams.count(), 1); - QCOMPARE(encodingParams[0],QString::fromAscii("X-VALUE")); + input = QString::fromAscii("\"Quoted \\n \\N \\; \\,\""); + VersitUtils::removeBackSlashEscaping(input); + QCOMPARE(input, QString::fromAscii("\"Quoted \\n \\N \\; \\,\"")); } QTEST_MAIN(UT_VersitUtils) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitutils/ut_versitutils.h --- a/qtcontactsmobility/tests/auto/qversitutils/ut_versitutils.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitutils/ut_versitutils.h Fri Apr 16 14:53:18 2010 +0300 @@ -45,28 +45,15 @@ #include #include +class QTextCodec; + class UT_VersitUtils : public QObject { Q_OBJECT private slots: - - void testCountLeadingWhiteSpaces(); - void testFindHardLineBreakInQuotedPrintable(); - void testParamName(); - void testParamValue(); - void testExtractPart(); - void testExtractParts(); - void testFold(); - void testUnfold(); - void testQuotedPrintableEncode(); - void testDecodeQuotedPrintable(); void testBackSlashEscape(); void testRemoveBackSlashEscaping(); - void testExtractPropertyGroupsAndName(); - void testExtractPropertyValue(); - void testExtractVCard21PropertyParams(); - void testExtractVCard30PropertyParams(); }; #endif // UT_VERSITUTILS_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitwriter/qversitwriter.pro --- a/qtcontactsmobility/tests/auto/qversitwriter/qversitwriter.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitwriter/qversitwriter.pro Fri Apr 16 14:53:18 2010 +0300 @@ -4,7 +4,7 @@ CONFIG+=testcase include(../../../common.pri) -DEFINES += BUILD_QTVERSIT QT_ASCII_CAST_WARNINGS +DEFINES += QT_ASCII_CAST_WARNINGS DEPENDPATH += . INCLUDEPATH += \ diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitwriter/ut_qversitwriter.cpp --- a/qtcontactsmobility/tests/auto/qversitwriter/ut_qversitwriter.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitwriter/ut_qversitwriter.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -46,25 +46,40 @@ #include #include +// Copied from tst_qcontactmanager.cpp +// Waits until __expr is true and fails if it doesn't happen within 5s. +#ifndef QTRY_VERIFY +#define QTRY_VERIFY(__expr) \ + do { \ + const int __step = 50; \ + const int __timeout = 5000; \ + if (!(__expr)) { \ + QTest::qWait(0); \ + } \ + for (int __i = 0; __i < __timeout && !(__expr); __i+=__step) { \ + QTest::qWait(__step); \ + } \ + QVERIFY(__expr); \ + } while(0) +#endif + QTM_USE_NAMESPACE void UT_QVersitWriter::init() { - mWritingDoneCalled = false; mOutputDevice = new QBuffer; mWriter = new QVersitWriter; - connect(mWriter,SIGNAL(writingDone()),this,SLOT(writingDone()),Qt::DirectConnection); + mSignalCatcher = new SignalCatcher; + qRegisterMetaType("QVersitWriter::State"); + connect(mWriter, SIGNAL(stateChanged(QVersitWriter::State)), + mSignalCatcher, SLOT(stateChanged(QVersitWriter::State))); } void UT_QVersitWriter::cleanup() { delete mWriter; delete mOutputDevice; -} - -void UT_QVersitWriter::writingDone() -{ - mWritingDoneCalled = true; + delete mSignalCatcher; } void UT_QVersitWriter::testDevice() @@ -77,56 +92,161 @@ QVERIFY(mWriter->device() == mOutputDevice); } -void UT_QVersitWriter::testWriting() +void UT_QVersitWriter::testDefaultCodec() { - // Device not set - QVERIFY(!mWriter->writeAll()); + QVERIFY(mWriter->defaultCodec() == 0); + mWriter->setDefaultCodec(QTextCodec::codecForName("UTF-16BE")); + QVERIFY(mWriter->defaultCodec() == QTextCodec::codecForName("UTF-16BE")); +} - // Device set, but not opened +void UT_QVersitWriter::testFold() +{ + // 87 characters long + QString longString(QLatin1String( + "4567890123456789012345678901234567890123456789012345678901234567890123456" + "234567890123456789012345678901234567890123456789012345678901234567890123456" + "234567890123456789012")); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:2.1\r\n" + "FN:4567890123456789012345678901234567890123456789012345678901234567890123456\r\n" + " 234567890123456789012345678901234567890123456789012345678901234567890123456\r\n" + " 234567890123456789012\r\n" + "END:VCARD\r\n"); + QVersitDocument document; + QVersitProperty property; + property.setName(QLatin1String("FN")); + property.setValue(longString); + document.addProperty(property); + document.setType(QVersitDocument::VCard21Type); + QList list; + list.append(document); mWriter->setDevice(mOutputDevice); - QVERIFY(!mWriter->writeAll()); + mOutputDevice->open(QBuffer::ReadWrite); + QVERIFY(mWriter->startWriting(list)); + QVERIFY(mWriter->waitForFinished()); + QCOMPARE(mWriter->state(), QVersitWriter::FinishedState); + QCOMPARE(mWriter->error(), QVersitWriter::NoError); + mOutputDevice->seek(0); + QByteArray result(mOutputDevice->readAll()); + QCOMPARE(result, expected); +} +void UT_QVersitWriter::testWriting21() +{ // vCard 2.1 - const char vCard21[] = + QByteArray vCard21( "BEGIN:VCARD\r\n\ VERSION:2.1\r\n\ FN:John\r\n\ -END:VCARD\r\n"; - mOutputDevice->open(QBuffer::ReadWrite); +END:VCARD\r\n"); QVersitDocument document; QVersitProperty property; property.setName(QString(QString::fromAscii("FN"))); - property.setValue(QByteArray("John")); + property.setValue(QString::fromAscii("John")); document.addProperty(property); - document.setVersitType(QVersitDocument::VCard21); - mWriter->setVersitDocument(document); - QVERIFY(mWriter->writeAll()); + document.setType(QVersitDocument::VCard21Type); + QList list; + list.append(document); + + // Device not set + QCOMPARE(mWriter->state(), QVersitWriter::InactiveState); + QCOMPARE(mWriter->error(), QVersitWriter::NoError); + QVERIFY(!mWriter->startWriting(list)); + QCOMPARE(mWriter->state(), QVersitWriter::InactiveState); + QCOMPARE(mWriter->error(), QVersitWriter::IOError); + QVERIFY(!mWriter->waitForFinished()); + + // Device not opened + mWriter->setDevice(mOutputDevice); + QVERIFY(!mWriter->startWriting(list)); + QCOMPARE(mWriter->state(), QVersitWriter::InactiveState); + QCOMPARE(mWriter->error(), QVersitWriter::IOError); + + // Now open the device and it should work. + mOutputDevice->open(QBuffer::ReadWrite); + QVERIFY(mWriter->startWriting(list)); + QVERIFY(mWriter->waitForFinished()); + QCOMPARE(mWriter->state(), QVersitWriter::FinishedState); + QCOMPARE(mWriter->error(), QVersitWriter::NoError); mOutputDevice->seek(0); QByteArray result(mOutputDevice->readAll()); - QCOMPARE(QString::fromAscii(result),QString::fromAscii(vCard21)); + QCOMPARE(result, vCard21); + // Try some other codec + delete mOutputDevice; + mOutputDevice = new QBuffer; + mOutputDevice->open(QBuffer::ReadWrite); + mWriter->setDevice(mOutputDevice); + QTextCodec* utf16(QTextCodec::codecForName("UTF-16")); + mWriter->setDefaultCodec(utf16); + QVERIFY(mWriter->startWriting(list)); + QVERIFY(mWriter->waitForFinished()); + QCOMPARE(mWriter->state(), QVersitWriter::FinishedState); + QCOMPARE(mWriter->error(), QVersitWriter::NoError); + mOutputDevice->seek(0); + result = mOutputDevice->readAll(); + QByteArray expected(utf16->fromUnicode(QLatin1String(vCard21.data()))); + QString out; + for (int i = 0; i < result.length(); i++) { + QString t; + out += t.sprintf("%02X ", (unsigned char)result.at(i)); + } + QCOMPARE(result, expected); +} + +void UT_QVersitWriter::testWriting30() +{ // vCard 3.0 - const char vCard30[] = + QByteArray vCard30( "BEGIN:VCARD\r\n\ VERSION:3.0\r\n\ FN:John\r\n\ -END:VCARD\r\n"; - document.setVersitType(QVersitDocument::VCard30); - mWriter->setVersitDocument(document); - mOutputDevice->reset(); - QVERIFY(mWriter->writeAll()); +END:VCARD\r\n"); + + QVersitDocument document; + QVersitProperty property; + property.setName(QString(QString::fromAscii("FN"))); + property.setValue(QString::fromAscii("John")); + document.addProperty(property); + document.setType(QVersitDocument::VCard30Type); + QList list; + list.append(document); + + // Basic 3.0 test + mOutputDevice->open(QBuffer::ReadWrite); + mWriter->setDevice(mOutputDevice); + QVERIFY(mWriter->startWriting(list)); + QVERIFY(mWriter->waitForFinished()); + QCOMPARE(mWriter->state(), QVersitWriter::FinishedState); + QCOMPARE(mWriter->error(), QVersitWriter::NoError); mOutputDevice->seek(0); - result = mOutputDevice->readAll(); - QCOMPARE(QString::fromAscii(result),QString::fromAscii(vCard30)); + QByteArray result(mOutputDevice->readAll()); + QCOMPARE(result, vCard30); // Asynchronous writing - QVERIFY(!mWritingDoneCalled); mOutputDevice->reset(); - QVERIFY(mWriter->startWriting()); - delete mWriter; // waits for the thread to finish - mWriter = 0; - QVERIFY(mWritingDoneCalled); + mSignalCatcher->mReceived.clear(); + QVERIFY(mWriter->startWriting(list)); + QTRY_VERIFY(mSignalCatcher->mReceived.count() >= 2); + QCOMPARE(mSignalCatcher->mReceived.at(0), QVersitWriter::ActiveState); + QCOMPARE(mSignalCatcher->mReceived.at(1), QVersitWriter::FinishedState); + // Cancelling + delete mOutputDevice; + mOutputDevice = new QBuffer; + mOutputDevice->open(QBuffer::ReadWrite); + mSignalCatcher->mReceived.clear(); + mWriter->setDevice(mOutputDevice); + mWriter->startWriting(list); + mWriter->cancel(); + mWriter->waitForFinished(); + QTRY_VERIFY(mSignalCatcher->mReceived.count() >= 2); + QCOMPARE(mSignalCatcher->mReceived.at(0), QVersitWriter::ActiveState); + QVersitWriter::State state(mSignalCatcher->mReceived.at(1)); + // It's possible that it finishes before it cancels. + QVERIFY(state == QVersitWriter::CanceledState + || state == QVersitWriter::FinishedState); } QTEST_MAIN(UT_QVersitWriter) diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/qversitwriter/ut_qversitwriter.h --- a/qtcontactsmobility/tests/auto/qversitwriter/ut_qversitwriter.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/qversitwriter/ut_qversitwriter.h Fri Apr 16 14:53:18 2010 +0300 @@ -45,35 +45,48 @@ #include #include #include +#include "qversitwriter.h" QTM_BEGIN_NAMESPACE -class QVersitWriter; class QVersitWriterPrivate; QTM_END_NAMESPACE QTM_USE_NAMESPACE +// Poor man's QSignalSpy because I couldn't get QSignalSpy to work with the user type QVR::State. +class SignalCatcher : public QObject +{ +Q_OBJECT +public slots: + void stateChanged(QVersitWriter::State state) { + mReceived.append(state); + } + +public: + QList mReceived; +}; + class UT_QVersitWriter : public QObject { Q_OBJECT -public slots: - void writingDone(); - private slots: // Tests void init(); void cleanup(); void testDevice(); - void testWriting(); + void testDefaultCodec(); + void testFold(); + void testWriting21(); + void testWriting30(); private: // Data QVersitWriter* mWriter; QBuffer* mOutputDevice; - bool mWritingDoneCalled; + SignalCatcher* mSignalCatcher; }; #endif // UT_QVERSITWRITER_H diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin.cpp --- a/qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin.cpp Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin.cpp Fri Apr 16 14:53:18 2010 +0300 @@ -43,11 +43,13 @@ #include #include +#include #include #include #include #include +#include #include #include #include @@ -70,6 +72,7 @@ { QMap trackerEngineParams; trackerEngine = new QContactTrackerEngine(trackerEngineParams); + errorMap = new QMap(); } void ut_qtcontacts_trackerplugin::testContacts() @@ -80,7 +83,7 @@ trackerEngine->saveContact(&c1, error); trackerEngine->saveContact(&c2, error); QVERIFY2((error == QContactManager::NoError),"Saving contact"); - QList contacts = trackerEngine->contacts(queryFilter, sortOrders, error); + QList contacts = trackerEngine->contactIds(queryFilter, sortOrders, error); QVERIFY2(contacts.contains(c1.localId()), "Previously added contact is not found"); QVERIFY2(contacts.contains(c2.localId()), "Previously added contact is not found"); } @@ -128,9 +131,9 @@ c.saveDetail(&nick); QVERIFY(c.detail().prefix() == "Mr"); - QVERIFY(c.detail().first() == "John"); - QVERIFY(c.detail().middle() == "Rupert"); - QVERIFY(c.detail().last() == "Doe"); + QVERIFY(c.detail().firstName() == "John"); + QVERIFY(c.detail().middleName() == "Rupert"); + QVERIFY(c.detail().lastName() == "Doe"); QVERIFY(c.detail().nickname() == "Johnny"); detailsAdded++; @@ -208,8 +211,8 @@ QContactLocalId initialId = c.localId(); int detailsAdded = 0; QContactName name; - name.setFirst("I have phone numbers"); - name.setLast("Girl"); + name.setFirstName("I have phone numbers"); + name.setLastName("Girl"); c.saveDetail(&name); // key: phonenumber; value: context,subtype @@ -225,10 +228,18 @@ QLatin1String(QContactPhoneNumber::SubTypeMobile))); phoneValues.insert("(412)670-1514", QPair(QLatin1String(QContactDetail::ContextWork), QLatin1String(QContactPhoneNumber::SubTypeCar))); + QMap > formattedPhoneValues; + foreach (QString number, phoneValues.keys()) { QContactPhoneNumber phone; phone.setNumber(number); + // Stripped automatically on saving RFC 3966 visual-separators reg exp "[(|-|.|)| ]" + formattedPhoneValues.insert(QString(number).replace( QRegExp("[\\(|" \ + "\\-|" \ + "\\.|" \ + "\\)|" \ + " ]"), ""),phoneValues.value(number)); if (!phoneValues.value(number).first.isEmpty()) { phone.setContexts(phoneValues.value(number).first); } @@ -249,6 +260,7 @@ QCoreApplication::processEvents(); } + // verify with synchronous read too QContact contact = trackerEngine->contact_impl(c.localId(), error); QCOMPARE(error, QContactManager::NoError); @@ -257,15 +269,15 @@ QCOMPARE(details.count(), detailsAdded); + foreach (QContactPhoneNumber detail, details) { // Verify that the stored values and attributes are the same as given - const QString& number = detail.number(); - QVERIFY(phoneValues.contains(number)); - QCOMPARE(detail.contexts()[0], phoneValues.value(number).first); - if( phoneValues.value(number).second.isEmpty()) // default empty is voice + QVERIFY(formattedPhoneValues.contains(detail.number())); + QCOMPARE(detail.contexts()[0], formattedPhoneValues.value(detail.number()).first); + if( formattedPhoneValues.value(detail.number()).second.isEmpty()) // default empty is voice QCOMPARE(detail.subTypes()[0], QLatin1String(QContactPhoneNumber::SubTypeVoice)); else - QCOMPARE(detail.subTypes()[0], phoneValues.value(number).second); + QCOMPARE(detail.subTypes()[0], formattedPhoneValues.value(detail.number()).second); } // edit one of numbers . values, context and subtypes and save again @@ -349,10 +361,7 @@ } QVERIFY(contactToTest.localId() == contactToSave.localId()); // Just to be sure we got the saved contact qDebug()<().count(); - foreach(QContactPhoneNumber numbber, contactToTest.details()) - { - qDebug()<().count() == 1); if (0 == iterations) { // perform context change @@ -370,7 +379,7 @@ QContact c; QContactPhoneNumber phone; phone.setContexts(QContactDetail::ContextWork); - phone.setNumber("555-999"); + phone.setNumber("555999"); phone.setSubTypes(QContactPhoneNumber::SubTypeMobile); c.saveDetail(&phone); QContact& contactToSave = c; @@ -425,8 +434,8 @@ { QContact c; QContactName name; - name.setFirst("Aruba & Barbados"); - name.setLast("Girl"); + name.setFirstName("Aruba & Barbados"); + name.setLastName("Girl"); c.saveDetail(&name); QContactLocalId initialId = c.localId(); int detailsAdded = 0; @@ -506,8 +515,8 @@ detailsAdded++; } QContactName name; - name.setFirst("Jo"); - name.setLast("H N Doe"); + name.setFirstName("Jo"); + name.setLastName("H N Doe"); c.saveDetail(&name); trackerEngine->saveContact(&c, error); QCOMPARE(error, QContactManager::NoError); @@ -532,8 +541,8 @@ email.setEmailAddress("super.man@hotmail.com"); c.saveDetail(&email); QContactName name; - name.setFirst("Super"); - name.setLast("Man"); + name.setFirstName("Super"); + name.setLastName("Man"); c.saveDetail(&name); QVERIFY2(trackerEngine->saveContact(&c, error) && error == QContactManager::NoError, "Saving a contact failed"); @@ -548,18 +557,20 @@ for (int i = 0; i < 3; i++) { QContact c; QContactName name; - name.setFirst("John"); - name.setLast(QString::number(i,10)); + name.setFirstName("John"); + name.setLastName(QString::number(i,10)); c.saveDetail(&name); contacts.append(c); } - trackerEngine->saveContacts(&contacts, error); + + QMap* errorMap; + trackerEngine->saveContacts(&contacts, errorMap, error); QCOMPARE(error, QContactManager::NoError); for (int i = 0; i < contacts.count(); i++) { QVERIFY(contacts[i].localId() != 0); QList details = trackerEngine->contact_impl(contacts[i].localId(), error).details(); QVERIFY(details.count()); - QCOMPARE(details.at(0).last(), + QCOMPARE(details.at(0).lastName(), QString("%1").arg(QString::number(i,10))); } } @@ -570,7 +581,7 @@ for (int i = 0; i < 5; i++) { QContact c; QContactName name; - name.setFirst(QString("John%1").arg(QString::number(i,10))); + name.setFirstName(QString("John%1").arg(QString::number(i,10))); c.saveDetail(&name); QVERIFY2(trackerEngine->saveContact(&c, error) && error == QContactManager::NoError, "Saving a contact failed"); addedIds.append(c.localId()); @@ -580,27 +591,23 @@ toApiRemove.append(addedIds.takeLast()); QList toPluginRemove(addedIds); // Remove all, but last of the added contacts - QList errors = trackerEngine->removeContacts(&toPluginRemove, error); - QCOMPARE(errors.count(), toPluginRemove.count()); - for (int i = 0; i < errors.count(); i++) { - QCOMPARE(errors[i], QContactManager::NoError); + bool success = trackerEngine->removeContacts(&toPluginRemove, errorMap, error); + QCOMPARE(success, true); + for (int i = 0; i < errorMap->count(); i++) { QVERIFY(toPluginRemove[i] == 0); } QCOMPARE(error, QContactManager::NoError); - errors = ContactManager::instance()->removeContacts(&toApiRemove); - QCOMPARE(ContactManager::instance()->error(), QContactManager::NoError); - QCOMPARE(errors.count(), toApiRemove.count()); - for (int i = 0; i < errors.count(); i++) { - QCOMPARE(errors[i], QContactManager::NoError); + success = ContactManager::instance()->removeContacts(&toApiRemove, errorMap); + QCOMPARE(success, true); + for (int i = 0; i < errorMap->count(); i++) { QVERIFY(toApiRemove[i] == 0); } // Try to remove some previously removed contacts, but one valid contact - errors = trackerEngine->removeContacts(&addedIds, error); - QCOMPARE(errors.count(), addedIds.count()); - for (int i = 0; i < errors.count() - 1; i++) { - QVERIFY2(errors[i] == QContactManager::DoesNotExistError, "Failed to report error of trying to remove previously removed"); + success = trackerEngine->removeContacts(&addedIds, errorMap, error); + QCOMPARE(errorMap->count(), addedIds.count()); + for (int i = 0; i < errorMap->count() - 1; i++) { QVERIFY2(addedIds[i] != 0, "Manager should not mark id as zero"); } } @@ -613,7 +620,7 @@ avatar.setAvatar("file:///home/user/.contacts/avatars/default_avatar.png"); contactWithAvatar.saveDetail(&avatar); QContactName name; - name.setFirst("John");name.setLast("A Frog"); + name.setFirstName("John");name.setLastName("A Frog"); contactWithAvatar.saveDetail(&name); QVERIFY(trackerEngine->saveContact( &contactWithAvatar, error)); @@ -633,7 +640,7 @@ url1.setContexts(QContactDetail::ContextHome); url1.setSubType(QContactUrl::SubTypeHomePage); QContactName name; - name.setFirst("John");name.setLast("TestUrl1"); + name.setFirstName("John");name.setLastName("TestUrl1"); contactWithUrl1.saveDetail(&name); contactWithUrl1.saveDetail(&url1); QVERIFY(trackerEngine->saveContact(&contactWithUrl1, error)); @@ -645,7 +652,7 @@ url2.setContexts(QContactDetail::ContextWork); url2.setSubType(QContactUrl::SubTypeHomePage); QContactName name2; - name2.setLast("TestUrl2"); + name2.setLastName("TestUrl2"); contactWithUrl2.saveDetail(&name2); contactWithUrl2.saveDetail(&url2); QVERIFY(trackerEngine->saveContact(&contactWithUrl2, error)); @@ -657,7 +664,7 @@ url3.setContexts(QContactDetail::ContextHome); url3.setSubType(QContactUrl::SubTypeFavourite); - name2.setLast("TestUrl3"); + name2.setLastName("TestUrl3"); contactWithUrl3.saveDetail(&name2); contactWithUrl3.saveDetail(&url3); QVERIFY(trackerEngine->saveContact(&contactWithUrl3, error)); @@ -735,14 +742,67 @@ QVERIFY(false); } */ -void ut_qtcontacts_trackerplugin::testContactsAddedSince() + +void ut_qtcontacts_trackerplugin::testSyncContactManagerContactsAddedSince() +{ + QDateTime start; + QList addedIds; + syncContactsAddedSinceHelper(start, addedIds); + + QContactChangeLogFilter filter(QContactChangeLogFilter::EventAdded); + filter.setSince(start); + + QList sortOrder; + + QList contactIds = ContactManager::instance()->contacts( filter, sortOrder, QStringList() ); + qDebug() << "addedIds" << addedIds.size(); + qDebug() << "contactIds" << contactIds.size(); + QEXPECT_FAIL("", "ContactManager is returning an empty list", Continue); + QVERIFY2( contactIds.size() == addedIds.size(), "Incorrect number of filtered contacts"); +} + +void ut_qtcontacts_trackerplugin::testSyncTrackerEngineContactsIdsAddedSince() { + QDateTime start; QList addedIds; + syncContactsAddedSinceHelper(start, addedIds); + + QContactChangeLogFilter filter(QContactChangeLogFilter::EventAdded); + filter.setSince(start); + + QList sortOrder; + QContactManager::Error error; + + QList contactIds = trackerEngine->contactIds( filter, sortOrder, error ); + qDebug() << "addedIds" << addedIds; + qDebug() << "contactIds" << contactIds; + QVERIFY2( contactIds.size() == addedIds.size(), "Incorrect number of filtered contacts"); +} + +void ut_qtcontacts_trackerplugin::testSyncContactManagerContactIdsAddedSince() +{ QDateTime start; + QList addedIds; + syncContactsAddedSinceHelper(start, addedIds); + QContactChangeLogFilter filter(QContactChangeLogFilter::EventAdded); + filter.setSince(start); + QList sortOrder; + + + QList contactIds = ContactManager::instance()->contactIds(filter, sortOrder); + qDebug() << "addedIds" << addedIds; + qDebug() << "contactIds" << contactIds; + QEXPECT_FAIL("", "ContactManager is returning an empty list", Continue); + QVERIFY2( contactIds.size() == addedIds.size(), "Incorrect number of filtered contacts"); +} + + +void ut_qtcontacts_trackerplugin::syncContactsAddedSinceHelper(QDateTime& start, QList& addedIds) +{ for (int i = 0; i < 3; i++) { QContact c; QContactName name; - name.setFirst("A"+QString::number(i)); + name.setFirstName("A"+QString::number(i)); QVERIFY2(c.saveDetail(&name), "Failed to save detail"); QVERIFY2(trackerEngine->saveContact(&c, error), "Failed to save contact"); } @@ -753,7 +813,32 @@ for (int i = 0; i < 3; i++) { QContact c; QContactName name; - name.setFirst("B"+QString::number(i)); + name.setFirstName("B"+QString::number(i)); + QVERIFY2(c.saveDetail(&name), "Failed to save detail"); + QVERIFY2(trackerEngine->saveContact(&c, error), "Failed to save contact"); + addedIds.append(c.localId()); + } +} + +void ut_qtcontacts_trackerplugin::testContactsAddedSince() +{ + QList addedIds; + QDateTime start; + for (int i = 0; i < 3; i++) { + QContact c; + QContactName name; + name.setFirstName("A"+QString::number(i)); + QVERIFY2(c.saveDetail(&name), "Failed to save detail"); + QVERIFY2(trackerEngine->saveContact(&c, error), "Failed to save contact"); + } + + QTest::qWait(1000); + start = QDateTime::currentDateTime(); + + for (int i = 0; i < 3; i++) { + QContact c; + QContactName name; + name.setFirstName("B"+QString::number(i)); QVERIFY2(c.saveDetail(&name), "Failed to save detail"); QVERIFY2(trackerEngine->saveContact(&c, error), "Failed to save contact"); addedIds.append(c.localId()); @@ -829,7 +914,7 @@ for (int i = 0; i < contactsToAdd; i++) { QContact c; QContactName name; - name.setFirst("A"+QString::number(i)); + name.setFirstName("A"+QString::number(i)); QVERIFY2(c.saveDetail(&name), "Failed to save detail"); QVERIFY2(trackerEngine->saveContact(&c, error), "Failed to save contact"); addedIds.append(c.localId()); @@ -843,7 +928,7 @@ QContact c = trackerEngine->contact_impl(addedIds[i], error); QContactName name = c.detail(); // Modify name - name.setFirst("B"+QString::number(i)); + name.setFirstName("B"+QString::number(i)); QVERIFY2(c.saveDetail(&name), "Failed to save detail"); QVERIFY2(trackerEngine->saveContact(&c, error), "Failed to save contact"); modified.append(c.localId()); @@ -882,7 +967,7 @@ QContactChangeLogFilter filter(QContactChangeLogFilter::EventRemoved); filter.setSince(start); QList sorts; - QList actuallyRemoved = trackerEngine->contacts(filter, sorts, error); + QList actuallyRemoved = trackerEngine->contactIds(filter, sorts, error); QVERIFY(actuallyRemoved.isEmpty()); QVERIFY(error == QContactManager::NotSupportedError); } @@ -909,13 +994,20 @@ void ut_qtcontacts_trackerplugin::cleanupTestCase() { delete trackerEngine; + delete errorMap; +} + +void ut_qtcontacts_trackerplugin::cleanup() +{ + foreach (QContactLocalId id, addedContacts) { + trackerEngine->removeContact(id, error); + } + addedContacts.clear(); } void ut_qtcontacts_trackerplugin::testNcoTypes() { - // libqttracker bug 127538 - // when this passes our bug 127544 can be fixed using namespace SopranoLive; QList ids; @@ -934,17 +1026,29 @@ void ut_qtcontacts_trackerplugin::testAsyncReadContacts() { + addedContacts.clear(); // Add at least one contact to be sure that this doesn't fail because tracker is clean - QContact c; - QContactName name; - name.setFirst("First"); name.setLast("Last"); - QContactAvatar avatar; - avatar.setAvatar("default_avatar.png"); - avatar.setSubType(QContactAvatar::SubTypeImage); - QVERIFY(c.saveDetail(&name)); - QVERIFY(c.saveDetail(&avatar)); - QVERIFY(trackerEngine->saveContact(&c, error)); + QStringList firstNames, lastNames; + firstNames << "aa" << "ab" << "ac" << "dd" << "fe"; + lastNames << "fe" << "ab" << "dd" << "dd" << "aa"; + for (int i = 0; i < firstNames.count(); i++) { + QContact c; + QContactName name; + name.setFirstName(firstNames.at(i)); + name.setLastName(lastNames.at(i)); + QContactAvatar avatar; + avatar.setAvatar("default_avatar.png"); + avatar.setSubType(QContactAvatar::SubTypeImage); + QVERIFY(c.saveDetail(&name)); + QVERIFY(c.saveDetail(&avatar)); + QVERIFY(trackerEngine->saveContact(&c, error)); + addedContacts.append(c.localId()); + } + + // Prepare the filter for the request - we really should test only the contact we add here. + QContactLocalIdFilter filter; + filter.setIds(addedContacts); // this one will get complete contacts @@ -954,16 +1058,18 @@ QContactSortOrder sort, sort1; sort.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldLast); sort1.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldFirst); - sorting<startRequest(&request); trackerEngine->startRequest(&request1); + trackerEngine->waitForRequestFinished(&request, 10000); + trackerEngine->waitForRequestFinished(&request1, 10000); - for(int i = 0; i < 100; i++) - { - usleep(100000); - QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); - if(request.isFinished() && request1.isFinished()) - break; - } // if it takes more, then something is wrong QVERIFY(request.isFinished()); @@ -995,20 +1096,23 @@ // now ask for one contact QVERIFY(!slot.ids.isEmpty()); - QList idsFromAllContactReq; QVERIFY2(slot.contacts.count() == slot.ids.count(), "not all contacts were loaded"); + QVERIFY(slot.contacts.count() >= firstNames.count()); for( int i = 0; i < slot.contacts.size() -1 ; i++) { QContact contact = slot.contacts[i]; QContact contact1 = slot.contacts[i+1]; - idsFromAllContactReq << contact.localId(); + QString last0 = contact.detail().lastName(); + QString first0 = contact.detail().firstName(); + QString last1 = contact1.detail().lastName(); + QString first1 = contact1.detail().firstName(); // sorting - QVERIFY(contact.detail(QContactName::DefinitionName).value(QContactName::FieldLast) <= contact1.detail(QContactName::DefinitionName).value(QContactName::FieldLast)); - if( contact.detail(QContactName::DefinitionName).value(QContactName::FieldLast) == contact1.detail(QContactName::DefinitionName).value(QContactName::FieldLast)) - QVERIFY(contact.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) <= contact1.detail(QContactName::DefinitionName).value(QContactName::FieldFirst)); - qDebug() << contact.localId() - << contact.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) - << contact.detail(QContactName::DefinitionName).value(QContactName::FieldLast); + qDebug() << "contacts:" << contact.localId() << first0 << last0; + bool test = last0 < last1 || (last0 == last1 && first0 <= first1); + if (!test) { + qDebug() << "contacts sort failed. First: " << contact1.localId() << first0 << last1 << "lasts: " << last0 << last1; + } + QVERIFY2(test, "Sorting failed."); } } @@ -1018,13 +1122,18 @@ // this one will get complete contacts QContact c; QContactName name; - name.setFirst("Zuba"); - name.setLast("Zub"); + name.setFirstName("Zuba"); + name.setLastName("Zub"); c.saveDetail(&name); QContactPhoneNumber phone; phone.setNumber("4872444"); c.saveDetail(&phone); + + QContactBirthday birthday; + birthday.setDate(QDate(2010, 2, 14)); + c.saveDetail(&birthday); + trackerEngine->saveContact(&c, error); QStringList details; @@ -1077,6 +1186,22 @@ QVERIFY(containsPhone); } QVERIFY(containsThisId); + + // filter by birthday range + QContactDetailRangeFilter rangeFilter; + rangeFilter.setDetailDefinitionName(QContactBirthday::DefinitionName, QContactBirthday::FieldBirthday); + // include lower & exclude upper by default + rangeFilter.setRange(QDate(2010, 2, 14), QDate(2010, 2, 15)); + QList contacts = trackerEngine->contacts(rangeFilter, QList(), QStringList()<< QContactBirthday::DefinitionName, error); + QVERIFY(!contacts.isEmpty()); + bool containsOurContact(false); + foreach(const QContact &cont, contacts) + { + QVERIFY(cont.detail().date() == QDate(2010, 2, 14)); + if( c.id() == cont.id() ) + containsOurContact = true; + } + QVERIFY(containsOurContact); } void ut_qtcontacts_trackerplugin::testFilterContactsEndsWith() @@ -1086,8 +1211,8 @@ QContact matchingContact; QContactName name; - name.setFirst("Zuba"); - name.setLast("Zub"); + name.setFirstName("Zuba"); + name.setLastName("Zub"); matchingContact.saveDetail(&name); QContactPhoneNumber phone; // TODO doesnt work yet phone.setContexts(QContactPhoneNumber::ContextWork); @@ -1170,8 +1295,8 @@ QContact matchingContactWithShorterNumber; QContactName name1; - name1.setFirst("ShortNumber"); - name1.setLast("Zub1"); + name1.setFirstName("ShortNumber"); + name1.setLastName("Zub1"); matchingContactWithShorterNumber.saveDetail(&name1); QContactPhoneNumber phone1; phone1.setNumber("54321"); @@ -1243,6 +1368,54 @@ settings.setValue("phoneNumberMatchDigitCount", restoreValue); } +void ut_qtcontacts_trackerplugin::testFilterTwoNameFields() +{ + // init test + QMap names; + for (int i = 0; i < 3; i++) { + QContact c; + QContactName name; + name.setFirstName(QUuid::createUuid().toString() + QString::number(i)); + name.setLastName(QUuid::createUuid().toString() + QString::number(i)); + c.saveDetail(&name); + QContactAvatar avatar; + avatar.setAvatar(QUuid::createUuid().toString()); + c.saveDetail(&avatar); + QVERIFY(trackerEngine->saveContact(&c, error)); + names.insert(c.localId(), name); + QCOMPARE(error, QContactManager::NoError); + addedContacts.append(c.localId()); + } + + // Init filter + QContactLocalId searchId = names.keys().at(1); + QString searchFirst = names.value(searchId).firstName(); + QString searchLast = names.value(searchId).lastName(); + QContactUnionFilter ufilter; + QContactDetailFilter filterFirst; + filterFirst.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldFirst); + filterFirst.setMatchFlags(QContactFilter::MatchExactly); + filterFirst.setValue(searchFirst); + QContactDetailFilter filterLast; + filterLast.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldLast); + filterLast.setMatchFlags(QContactFilter::MatchExactly); + filterLast.setValue(searchLast); + ufilter.setFilters(QList() << filterFirst << filterLast); + + // Init request + QContactFetchRequest request; + request.setFilter(ufilter); + trackerEngine->startRequest(&request); + trackerEngine->waitForRequestFinished(&request, 10000); + + + // Test fetch result + QCOMPARE(request.contacts().count(), 1); + QCOMPARE(request.contacts().at(0).localId(), searchId); + QCOMPARE(request.contacts().at(0).detail().firstName(), searchFirst); + QCOMPARE(request.contacts().at(0).detail().lastName(), searchLast); +} + void ut_qtcontacts_trackerplugin::testTrackerUriToUniqueId() { QString uri = "contact:1234567"; @@ -1254,7 +1427,7 @@ { QContact firstContact; QContactName name; - name.setFirst("FirstMeta"); + name.setFirstName("FirstMeta"); firstContact.saveDetail(&name); QVERIFY(trackerEngine->saveContact(&firstContact, error)); @@ -1264,7 +1437,7 @@ { QContact secondContact; QContactName name1; - name1.setFirst(firstname); + name1.setFirstName(firstname); secondContact.saveDetail(&name1); QVERIFY(trackerEngine->saveContact(&secondContact, error)); secondIds< conts = contacts(QList()< ut_qtcontacts_trackerplugin::contacts(QList ids, QStringList details) -{ - QContactFetchRequest request; - QContactLocalIdFilter filter; - filter.setIds(ids); - request.setFilter(filter); - - request.setDefinitionRestrictions(details); - - trackerEngine->startRequest(&request); - trackerEngine->waitForRequestFinished(&request, 1000); - - return request.contacts(); -} - void ut_qtcontacts_trackerplugin::testIMContactsAndMetacontactMasterPresence() { if( !QFileInfo(PATH_TO_SPARQL_TESTS).exists() ) @@ -1345,14 +1497,16 @@ QContactLocalId masterContactId; // using one master contact later for additional testing for( int i = 0; i < 2; i++ ) { - unsigned int contactid = 999998+i; + unsigned int contactid = qHash(QString("/org/freedesktop/fake/account/") + QString::number(999998+i) + "@ovi.com"); idstoremove << contactid; - insertContact(contactid, QString::number(contactid)+ "@ovi.com", "nco:presence-status-available"); + insertContact(QString("telepathy://org/freedesktop/fake/account/") + QString::number(999998+i) + "@ovi.com", + contactid, QString::number(999998 + i)+ "@ovi.com", "nco:presence-status-available", QString("http://www.sopranolive.org/backends/tracker/generated_unique_id/105323876#%1").arg(999998+i),"ovi.com"); QContact c = contact(contactid, QStringList()<().serviceProvider() == "ovi.com"); QContact firstContact; QContactName name; - name.setFirst("FirstMetaWithIM"+QString::number(contactid)); + name.setFirstName("FirstMetaWithIM"+QString::number(contactid)); firstContact.saveDetail(&name); QVERIFY(trackerEngine->saveContact(&firstContact, error)); @@ -1376,7 +1530,7 @@ // all contacts in master contact in order to calculate master presence { QList cons = contacts(QList () - << masterContactId << 999999, QStringList() + << masterContactId << qHash(QString("/org/freedesktop/fake/account/") + QString::number(999999) + "@ovi.com"), QStringList() << QContactOnlineAccount::DefinitionName); QVERIFY(cons.size() == 1); QVERIFY(cons[0].id().localId() == masterContactId); @@ -1389,17 +1543,17 @@ { QVERIFY(det.presence() == QContactOnlineAccount::PresenceAvailable); // keeping the reference to tp contact - QVERIFY(det.value("QContactLocalId") == "999999"); + QVERIFY(det.value("QContactLocalId") == QString::number(qHash(QString("/org/freedesktop/fake/account/") + QString::number(999999) + "@ovi.com"))); containDetail = true; } } QVERIFY(containDetail); } //now update presence to IM contact and check it in metacontact (TODO and if signal is emitted) - updateIMContactStatus(999999, "nco:presence-status-offline"); + updateIMContactStatus(QString("telepathy://org/freedesktop/fake/account/") + QString::number(999999) + "@ovi.com", "nco:presence-status-offline"); { QList cons = contacts(QList () - << masterContactId << 999999, QStringList() + << masterContactId << qHash(QString("/org/freedesktop/fake/account/") + QString::number(999999) + "@ovi.com"), QStringList() << QContactOnlineAccount::DefinitionName); QVERIFY(cons.size() == 1); QVERIFY(cons[0].id().localId() == masterContactId); @@ -1412,7 +1566,7 @@ { QVERIFY(det.presence() == QContactOnlineAccount::PresenceOffline); // keeping the reference to tp contact - QVERIFY(det.value("QContactLocalId") == "999999"); + QVERIFY(det.value("QContactLocalId") == QString::number(qHash(QString("/org/freedesktop/fake/account/") + QString::number(999999) + "@ovi.com"))); containDetail = true; } } @@ -1435,7 +1589,7 @@ { QVERIFY(det.presence() == QContactOnlineAccount::PresenceOffline); // keeping the reference to tp contact - QVERIFY(det.value("QContactLocalId") == "999999"); + QVERIFY(det.value("QContactLocalId") == QString::number(qHash(QString("/org/freedesktop/fake/account/") + QString::number(999999) + "@ovi.com"))); containDetail = true; } } @@ -1449,10 +1603,177 @@ } } +void ut_qtcontacts_trackerplugin::testIMContactsFilterring() +{ + QList idstoremove; + QList idsToRetrieveThroughFilter; + for( int i = 0; i < 3; i++ ) + { + unsigned int contactid = qHash(QString("/org/freedesktop/fake/account/") + QString::number(999995+i) + "@ovi.com"); + idstoremove << contactid; + insertContact(QString("telepathy://org/freedesktop/fake/account/") + QString::number(999995+i) + "@ovi.com", + contactid, QString::number(999995 + i)+ "@ovi.com", "nco:presence-status-available", + QString("www.sopranolive.org/backends/tracker/generated_unique_id/105323876#ovi%1").arg(i/2), QString("ovi%1.com").arg(i/2)); + if(!i/2) + idsToRetrieveThroughFilter << contactid; + } + + + { + // now filter by service provider ovi0.com needs to return 2 contacts, 999995 & 999996 + QList ids(idsToRetrieveThroughFilter); + + QContactFetchRequest request; + QContactDetailFilter filter; + filter.setDetailDefinitionName(QContactOnlineAccount::DefinitionName, QContactOnlineAccount::FieldServiceProvider); + + Slots slot; + QObject::connect(&request, SIGNAL(progress(QContactFetchRequest*, bool)), + &slot, SLOT(progress(QContactFetchRequest*, bool ))); + filter.setValue(QString("ovi0.com")); + filter.setMatchFlags(QContactFilter::MatchExactly); + + request.setDefinitionRestrictions(QStringList()<startRequest(&request); + + for(int i = 0; i < 100; i++) + { + usleep(100000); + QCoreApplication::processEvents(); + if(request.isFinished() ) + break; + } + + // if it takes more, then something is wrong + QVERIFY(request.isFinished()); + QVERIFY(!request.contacts().isEmpty()); + + QVERIFY(request.contacts().size() >= 2); + foreach(const QContact &contact, request.contacts()) + { + QVERIFY(contact.detail().serviceProvider() == "ovi0.com"); + ids.removeOne(contact.localId()); + } + QVERIFY(ids.isEmpty()); + } + + // now account path filter + { + // now filter by account path 999995 & 999996 + QList ids(idsToRetrieveThroughFilter); + + QContactFetchRequest request; + QContactDetailFilter filter; + filter.setDetailDefinitionName(QContactOnlineAccount::DefinitionName, "AccountPath"); + + Slots slot; + QObject::connect(&request, SIGNAL(progress(QContactFetchRequest*, bool)), + &slot, SLOT(progress(QContactFetchRequest*, bool ))); + // see insertTpContact + filter.setValue(QString("www.sopranolive.org/backends/tracker/generated_unique_id/105323876#ovi0")); + filter.setMatchFlags(QContactFilter::MatchExactly); + + request.setDefinitionRestrictions(QStringList()<startRequest(&request); + + for(int i = 0; i < 100; i++) + { + usleep(100000); + QCoreApplication::processEvents(); + if(request.isFinished() ) + break; + } + + // if it takes more, then something is wrong + QVERIFY(request.isFinished()); + QVERIFY(!request.contacts().isEmpty()); + + QVERIFY(request.contacts().size() >= 2); + foreach(const QContact &contact, request.contacts()) + { + QVERIFY(contact.detail().serviceProvider() == "ovi0.com"); + ids.removeOne(contact.localId()); + } + QVERIFY(ids.isEmpty()); + } + + + // remove them + foreach(unsigned int id, idstoremove) + { + QVERIFY2(trackerEngine->removeContact(id, error), "Removing a contact failed"); + } + +} + +void ut_qtcontacts_trackerplugin::testContactsWithoutMeContact() { + QContact c; + QContactName name; + name.setFirstName("Totally"); + name.setLastName("Unique"); + c.saveDetail(&name); + trackerEngine->saveContact(&c, error); + QContactLocalId id = c.localId(); // Store ID for later removal. + + // Prepare the filter for the request - we fetch only the one contact saved above. + QList ids; + ids << id; + QContactLocalIdFilter filter; + filter.setIds(ids); + + // Prepare the requst - give filter to it and specify which fields to fetch. We fetch only the name. + QStringList details; + details << QContactName::DefinitionName; + + QContactLocalIdFetchRequest nameFetchRequest; + nameFetchRequest.setFilter(filter); + + // Start the request and wait for it to finish. + trackerEngine->startRequest(&nameFetchRequest); + trackerEngine->waitForRequestFinished(&nameFetchRequest, 1000); + + // Requst finished. Test that only one contact is removed. + QList contacts = nameFetchRequest.ids(); + QVERIFY2(contacts.count() < 2, "We expected to get only one contact. Got more."); + QVERIFY2(contacts.count() != 0, "We expected to get one contact. Got none."); + QVERIFY2(contacts.first() == id, "Did not get the requested contact back."); + + // Cleaning up. + trackerEngine->removeContact(id, error); + +} + +/*************************** Helper functions for unit tests ***************'*/ + +QContact ut_qtcontacts_trackerplugin::contact(QContactLocalId id, QStringList details) +{ + QList conts = contacts(QList()< ut_qtcontacts_trackerplugin::contacts(QList ids, QStringList details) +{ + QContactFetchRequest request; + QContactLocalIdFilter filter; + filter.setIds(ids); + request.setFilter(filter); + + request.setDefinitionRestrictions(details); + + trackerEngine->startRequest(&request); + trackerEngine->waitForRequestFinished(&request, 1000); + + return request.contacts(); +} + void Slots::progress(QContactLocalIdFetchRequest* self, bool appendOnly) { Q_UNUSED(appendOnly) - if( self->status() == QContactAbstractRequest::Finished ) + if( self->state() == QContactAbstractRequest::FinishedState ) { ids << self->ids(); } diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin.h --- a/qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin.h Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin.h Fri Apr 16 14:53:18 2010 +0300 @@ -47,11 +47,14 @@ #include #include - - +QTM_BEGIN_NAMESPACE class QContactLocalIdFetchRequest; class QContactFetchRequest; +QTM_END_NAMESPACE + class QContactTrackerEngine; +QTM_USE_NAMESPACE + /** * QtContacts Tracker plugin unittests */ @@ -63,6 +66,7 @@ private slots: void initTestCase(); void cleanupTestCase(); + void cleanup(); void testSavePhoneNumber(); void testPhoneNumberContext(); void testWritingOnlyWorkMobile(); @@ -87,6 +91,9 @@ // void testDetailDefinition(); // void testSaveDetailDefinition(); // void testRemoveDetailDefinition(); + void testSyncContactManagerContactsAddedSince(); + void testSyncTrackerEngineContactsIdsAddedSince(); + void testSyncContactManagerContactIdsAddedSince(); void testContactsAddedSince(); void testContactsModifiedSince(); void testContactsRemovedSince(); @@ -94,26 +101,33 @@ // void testGroupsModifiedSince(); // void testGroupsRemovedSince(); void testNcoTypes(); + void testQRelationshipAndMetacontacts(); void testAsyncReadContacts(); void testFilterContacts(); void testFilterContactsEndsWith(); + void testFilterTwoNameFields(); void testTrackerUriToUniqueId(); - void testQRelationshipAndMetacontacts(); void testIMContactsAndMetacontactMasterPresence(); + void testIMContactsFilterring(); + void testContactsWithoutMeContact(); private: - void insertContact( QContactLocalId uid, QString imId, QString imStatus ); - void updateIMContactStatus(QContactLocalId uId, QString imStatus); + void syncContactsAddedSinceHelper(QDateTime& start, QList& addedIds); + + void insertContact(const QString& URI, QContactLocalId uid, QString imId, QString imStatus, QString accountPath, QString protocol = "jabber"); + void updateIMContactStatus(const QString& uri, QString imStatus); QContact contact(QContactLocalId uid, QStringList detailsToLoad = QStringList()); QList contacts(QList uids, QStringList detailsToLoad = QStringList()); private: QContactTrackerEngine *trackerEngine; QContactManager::Error error; + QMap* errorMap; // Filtering and sort options used for QContactTrackerEngine. // Not used. QContactFilter queryFilter; QList sortOrders; + QList addedContacts; }; class Slots: public QObject diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin.pro --- a/qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin.pro Fri Apr 16 14:53:18 2010 +0300 @@ -15,6 +15,7 @@ # CONFIG += contacts INCLUDEPATH += /usr/include/qt4/QtContacts \ + /usr/include \ $$QCONTACTS_TRACKER_BACKENDDIR ## Include source files under test. diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin_data/insertTpContact.sparql --- a/qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin_data/insertTpContact.sparql Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin_data/insertTpContact.sparql Fri Apr 16 14:53:18 2010 +0300 @@ -1,43 +1,56 @@ #!/bin/bash if [ -z "$1" ]; then -echo "usage: $0 " +echo "usage: $0 " exit 1 fi + echo "create nco:IMAccount" tracker-sparql -u -q " INSERT { - + } " -echo "Update nco:IMAccount" -tracker-sparql --update --query "INSERT { - a nco:IMAccount; - nco:imID '$3'; - nco:imNickname '$4'; - nco:imPresence $5; - nco:imStatusMessage '$6'; - nco:imProtocol '$7' +tracker-sparql -u -q " +INSERT +{ + + nco:imDisplayName '$7' } " + echo "create nco:IMContact" -tracker-sparql -u -q "INSERT +tracker-sparql -u -q " +INSERT { - +<$1> } " + +echo "create nco:IMContact" +tracker-sparql --update --query " +INSERT { + <$1> a nco:IMContact; + nco:contactUID '$2'; + nco:imContactId '$3'; + nco:imContactNickname '$8$9'; + nco:imContactPresence $5; + nco:imContactStatusMessage '$6'; + nco:fromIMAccount ; + nco:imContactCapability +} +" + echo "update nco:IMContact" tracker-sparql --update --query "INSERT { - a nco:IMContact; - nco:contactUID $1; + <$1> a nco:IMContact; nco:nameGiven '$8'; - nco:hasIMAccount ; - nco:nameFamily '$9' + nco:nameFamily '$9' } -" +" \ No newline at end of file diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin_data/updateTpStatus.sparql --- a/qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin_data/updateTpStatus.sparql Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin_data/updateTpStatus.sparql Fri Apr 16 14:53:18 2010 +0300 @@ -1,12 +1,11 @@ -#!/bin/sh +#!/bin/bash if [ -z "$1" ]; then echo "usage: $0 " exit 1 fi - tracker-sparql --update --query " -DELETE { nco:imPresence ?status } - WHERE { nco:imPresence ?status } -INSERT { nco:imPresence $2 } +DELETE { <$1> nco:imContactPresence ?status } +WHERE { <$1> nco:imContactPresence ?status } +INSERT { <$1> nco:imContactPresence $2 } " diff -r 0ba2181d7c28 -r 76a2435edfd4 qtcontactsmobility/tests/tests.pro --- a/qtcontactsmobility/tests/tests.pro Fri Mar 19 09:27:18 2010 +0200 +++ b/qtcontactsmobility/tests/tests.pro Fri Apr 16 14:53:18 2010 +0300 @@ -14,5 +14,6 @@ symbian { contains(mobility_modules,messaging): SUBDIRS += messagingex + contains(mobility_modules,multimedia): SUBDIRS += cameracapture_s60 playerex_s60 contains(mobility_modules,publishsubscribe): SUBDIRS += publishsubscribeex }